完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
用18B20检测温度,并用显示器显示,但是仿真图出不来,求大神指教 #include # define uchar unsigned char # define uint unsigned int uchar data disdata[7]; uchar temp1,temp2; uchar d; bit flag; //正负标志位 uint temper; //温度值 ***it DS=P2^4; //74HC595 单 ***it SH_CP=P2^3; ***it ST_CP=P2^0; ***it DS1=P2^7; //74HC595级联 ***it SH_CP1=P2^6; ***it ST_CP1=P2^5; ***it RS=P1^1; //1602 ***it RW=P1^2; ***it E=P1^3; ***it DQ=P1^0; //18B20 ***it SCL=P1^4; //AT24C02 ***it SDA=P1^5; ***it SID=P1^6; //12864 ***it SCLK=P1^7; //端口定义 uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f} ; //段选 uchar code table1[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //位选 uchar code text[]={'2','0','1','6','.','0','7','.','0','8'}; //日期 2016.07.08 uchar code text1[]={0x5b,0x3f,0x06,0xfd,0x3f,0x87,0x3f,0x7f,}; //数码管日期 2016.07.08 void delay(uint m) //延时 { while(m--); } void delay1(uchar c) //延时 { unsigned char a,b; for(;c>0;c--) for(b=142;b>0;b--) for(a=2;a>0;a--); } /*********************DS18B20**********************/ init1 (void) /*初始化子程序*/ { uchar i=0; DQ=1; //DQ复位 delay(8); DQ=0; //DQ拉低 delay(80); //精确延时大于480us DQ=1; //拉高 delay(14); i=DQ; delay(20); } uchar read_date1() /*读数据子程序*/ { uchar i; uchar date=0; for(i=0;i<8;i++) { DQ=0; //给脉冲信号 date>>=1; DQ=1; //给脉冲信号 if(DQ) date|=0x80; delay(4); } return (date); } write_date1(uchar date) /*写数据子程序*/ { uchar i; for(i=0;i<8;i++) { DQ=0; date>>=1; DQ=CY; delay(5); DQ=1; } } read_temp() /*读温度并转换温度子程序*/ { init1(); write_date1(0xcc); write_date1(0x44); delay(10); init1(); write_date1(0xcc); write_date1(0xbe); temp1=read_temp(); //低位 temp2=read_temp(); //高位 temper=temp2; /*转换温度*/ temper<<=8; temper=temper|temp1; if(temper<0x0fff) flag=0; else { temper=~temper+1; flag=1; } temper=temper*(0.625);//温度值扩大10倍,精确到1位小数 return(temper); } /****************AT24C02程序***********************/ void init2 () /*初始化子程序*/ { SDA=1; delay(20); SCL=1; delay(20); } void start () /*开始信号子程序*/ { SDA=1; //SCL在高电平期间,SDA一个下降沿启动总线 delay(20); SCL=1; delay(20); SDA=0; delay(20); } void respons () /*应答信号子程序*/ { uchar j; SCL=1; delay(20); while ((SDA=1)&&(j<255)) //一段时间无应答,则不再等待 j++; SCL=0; delay(20); } void stop () /*停止信号子程序*/ { SDA=0; //SCL在高电平期间,SDA一个上升沿停止 总线 delay(20); SCL=1; delay(20); SDA=1; delay(20); } void write_date2(uchar date) /*写数据子程序*/ { //串行发送一个字节,先传最高位 uchar n,temp; temp=date; for(n=0;n<8;n++) { temp=temp<<1; //左移一位,最高位移入PSW寄存器的CY位 SCL=0; delay(20); SDA=CY; delay(20); SCL=1; delay(20); } SCL=0; delay(20); SDA=1; delay(20); } uchar read_date2() /*读数据子程序*/ { //串行接收一个字节,先接收最高位 uchar n,k; SCL=0; delay(20); SDA=1; delay(20); for(n=0;n<8;n++) { SCL=1; delay(20); k=(k<<1)|SDA; SCL=0; delay(20); } return k; //变量k中保存着接收的8位串行数据 } void write_add(char address,char date) /*写地址子程序*/ { start(); write_date2(0xa0); respons (); write_date2(address); respons (); write_date2(date); respons (); stop(); } uchar read_add(char address) /*读地址子程序*/ { char byte; start(); write_date2(0xa0); respons (); write_date2(address); respons (); start(); write_date2(0xa1); respons (); byte=read_date2(); stop(); return byte; } void temp_save () //温度存入24c02 { init2(); write_add(2,temper); } /****************1602程序***********************/ void write_595(unsigned char Data) { SH_CP=0; ST_CP=1; for (d=0;d<8;d++) { Data=Data<<1; DS=CY; SH_CP=1; delay1(5); SH_CP=0; } ST_CP=0; delay1(5); ST_CP=1; delay1(5); ST_CP=0 ; } void write_com3(unsigned char com)/*写命令子程序*/ { RS=0; RW=0; write_595(com); delay1(5); E=1; delay1(5); E=0; } void write_date3(unsigned char date)/*写数据子程序*/ { RS=1; RW=0; write_595(date); delay1(5); E=1; delay1(5); E=0; } void init3 () /*初始化子程序*/ { E=0; delay1(15); //延时较长,可跳过检查忙碌 write_com3(0x38);delay1(5); //显示模式设置 write_com3(0x0c);delay1(5); //开显示 光标不闪烁 write_com3(0x01);delay1(5); //清屏显示 write_com3(0x06);delay1(5); //光标加1 write_com3(0x80);delay1(5); //字符显示首地址 } void lcd_display(unsigned char *p)//显示 { while(*p!=' |