1602数字显示及采样

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1//1602液晶显示程序, TX-1B实验板上的1602LCD的R/W读写端接地, 即始终只写, 不读数据
2//使用1602LCD显示DS18B20转换的温度值
3#include <reg52.H>
4#include <intrins.H>
5#include <math.H>
6
7#define uchar unsigned char
8#define uint unsigned int
9sbit dula = P2^6;
10sbit wela = P2^7;
11sbit RS = P3^5; //数据/命令选择端(H/L)
13sbit LCDEN = P3^4; //使能端
14void delayUs()
16{
17 _nop_();
18}
19
20void delayMs(uint a)
21{
22uint i, j;
23for(i = a; i > 0; i--)
24for(j = 100; j > 0; j--);
25}
26
27//第一行开始地址为0x80, 第二行开始地址为0xc0;
28//写命令:RS=0, RW=0;
29void writeComm(uchar comm)
30{
31 RS = 0;
32 P0 = comm;
33 LCDEN = 1;
34 delayUs();
35 LCDEN = 0;
36 delayMs(1);
37}
38
39//写数据:RS=1, RW=0;
40void writeData(uchar dat)
41{
42 RS = 1;
43 P0 = dat;
44 LCDEN = 1;
45 delayUs();
46 LCDEN = 0;
47 delayMs(1);
48}
49
50//初始化
51//显示模式, 固定指令为00111000=0x38, 16*2显示, 5*7点阵,8位数据接口
52//显示开/关及光标设置
53//指令1: 00001DCB : D:开显示/关显示(H/L); C:显示光标/不显示(H/L), B:光标闪烁/不闪烁(H/L)
54//指令2: 000001NS :
55//N=1, 当读/写一个字符后地址指针加1, 且光标也加1; N=0则相反
56//S=1, 当写一个字符, 整屏显示左移(N=1)或右移(N=0), 但光标不移动; S=0, 整屏不
移动
57void init()
58{
59//先关闭数码管, 使两个锁存器锁存, 因开了数码管, USB电压驱动不够, 将无法使LC D正常工作
60 dula = wela = 0;
61 writeComm(0x38); //显示模式
62 writeComm(0x0c); //开显示, 关光标
63 writeComm(0x06); //写字符后地址加1, 光标加1
64 writeComm(0x01); //清屏
65}
66
67void writeString(uchar * str, uchar length)
68{
69 uchar i;
70for(i = 0; i < length; i++)
71 {
72 writeData(str[i]);
73 }
74}
75
76/*****************************DS18B20*********************** ********/
77sbit ds = P2^2;
78//初始化DS18B20
79//让DS18B20一段相对长时间低电平, 然后一段相对非常短时间高电平, 即可启动
80void dsInit()
81{
82//对于11.0592MHz时钟, unsigned int型的i, 作一个i++操作的时间大于为8us
83 unsigned int i;
84 ds = 0;
85 i = 100; //拉低约800us, 符合协议要求的480us以上
86while(i>0) i--;
87 ds = 1; //产生一个上升沿, 进入等待应答状态
88 i = 4;
89while(i>0) i--;
90}
91
92void dsWait()
93{
94 unsigned int i;
95while(ds);
96while(~ds); //检测到应答脉冲
97 i = 4;
98while(i > 0) i--;
99}
100
101//向DS18B20读取一位数据
102//读一位, 让DS18B20一小周期低电平, 然后两小周期高电平,
103//之后DS18B20则会输出持续一段时间的一位数据
104bit readBit()
105{
106 unsigned int i;
107 bit b;
108 ds = 0;
109 i++; //延时约8us, 符合协议要求至少保持1us
111 i++; i++; //延时约16us, 符合协议要求的至少延时15us以上
112 b = ds;
113 i = 8;
114while(i>0) i--; //延时约64us, 符合读时隙不低于60us要求
115return b;
116}
117
118//读取一字节数据, 通过调用readBit()来实现
119unsigned char readByte()
120{
121 unsigned int i;
122 unsigned char j, dat;
123 dat = 0;
124for(i=0; i<8; i++)
125 {
126 j = readBit();
127//最先读出的是最低位数据
128 dat = (j << 7) | (dat >> 1);
129 }
130return dat;
131}
132
133//向DS18B20写入一字节数据
134void writeByte(unsigned char dat)
135{
136 unsigned int i;
137 unsigned char j;
139for(j = 0; j < 8; j++)
140 {
141 b = dat & 0x01;
142 dat >>= 1;
143//写"1", 将DQ拉低15us后, 在15us~60us内将DQ拉高, 即完成写1
144if(b)
145 {
146 ds = 0;
147 i++; i++; //拉低约16us, 符号要求15~60us内
148 ds = 1;
149 i = 8; while(i>0) i--; //延时约64us, 符合写时隙不低于60us要求
150 }
151else//写"0", 将DQ拉低60us~120us
152 {
153 ds = 0;
154 i = 8; while(i>0) i--; //拉低约64us, 符号要求
155 ds = 1;
156 i++; i++; //整个写0时隙过程已经超过60us, 这里就不用像写1那样, 再延时64us了
157 }
158 }
159}
160
161//向DS18B20发送温度转换命令
162void sendChangeCmd()
163{
164 dsInit(); //初始化DS18B20, 无论什么命令, 首先都要发起初始化
165 dsWait(); //等待DS18B20应答
166 delayMs(1); //延时1ms, 因为DS18B20会拉低DQ 60~240us作为应答信号
167 writeByte(0xcc); //写入跳过序列号命令字 Skip Rom
168 writeByte(0x44); //写入温度转换命令字 Convert T
169}
170
171//向DS18B20发送读取数据命令
172void sendReadCmd()
173{
174 dsInit();
175 dsWait();
176 delayMs(1);
177 writeByte(0xcc); //写入跳过序列号命令字 Skip Rom
178 writeByte(0xbe); //写入读取数据令字 Read Scratchpad
179}
180
181//获取当前温度值
182int getTmpValue()
183{
184 unsigned int tmpvalue;
185int value; //存放温度数值
186float t;
187 unsigned char low, high;
188 sendReadCmd();
189//连续读取两个字节数据
190 low = readByte();
191 high = readByte();
192//将高低两个字节合成一个整形变量
193 //计算机中对于负数是利用补码来表示的
194 //若是负值, 读取出来的数值是用补码表示的, 可直接赋值给int型的value
195 tmpvalue = high;
196 tmpvalue <<= 8;
197 tmpvalue |= low;
198 value = tmpvalue;
199
200//使用DS18B20的默认分辨率12位, 精确度为0.0625度, 即读回数据的最低位代表0.0625度
201 t = value * 0.0625;
202//将它放大100倍, 使显示时可显示小数点后两位, 并对小数点后第三进行4舍5入
203 //如t=11.0625, 进行计数后, 得到value = 1106, 即11.06 度
204 //如t=-11.0625, 进行计数后, 得到value = -1106, 即-11.06 度
205 value = t * 100 + (value > 0 ? 0.5 : -0.5); //大于0加0.5, 小于0减0.5
206return value;
207}
208
209void display(int v)
210{
211 unsigned char count;
212 unsigned char datas[] = {0, 0, 0, 0, 0};
213 unsigned int tmp = abs(v);
214 datas[0] = tmp / 10000;
215 datas[1] = tmp % 10000 / 1000;
216 datas[2] = tmp % 1000 / 100;
217 datas[3] = tmp % 100 / 10;
218 datas[4] = tmp % 10;
219 writeComm(0xc0+3);
220if(v < 0)
221 {
222 writeString("- ", 2);
223 }
224else
225 {
226 writeString("+ ", 2);
227 }
228if(datas[0] != 0)
229 {
230 writeData('0'+datas[0]);
231 }
232for(count = 1; count != 5; count++)
233 {
234 writeData('0'+datas[count]);
235if(count == 2)
236 {
237 writeData('.');
238 }
239 }
240}
241/*****************************DS18B20********************** *********/
242
243void main()
244{
245 uchar table[] = "Now Temperature:";
246 sendChangeCmd();
247 init(); 248 writeComm(0x80); 249 writeString(table, 16); 250 while (1) 251 { 252 delayMs(1000); //温度转换时间需要750ms 以上 253 writeComm(0xc0);
254 display(getTmpValue());
255 sendChangeCmd();
256 } 257}
Options
Disable
What is new with Snap Shots?
1 2
3
4
5
6
7
8
9
10
11
12
博客园首页新文章新随笔订阅管理
posts - 101, comments - 110, trackbacks - 1
单片机练习- DS18B20温度转换与显示
最近都在学习和写单片机的程序, 今天有空又模仿DS18B20温度测量显示实验写了一个与DS18B20基于单总线通信的程序.
DS18B20 数字温度传感器(参考:智能温度传感器DS18B20的原理与应用)是DALLAS 公司生产的1-Wire,即单总线器件,具有线路简单,体积小的特点。

