51单片机源程序如下:
#include #include #include "1602.h" 
 #include "delay.h" 
 #include "i2c.h" 
 char dis0[16];                           //打印数组初始化 
 unsigned long time_20ms=0;                   //定时器计数 
 float Volt=0.0;                          //检测电压 
 float Acurrent=0.0;                                  //检测电流 
 void Init_Timer0(void);                //函数声明 
 void uartSendStr(unsigned char *s,unsigned char length); 
 void UART_Init(void); 
 void uartSendByte(unsigned char dat); 
 void main (void) 
 {      
         unsigned char midvolt,midcur;  //电压电流中间变量值 
         Init_Timer0();        //定时器0初始化 
         UART_Init();                  //串口初始化 
                       
         LCD_Init();           //初始化液晶 
         DelayMs(20);          //延时有助于稳定 
         LCD_Clear(); 
         sprintf(dis0,"My Designer!!  ");//打印 
         LCD_Write_String(0,0,dis0);//显示第一行 
         sprintf(dis0,"V:%3.2fv A:%3.2fA",Volt,Acurrent);//打印电压电流值 
         LCD_Write_String(0,1,dis0);//显示第二行 
         uartSendStr("reday ok!!",10); 
         while (1)         //主循环 
         { 
                 midvolt=ReadADC(1);                                //读取AD检测到的 电压值 
                 DelayMs(50);          //延时有助于稳定 
                 midcur=ReadADC(0);                //读取电流转化后的电压值 
                 Volt=(float)midvolt*5.13/255*3;                //计算出电压 *3表示分压值 
                 Acurrent=(float)midcur*5.13/255;                //计算出电流 
                                                                                                 
                 if(Acurrent>2.62)                         //如果电流转换后的电压值超过2.62 
                 { 
                         Acurrent=(Acurrent-2.62)/0.185;         //电流模块 电压转换计算 
                 } 
                 else 
                 { 
                         Acurrent=0; 
                 }        
                 sprintf(dis0,"V:%3.2fv A:%3.2fA",Volt,Acurrent);//打印电压电流值 
                 LCD_Write_String(0,1,dis0);//显示第二行 
 //                uartSendStr(dis0,16);          //串口上报 
 //                uartSendStr("n",1);                           //换行 
                 DelayMs(200);          //延时有助于稳定 
         } 
 } 
 void Init_Timer0(void) 
 { 
         TMOD |= 0x01;          //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响                      
         TH0=(65536-20000)/256;                  //重新赋值 20ms 
         TL0=(65536-20000)%256; 
         EA=1;            //总中断打开 
         ET0=1;           //定时器中断打开 
         TR0=1;           //定时器开关打开 
 } 
 void Timer0_isr(void) interrupt 1 
 { 
         TH0=(65536-20000)/256;                  //重新赋值 20ms 
         TL0=(65536-20000)%256; 
         
         time_20ms++; 
 } 
 void UART_Init(void) 
 { 
     SCON  = 0x50;                        // SCON: 模式 1, 8-bit UART, 使能接收   
     TMOD |= 0x20;               // TMOD: timer 1, mode 2, 8-bit 重装 
     TH1   = 0xFD;               // TH1:  重装值 9600 波特率 晶振 11.0592MHz 
         TL1 = TH1;   
     TR1   = 1;                  // TR1:  timer 1 打开                         
     EA    = 1;                  //打开总中断 
     ES    = 1;                  //打开串口中断 
 } 
 void uartSendByte(unsigned char dat) 
 { 
         unsigned char time_out; 
         time_out=0x00; 
         SBUF = dat;                          //将数据放入SBUF中 
         while((!TI)&&(time_out<100))  //检测是否发送出去 
         {time_out++;DelayUs2x(10);}        //未发送出去 进行短暂延时 
         TI = 0;                                                //清除ti标志 
 } 
 void uartSendStr(unsigned char *s,unsigned char length) 
 { 
         unsigned char NUM; 
         NUM=0x00; 
         while(NUM                 uartSendByte(*s);  //放松单字节数据 
                 s++;                  //指针++ 
                 NUM++;                  //下一个++ 
            } 
 } 
 void UART_SER (void) interrupt 4         //串行中断服务程序 
 { 
         if(RI)                        //判断是接收中断产生 
         { 
                 RI=0;                      //标志位清零 
         } 
         if(TI)  //如果是发送标志位,清零 
         TI=0; 
 } 
 …………………… 


 会员中心
 会员中心 会员注册
 会员注册 
  
  
  
  返回顶部
返回顶部 刷新页面
刷新页面 下到页底
下到页底