已阅读5页,还剩7页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
/* 智能温控器问题描述:当温控开关打开时,若测得环境温度大于设定温度,则继电器吸合 ,启动压缩机工作;若测得环境温度小于设定温度,则继电器释放, 压缩机停止工作。 该实验可以应用于对温度控制精度要求不是很高的场合,例如,粮仓, 电冰箱,空调,电饭锅等。如果配以通讯接口,可以做成多点温度检 测监控系统。具有极强的扩展性。作者: yiwei shannxi university of technolog 日期: 2007.4.1在proteus上仿真成功; 2007.4.3电路板焊接调试成功参考资料:1 周兴华 编著 单片机智能产品c语言设计实例祥解 2电子制作 2006.11 3 注意: 此文档为仿真程序,若要在试验板上验证,需要须改一下函数void lcd_wait(void) DATAPORT=0xff; LCM_EN=1; LCM_RS=0; LCM_RW=1; _nop_(); while(DATAPORT&BUSY); LCM_EN=0;*/#include#include#include #define uchar unsigned char#define uint unsigned int#define BUSY 0x80 /lcd忙检测标志#define DATAPORT P0 /定义P0口为LCD通讯端口#define PLAYE_ADDR XBYTE0XBFFF /语音报警地址sbit RED_ALARM=P10; /红色指示灯sbit WRITE_ALARM=P11; /白色指示灯sbit GREEN_ALARM=P12; /绿色指示灯sbit P1_4=P14; /时钟调整sbit P1_5=P15; /时钟加sbit P1_6=P16; /时钟减sbit DQ = P24; /定义ds18b20通信端口 sbit LCM_RS=P20;/数据/命令端sbit LCM_RW=P21;/读/写选择端sbit LCM_EN=P22; /LCD使能信号sbit ad_busy=P32; /adc中断方式接口sbit RECLED_EOC=P35; /ISD1420放音结束查询标志sbit OUT=P37;uchar ad_data; /ad采样值存储uchar seconde=0; /定义并初始化时钟变量uchar minite=0;uchar hour=12;uchar mstcnt=0;uchar temp1,temp2,temp; /温度显示变量uchar t,set;uchar K;bit ON_OFF=0;bit outflag;uchar code str0=- : : - ;uchar code str1=SET: C SA: . C;void delay_LCM(uint); /LCD延时子程序void initLCM( void); /LCD初始化子程序void lcd_wait(void); /LCD检测忙子程序void WriteCommandLCM(uchar WCLCM,uchar BusyC); /写指令到ICM子函数void WriteDataLCM(uchar WDLCM); /写数据到LCM子函数void DisplayOneChar(uchar X,uchar Y,uchar DData); /显示指定坐标的一个字符子函数void DisplayListChar(uchar X,uchar Y,uchar code *DData); /显示指定坐标的一串字符子函数void init_timer0(void); /定时器初始化void displayfun1(void);void displayfun2(void);void displayfun3(void);void displayfun4(void);void keyscan(void ); /键盘扫描子程序void set_adj(void);void inc_key(void);void dec_key(void);void delay_18B20(unsigned int i);void Init_DS18B20(void) ;uchar ReadOneChar(void);void WriteOneChar(unsigned char dat);void ReadTemperature(void);void ad0809(void);void playalarm(void); /*延时K*1ms,12.000mhz*/void delay_LCM(uint k) uint i,j; for(i=0;ik;i+) for(j=0;j60;j+) ; /*写指令到ICM子函数*/void WriteCommandLCM(uchar WCLCM,uchar BusyC) if(BusyC)lcd_wait();DATAPORT=WCLCM; LCM_RS=0; / 选中指令寄存器 LCM_RW=0; / 写模式 LCM_EN=1; _nop_(); _nop_();_nop_(); LCM_EN=0; /*写数据到LCM子函数*/void WriteDataLCM(uchar WDLCM) lcd_wait( ); /检测忙信号 DATAPORT=WDLCM; LCM_RS=1; / 选中数据寄存器 LCM_RW=0; / 写模式 LCM_EN=1; _nop_();_nop_();_nop_(); LCM_EN=0;/*lcm内部等待函数*/void lcd_wait(void) DATAPORT=0xff; LCM_EN=1; LCM_RS=0; LCM_RW=1; _nop_(); while(DATAPORT&BUSY) LCM_EN=0; _nop_(); _nop_(); LCM_EN=1; _nop_(); _nop_(); LCM_EN=0;/*LCM初始化子函数*/void initLCM( ) DATAPORT=0;delay_LCM(15);WriteCommandLCM(0x38,0); /三次显示模式设置,不检测忙信号 delay_LCM(5); WriteCommandLCM(0x38,0); delay_LCM(5); WriteCommandLCM(0x38,0); delay_LCM(5); WriteCommandLCM(0x38,1); /8bit数据传送,2行显示,5*7字型,检测忙信号 WriteCommandLCM(0x08,1); /关闭显示,检测忙信号 WriteCommandLCM(0x01,1); /清屏,检测忙信号 WriteCommandLCM(0x06,1); /显示光标右移设置,检测忙信号 WriteCommandLCM(0x0c,1); /显示屏打开,光标不显示,不闪烁,检测忙信号/*显示指定坐标的一个字符子函数*/void DisplayOneChar(uchar X,uchar Y,uchar DData) Y&=1; X&=15; if(Y)X|=0x40; /若y为1(显示第二行),地址码+0X40 X|=0x80; /指令码为地址码+0X80 WriteCommandLCM(X,0); WriteDataLCM(DData);/*显示指定坐标的一串字符子函数*/void DisplayListChar(uchar X,uchar Y,uchar code *DData) uchar ListLength=0; Y&=0x01; X&=0x0f; while(X0;i-) DQ = 0; / 给脉冲信号 dat=1; DQ = 1; / 给脉冲信号 if(DQ) dat|=0x80; delay_18B20(4); return(dat);/*ds18b20写一个字节*/ void WriteOneChar(uchar dat) unsigned char i=0; for (i=8; i0; i-) DQ = 0; DQ = dat&0x01; delay_18B20(5); DQ = 1; dat=1; /*读取ds18b20当前温度*/void ReadTemperature(void)unsigned char a=0;unsigned char b=0;unsigned char t=0;Init_DS18B20();WriteOneChar(0xCC); / 跳过读序号列号的操作WriteOneChar(0x44); / 启动温度转换delay_18B20(100); / this message is wery importantInit_DS18B20();WriteOneChar(0xCC); /跳过读序号列号的操作WriteOneChar(0xBE); /读取温度寄存器等(共可读9个寄存器) 前两个就是温度delay_18B20(100);a=ReadOneChar(); /读取温度值低位b=ReadOneChar(); /读取温度值高位temp1=b4;temp2=a&0x0f; temp=(b*256+a)4); /当前采集温度值除16得实际温度值/*液晶显示子函数1正常显示*/void displayfun1(void)WriteCommandLCM(0x0c,1); /显示屏打开,光标不显示,不闪烁,检测忙信号DisplayListChar(0,0,str0);DisplayListChar(0,1,str1); DisplayOneChar(3,0,hour/10+0x30); /液晶上显示小时DisplayOneChar(4,0,hour%10+0x30);DisplayOneChar(6,0,minite/10+0x30);/液晶上显示分DisplayOneChar(7,0,minite%10+0x30);DisplayOneChar(9,0,seconde/10+0x30); /液晶上显示秒DisplayOneChar(10,0,seconde%10+0x30);DisplayOneChar(4,1,K/10+0x30); /液晶上显示设定的温度DisplayOneChar(5,1,K%10+0x30); DisplayOneChar(11,1,temp1/10+0x30); /液晶上显示测得的温度 DisplayOneChar(12,1,temp1%10+0x30);DisplayOneChar(14,1,temp2/10+0x30);if(ON_OFF=0) /若温控标志为0DisplayOneChar(14,0,0x4f); / 液晶上显示不控温的标志DisplayOneChar(15,0,0x46);elseDisplayOneChar(14,0,0x4f); / 液晶上显示控温的标志DisplayOneChar(15,0,0x4e);if(outflag=1) DisplayOneChar(0,0,0x7c); elseDisplayOneChar(0,0,0xef);/*液晶显示子函数2*/void displayfun2(void)WriteCommandLCM(0x0c,1); /显示屏打开,光标不显示,不闪烁,检测忙信号DisplayListChar(0,0,str0);DisplayListChar(0,1,str1);DisplayOneChar(6,0,minite/10+0x30);DisplayOneChar(7,0,minite%10+0x30);DisplayOneChar(9,0,seconde/10+0x30);DisplayOneChar(10,0,seconde%10+0x30);DisplayOneChar(4,1,K/10+0x30); DisplayOneChar(5,1,K%10+0x30); DisplayOneChar(11,1,temp1/10+0x30); DisplayOneChar(12,1,temp1%10+0x30);DisplayOneChar(14,1,temp2/10+0x30); WriteCommandLCM(0x0f,1); /显示屏打开,光标显示,闪烁,检测忙信号 DisplayOneChar(3,0,hour/10+0x30);DisplayOneChar(4,0,hour%10+0x30);/*液晶显示子函数3*/void displayfun3(void)WriteCommandLCM(0x0c,1); /显示屏打开,光标不显示,不闪烁,检测忙信号DisplayListChar(0,0,str0);DisplayListChar(0,1,str1);DisplayOneChar(3,0,hour/10+0x30);DisplayOneChar(4,0,hour%10+0x30); DisplayOneChar(9,0,seconde/10+0x30);DisplayOneChar(10,0,seconde%10+0x30);DisplayOneChar(4,1,K/10+0x30); DisplayOneChar(5,1,K%10+0x30); DisplayOneChar(11,1,temp1/10+0x30); DisplayOneChar(12,1,temp1%10+0x30);DisplayOneChar(14,1,temp2/10+0x30); WriteCommandLCM(0x0f,1); /显示屏打开,光标显示,闪烁,检测忙信号DisplayOneChar(6,0,minite/10+0x30);DisplayOneChar(7,0,minite%10+0x30);/*液晶显示子函数4 */void displayfun4(void)WriteCommandLCM(0x0c,1); /显示屏打开,光标不显示,不闪烁,检测忙信号DisplayListChar(0,0,str0);DisplayListChar(0,1,str1);DisplayOneChar(3,0,hour/10+0x30);DisplayOneChar(4,0,hour%10+0x30); DisplayOneChar(6,0,minite/10+0x30);DisplayOneChar(7,0,minite%10+0x30);DisplayOneChar(9,0,seconde/10+0x30);DisplayOneChar(10,0,seconde%10+0x30); DisplayOneChar(11,1,temp1/10+0x30); DisplayOneChar(12,1,temp1%10+0x30);DisplayOneChar(14,1,temp2/10+0x30); WriteCommandLCM(0x0f,1); /显示屏打开,光标显示,闪烁,检测忙信号DisplayOneChar(4,1,K/10+0x30); DisplayOneChar(5,1,K%10+0x30);/*键盘扫描子函数*/void keyscan(void)uchar xx; /局部变量P1=0xff;if(P1!=0xff) delay_LCM(50);if(P1!=0xff) xx=P1;switch(xx) / 根据按键状态,调用不同的子函数case 0xfe:set_adj(); break; case 0xfd:inc_key(); break; case 0xfb:dec_key(); break; case 0xf7:ON_OFF=!ON_OFF; break;default:break; /*设定工作模式子函数*/void set_adj(void)delay_LCM(100);set+; if(set=4)set=0;/*按键加法子函数*/void inc_key(void)delay_LCM(100);switch(set)case 0:if(P1=0xf7)ON_OFF=!ON_OFF; break;case 1:hour+; if(hour=23)hour=23; break;case 2:minite+; if(minite=59)minite=59;break;case 3:K+;if(K=99)K=99; break; default:break;/*按键减法子函数*/void dec_key(void)delay_LCM(100);switch(set) case 0:if(P1=0xf7)ON_OFF=!ON_OFF; break;case 1:hour-; if(hour=0)hour=0; break;case 2:minite-;if(minite=0)minite=0;break;case 3:K-;if(K=20 )
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026浙江象山半边山紫冠投资有限公司酒店管理分公司(宁波象山海景皇冠假日酒店)招聘5人备考考试题库及答案解析
- 2026天津商业大学第一批招聘20人 (高层次人才岗位)备考考试题库及答案解析
- 2026山东事业单位统考烟台市莱山区招聘4人考试备考试题及答案解析
- 骨髓瘤患者营养支持护理
- 2026交通运输部所属事业单位第四批统一招聘24人备考考试试题及答案解析
- 2026年宁德人民医院编外人员招聘1人(一)备考考试题库及答案解析
- 失智照护区管理制度(3篇)
- 2026山东事业单位统考青岛西海岸新区招聘工作人员2人参考考试题库及答案解析
- 中美药品广告管理制度对比(3篇)
- 2026云南昭通市彝良县公安局警务辅助人员招聘6人备考考试试题及答案解析
- 2026年吉林大学附属中学公开招聘教师备考题库(4人)及参考答案详解
- 2025年大学旅游管理(旅游服务质量管理)试题及答案
- 打捆机培训课件
- 2026年浅二度烧伤处理
- 北京通州产业服务有限公司招聘考试备考题库及答案解析
- 河北省NT名校联合体2025-2026学年高三上学期1月月考英语(含答案)
- 2025-2026学年沪科版八年级数学上册期末测试卷(含答案)
- 途虎养车安全培训课件
- 卫生管理研究论文
- 委托市场调研合同范本
- 畜牧安全培训资料课件
评论
0/150
提交评论