因此用它来组成一个测温系统,具有线路简单,在一根通信线,可以挂很多这样的数字温度计。

DS18B20 产品的特点:
(1)、只要求一个I/O 口即可实现通信。

(2)、在DS18B20 中的每个器件上都有独一无二的序列号。

(3)、实际应用中不需要外部任何元器件即可实现测温。

(4)、测量温度范围在-55 到+125℃之间; 在-10 ~ +85℃范围内误差为±5℃;
(5)、数字温度计的分辨率用户可以从9 位到12 位选择。

将12位的温度值转换为数字量所需时间不超过750ms;
(6)、内部有温度上、下限告警设置。

DS18B20引脚分布图
DS18B20 详细引脚功能描述:
1、GND 地信号;
2、DQ数据输入出引脚。

开漏单总线接口引脚。

当被用在寄生电源下,此引脚可以向器件提供电源;漏极开路, 常太下高电平. 通常要求外接一个约5kΩ的上拉电阻.
3、VDD可选择的VDD 引脚。

电压范围:3~5.5V; 当工作于寄生电源时,此引脚必须接地。

DS18B20存储器结构图
暂存储器的头两个字节为测得温度信息的低位和高位字节;
第3, 4字节是TH和TL的易失性拷贝, 在每次电复位时都会被刷新;
第5字节是配置寄存器的易失性拷贝, 同样在电复位时被刷新;
第9字节是前面8个字节的CRC检验值.
配置寄存器的命令内容如下:
MSB LSB
R0和R1是温度值分辨率位, 按下表进行配置.默认出厂设置是R1R0 = 11, 即12位. 温度值分辨率配置表
4种分辨率对应的温度分辨率为0.5℃, 0.25℃, 0.125℃, 0.0625℃(即最低一位代表的温度值)
12位分辨率时的两个温度字节的具体格式如下:
低字节:
高字节:
其中高字节前5位都是符号位S, 若分辨率低于12位时, 相应地使最低为0, 如: 当分辨率为10位时, 低字节为:
, 高字节不变....
一些温度与转换后输出的数字参照如下:
由上表可看出, 当输出是负温度时, 使用补码表示, 方便计算机运算(若是用C语言, 直接将结果赋值给一个int变量即可).
DS18B20 的使用方法:
由于DS18B20 采用的是1-Wire 总线协议方式,即在一根数据线实现数据的双向传输,而对单片机来说,我们必须采用软件的方法来模拟单总线的协议时序来完成对DS18B20芯片的访问。

