完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
这是我开发板DS18B20的原理图,可以接两路DS18B20,我现在只插了一个,另一个空着 现在把这个DS12B20空着对写程序有影响吗?搞一个程序发现怎么搞都不对 程序如下 #include #include #define uchar unsigned char #define uint unsigned int #define ulong unsigned long void Init_LCD1602(void); void WriteCommandLCD(uchar Cmd); void WriteDataLCD(uchar Data); void delayms(uint x); ***it DQ = P3^2; ***it Buzz = P1^6; bit status; //声明待显示内容 uchar data Word1[] = {"DS18B20 IS OK!!!"}; uchar data Word2[] = {"TEMP: . "}; uchar data Word3[] = {"DS18B20 IS FAULT"}; uchar data Word4[] = {"PLEASE CHECK!!! "}; uchar Temp_Value[] = {0x00,0x00}; uchar Display_Digit[] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00}; //温度字符数组 uchar code CGRAM_CODE[] = {0x08,0x14,0x08,0x00,0x00,0x00,0x00,0x00}; //延时函数_us级别 void Delay(uint x) { while(--x); } //LCD1602自定义符号函数 void WriteCGRAM(void) { uchar j; WriteCommandLCD(0x40); //写CGRAM for(j = 0; j < 8; j ++) { WriteDataLCD(CGRAM_CODE[j]); } } //初始化DS18B20函数 bit Init_DS18B20(void) { DQ = 1; Delay(1); DQ = 0; Delay(60); DQ = 1; Delay(5); status = DQ; while(!DQ); //等待DQ变为高电平 return status; } //写字节函数 void WriteOneByte(uchar dat) { uchar i; DQ = 1; Delay(1); for(i = 0; i < 8; i ++) { DQ = 0; Delay(1); //1101 1101 & 0x01 DQ = dat & 0x01; Delay(5); //DS18B20采样DQ线 DQ = 1; dat >>= 1; } } //读字节函数 uchar ReadOneByte(void) { uchar i, dat = 0x00; DQ = 1; Delay(1); for(i = 0; i < 8; i ++) { DQ = 0; _nop_(); dat >>= 1; //高位放入0 DQ = 1; _nop_(); if(DQ) { dat |= 0x80; //高位放入1 } Delay(8); DQ = 1; } return dat; } //读取温度值函数 void Read_Temperature(void) { Init_DS18B20(); WriteOneByte(0xCC); WriteOneByte(0x44); Init_DS18B20(); WriteOneByte(0xCC); WriteOneByte(0xBE); Temp_Value[0] = ReadOneByte(); //温度低8位 Temp_Value[1] = ReadOneByte(); //温度高8位 } //LCD1602显示当前温度值函数 void Display_Temperature(void) { uchar i,ng = 0; uint Temp; ulong Current; if((Temp_Value[1] & 0xF8) == 0xF8) { if(Temp_Value[0] == 0) //有进制 { Temp_Value[1] = ~Temp_Value[1] + 1; } else //没有进制 { Temp_Value[1] = ~Temp_Value[1]; Temp_Value[0] = ~Temp_Value[0] + 1; } ng = 1; } Temp = ((uint)Temp_Value[1]) << 8; //强制性转换成16位,并且移至高8位 Current = (Temp + (uint)Temp_Value[0]) * 0.0625 * 10000; //1250000 Display_Digit[6] = Current / 1000000; //百位 Display_Digit[5] = Current % 1000000 / 100000; //十位 Display_Digit[4] = Current % 100000 / 10000; //个位 Display_Digit[3] = Current % 10000 / 1000; //1位小数点 Display_Digit[2] = Current % 1000 / 100; //2位小数点 Display_Digit[1] = Current % 100 / 10; //3位小数点 Display_Digit[0] = Current % 10; //4位小数点 //显示在LCD上的位置 Word2[6] = Display_Digit[6] + '0'; //百位 Word2[7] = Display_Digit[5] + '0'; //十位 Word2[8] = Display_Digit[4] + '0'; //个位 Word2[10] = Display_Digit[3] + '0'; //1位小数点 Word2[11] = Display_Digit[2] + '0'; //2位小数点 Word2[12] = Display_Digit[1] + '0'; //3位小数点 Word2[13] = Display_Digit[0] + '0'; //4位小数点 if(Display_Digit[6] == 0) Word2[6] = ' '; //百位为0不显示 if(Display_Digit[6] == 0 && Display_Digit[5] == 0) Word2[7] = ' ';//十位为0且百位为0,十位不显示 if(ng) //让“-”显示在适当位置 -15 -8 { if(Word2[7] == ' ') Word2[7] = '-'; else Word2[6] = '-'; } //在第一行里显示标题 WriteCommandLCD(0x80); for(i = 0; i < 16; i ++) { WriteDataLCD(Word1); } //在第二行显示当前温度值 WriteCommandLCD(0xC0); for(i = 0; i < 14; i ++) { WriteDataLCD(Word2); // 125.0000℃ } //显示温度符号 WriteCGRAM(); WriteCommandLCD(0xCE); WriteDataLCD(0x00); //显示°符号 WriteCommandLCD(0xCF); WriteDataLCD('C'); //显示C符号 } //显示故障信息函数 void Display_Fault(void) { uchar i; WriteCommandLCD(0x80); for(i = 0; i < 16; i ++) { WriteDataLCD(Word3); } WriteCommandLCD(0xC0); for(i = 0; i < 16; i ++) { WriteDataLCD(Word4); } } //蜂鸣器发音函数 void Pulse_Buzz(void) { uint i; for(i = 0; i < 100; i ++) { Buzz = ~Buzz; delayms(1); } Buzz = 1; delayms(80); } //主函数 void main(void) { Init_LCD1602(); Init_DS18B20(); while(1) { if(status == 0) { Read_Temperature(); Display_Temperature(); } else { Init_DS18B20(); Display_Fault(); Pulse_Buzz(); } } } 还有一个1602.c的文件就不发了吧,免得大家看着晕 这个程序的主要功能是 先开机检测 DS18B20是否能初始化,如果能,则1602第一行 显示DS18B20 IS OK!!!,第二行显示温度,检测的一句是 bit Init_DS18B20(void) 函数的返回值是否为0,0表示正常 如果DS18B20不能初始化则显示DS18B20 IS FAULT PLEASE CHECK!!! 这个程序应该没问题别人用普通开发板只有一路DS18B20的好用,到我这里就不好用了,求大神告诉为什么 先谢过了 |
|
相关推荐
6个回答
|
|
|
|
|
|
求解答啊,不要冷落了新人
|
|
|
|
应该没影响吧。你可以这样子,不要写两只的程序,你写个一只的。这两只的也是从一只变化来的。是根据接受的信号
|
|
|
|
可我写的就是一只的啊 bit Init_DS18B20(void) 这个函数开机初始化返回1,但如果把故障检测去了,就能显示温度了,为啥啊 |
|
|
|
我不久前还专门写过DS18B20注意事项,只是没人关注
|
|
|
|
路过!!!!,正在搞18b20
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
飞凌嵌入式ElfBoard EL 1板卡-i2c与从设备通讯编程示例之i2c-tools工具使用
1226 浏览 0 评论
stc15f2k60s2利用串口传输字模存储到eeprom并进行点阵显示
1453 浏览 1 评论
1457 浏览 0 评论
615 浏览 0 评论
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-串口通讯编程示例之串口编写程序
1283 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11601 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-4 11:34 , Processed in 0.601883 second(s), Total 81, Slave 64 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号