《温度测量 红外控制 单片机》由会员分享,可在线阅读,更多相关《温度测量 红外控制 单片机(28页珍藏版)》请在金锄头文库上搜索。
1、/DS18B20 温度检测及其液晶显示#include /包含单片机寄存器的头文件#include /包含_nop_()函数定义的头文件#define AddWr 0xa0 /写数据地址,需要参考 24c02 芯片文档#define AddRd 0xa1 /读数据地址#define Data P0/数据端口unsigned char code digit10=“0123456789“; /定义字符数组显示数字unsigned char code Temp=“Temp:“; /说明显示的是温度unsigned char code Cent=“Cent“; /温度单位unsigned char T
2、L; /储存暂存器的温度低位unsigned char TH; /储存暂存器的温度高位unsigned char TN; /储存温度的整数部分unsigned char TD; /储存温度的小数部分char data Number=“ “;/*以下是对液晶模块的操作程序*/sbit RS=P34; /寄存器选择位sbit RW=P36; /读写选择位sbit E=P37; /使能信号位sbit BF=P07; /忙碌标志位, ,将 BF 位定义为 P0.7 引脚/*以下是存储定义*/sbit Sda=P16; /定义总线连接端口sbit Scl=P15;sbit WP=P10; /写保护,这里
3、不使用/*以下是红外定义*/sbit IR=P32; /红外接口标志char code Tab16=“0123456789ABCDEF“;char data TimeNum=“ “;/*/* 变量声明 */*/unsigned char irtime;/红外用全局变量bit irpro_ok,irok;unsigned char IRcord4; /处理后的红外码,分别是 客户码,客户码,数据码,数unsigned char irdata33; /33 个高低电平的时间数据/*温度以及显示相关函数*函数功能:延时 1ms(3j+2)*i=(333+2)10=1010(微秒),可以认为是 1 毫
4、秒*/void delay1ms()unsigned char i,j;for(i=0;i=1;_nop_(); /等待一个机器周期 DQ = 1; /将数据线“人为“拉高,为单片机检测 DS18B20 的输出电for(time=0;time=1; /将 dat 中的各二进制位数据右移 1 位for(time=0;time=33)/引导码 TC9012 的头码,9ms+4.5msi=0;irdatai=irtime;/存储每个电平的持续时间,用于以后判断是 0 还是1irtime=0;i+;if(i=33)irok=1;i=0;elseirtime=0;startflag=1;/*/* 定时器
5、 0 初始化 */*/void TIM0init(void)/定时器 0 初始化TMOD=0x02;/定时器 0 工作方式 2,TH0 是重装值,TL0 是初值TH0=0x00; /重载值TL0=0x00; /初始化值ET0=1; /开中断TR0=1; /*/* 外部中断初始化 */*/void EX0init(void)IT0 = 1; /指定外部中断 0 下降沿触发,INT0 (P3.2)EX0 = 1; /使能外部中断EA = 1; /开总中断/*/* 红外键值处理 */*/void Ir_work(void) /红外键值散转程序 int i=0;TimeNum3 = TabIRcord
6、0/16; /处理客户码并显示TimeNum4 = TabIRcord0%16;TimeNum6 = TabIRcord1/16; /处理客户码并显示TimeNum7 = TabIRcord1%16;TimeNum9 = TabIRcord2/16; /处理数据码并显示TimeNum10 = TabIRcord2%16;TimeNum12 = TabIRcord3/16; /处理数据反码并显示TimeNum13 = TabIRcord3%16;if(TimeNum12=BShowString(1,“ ch “);i+;while(i| “);i+;while(i| “);i+; while(i
7、7)/大于某值为 1,这个和晶振有绝对关系,这里使用 12M计算,此值可value=value|0x80;else value=value;if(j1;k+;IRcordi=value;value=0; irpro_ok=1;/处理完毕标志位置 1/*/* 写入命令函数 */*/void WriteCommand(unsigned char c)delaynms(5);/操作前短暂延时,保证信号稳定E=0;RS=0;RW=0;_nop_();E=1;Data=c;E=0;/*/* 写入数据函数 */*/void WriteData2(unsigned char c)delaynms(5); /
8、操作前短暂延时,保证信号稳定E=0;RS=1;RW=0;_nop_();E=1;Data=c;E=0;RS=0;/*/* 写入字节函数 */*/void ShowChar(unsigned char pos,unsigned char c)unsigned char p;if (pos=0x10)p=pos+0xb0; /是第二行则命令代码高 4 位为 0xcelse p=pos+0x80; /是第二行则命令代码高 4 位为 0x8WriteCommand (p);/写命令WriteData2 (c); /写数据/*/* 写入字符串函数 */*/void ShowString (unsigne
9、d char line,char *ptr)unsigned char l,i;l=line4;for (i=0;i16;i+)ShowChar (l+,*(ptr+i);/循环显示 16 个字符/*/* 初始化函数 */*/void InitLcd()delaynms(15);WriteCommand(0x38); /display modeWriteCommand(0x38); /display modeWriteCommand(0x38); /display modeWriteCommand(0x06); /显示光标移动位置WriteCommand(0x0c); /显示开及光标设置WriteC