由于DS18B20是在一根I/O线上读写数据,因此,对读写的数据位有着严格的时序要求。

DS18B20有严格的通信协议来保证各位数据传输的正确性和完整性。

该协议定义了几种信号的时序:初始化时序(dsInit()实现)、读时序(readByte())、写时序(writeB yte())。

所有时序都是将主机作为主设备,单总线器件作为从设备。

而每一次命令和数据的传输都是从主机主动启动写时序开始,如果要求单总线器件回送数据,在进行写命令后,主机需启动读时序完成数据接收。

数据和命令的传输都是低位在先。

DS18B20与单片机连接电路图:
利用软件模拟DS18B20的单线协议和命令:主机操作DS18B20必须遵循下面的顺序
1. 初始化
单线总线上的所有操作都是从初始化开始的. 过程如下:
1)请求: 主机通过拉低单线480us以上, 产生复位脉冲, 然后释放该线, 进入Rx接收模式. 主机释放总线时, 会产生一个上升沿脉冲.
DQ : 1 -> 0(480us+) -> 1
2)响应: DS18B20检测到该上升沿后, 延时15~60us, 通过拉低总线60~240us来产生应答脉冲. DQ: 1(15~60us) -> 0(60~240us)
3)接收响应: 主机接收到从机的应答脉冲后, 说明有单线器件在线. 至此, 初始化完成.
DQ: 0
2. ROM操作命令
当主机检测到应答脉冲, 便可发起ROM操作命令. 共有5类ROM操作命令, 如下表
3. 内存操作命令
在成功执行ROM操作命令后, 才可使用内存操作命令. 共有6种内存操作命令:
4. 数据处理
DS18B20要求有严格的时序来保证数据的完整性. 在单线DQ上, 有复位脉冲, 应答脉冲, 写0, 写1, 读0, 读1这6种信号类型. 除了应答脉冲外, 其它都由主机产生. 数据位的读和写是通过读、写时隙实现的.
1) 写时隙: 当主机将数据线从高电平拉至低电平时, 产生写时隙.所有写时隙都必须在60us以上, 各写时隙间必须保证1us的恢复时间.
写"1" : 主机将数据线DQ先拉低, 然后释放15us后, 将数据线DQ拉高;
写"0" : 主机将DQ拉低并至少保持60us以上.
2)读时隙: 当主机将数据线DQ从高电平拉至低电平时, 产生读时隙. 所有读时隙最短必须持续60us, 各读时隙间必须保证1us的恢复时间.
读: 主机将DQ拉低至少1us,. 此时主机马上将DQ拉高, 然后就可以延时15us后, 读取DQ即可.
源代码: (测量范围: 0 ~ 99度)
DS18B20
改进代码
两位小数, 并消除下一位对上一位的影响
(PS: 写这篇文章期间, 07年迟来的冬天过去了, 温度上升了5℃....温暖^_^)
其它参考资料:
1. 《51单片机C语言应用程序设计实例精讲》, 戴佳,戴卫恒编著,电子工业出版社。

