完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
请教大神指教一下
#include #include #define uchar unsigned char #define uint unsigned int ***it dq=P1^3; ***it wela=P2^7; ***it dula=P2^6; //定义整型的温度数据 //float f_temp;//定义浮点型型的温度数据 uchar code table[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; uchar shi,ge; uchar temp; void delay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } bit init_ds()//ds18b20复位,初始化函数 { bit dat; uchar k; dq=1; k=2; while(k>0)k--; dq=0;//将数据线拉低 k=80;//延时范围在480~960us之间 while(k>0)k--; dq=1;//再次拉高 k=5; //15~60us后接收60~240us的存在脉冲 while(k>0)k--; dat=dq;//如果dq=0则说明有期间响应即温度传感器是好的,dq=1则说明温度传感器是坏的 k=1;//稍作延时返回 while(k>0)k--; return dat; } uchar readonechar(void)//读一个字节 { uchar k; uchar j; uchar dat; dq=1; k=2; while(k>0)k--; for(j=0;j<8;j++)//一个字节分八位读取 { dq=0;//拉低dq总线开始读取时序 dat>>=1;//右移一位后的值 dq=1;//拉高,为单片机检测ds18b20的输出电平做准备 k=2; //使主机在15us中采样 while(k>0)k--; if(dq)//读取一位数据 即采样 dat=dat|0x80;//如果读到的数据是1,则将1存入dat,如果是0则保持原数据不变 k=1; //两个读时序之前必须有大于1us的恢复期 while(k>0)k--; } return (dat); } void writeonechar(uchar dat)//写一个字节 { uchar k; uchar j; for(j=0;j<8;j++)//一个字节分八位读取 { dq=0;//将数据从高拉低时即启动写时序 dq=dat&0x01;//将数据放置在数据线上,最低位先写入 k=8;//写0时序时,单总线要被拉低至少60us while(k>0)k--; dq=1; dat>>=1;//将dat数据中的各二进制位数据右移1位 } k=2; while(k>0)k--; } uchar read_temperature(void)//读取温度 { uchar k; uchar a=0; uchar b=0; uchar t=0; init_ds(); writeonechar(0xcc);//跳过读序号列号的操作 writeonechar(0x44);//启动温度转换 k=10; while(k>0)k--; init_ds(); writeonechar(0xcc);//跳过读序号列号的操作 writeonechar(0xbe);//读取温度寄存器(共可读九个寄存器)前两个分别是温度的高位和低位 k=10; while(k>0)k--; a=readonechar();//读取温度值低位 b=readonechar();//读取温度值高位 t=b; t<<=4; t=+(a&0xf0)>>4; return t;//将数据都放b里面 } void display_ds(void) { dula=1; P0=table[temp/10]; dula=0; P0=0xff; wela=1; P0=0xfe; wela=0; delay(5); dula=1; P0=table[temp%10]; dula=0; P0=0xff; wela=1; P0=0xfd; wela=0; delay(5); } void main() { while(1) { temp=read_temperature(); display_ds(); } } |
|
相关推荐
6个回答
|
|
看你的程序是显示两位温度值,你先人工随意给几个温度值,看是否能显示,如果能正确显示,那就是读取温度部分有错了
|
|
|
|
很明显温度没传过去
|
|
|
|
我试过了,可以显示,说明不是显示程序的问题 |
|
|
|
|
|
|
|
|
|
|
|
温度可以实现了,
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
524 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
1067 浏览 1 评论
LL库F030进行3个串口收发,2个串口为232,一个为485,长时间后,会出现串口1停止运行,另外两个正常,只有重启复原
1544 浏览 1 评论
530 浏览 0 评论
1061 浏览 0 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-7 11:18 , Processed in 0.715066 second(s), Total 85, Slave 67 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号