




已阅读5页,还剩4页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
单片机ds18b20温度计c语言程序 (2008-09-27 17:01:06) #include #include #include /要用到取绝对值函数abs()/通过ds18b20测试当前环境温度, 并通过数码管显示当前温度值, 目前显示范围: -55 +125度 sbit wela = p27; /数码管位选 sbit dula = p26; /数码管段选 sbit ds = p22; int tempvalue; /0-f数码管的编码(共阳极) unsigned char code table=0xc0,0xf9,0xa4,0xb0,0x99, 0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e; /0-9数码管的编码(共阳极), 带小数点 unsigned char code tablewidthdot=0x40, 0x79, 0x24, 0x30,0x19, 0x12, 0x02,0x78, 0x00, 0x10; /延时函数, 对于11.0592mhz时钟, 例i=10,则大概延时10ms. void delay(unsigned int i) unsigned int j; while(i-) for(j = 0; j 0) i-; ds = 1; /产生一个上升沿, 进入等待应答状态 i = 4; while(i0) i-; void dswait() unsigned int i; while(ds); while(ds); /检测到应答脉冲 i = 4; while(i 0) i-;/向ds18b20读取一位数据/读一位, 让ds18b20一小周期低电平, 然后两小周期高电平,/之后ds18b20则会输出持续一段时间的一位数据bit readbit() unsigned int i; bit b; ds = 0; i+; /延时约8us, 符合协议要求至少保持1us ds = 1; i+; i+; /延时约16us, 符合协议要求的至少延时15us以上 b = ds; i = 8; while(i0) i-; /延时约64us, 符合读时隙不低于60us要求 return b;/读取一字节数据, 通过调用readbit()来实现unsigned char readbyte() unsigned int i; unsigned char j, dat; dat = 0; for(i=0; i8; i+) j = readbit(); /最先读出的是最低位数据 dat = (j 1); return dat;/向ds18b20写入一字节数据void writebyte(unsigned char dat) unsigned int i; unsigned char j; bit b; for(j = 0; j = 1; /写1, 将dq拉低15us后, 在15us60us内将dq拉高, 即完成写1 if(b) ds = 0; i+; i+; /拉低约16us, 符号要求1560us内 ds = 1; i = 8; while(i0) i-; /延时约64us, 符合写时隙不低于60us要求 else /写0, 将dq拉低60us120us ds = 0; i = 8; while(i0) i-; /拉低约64us, 符号要求 ds = 1; i+; i+; /整个写0时隙过程已经超过60us, 这里就不用像写1那样, 再延时64us了 /向ds18b20发送温度转换命令void sendchangecmd() dsinit(); /初始化ds18b20, 无论什么命令, 首先都要发起初始化 dswait(); /等待ds18b20应答 delay(1); /延时1ms, 因为ds18b20会拉低dq 60240us作为应答信号 writebyte(0xcc); /写入跳过序列号命令字 skip rom writebyte(0x44); /写入温度转换命令字 convert t/向ds18b20发送读取数据命令void sendreadcmd() dsinit(); dswait(); delay(1); writebyte(0xcc); /写入跳过序列号命令字 skip rom writebyte(0xbe); /写入读取数据令字 read scratchpad/获取当前温度值int gettmpvalue() unsigned int tmpvalue; int value; /存放温度数值 float t; unsigned char low, high; sendreadcmd(); /连续读取两个字节数据 low = readbyte(); high = readbyte(); /将高低两个字节合成一个整形变量 /计算机中对于负数是利用补码来表示的 /若是负值, 读取出来的数值是用补码表示的, 可直接赋值给int型的value tmpvalue = high; tmpvalue 0 ? 0.5 : -0.5); /大于0加0.5, 小于0减0.5 return value;unsigned char const timecount = 3; /动态扫描的时间间隔/显示当前温度值, 精确到小数点后一位/若先位选再段选, 由于io口默认输出高电平, 所以当先位选会使数码管出现乱码void display(int v) unsigned char count; unsigned char datas = 0, 0, 0, 0, 0; unsigned int tmp = abs(v); datas0 = tmp / 10000; datas1 = tmp % 10000 / 1000; datas2 = tmp % 1000 / 100; datas3 = tmp % 100 / 10; datas4 = tmp % 10; if(v 0) /关位选, 去除对上一位的影响 p0 = 0xff; wela = 1; /打开锁存, 给它一个下降沿量 wela = 0; /段选 p0 = 0x40; /显示-号 dula = 1; /打开锁存, 给它一个下降沿量 dula = 0; /位选 p0 = 0xfe; wela = 1; /打开锁存, 给它一个下降沿量 wela = 0; delay(timecount); for(count = 0; count != 5; count+) /关位选, 去除对上一位的影响 p0 = 0xff; wela = 1; /打开锁存, 给它一个下降沿量 wela = 0; /段选 if(count != 2) p0 = tabledatascount; /显示数字 else p0 = tablewidthdotdatascount; /显示带小数点数字 dula = 1; /打开锁存, 给它一个下降沿量 dula = 0; /位选 p0 = _crol_(0xfd, count); /选择第(count + 1) 个数码管 wela = 1; /打开锁存, 给它一个下降沿量 wela = 0; delay(timecount); void main() unsigned char i; while(1) /启动温度转换 sendchangecmd(); /显示5次 for(i = 0; i 40; i+) display(tempvalue); tempvalue = gettmpvalue(); 1.18b20跳过查询序列号是因为一般都是单个应用,18b20只是自带唯一的id,而不是唯一的地址,所以除非你用之前先把每个的id读出来存起来,否则是不能一线多个器件一起用的,也就是为什么大多数都是直接skip掉,因为很少会采用它的那个多器件寻址功能。2.0xcc就是跳过序列号的命令,0x44就是启动温度转换的命令,建议你看看18b20的datasheet。3.nop就是机器执行一下空指令,一般都是延迟用的,如果单片机是12mhz的标准51,一个nop指令可以延迟1us。#include #include #define uchar unsigned char#define uint unsigned intsbit dq=p37; sbit s1=p10;sbit s2=p11;uchar temp;uchar du();void xie(uchar dat);void ds1820();void delay(uint t);bit flag;uchar duwendu();void yanshi();uint a=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f; void yanshi(void) uchar a,b,c; for(c=167;c0;c-) for(b=171;b0;b-) for(a=16;a0;a-); _nop_ (); void yanshi1(void) unsigned char a,b; for(b=35;b0;b-) for(a=25;a0;a-);void delay(uint t)while(t-); void ds1820() dq=1; _nop_(); dq=0; delay(80); /530us_nop_();dq=1; delay(14); /delay 100 us/14_nop_();_nop_();_nop_();if(dq=0)flag = 1; /detect 1820 success!elseflag = 0; /detect 1820 fail! delay(20); /20 _nop_(); _nop_(); dq = 1; void xie(uchar dat)uint i; for(i=0;i=1; delay(4); uchar du() uchar i,va; for(i=0;i=1; dq=1; if(dq)va|=0x80; delay(4); return va; uchar duwendu()uchar a,b;ds1820();xie(0xcc); /跳过
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 海藻肥的技术标准
- 2025年陕西货运从业资格证考试题目和答案解析
- 2025年辽宁a2货运从业资格证考试
- 当归生物学特征
- 乡镇人才工作情况汇报编排
- 16鲁滨孙漂流记76670
- 中学七年级数学上册《25-有理数的减法》课件-(新版)北师大版
- 全国安全交通日观后感
- 管理工作方案
- 低温液体储槽操作培训
- (机械创新设计论文)
- GB/T 39802-2021城镇供热保温材料技术条件
- GB/T 2792-2014胶粘带剥离强度的试验方法
- GB/T 21566-2008危险品爆炸品摩擦感度试验方法
- GB/T 215-2003煤中各种形态硫的测定方法
- GB/T 17492-2012工业用金属丝编织网技术要求和检验
- GB/T 17207-2012电子设备用固定电容器第18-1部分:空白详细规范表面安装固体(MnO2)电解质铝固定电容器评定水平EZ
- GB/T 16886.7-2001医疗器械生物学评价第7部分:环氧乙烷灭菌残留量
- 国开电大《人员招聘与培训实务》形考任务4国家开放大学试题答案
- 铁路职工政治理论应知应会题库
- 中考复习确定二次函数的解析式课件
评论
0/150
提交评论