/* 程序功能:在1602液晶屏上显示当前温度 涉及芯片:1602液晶、SD18b20温度传感器 */ //***************************************************************** #include#define uint unsigned int #define uchar unsigned char sbit DQ=P0^3; sbit rs=P2^0; sbit rw=P2^1; sbit en=P2^2; uchar low,high; //====================================函数声明 //*********sd18b20******************* void delayus(uint time); void init_18b20(); void write_18b20(uchar date); uchar read_18b20(); void wndu(); //**********1602液晶************** void init_1602(); void write_com1602(uchar com); void write_date1602(uchar date); //==================================== void delayms(uint time)//毫秒级延时函数 { uint i,j; for(i=time;i>0;i--) for(j=110;j>0;j--); } void delayus(uint time)//微秒级延时函数 { while(time--); } void init_18b20()//对sd18b20的初始化 { uchar n; DQ=1; delayus(8); DQ=0; delayus(80); DQ=1; delayus(8); n=DQ; delayus(8); } /*将数据线拉为低电平产生写时间片,在数据线口拉为低电平在15微秒到60微秒间对数据 线进行数据采样.如果为高电平则为写“1”,如果为低电平则为写零。 对于主机产生的写“1”时间片的情况:数据线必须必先拉为低电平,然后被释放,是 数据线在产生时间片15微秒之内拉至高电平; 对于主机产生的写“0”时间片的情况:数据线必须被拉至逻辑电平并且保持低电平60个微秒*/ void write_18b20(uchar com) { uint i; for(i=0;i<8;i++) { DQ=0; //delayus(4); DQ=com&0x01; delayus(10); DQ=1; com>>=1; delayus(4); } delayus(4); } /*从ds18b20读数据时,主机产生读时间片。当主机把数据线从逻辑高电平拉至低电平时,产生 读时间片。数据线必须保持在逻辑低电平至少1个微秒。来至ds18b20的数据在读时间下降沿之 后15微秒有效。因此,为了读出从时间片开始15微秒的状态,主机必须停止保持数据线为逻辑 低电平。*/ uchar read_18b20() { uint i; uchar date=0x00; for(i=0;i<8;i++) { DQ=0; date>>=1; DQ=1; if(DQ)date|=0x80; delayus(4); DQ=1; delayus(4); } return date; } void wendu() { init_18b20(); write_18b20(0xcc);//跳过ROM write_18b20(0x44);//启动温度测量 delayus(300); init_18b20(); write_18b20(0xcc);//跳过ROM write_18b20(0xbe);//读取温度 low=read_18b20(); //先读低八位 high=read_18b20();//后读高八位 } void xianshi() { uchar a,b,c,d; float m,n=0.0625; high<<=4; high+=(low&0xf0)>>4; m=(low%10)*n; delayus(4); write_com1602(0x80+0x03); a=high/10; //显示十位上的数 write_date1602(0x30+a); delayms(5); write_com1602(0x80+0x04); b=high%10; //显示个位上的数 write_date1602(0x30+b); delayms(5); write_com1602(0x80+0x06); c=(int)(m*10); //小数点后一位 write_date1602(0x30+c); delayms(5); d=(int)(m*100)%10; //小数点后第二位 write_com1602(0x80+0x07); write_date1602(0x30+d); delayms(5); write_com1602(0x80+0x08); write_date1602(0x27); delayms(5); write_com1602(0x80+0x09); write_date1602('C'); delayms(5); write_com1602(0x80+0x05); write_date1602(0x2e); delayms(5); } void main() { init_1602(); while(1) { wendu(); xianshi(); } } void init_1602() { en=0; rw=0; write_com1602(0x28); delayms(5); write_com1602(0x01); delayms(5); write_com1602(0x0c); delayms(5); write_com1602(0x06); delayms(5); } void write_com1602(uchar com) { uchar gao,di; gao=com&0xf0; di=(com<<4)&0xf0; delayms(5); P2=gao; rs=0; delayms(5); en=1; delayms(5); en=0; delayms(5); P2=di; rs=0; delayms(5); en=1; delayms(5); en=0; delayms(5); } void write_date1602(uchar date) { uchar gao,di; gao=date&0xf0; di=(date<<4)&0xf0; delayms(5); P2=gao; rs=1; delayms(5); en=1; delayms(5); en=0; delayms(5); P2=di; rs=1; delayms(5); en=1; delayms(5); en=0; delayms(5); }
上一篇:基于74hc595芯片数码管独立按键的应用
下一篇:TLC5615信号发生器程序-正弦波,锯齿波,方波,三角波
推荐阅读最新更新时间:2024-03-16 14:26