完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
在网上找了一些51的,DS18B20的代码。刚接触N76E003,不知道怎么改。
/*所用单片机型号为STC89C52RC,晶振为11.0592MHz*/ #include #include sbit Bus=P1^1;//数据单总线 unsigned int Ds_Result();//返回最终结果 bit DS_Init();//初始化子函数 void Ds_Write(unsigned char dat);//“写”子函数(用于向总线写命令) unsigned char Ds_Read();//“读”子函数(用于从总线读值) void Ds_Change();//开始转换温度 unsigned int Get_Temp();//获取温度子函数 void Delay10us(unsigned int t);//延时10*t微秒 void Delay1ms(unsigned int t); /*ds18b20 10*t延时函数*/ void Delay10us(unsigned int t) { unsigned int i; for(i=t;i>0;i--) { _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); } } /*dsb8b20 1ms延时函数*/ void Delay1ms(unsigned int t) //误差 0us { unsigned char a,b,c; for(t;t>0;t--) for(c=1;c>0;c--) for(b=142;b>0;b--) for(a=2;a>0;a--); } /*ds18b20初始化*/ bit Ds_Init() { bit ack; Bus=0; Delay10us(60);//最小480,最大960 Bus=1; Delay10us(6);//15-60us while(Bus==0); Bus=1;//让传感器释放总线,避免影响下一步 return ack;//ack为0则响应成功 } /*ds18b20写时序*/ void Ds_Write(unsigned char dat)//一个写周期为60-120us,主机在15--45us内对信号采样 { unsigned char mask; for(mask=0x01;mask!=0;mask<<=1) { Bus=0; _nop_(); if((mask&dat)==0) { Bus=0; } else { Bus=1; } Delay10us(6);//15-60us采样 Bus=1; _nop_(); _nop_(); } } /*ds18b20读时序*/ unsigned char Ds_Read() { unsigned char dat=0; unsigned char mask,fmask; for(mask=0x01;mask!=0;mask<<=1)//一个周期需要至少60us,但采样要在15us内完成 { Bus=0; _nop_(); Bus=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); if(Bus==0)//读0 { fmask=~mask; dat=dat&fmask; } else { dat|=mask; } Delay10us(5); Bus=1; } return dat; } /*转换温度子函数*/ void Ds_Change() { Ds_Init(); Delay1ms(1); Ds_Write(0xCC);//跳过ROM寻址 Ds_Write(0x44);//启动一次温度转换 } /*ds18b20获取温度子函数*/ unsigned int Get_Temp() { unsigned int temp=0; unsigned char LSB,MSB;//用来储存数据的第八位与高八位 Ds_Init(); Delay1ms(1); Ds_Write(0xCC);//跳过寻址 Ds_Write(0xBE);//发送读值命令· LSB=Ds_Read(); MSB=Ds_Read(); temp=MSB; temp<<=8; temp|=LSB; return temp; } /*ds18b20 返回最终结果子函数*/ unsigned int Ds_Result() { float tp; unsigned int temp; Delay1ms(10);//10ms度过不稳定期 Ds_Change();//转换温度 Delay1ms(1000);//延时1s等待转化 temp=Get_Temp(); tp=temp; temp=tp*0.0625; return temp;//最终结果为temp } int main() { unsigned int temp; temp=Ds_Result();//该值即为结果 } 不能用吗?其实51的基本上可以直接拿来用 无法直接使用,改了延时都不行。以接4.7K电阻 延时函数改成了新唐的延时也是行,有没有大牛帮改一下。 |
|
相关推荐
1个回答
|
|
以下是N76E003读取DS18B20的代码,参考了您提供的51单片机的代码:
#include "N76E003.h" #include "SFR_Macro.h" #include "Function_define.h" #include "Common.h" #define DS_PIN P14 // DS18B20连接到P14 bit DS_init() // DS18B20初始化 { bit presence; DS_PIN = 1; // 主机拉高总线 Delay_us(500); DS_PIN = 0; // 主机拉低总线 Delay_us(500); DS_PIN = 1; // 主机释放总线 Delay_us(100); presence = DS_PIN; // 判断从机响应 Delay_us(400); return presence; // 返回从机响应状态 } void DS_write(unsigned char dat) // 向DS18B20写命令 { unsigned char i; for (i = 0; i < 8; i++) { DS_PIN = 0; // 主机拉低总线,开始传数据 Delay_us(5); DS_PIN = dat & 0x01; // 传送数据 Delay_us(70); DS_PIN = 1; // 主机释放总线 dat >>= 1; // 准备传下一位数据 Delay_us(5); } } unsigned char DS_read() // 从DS18B20读数 { unsigned char i, dat = 0; for (i = 0; i < 8; i++) { DS_PIN = 0; // 主机拉低总线,开始传数据 Delay_us(5); DS_PIN = 1; // 主机释放总线,开始从数据线读数 Delay_us(5); dat >>= 1; // 准备读下一位数据 if (DS_PIN) dat |= 0x80; // 从数据线读取数据 Delay_us(70); } return dat; } void DS_convert() // 向DS18B20发起温度转换 { if (!DS_init()) return; // 判断从机是否响应 DS_write(0xCC); // 发送跳过ROM操作 DS_write(0x44); // 发起温度转换命令 } int DS_get_temp() // 从DS18B20读取温度值 { unsigned char lsb, msb; int temp; if (!DS_init()) return 0; // 判断从机是否响应 DS_write(0xCC); // 发送跳过ROM操作 DS_write(0xBE); // 发送读取命令 lsb = DS_read(); // 读LSB msb = DS_read(); // 读MSB temp = (msb << 8) | lsb; // 合并温度值 temp = temp * 625 / 100; // 转换为0.1°C单位的温度值 return temp; } void main() { int temp; Set_All_GPIO_Quasi_Mode; // 全部IO设置为Quasi模式 while (1) { DS_convert(); // 向DS18B20发送转换命令 temp = DS_get_temp(); // 读取温度值 // TODO: 处理温度值,例如输出到LCD显示 } } |
|
|
|
只有小组成员才能发言,加入小组>>
788 浏览 0 评论
1151 浏览 1 评论
2527 浏览 5 评论
2860 浏览 9 评论
移植了freeRTOS到STMf103之后显示没有定义的原因?
2709 浏览 6 评论
keil5中manage run-time environment怎么是灰色,不可以操作吗?
1068浏览 3评论
193浏览 2评论
455浏览 2评论
368浏览 2评论
M0518 PWM的电压输出只有2V左右,没有3.3V是怎么回事?
453浏览 1评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-21 20:37 , Processed in 1.101591 second(s), Total 79, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号