posted on 2007-03-11 15:06 MK2阅读(1252) 评论(11)编辑收藏所属分类: S 单片机/SC
M/MCU/PLC
FeedBack:
#1楼
2007-05-14 09:15 | 唐柏林[未注册用户] 请问能不能把这个的PROTEUS仿真发给我啊,我现在急需啊,可以的话发到koolysboy1@yahoo.co 。

非常感谢!!!
回复引用查看
#2楼
2007-05-26 01:35 | majiang [未注册用户] 我现在也急需啊,可以的话发
majiang511@
非常感谢!!!
回复引用查看
#3楼
2007-07-16 12:04 | 蒲公英[未注册用户] 可以给我发DS18B20温度转换与显示的程序吗,很急需!!!!非常感谢!!
6682937ljq@邮箱
回复引用查看
#4楼
2007-07-16 12:17 | 蒲公英[未注册用户] @蒲公英
可以给我发DS18B20温度转换与显示的单片机程序吗,很急需!!!!非常感谢!!
6682937ljq@邮箱
回复引用查看
#5楼
2007-07-25 11:09 | 杨柳[未注册用户]
可以给我发DS18B20温度转换与显示的单片机程序吗,很急需!!!!非常感谢!!
yangliu8623@邮箱
回复引用查看
#6楼
2007-07-25 14:48 | 高伟[未注册用户] 知道如何读取序列号吗??我用33h读一个ds18b20得到全是0xff。

