找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 1535|回復(fù): 1
收起左側(cè)

做的單片機(jī)電流電壓檢測(cè),Proteus仿真出來LCD1602不顯示,幫我看看接線有沒有錯(cuò)誤

[復(fù)制鏈接]
ID:1069252 發(fā)表于 2023-3-31 15:39 | 顯示全部樓層 |閱讀模式

按照?qǐng)D一接的

按照?qǐng)D一接的

圖一

圖一

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> //包含頭文件,一般情況不需要改動(dòng),頭文件包含特殊功能寄存器的定義
   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];                     //打印數(shù)組初始化
  15          char dis1[16];
  16          unsigned long time_20ms=0;                 //定時(shí)器計(jì)數(shù)
  17         
  18          unsigned char disFlag =0;//定時(shí)更新顯示
  19          unsigned char setFlag =0;
  20          float Volt=0.0;                 //檢測(cè)電壓
  21          float Acurrent=0.0;                               //檢測(cè)電流
  22          unsigned char setV=5;
  23          float setA = 0.8;
  24          void Init_Timer0(void);         //函數(shù)聲明
  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();        //定時(shí)器0初始化
  35   1              UART_Init();              //串口初始化
  36   1                           
  37   1              LCD_Init();           //初始化液晶
  38   1              DelayMs(20);          //延時(shí)有助于穩(wěn)定
  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)         //主循環(huán)
  44   1              {
  45   2                      keydeal();
  46   2                      if(disFlag == 1)
  47   2                      {
  48   3                              disFlag = 0;
  49   3                              midvolt=ReadADC(1);                             //讀取AD檢測(cè)到的 電壓值
  50   3                              DelayMs(20);          //延時(shí)有助于穩(wěn)定
  51   3                              midcur=ReadADC(0);              //讀取、流轉(zhuǎn)化后的電壓值
  52   3              
  53   3                              Volt=(float)midvolt*5.13/255*3;         //計(jì)算出電壓 *3表示分壓值
  54   3                              Acurrent=(float)midcur*5.13/255;                //計(jì)算出電流
  55   3                                                                                                              
C51 COMPILER V9.01   MAIN                                                                  10/27/2017 18:53:25 PAGE 2   

  56   3                              if(Acurrent>2.62)                        //如果電流轉(zhuǎn)換后的電壓值超過2.62
  57   3                              {
  58   4                                      Acurrent=(Acurrent-2.62)/0.185;  //電流模塊 電壓轉(zhuǎn)換計(jì)算
  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) //按鍵檢測(cè)及處理函數(shù)
  99          {
100   1              static bit rekey =0;
101   1              if((key1 == 0)||(key2 == 0)||(key3 == 0))        //有按鍵按下
102   1              {
103   2                      if(rekey == 0)  //防止重復(fù)按下
104   2                      {
105   3                              DelayMs(10);
106   3                              if((key1 == 0))//按鍵1按下
107   3                              {
108   4                                      rekey =1;       //防止重復(fù)按下
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;       //防止重復(fù)按下
115   4                                      if(setFlag == 1)  //設(shè)置閾值標(biāo)志
116   4                                      {
117   5                                              if(setV<10)      //設(shè)置值
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)  //設(shè)置閾值標(biāo)志
121   4                                      {
122   5                                              if(setA<5.0)     //設(shè)置值
123   5                                              {setA = setA+0.1;}//+10                        
124   5                                      }
125   4                              }
126   3                              else if((key3 == 0))//按鍵2按下
127   3                              {
128   4                                      rekey =1;       //防止重復(fù)按下
129   4                                      if(setFlag == 1)  //設(shè)置閾值標(biāo)志
130   4                                      {
131   5                                              if(setV>1)       //設(shè)置值
132   5                                              {setV =setV-1;}//-1
133   5                                      }
134   4                                      else if(setFlag == 2)  //設(shè)置閾值標(biāo)志
135   4                                      {
136   5                                              if(setA>0.1)     //設(shè)置值
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位定時(shí)器,使用"|"符號(hào)可以在使用多個(gè)定時(shí)器時(shí)不受影響                 
152   1              TH0=(65536-20000)/256;            //重新賦值 20ms
153   1              TL0=(65536-20000)%256;
154   1              EA=1;            //總中斷打開
155   1              ET0=1;           //定時(shí)器中斷打開
156   1              TR0=1;           //定時(shí)器開關(guān)打開
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;                       //將數(shù)據(jù)放入SBUF中
187   1              while((!TI)&&(time_out<100))  //檢測(cè)是否發(fā)送出去
188   1              {time_out++;DelayUs2x(10);}     //未發(fā)送出去 進(jìn)行短暫延時(shí)
189   1              TI = 0;                                         //清除ti標(biāo)志
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)       //發(fā)送長(zhǎng)度對(duì)比
197   1              {
198   2                      uartSendByte(*s);  //放松單字節(jié)數(shù)據(jù)
199   2                      s++;              //指針++
200   2                      NUM++;            //下一個(gè)++
201   2               }
202   1      }
203         
204          void UART_SER (void) interrupt 4        //串行中斷服務(wù)程序
205          {
206   1              if(RI)                        //判斷是接收中斷產(chǎn)生
207   1              {
208   2                      RI=0;                      //標(biāo)志位清零
209   2              }
210   1              if(TI)  //如果是發(fā)送標(biāo)志位,清零
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)
回復(fù)

使用道具 舉報(bào)

ID:102963 發(fā)表于 2023-4-1 14:31 | 顯示全部樓層
可能是1602驅(qū)動(dòng)函數(shù)部分有問題。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表