找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 622|回复: 1
打印 上一主题 下一主题
收起左侧

做的单片机电流电压检测,Proteus仿真出来LCD1602不显示,帮我看看接线有没有错误

[复制链接]
跳转到指定楼层
楼主

C51 COMPILER V9.01   MAIN     10/27/2017 18:53:25 PAGE 1   


C51 COMPILER V9.01, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN main.OBJ
COMPILER INVOKED BY: C:\Keil_C51\C51\BIN\C51.EXE main.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
   2          #include<stdio.h>
   3          #include "1602.h"
   4          #include "delay.h"
   5          #include "i2c.h"
   6         
   7          sbit buzzer = P1^0;//蜂鸣器引脚定义
   8          sbit led_gre = P1^1;    //led灯引脚定义
   9          sbit led_yel = P1^2;
  10          sbit key1 = P1^3;        //按键引脚定义
  11          sbit key2 = P1^4;
  12          sbit key3 = P1^5;
  13         
  14          char dis0[16];                     //打印数组初始化
  15          char dis1[16];
  16          unsigned long time_20ms=0;                 //定时器计数
  17         
  18          unsigned char disFlag =0;//定时更新显示
  19          unsigned char setFlag =0;
  20          float Volt=0.0;                 //检测电压
  21          float Acurrent=0.0;                               //检测电流
  22          unsigned char setV=5;
  23          float setA = 0.8;
  24          void Init_Timer0(void);         //函数声明
  25          void uartSendStr(unsigned char *s,unsigned char length);
  26          void UART_Init(void);
  27          void uartSendByte(unsigned char dat);
  28          void keydeal(void) ;
  29         
  30          void main (void)
  31          {     
  32   1              unsigned char midvolt,midcur;  //电压电流中间变量值
  33   1      
  34   1              Init_Timer0();        //定时器0初始化
  35   1              UART_Init();              //串口初始化
  36   1                           
  37   1              LCD_Init();           //初始化液晶
  38   1              DelayMs(20);          //延时有助于稳定
  39   1              LCD_Clear();
  40   1              sprintf(dis0,"V:%3.2fv A:%3.2fA",Volt,Acurrent);//打印电压电流值
  41   1              LCD_Write_String(0,0,dis0);//显示第二行
  42   1              uartSendStr("reday ok!!",10);
  43   1              while (1)         //主循环
  44   1              {
  45   2                      keydeal();
  46   2                      if(disFlag == 1)
  47   2                      {
  48   3                              disFlag = 0;
  49   3                              midvolt=ReadADC(1);                             //读取AD检测到的 电压值
  50   3                              DelayMs(20);          //延时有助于稳定
  51   3                              midcur=ReadADC(0);              //读取、流转化后的电压值
  52   3              
  53   3                              Volt=(float)midvolt*5.13/255*3;         //计算出电压 *3表示分压值
  54   3                              Acurrent=(float)midcur*5.13/255;                //计算出电流
  55   3                                                                                                              
C51 COMPILER V9.01   MAIN                                                                  10/27/2017 18:53:25 PAGE 2   

  56   3                              if(Acurrent>2.62)                        //如果电流转换后的电压值超过2.62
  57   3                              {
  58   4                                      Acurrent=(Acurrent-2.62)/0.185;  //电流模块 电压转换计算
  59   4                              }
  60   3                              else
  61   3                              {
  62   4                                      Acurrent=0;
  63   4                              }               
  64   3                              sprintf(dis0,"V:%3.2fv A:%3.2fA",Volt,Acurrent);//打印电压电流值
  65   3                              LCD_Write_String(0,0,dis0);//显示第二行
  66   3                              
  67   3                              if(setFlag == 0)
  68   3                              {
  69   4                                      sprintf(dis1," v:%02d   a:%2.1f",(unsigned int)setV,setA);//打印电压电流值
  70   4                                      LCD_Write_String(0,1,dis1);//显示第二行
  71   4                              }
  72   3                              else if(setFlag == 1)
  73   3                              {
  74   4                                      sprintf(dis1,"Sv:%02d   a:%2.1f",(unsigned int)setV,setA);//打印电压电流值
  75   4                                      LCD_Write_String(0,1,dis1);//显示第二行
  76   4                              }
  77   3                              else if(setFlag == 2)
  78   3                              {
  79   4                                      sprintf(dis1," v:%02d  Sa:%2.1f",(unsigned int)setV,setA);//打印电压电流值
  80   4                                      LCD_Write_String(0,1,dis1);//显示第二行
  81   4                              }
  82   3                              if(Acurrent > setA)
  83   3                              {led_yel = 0;}
  84   3                              else
  85   3                              {led_yel = 1;}
  86   3                              if(Volt > setV)
  87   3                              {led_gre = 0;}
  88   3                              else
  89   3                              {led_gre = 1;}
  90   3                              if((Acurrent > setA)||(Volt > setV))
  91   3                              {buzzer = 0;}
  92   3                              else
  93   3                              {buzzer = 1;}
  94   3                      }
  95   2              }
  96   1      }
  97         
  98          void keydeal(void) //按键检测及处理函数
  99          {
100   1              static bit rekey =0;
101   1              if((key1 == 0)||(key2 == 0)||(key3 == 0))        //有按键按下
102   1              {
103   2                      if(rekey == 0)  //防止重复按下
104   2                      {
105   3                              DelayMs(10);
106   3                              if((key1 == 0))//按键1按下
107   3                              {
108   4                                      rekey =1;       //防止重复按下
109   4                                      setFlag++;
110   4                                      if(setFlag >= 3)  setFlag = 0;
111   4                              }
112   3                              else if((key2 == 0))//按键1按下
113   3                              {
114   4                                      rekey =1;       //防止重复按下
115   4                                      if(setFlag == 1)  //设置阈值标志
116   4                                      {
117   5                                              if(setV<10)      //设置值
C51 COMPILER V9.01   MAIN                                                                  10/27/2017 18:53:25 PAGE 3   

118   5                                              {setV =setV+1;}//+1                             
119   5                                      }
120   4                                      else if(setFlag == 2)  //设置阈值标志
121   4                                      {
122   5                                              if(setA<5.0)     //设置值
123   5                                              {setA = setA+0.1;}//+10                        
124   5                                      }
125   4                              }
126   3                              else if((key3 == 0))//按键2按下
127   3                              {
128   4                                      rekey =1;       //防止重复按下
129   4                                      if(setFlag == 1)  //设置阈值标志
130   4                                      {
131   5                                              if(setV>1)       //设置值
132   5                                              {setV =setV-1;}//-1
133   5                                      }
134   4                                      else if(setFlag == 2)  //设置阈值标志
135   4                                      {
136   5                                              if(setA>0.1)     //设置值
137   5                                              {setA =setA-0.1;}//-10
138   5                                      }                              
139   4                              }
140   3                      }               
141   2              }
142   1              else
143   1              {
144   2                      rekey = 0;
145   2              }
146   1      }
147         
148         
149          void Init_Timer0(void)
150          {
151   1              TMOD |= 0x01;     //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响                 
152   1              TH0=(65536-20000)/256;            //重新赋值 20ms
153   1              TL0=(65536-20000)%256;
154   1              EA=1;            //总中断打开
155   1              ET0=1;           //定时器中断打开
156   1              TR0=1;           //定时器开关打开
157   1      }
158         
159          void Timer0_isr(void) interrupt 1
160          {
161   1              TH0=(65536-20000)/256;            //重新赋值 20ms
162   1              TL0=(65536-20000)%256;         
163   1              time_20ms++;
164   1              if(time_20ms % 10 == 0)
165   1              {
166   2                      disFlag  = 1;
167   2              }
168   1      }
169         
170         
171          void UART_Init(void)
172          {
173   1          SCON  = 0x50;                       // SCON: 模式 1, 8-bit UART, 使能接收  
174   1          TMOD |= 0x20;               // TMOD: timer 1, mode 2, 8-bit 重装
175   1          TH1   = 0xFD;               // TH1:  重装值 9600 波特率 晶振 11.0592MHz
176   1              TL1 = TH1;  
177   1          TR1   = 1;                  // TR1:  timer 1 打开                        
178   1          EA    = 1;                  //打开总中断
179   1          ES    = 1;                  //打开串口中断
C51 COMPILER V9.01   MAIN                                                                  10/27/2017 18:53:25 PAGE 4   

180   1      }
181         
182          void uartSendByte(unsigned char dat)
183          {
184   1              unsigned char time_out;
185   1              time_out=0x00;
186   1              SBUF = dat;                       //将数据放入SBUF中
187   1              while((!TI)&&(time_out<100))  //检测是否发送出去
188   1              {time_out++;DelayUs2x(10);}     //未发送出去 进行短暂延时
189   1              TI = 0;                                         //清除ti标志
190   1      }
191         
192          void uartSendStr(unsigned char *s,unsigned char length)
193          {
194   1              unsigned char NUM;
195   1              NUM=0x00;
196   1              while(NUM<length)       //发送长度对比
197   1              {
198   2                      uartSendByte(*s);  //放松单字节数据
199   2                      s++;              //指针++
200   2                      NUM++;            //下一个++
201   2               }
202   1      }
203         
204          void UART_SER (void) interrupt 4        //串行中断服务程序
205          {
206   1              if(RI)                        //判断是接收中断产生
207   1              {
208   2                      RI=0;                      //标志位清零
209   2              }
210   1              if(TI)  //如果是发送标志位,清零
211   1              TI=0;
212   1      }
213         
214         
215         
216         
217         
218         


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    941    ----
   CONSTANT SIZE    =     83    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     51       8
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      1    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:102963 发表于 2023-4-1 14:31 | 只看该作者
可能是1602驱动函数部分有问题。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表