- #include <REGX52.H>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- typedef unsigned int u16; //对数据类型进行声明定义
- typedef unsigned char u8;
- sbit IRIN=P3^2;
- u8 IrValue[6];
- u8 Time;
- sbit wela = P0^7;
- sbit dula = P0^6;
- sbit EN=P2^7;//使能
- sbit RS=P2^6;//数据/命令选择端(H/L)
- sbit RW=P2^5;//读/写端(H/L)
- sbit DS1=P2^4; //DS18B20one接入口
- sbit DS2=P2^3; //DS18B20two接入口
- sbit Dcfcold=P2^2;
- sbit Dcfhot=P2^1;
- sbit Dcfmix=P2^0;
- bit f1=1; //正负温度标志位
- bit f2=1;
- unsigned char m=1,y=0,o=0;//寄存器
- unsigned int sdata1; //存放整数温度
- unsigned char xiaoshu11; //存放小数后第一位温度数值
- unsigned char xiaoshu12; //存放小数后第二位温度数值
- unsigned int sdata2; //存放整数温度
- unsigned char xiaoshu21; //存放小数后第一位温度数值
- unsigned char xiaoshu22; //存放小数后第二位温度数值
- unsigned char code huany[]=" Welcome to use "; //欢迎使用
- unsigned char code tt[] =" ter thermometer"; //温度计
- unsigned char code duqu[]=" loading... "; //读取
- unsigned char code tab1[]=" C C "; //框架
- unsigned char code tab2[]="U: C L: C ";
- unsigned char code shuzu[]="0123456789+- .*"; //数字,,10加号,,,11减号,,,12空格,,,,13点,,,,14*
- uchar u,l,p,Key_value;
- //uchar str[4];
- uchar str[4];//uchartostr函数转换的字符串 同时可以把16进制转成10进制
- /*******************************************************************************
- * 函 数 名 : delay
- * 函数功能 : 延时函数,i=1时,大约延时10us
- *******************************************************************************/
- void Irdelay(u16 i)
- {
- while(i--);
- }
- void Ir_work(void)//红外键值散转程序
- {
- switch(IrValue[2]) //判断第三个数码值
- {
- case 0x40:u++;break;
- case 0x19:u--;break;
- case 0x07:l++;break;
- case 0x09:l--;break;
- // case 0x0C:mix=1;break;
- // case 0x16:imix=0;break;
- default:break;
- }
- // irpro_ok=0;//处理完成标志
- }
- /*******************************************************************************
- * 函数名 : IrInit()
- * 函数功能 : 初始化红外线接收
- * 输入 : 无
- * 输出 : 无
- *******************************************************************************/
- void IrInit()
- {
- IT0=1;//下降沿触发
- EX0=1;//打开中断0允许
- EA=1; //打开总中断
- IRIN=1;//初始化端口
- }
- /*******************************************************************************
- * 函 数 名 : main
- * 函数功能 : 主函数
- * 输 入 : 无
- * 输 出 : 无
- *******************************************************************************/
- //void main()
- //{
- // IrInit();
- // while(1)
- // {
- // DisplayData[0] = smgduan[IrValue[2]/16];
- // DisplayData[1] = smgduan[IrValue[2]%16];
- // DisplayData[2] = smgduan[16];
- // DigDisplay();
- // }
- //}
- /*******************************************************************************
- * 函数名 : ReadIr()
- * 函数功能 : 读取红外数值的中断函数
- * 输入 : 无
- * 输出 : 无
- *******************************************************************************/
- void ReadIr() interrupt 0
- {
- u8 j,k;
- u16 err;
- Time=0;
- Irdelay(700); //7ms
- if(IRIN==0) //确认是否真的接收到正确的信号
- {
-
- err=1000; //1000*10us=10ms,超过说明接收到错误的信号
- /*当两个条件都为真是循环,如果有一个条件为假的时候跳出循环,免得程序出错的时
- 侯,程序死在这里*/
- while((IRIN==0)&&(err>0)) //等待前面9ms的低电平过去
- {
- Irdelay(1);
- err--;
- }
- if(IRIN==1) //如果正确等到9ms低电平
- {
- err=500;
- while((IRIN==1)&&(err>0)) //等待4.5ms的起始高电平过去
- {
- Irdelay(1);
- err--;
- }
- for(k=0;k<4;k++) //共有4组数据
- {
- for(j=0;j<8;j++) //接收一组数据
- {
- err=60;
- while((IRIN==0)&&(err>0))//等待信号前面的560us低电平过去
- {
- Irdelay(1);
- err--;
- }
- err=500;
- while((IRIN==1)&&(err>0)) //计算高电平的时间长度。
- {
- Irdelay(10); //0.1ms
- Time++;
- err--;
- if(Time>30)
- {
- return;
- }
- }
- IrValue[k]>>=1; //k表示第几组数据
- if(Time>=8) //如果高电平出现大于565us,那么是1
- {
- IrValue[k]|=0x80;
- }
- Time=0; //用完时间要重新赋值
- }
- }
- }
- if(IrValue[2]!=~IrValue[3])
- {
- return;
- }
- }
- }
- /**************************************/
- /*************LCD1602*****************/
- void delay(uint z) //延时函数
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=120;y>0;y--);
- }
- void write_com(uchar com) //写命令
- {
- P0=com;
- RS=0;
- EN=0;
- delay(10);
- EN=1;
- delay(10);
- EN=0;
-
- }
- void write_data(uchar date) //写数据
- {
- P0=date;
- RS=1;
- EN=0;
- delay(10);
- EN=1;
- delay(10);
- EN=0;
-
- }
- void init()
- {
- RW=0;
- dula=0;
- wela=0;
- write_com(0x38); //显示模式设置:16×2显示,5×7点阵,8位数据接口
- delay(20);
- write_com(0x0c); //显示模式设置
- delay(20);
- write_com(0x06); //显示模式设置:光标右移,字符不移
- delay(20);
- write_com(0x01); //清屏幕指令,将以前的显示内容清除
- delay(20);
- }
- uchar *uchartostr(uchar num) //将一个字节的数据转换为字符串 或10进制
- {
- uchar x2,x1,x0,i;
- x2=num/100;
- x1=num%100/10;
- x0=num%100%10;
- i=0;
- if(x2!=0)
- {
- str[i]=x2+48;
- i++;
- }
- if(x1!=0)
- {
- str[i]=x1+48;
- i++;
- }
- str[i]=x0+48;
- i++;
- str[i]='\0';
- return str;
- }
- void lcd_dis(uchar X,uchar Y,uchar *dis) //显示数据数组
- {
- uchar pos;
- switch(X)
- {
- case 0:X=0x00;break;
- case 1:X=0x40;break;
- break;
- default:break;
- }
- pos =0x80+X+Y;
- write_com(pos); //显示地址
- while(*dis!='\0')
- {
- write_data(*dis++);
- }
- }
- void delay_50us(unsigned int t) //延时函数
- {
- unsigned int j,k;
- for (;t>0;t--)
- {
- for(j=10;j>0;j--)
- {
- for(k=1;k>0;k--);
- }
- }
- }
- /////////////////////////////18B20one//////////////////////////////
- void delay_18B201(unsigned int i) //18b20全局延时
- {
- while(i--);
- }
- Init_DS18B201(void)
- {
- unsigned char x=0;
- DS1=1;//DQ复位
- delay_18B201(10);//稍做延时
- DS1=0;//单片机将DQ拉低
- delay_18B201(80);//精确延时大于480us
- DS1=1;//拉高总线
- delay_18B201(20);
- x=DS1;//稍做延时后如果x=0则初始化成功x=1则初始化失败
- delay_18B201(30);
- return x;
- }
- //读一个字节
- ReadOneChar1(void)
- {
- unsigned char i=0;
- unsigned char dat=0;
- for(i=8;i>0;i--)
- {
- DS1=0;//给脉冲信号
- dat>>=1;
- DS1=1;//给脉冲信号
- if(DS1)
- dat|=0x80;
- delay_18B201(4);
- }
- return(dat);
- }
- //写一个字节
- WriteOneChar1(unsigned char dat)
- {
- unsigned char i=0;
- for(i=8;i>0;i--)
- {
- DS1=0;
- DS1=dat&0x01;
- delay_18B201(5);
- DS1=1;
- dat>>=1;
- }
- return(dat);
- }
- void ReadTemperature1(void)
- {
- unsigned char L=0;
- unsigned char H=0;
- Init_DS18B201();
- WriteOneChar1(0xCC);//跳过读序号列号的操作
- WriteOneChar1(0x44);//启动温度转换
- delay_18B201(100);
- Init_DS18B201();
- WriteOneChar1(0xCC);//跳过读序号列号的操作
- WriteOneChar1(0xBE);//读取温度寄存器等(共可读9个寄存器前两个就是 温度
- L=ReadOneChar1(); //温度低8位
- H=ReadOneChar1(); //温度高8位
- f1=1;
- sdata1 = L/16+H*16; //整数部分
- xiaoshu11 = (L&0x0f)*10/16; //小数第一位
- xiaoshu12 =(L&0x0f)*100/16%10; //小数第二位
-
- }
- ///////////////////18B20two/////////////
- void delay_18B202(unsigned int i) //18b20全局延时
- {
- while(i--);
- }
- Init_DS18B202(void)
- {
- unsigned char x=0;
- DS2=1;//DQ复位
- delay_18B202(10);//稍做延时
- DS2=0;//单片机将DQ拉低
- delay_18B202(80);//精确延时大于480us
- DS2=1;//拉高总线
- delay_18B202(20);
- x=DS2;//稍做延时后如果x=0则初始化成功x=1则初始化失败
- delay_18B202(30);
- return x;
- }
- //读一个字节
- ReadOneChar2(void)
- {
- unsigned char i=0;
- unsigned char dat=0;
- for(i=8;i>0;i--)
- {
- DS2=0;//给脉冲信号
- dat>>=1;
- DS2=1;//给脉冲信号
- if(DS2)
- dat|=0x80;
- delay_18B202(4);
- }
- return(dat);
- }
- //写一个字节
- WriteOneChar2(unsigned char dat)
- {
- unsigned char i=0;
- for(i=8;i>0;i--)
- {
- DS2=0;
- DS2=dat&0x01;
- delay_18B202(5);
- DS2=1;
- dat>>=1;
- }
- return(dat);
- }
- void ReadTemperature2(void)
- {
- unsigned char L=0;
- unsigned char H=0;
- Init_DS18B202();
- WriteOneChar2(0xCC);//跳过读序号列号的操作
- WriteOneChar2(0x44);//启动温度转换
- delay_18B202(100);
- Init_DS18B202();
- WriteOneChar2(0xCC);//跳过读序号列号的操作
- WriteOneChar2(0xBE);//读取温度寄存器等(共可读9个寄存器前两个就是 温度
- L=ReadOneChar2(); //温度低8位
- H=ReadOneChar2(); //温度高8位
- f2=1;
- sdata2 = L/16+H*16; //整数部分
- xiaoshu21 = (L&0x0f)*10/16; //小数第一位
- xiaoshu22 =(L&0x0f)*100/16%10; //小数第二位
-
- }
- void display0()//显示welcome to use the
- {
- unsigned char i,w,h=0x8f,i1,w1,h1=0xcf,w2,i2,h2,g=2;
- init();
- for(w=0;w<16;w++) //显示欢迎
- {
- write_com(h--);//第一行自减左移
- for(i=0;i<16;i++)
- {
- write_data(huany[i]);
- delay_50us(5);
- }
- }
- for(w1=0;w1<16;w1++)//第二行自减左移
- {
- write_com(h1--);
- for(i1=0;i1<16;i1++)
- {
- write_data(tt[i1]);
- delay_50us(5);
- }
- }
-
- delay_50us(5000);//显示loading
- init();
- write_com(0x80);
- for(w2=0;w2<16;w2++)//向右显示
- {
- write_data(duqu[w2]);
- delay_50us(200);
- }
- while(g--)//小数点循环亮灭
- {
- write_com(0x8a);
- for(i2=0;i2<3;i2++)
- {
- write_data(duqu[i2]);
- }
- write_com(0x8a);
- for(h2=10;h2<14;h2++)
- {
- delay_50us(300);
- write_data(duqu[h2]);
- delay_50us(300);
- }
- }
- }
- void display1() //显示框架
- {
- unsigned char p,q;
- init();//全局清零
- write_com(0x80);
- for(q=0;q<16;q++) //显示TMHL
- {
- write_data(tab1[q]);
- }
- write_com(0xc0);
- for(p=0;p<16;p++)
- {
- write_data(tab2[p]);
- }
- write_com(0xc4);
- write_data(0Xdf);
- write_com(0xcd);
- write_data(0xdf);
- }
- void displayone(unsigned int date) //显示温度,
- {
- if(date/100==0) //100度内
- {
- write_com(0x80);
- write_data(shuzu[date/10]);//十位
- write_com(0x81);
- write_data(shuzu[date%10]);//个位
- write_com(0x82);
- write_data(shuzu[13]);//小数点
- write_com(0x83);
- write_data(shuzu[xiaoshu11]);//小数点后一位
- write_com(0x84);
- write_data(shuzu[xiaoshu12]); //小数点后二位
- write_com(0x85);
- write_data(0xdf);
- }
- }
- void displaytwo(unsigned int date) //显示温度,
- {
- if(date/100==0) //100度内
- {
- write_com(0x88);
- write_data(shuzu[date/10]);//十位
- write_com(0x89);
- write_data(shuzu[date%10]);//个位
- write_com(0x8a);
- write_data(shuzu[13]);//小数点
- write_com(0x8b);
- write_data(shuzu[xiaoshu21]);//小数点后一位
- write_com(0x8c);
- write_data(shuzu[xiaoshu22]); //小数点后二位
- write_com(0x8d);
- write_data(0xdf);
- }
- }
- //void fuhao() //温度正负子程序
- //{
- // if(f==1) //温度为正
- // {
- // write_com(0x84);
- // write_data(shuzu[12]);
- // }
- // else if(f==0) //温度为负,显示负号
- // {
- // write_com(0x84);
- // write_data(shuzu[11]);
- // }
- //}
- void key()
- {
- Key_value = P1;
- Key_value = Key_value & 0x0f;
- if ( Key_value != 0x0f )
- {
- switch(Key_value)
- {
- case 0x0e: u++; break;
- case 0x0d: u--; break;
- case 0x0b: l++; break;
- case 0x07: l--; break;
- }
- }
- }
- void compare()//温度数据比较
- {
- if(sdata1>=u) //温度大于上限,开冷关热
- {
- displayone(sdata1);
- displaytwo(sdata2);
- Dcfcold =1; //1.5
- Dcfhot =0; //1.3
- }
- else if(l>0&sdata1<=l) //温度小于下限,开热关冷
- {
- displayone(sdata1);
- displaytwo(sdata2);
- Dcfcold =0; //1.5
- Dcfhot =1; //1.4
- }
- else if(sdata1<u&sdata1>l)
- {
- displayone(sdata1);
- displaytwo(sdata2);
- Dcfcold =0; //1.5
- Dcfhot =0; //1.4
- Dcfmix =0;
- }
- else
- displayone(sdata1);
- displaytwo(sdata2);
- }
- void main()
- {
- //P1=0x00;
- u=35;
- l=20;
- IrInit();
- display0(); //欢迎,
- display1();//框架
- while(1)
- {
- lcd_dis(1,2,uchartostr( u ) );
- lcd_dis(1,11,uchartostr( l ) );
- ReadTemperature1(); //测温程序
- ReadTemperature2(); //测温程序
- // fuhao();//负号显示程序
- key(); //按键
- compare();
- Ir_work();
- }
- }
复制代码 |