回复引用查看
#7楼
2007-07-29 16:06 | rain [未注册用户]能不能给我发一份啊,我的邮箱luanle-zxj@
回复引用查看
#8楼
2007-07-31 22:05 | 刘阳[未注册用户] 您好,请问您能否把整个电路图或者数据管显示电路发给我参考一下,谢谢!
我邮箱lh04101@,非常期盼您能帮助一下!
回复引用查看
#9楼
2007-09-14 09:20 | 刚起步![未注册用户]兄弟,帮个忙能否把整个电路图或者数据管显示电路发给我借鉴一下,我对DS18B20这个不是很熟!
我邮箱xiaoyf00@,非常期盼您能帮助一下!
回复引用查看
#10楼
2007-09-19 17:35 | 五[未注册用户]你的程序时隙有点问题,读出来的二进制码时错的
回复引用查看
#11楼
2007-10-11 09:51 | 马士尧[未注册用户
]
你好,我的实验是多点测量,想问以下CRC是如何校验的,顺便把它的程序给我借鉴一下。

谢谢!我的邮箱是www.wgy_200@
回复引用查看
刷新评论列表标题请输入标题
姓名请输入你的姓名
主页
Email
(只有博主才能看到)邮件地址无效
验证码
*
内容(请不要发表任何与政治相关的内容) 请输入评论内容
Remember
Me?
登录使用高级评论新用户注册返回页首恢复上次提交[使用Ctrl+Enter键可以直接提交]
该文被作者在2007-03-15 01:43 编辑过
相关文章:
∙大三第二学期单片机课程设计-上机篇
∙电子电路基本常识摘要
∙单片机练习-RC-5红外遥控器程序及简单制造DIY PC遥控器
∙单片机练习- 带中文字库12864LCD显示程序
∙单片机练习- 使用1602LCD显示DS18B20的温度值
∙单片机练习- I2C总线协议
∙单片机综合练习- 多功能时钟
∙单片机练习- 计时器
∙单片机练习- 定时器
∙用C51编写单片机延时函数
IT人的互动社区—ZDNetChina中文社区
服务器托管服务商:零刻数据。

That is MK2...
Come from GDUT's NetWork Engineering specialty In Automation College. in March,2005.
Contact Me by ,or Contact me Here.
站长统计
今日IP[29]
今日PV[53]
昨日IP[88]
昨日PV[132]
当前在线[1]
Subscribe in a reader
<2007年3月>日一二三四五六
25 26 27 28 1 2 3
4 5 6 7 8 910
111213 141516 17
181920 21 2223 24
252627 282930 31
1 2 3 4 5 6 7
常用链接
∙我的随笔
∙我的文章
∙我的评论
∙我的参与
∙最新评论
留言簿(2)
∙给我留言
∙查看公开留言
∙查看私人留言
我参与的团队
∙ AJAX (Atlas)学习(1/1029)
∙薪酬辅助核算系统开发(0/11)
随笔分类(183)
∙ 1 .NET 2.0/1.1 & 3.X(37)
∙ 2 AJAX(11)
∙ 3 Ajax In other way(6)
∙ 4 JavaScript 的世界(15)
∙ 5 Google(2)
∙ 6 Network Engineer(12)
∙7 NBear 学习之路(11)
∙8 DataBase(12)
∙9 Design Patterns(6)
∙ A 敏捷开发与极限编程(6)
∙ B (1)
∙ B 文章收藏(22)
∙ C Web Design&W3C(10)
∙S 单片机/SCM/MCU/PLC(15)
∙z 喂鸟(17)
随笔档案(100)∙2007年9月(2)
∙2007年8月(12)
∙2007年7月(4)
∙2007年6月(8)
∙2007年5月(4)
∙2007年4月(6)
∙2007年3月(15)
∙2007年2月(8)
∙2007年1月(9)
∙2006年12月(11)
∙2006年11月(14)
∙2006年10月(7)
文章分类(2)
∙Ajax
∙。

相关文档
最新文档