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)
|