屏幕截圖(80).png (257.55 KB, 下載次數: 24)
下載附件
按照圖一接的
2023-3-31 15:32 上傳
屏幕截圖(81).png (350.13 KB, 下載次數: 27)
下載附件
圖一
2023-3-31 15:32 上傳
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)
|