#电热水器自动控温系统下位机_第1页
#电热水器自动控温系统下位机_第2页
#电热水器自动控温系统下位机_第3页
#电热水器自动控温系统下位机_第4页
#电热水器自动控温系统下位机_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、电路图电热水器自动控温系统的设计和实现下位机#include math.h#include reg51.#include INTRIN#define N 4S.Hsbit adcstartale = sbit adc_con=P2 sbit adcoe= sbit key1=P sbit key2=P =PP3710;11;3;P37;6sbit key4=P sbit int_0=P32;sbit int_1=P33; sbit P15=P15;=P16;void delay(); void delay1();void inituart(voi unsigned cha void fillb

2、uff();void shooid r gbu void led(); ;); ettemper();void keyproc void filter();void send_char();ledtab/ 段码le=0 x0-9,-deco ledtable1 码 0.-9. unsigned unsigned unsigned unsignedg;ess() ;unsigned/ 键值/ 是否按键按下图 1-2 下位机电路图,0 x80/ 主函数void main()EX1=1; / 允许 INT1 中断EA=1; / 中断总允许IT1=1; / INT1 边沿触发方式level=0; /

3、初始键值levelflag=0;/ 无键按下标志temperflag=0; / 键值temper=0; /adc 初始值P16=0;inituart();/ 串口初始化while(1)filter();delay1();showbuff(); / 显示温度值led();if(levelflag|temperflag)send_char();/ 如果有按键按下或者采集到的值和前一刻不相同 时,将 / 温度或档位发给上位机/ 延时函数void delay()int i,j;for(i=0;i50;i+) for(j=0;j1;j+);void delay1()int i,j;for(i=0;i15

4、0;i+) for(j=0;j25;j+);/ 检测void led()if(level=1) if(video_buff3=level)|(video_buff3=level+1)&(video_buff 4=0) P16=0;else P16=1;/ 如果有按键按下或者采集到的值和前一刻不相同时,将温 度或档位发给上位机else if(video_buff3=level)&(video_buff4!=0)|(video_buff3= =level+1)&(video_buff4=0) P16=0;else P16=1; / 如果有按键按下或者采集到的值和前一刻不相同时,将温 度或档位发给上

5、位机/ 得到采样值unsigned char gettemper() unsigned char adcdata;EA=0; adc_con=0; adcstartale=0; adcstartale=1;P0=0 xff; while(int_0=0); adcoe=0; adcdata=P0; adcoe=1;/ 采样时关闭所有中断_nop_();_nop_();/ 启动 A/D 转换,下降沿有效/ 等待转换完成/ 允许读 ADC0808/ 将转换后的数据送单片机的 P0 口/ 不允许读 ADC0808if(temper!=adcdata) temperflag=1; / 相 邻 两 次

6、采 样 值 不 同 时 , temperflag 置 1EA=1; / 打开所有中断return adcdata;/ 处理采样值,填充显示缓冲区 void fillbuff()unsigned int tmp;tmp=temper*1.96078; video_buff0=level; / video_buff1=10; video_buff2=10;video_buff3=tmp/100; tmp=tmp%100; video_buff4=tmp/10; tmp=tmp%10; video_buff5=tmp;填充档位/ 填充 -/ 填充 -/ 填充十位/ 填充个位/ 填充小数点位/ 将档位

7、、温度值显示在数码管上void showbuff()unsigned char ii,j,k;2unsigned char p=0 x1;unsigned char xdata *i;P15=0;for(ii=0;ii6;ii+) i=0 xfff3; / 控制口地址 *i=0 x80; / 控制写入控制口 j=video_buffii;if(ii=4) k=ledtable1j; else k=ledtablej;i=i-3;/ 位码地址*i=p;/ 送位码到 PA 口i=i+1;/ 段码地址*i=k;/ 送段码到 PB 口p=1;/ 从左向右依次点亮数码管delay();P15=1;/ 键

8、盘中断处理程序unsigned char i; for(i=0;i30;i+); if(int_1) return; / if(!key1)level=1; / if(!key2)level=2; / if(!key3)level=3; / if(!key4)level=4; / levelflag=1; video_buff0=level;void keyprocess() interrupt 2 当 INT1=1 时,无中断,无按键按下 如果 key1=0,则 1 键按下 如果 key21=0,则 2 键按下 如果 key3=0,则 3 键按下 如果 key4=0,则 4 键按下/ 有按键

9、按下/ 均值滤波void filter() / 对四次采样进行求平均 , 考虑到实际中温度的变化是一个比 较缓慢的过程,/ 相邻的几次采样变化幅度不大,且为计算简便, N 取值为 4int sum=0,count;for (count=0;count=1&level=4)video_buff0=level; / 将接收到的档位值填写显示缓冲区if(TI=1) / 如果 TI=1 ,发送完数据TI=0; / 软件清零/ 串口初始化void inituart()SCON=0X50 ;/ / 方式 1,8 位数据,允许接收 sm0 sm1 sm2 ren tb8 rb8 ti riTMOD=0X20

10、/; 设置 timer1 ,方式 2 (方式 2,自动重装入初值的 8 位计数 器, 串行通信时用)TH1=0XFD; / 初始值TL1 = 0 xfd;TR1=1; / 启动 timer1 ,开始计时ES=1; /开启串口中断/ 向上位机发送档位、温度void send_char()if(!TI)if(temperflag=1) / 温度有变化SBUF=video_buff3+0 x30; while(TI=0);SBUF=video_buff4+0 x30; while(TI=0);SBUF=.; while(TI=0);SBUF=video_buff5+0 x30; while(TI=0);SBUF=-;while(TI=0); temperflag=0;if(levelflag=1)levelflag=0;SBUF=video_buff0+0 x30; while(!TI);SBUF=-; while(TI=0);/ 发送十位给上位机/ 等待发送完 ,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论