📄 heater.lst
字号:
C51 COMPILER V7.09 HEATER 04/16/2005 10:17:05 PAGE 1
C51 COMPILER V7.09, COMPILATION OF MODULE HEATER
OBJECT MODULE PLACED IN heater.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE heater.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /*--------------------------------------
2 快热式热水器程序
3 MCU AT89C51 XAL 12MHz
4 Build by Gavin Hu, 2005.3.18
5 --------------------------------------*/
6 //#pragma src
7 #include <reg51.h>
8 #include <intrins.h>
9 #include <math.h>
10 void delay(unsigned int); //延时函数
11 void display(void); //显示函数
12 unsigned char keyscan(void); //按键扫描处理函数
13 void heatctrl(void); //加热控制函数
14 void temptest(void); //测温函数
15 sbit swkey=P1^0; //开关键
16 sbit upkey=P1^1; //加热档位“+”键
17 sbit downkey=P1^2; //加热档位“-”键
18 sbit buzz=P1^05; //蜂鸣器输出端
19 sbit triac=P1^6; //可控硅触发信号输出端
20 sbit relay=P1^7; //继电器控制信号输出端
21 sbit led1=P2^5; //加热档位指示灯1
22 sbit led2=P2^6; //加热档位指示灯2
23 sbit led3=P2^7; //加热档位指示灯3
24 signed char data ctemp; //当前测得水温寄存器
25 unsigned char data dispram[2]={0x10,0x10}; //显示区缓存
26 unsigned char data heatpower,px0count; //加热档位寄存器、外中断0计数器
27 bit tempov,t0tst,testok; //超温标志、测温开始标志、测温完成标志
28 /*----------------------------------------------
29 主函数 void main(void)
30 无参数,无返回值
31 循环调用显示、键扫描、温度检测、加热控制函数
32 ----------------------------------------------*/
33 void main(void)
34 {
35 1 unsigned char i,j;
36 1 ctemp=15; //初始化水温寄存器
37 1 heatpower=5; //初始化加热档位为5当
38 1 tempov=0; //清除超温标志
39 1 swkey=0; //默认开关键被按下,进入待机状态
40 1 TMOD=0x11; //设定T0和T1工作方式为16位定时器
41 1 TCON=0x05; //设置外中断0和1为下降沿触发
42 1 IP=0x01; //设置外中断0优先
43 1 IE=0x80; //打开总中断
44 1 while (1)
45 1 {
46 2 i=1;
47 2 do{
48 3 for (j=0;j<100;j++) //循环100次约0.5s
49 3 {
50 4 if (keyscan()) i=6; //如果有键按下,显示当前档位3s
51 4 display(); //调用显示函数一次约4ms
52 4 heatctrl(); //调用加热控制函数
53 4 }//end for (b=0;b<100;b++)
54 3 temptest(); //每0.5s进行一次测温
55 3 } while (--i); //通过改变循环次数i的大小决定是否刷新显示
C51 COMPILER V7.09 HEATER 04/16/2005 10:17:05 PAGE 2
56 2 j=abs(ctemp); //取温度绝对值
57 2 dispram[1]=j%10; //取个位数送显示
58 2 j/=10; //取十位数
59 2 dispram[0]=j?j:0x11; //送显示(带灭零)
60 2 }//end while (1)
61 1 }
62
63 /*--------------------------------------
64 延时函数 void delay(unsigned int dt)
65 参数:dt,无返回值
66 延时时间=dt*500机器周期
67 --------------------------------------*/
68 void delay(unsigned int dt)
69 {
70 1 register unsigned char bt; //定义寄存器变量
71 1 for (; dt; dt--)
72 1 for (bt=250; --bt; ); //此句编译时以“DJNZ”实现,250*2=500机器周期
73 1 }
74
75 /*--------------------------------------
76 显示函数 void display(void)
77 无参数,无返回值
78 两位共阳数码管扫描显示
79 --------------------------------------*/
80 void display(void)
81 {
82 1 unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,\
83 1 0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf,0xff};
84 1 unsigned char i,a;
85 1 a=0xfe; //位选赋初值
86 1 for (i=0; i<2; i++) //循环扫描两位数码管
87 1 {
88 2 P2|=0x1f; //清除位选
89 2 P0=table[dispram[i]]; //送显示段码
90 2 P2&=a; //选通一位
91 2 delay(4); //延时2ms
92 2 a=_crol_(a,1); //改变位选字
93 2 P0=0xff; //消影
94 2 }
95 1 }
96
97 /*----------------------------------------------------------
98 按键扫描处理函数 unsigned char keyscan(void)
99 无参数,返回值:无符号字符型,无键按下为0,有键按下为其它
100 影响全局变量:heatpower
101 ----------------------------------------------------------*/
102 unsigned char keyscan(void)
103 {
104 1 unsigned char i,ch;
105 1 if (upkey==0) //“+”键
106 1 {
107 2 buzz=0; //打开蜂鸣器(发出按键音)
108 2 for (i=0;i<5;i++) display(); //延时消抖
109 2 buzz=1; //关闭蜂鸣器
110 2 if (heatpower<9) heatpower++; //档位加一
111 2 dispram[0]=0;
112 2 dispram[1]=heatpower; //显示当前档位
113 2 while (upkey==0) display(); //等待键释放
114 2 return (1); //返回有键按下
115 2 }
116 1 else if (downkey==0) //“-”键
117 1 {
C51 COMPILER V7.09 HEATER 04/16/2005 10:17:05 PAGE 3
118 2 buzz=0; //打开蜂鸣器(发出按键音)
119 2 for (i=0;i<5;i++) display(); //延时消抖
120 2 buzz=1; //关闭蜂鸣器
121 2 if (heatpower>0) heatpower--; //档位减一
122 2 dispram[0]=0;
123 2 dispram[1]=heatpower; //显示当前档位
124 2 while (downkey==0) display(); //等待键释放
125 2 return (2); //返回有键按下
126 2 }
127 1 else if (swkey==0) //开关键
128 1 {
129 2 buzz=0; //打开蜂鸣器(发出按键音)
130 2 for (i=0;i<30;i++) display(); //延时消抖
131 2 buzz=1; //关闭蜂鸣器
132 2 swkey=1; //置位开关键
133 2 while (swkey==0) display(); //等待键释放
134 2 ch=IE; //暂存中断控制字IE
135 2 IE=0x00; //禁止中断
136 2 P0=0xff;
137 2 P1=0xff;
138 2 P2=0xff; //清除端口输出
139 2 dispram[0]=0x10;
140 2 dispram[1]=0x10; //显示“--”
141 2 display();
142 2 while (1)
143 2 {
144 3 while (swkey) display(); //等待开关键按下
145 3 buzz=0; //打开蜂鸣器(发出按键音)
146 3 for (i=0;i<10;i++) display();//延时消抖
147 3 buzz=1; //关闭蜂鸣器
148 3 if (swkey==0) break; //确认开关键被按下
149 3 }
150 2 while (swkey==0) display(); //等待键释放
151 2 IE=ch; //还原中断控制字IE
152 2 return (0); //返回无键按下
153 2 }
154 1 else return (0); //无任何键按下时由此返回
155 1 }
156
157 /*--------------------------------------
158 加热控制函数 void heatctrl(void)
159 无参数,无返回值
160 判断是否加热、加热功率及档位指示灯处理
161 --------------------------------------*/
162 void heatctrl(void)
163 {
164 1 if (!tempov) //当没有超温标志时
165 1 {
166 2 relay=0; //接通继电器
167 2 buzz=1; //关闭蜂鸣器
168 2 switch (heatpower) //判断加热档位
169 2 {
170 3 case 0: {EX1=0;ET1=0;triac=1;led1=1;led2=1;led3=1;break;}//0档不加热,指示灯不亮
171 3 case 1:
172 3 case 2:
173 3 case 3:
174 3 case 4: {led1=0;led2=1;led3=1;EX1=1;break;} //1~4档1号指示等亮
175 3 case 5:
176 3 case 6:
177 3 case 7:
178 3 case 8: {led1=0;led2=0;led3=1;EX1=1;break;} //5~8档1号、2号指示灯亮
179 3 case 9: {EX1=0;ET1=0;led1=0;led2=0;led3=0;triac=0;break;} //9档全功率,指示灯全亮
C51 COMPILER V7.09 HEATER 04/16/2005 10:17:05 PAGE 4
180 3 }
181 2 }
182 1 else //当有超温标志时
183 1 {
184 2 relay=1; //断开继电器
185 2 EX1=0; ET1=0; triac=1; //关闭可控硅
186 2 buzz=0; //蜂鸣报警
187 2 }
188 1 }
189
190 /*--------------------------------------
191 测温函数 void temptest(void)
192 无参数,无返回值,
193 影响全局变量:ctemp,tempov
194 测量并查表计算温度,判断是否超温
195 --------------------------------------*/
196 void temptest(void)
197 {
198 1 signed char temp,tempmin,tempmax;
199 1 unsigned int t0rig;
200 1 unsigned int code temptab[]={0x6262,0x61eb,0x6171,0x60f7,0x6047,0x5ff7,0x5f6e,0x5eef,0x5e53,0x5dbe,0x5d4b,
-0x5ca5,0x5c17,\
201 1 0x5b6b,0x5ada,0x5a5c,0x599b,0x58ff,0x5869,0x57b0,0x570d,0x5663,0x55c6,0x550e,
-0x5444,0x5396,\
202 1 0x52dd,0x5240,0x5189,0x50b0,0x5005,0x4f20,0x4e69,0x4db1,0x4cef,0x4c42,0x4b64,
-0x4aaa,0x49e1,\
203 1 0x48fc,0x4847,0x476c,0x46b1,0x4604,0x4503,0x4449,0x4356,0x4299,0x41c0,0x40ce,
-0x3ff0,0x3f2b,\
204 1 0x3e33,0x3d86,0x3ca6,0x3bd2,0x3b26,0x3a39,0x3973,0x38a6,0x37ef,0x373f,0x3687,
-0x35c3,0x3507,\
205 1 0x3487,0x33bc,0x32ed,0x324f,0x319e,0x3106,0x3053,0x2fa6,0x2f2a,0x2e88,0x2e00,
-0x2d63,0x2cd6,\
206 1 0x2c65,0x2bae,0x2b28,0x2a97,0x2a07,0x298e,0x2914,0x287a,0x280d,0x278a,0x2703,
-0x2687,0x2626,\
207 1 0x25e5,0x256d,0x24ee,0x2489,0x2414,0x23bc,0x2356,0x22d9,0x2278,0x2203}; //温
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -