




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、#include<reg52.h>#include<intrins.h>#include <math.h>#define uchar unsigned char#define uint unsigned intuchar code table="-Figo" 。sbit lcden=P34 。sbit lcdrs=P35 。sbit dula=P26 。sbit wela=P27 。sbit ds=P17 。sbit key1=P10 。sbit key2=P11 。sbit key3=P12 。sbit key4=P13 。int te
2、mpValue 。int s_1=1000 。unsigned char FunKeyFlag=6,keypress 。#define key_vaule1 0x01#define key_vaule2 0x02#define key_vaule3 0x03#define key_vaule4 0x04uchar num。int ms_10=10 。int flag=0 。int s_1_1=1000 。uint sec=55 。uint min=9 。uint hour=22 。uint nian=2014 。uint yue=8 。uint ri=20 。uint xingqi=3 。/延
3、时函数 , 对于 11.0592MHz 时钟 , 例 i=10, 则大概延时10ms.void delay_wendu(unsigned int i)unsigned int j 。while(i-)1/12for(j = 0 。 j < 125 。 j+) 。/初始化 DS18B20/让 DS18B20 一段相对长时间低电平, 然后一段相对非常短时间高电平, 即可启动void dsInit()/对于 11.0592MHz 时钟 , unsigned int 型的 i, 作一个 i+ 操作的时间大于?usunsigned int i 。ds = 0。i = 100 。 /拉低约 800u
4、s, 符合协议要求的480us 以上while(i>0) i- 。ds = 1。 /产生一个上升沿, 进入等待应答状态i = 4 。while(i>0) 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
5、+ 。/延时约 8us, 符合协议要求至少保持1usds = 1。i+ 。 i+ 。/ 延时约 16us, 符合协议要求的至少延时15us 以上b = ds。i = 8 。while(i>0) i- 。 /延时约 64us, 符合读时隙不低于60us 要求return b。/读取一字节数据, 通过调用 readBit() 来实现unsigned char readByte()2/12unsigned int i 。unsigned char j, dat 。dat = 0。for(i=0 。 i<8 。 i+)j = readBit() 。/最先读出的是最低位数据dat = (j
6、<< 7) | (dat >> 1) 。return dat。/向 DS18B20 写入一字节数据void writeByte(unsigned char dat)unsigned int i 。unsigned char j。bit b 。for(j = 0 。 j < 8 。 j+)b = dat & 0x01 。dat >>= 1 。/写 "1", 将 DQ 拉低 15us 后, 在 15us60us 内将 DQ 拉高 , 即完成写1if(b)ds = 0。i+ 。i+ 。 /拉低约 16us, 符号要求1560us
7、内ds = 1。i = 8 。while(i>0)i- 。 /延时约 64us, 符合写时隙不低于60us 要求else /写"0", 将 DQ 拉低 60us120usds = 0。i = 8 。 while(i>0) i- 。 / 拉低约 64us, 符号要求ds = 1。i+ 。i+ 。/ 整个写 0 时隙过程已经超过60us, 这里就不用像写1 那样 , 再延时 64us 了/向 DS18B20 发送温度转换命令void sendChangeCmd()3/12dsInit() 。 /初始化 DS18B20, 无论什么命令 , 首先都要发起初始化dsWai
8、t()。 /等待 DS18B20 应答delay_wendu(1) 。 /延时 1ms, 因为 DS18B20 会拉低 DQ 60240us 作为应答信号writeByte(0xcc) 。 /写入跳过序列号命令字Skip RomwriteByte(0x44) 。 /写入温度转换命令字Convert T/向 DS18B20 发送读取数据命令void sendReadCmd()dsInit() 。dsWait()。delay_wendu(1) 。writeByte(0xcc) 。 /写入跳过序列号命令字Skip RomwriteByte(0xbe) 。 /写入读取数据令字Read Scratchp
9、ad/获取当前温度值int getTmpValue()unsigned int tmpvalue 。int value 。 /存放温度数值float t 。unsigned char low, high 。sendReadCmd()。/连续读取两个字节数据low = readByte() 。high = readByte() 。/将高低两个字节合成一个整形变量/计算机中对于负数是利用补码来表示的/若是负值 , 读取出来的数值是用补码表示的, 可直接赋值给int 型的 valuetmpvalue = high 。tmpvalue <<= 8 。tmpvalue |= low 。val
10、ue = tmpvalue 。/使用 DS18B20 的默认分辨率 12 位 , 精确度为 0.0625 度 , 即读回数据的最低位代表 0.0625 度t = value * 0.0625 。/将它放大100 倍 , 使显示时可显示小数点后两位, 并对小数点后第三进行4 舍 5 入/如 t=11.0625, 进行计数后 , 得到 value = 1106, 即 11.06 度/如 t=-11.0625, 进行计数后 , 得到 value = -1106, 即 -11.06 度value = t * 100 + (value > 0 ? 0.5 : -0.5) 。 /大于 0 加 0.5
11、, 小于 0 减 0.5 return value 。4/12void HandleKeyPress()。void KeyScan()/按键扫描static unsigned char state=0。unsigned char temp。if (key1=0) temp=key_vaule1 。else if (key2=0) temp=key_vaule2 。else if (key3=0) temp=key_vaule3 。else if (key4=0) temp=key_vaule4 。else temp=0。switch (state)case 0: if(temp!=0) sta
12、te=1 。break。case 1: state=2。 break。case 2: if(temp!=0) state=3 。keypress=temp。 else state=0 。 break。case 3: if(temp=0) HandleKeyPress() 。 state=0。 break 。void HandleKeyPress()/按键功能的设置 if (keypress=key_vaule1)/功能键的设置FunKeyFlag=(FunKeyFlag+1)%7 。else if (keypress=key_vaule2)/第二个按键的设置switch (FunKeyFlag
13、)case 0:hour+。 if(hour>23)hour=0 。break。case 1:min+ 。 if(min>59)min=0 。 break。case 2:sec+。 if(sec>59)min=0 。break。case 3:ri+ 。 xingqi+ 。 if(ri>30)ri=1 。if(xingqi>7)xingqi=1。 break。case 4:yue+。 if(yue>12)yue=1 。 break。case 5:nian+。 break。else if (keypress=key_vaule3)/第三个按键的设置switch
14、(FunKeyFlag)5/12case 0:hour-。if(hour<0)hour=23 。 break。case 1:min-。if(min<0)min=59 。 break。case 2:sec-。 if(sec<0)sec=59 。 break。case 3:ri-。 xingqi- 。 if(ri<1)ri=31 。 if(xingqi<1)xingqi=1。 break。case 4:yue-。 if(yue<1)yue=12 。 break。case 5:nian-。 break。else if (keypress=key_vaule4)/第
15、四个按键的设置switch (FunKeyFlag)case 0:hour=0。 break。case 1:min=0。 break。case 2:sec=0。break。case 3:ri=1。 xingqi=1 。 break。case 4:yue=1。 break。case 5:nian=2000。 break。void delay(uint z)uint x,y 。for(x=z 。 x>0。 x-)for(y=110 。 y>0。 y-) 。void write_com(uchar com)lcdrs=0 。P0=com。delay(5) 。lcden=1。delay(5
16、) 。lcden=0。void write_data(uchar date)lcdrs=1 。P0=date。6/12flag=1 。delay(5) 。lcden=1。delay(5) 。lcden=0。shijian_show(uchar wei,shijian )uchar shi,ge。shi=shijian/10 。ge=shijian%10 。write_com(0x80+0x40+wei) 。write_data(0x30+shi) 。write_data(0x30+ge) 。rili_show(uchar wei,rili )uchar shi,ge。shi=rili/10 。
17、ge=rili%10 。write_com(0x80+wei) 。write_data(0x30+shi) 。write_data(0x30+ge) 。nian_show(uchar wei,shijian )uchar shi,ge,qian,bai 。qian=shijian/1000 。bai=shijian%1000/100 。shi=shijian%100/10 。ge=shijian%10 。write_com(0x80+wei) 。write_data(0x30+qian) 。write_data(0x30+bai) 。write_data(0x30+shi) 。write_da
18、ta(0x30+ge) 。wendu_show(uchar wei,int wendu )uchar shi,ge,qian,bai,xiao 。qian=wendu/10000 。7/12bai=wendu%10000/1000 。shi=wendu%1000/100 。ge=wendu%100/10 。xiao=wendu%10 。write_com(0x80+0x40+wei) 。write_data(0x30+qian) 。write_data(0x30+bai) 。write_data(0x30+shi) 。/ write_com(0x80+0x40+wei+1) 。write_da
19、ta(0xdf) 。write_data(0x30+ge) 。write_data(0x30+xiao) 。void init()P0=0。dula=0。wela=0 。lcden=0。write_com(0x38) 。write_com(0x0c) 。write_com(0x06) 。write_com(0x01) 。void week_show()/ 星期的显示write_com(0x80+12) 。switch (xingqi)case 1:write_data('M') 。write_data('o') 。write_data('n')
20、。break 。case 2:write_data('T') 。write_data('u') 。write_data('e') 。break 。case 3:write_data('W') 。8/12write_data('e') 。write_data('d') 。break 。case 4:write_data('T') 。write_data('h') 。write_data('u') 。break 。case 5:write_data(
21、9;F') 。write_data('r') 。write_data('i') 。break 。case 6:write_data('S') 。write_data('a') 。write_data('t') 。break 。case 7:write_data('S') 。write_data('u') 。write_data('n') 。break 。void main()TMOD = 0x01 。TH0 = (65536-1000)/256 。TL0 =
22、(65536-1000)%256 。EA=1。ET0 = 1。TR0 = 1。init() 。while(1)nian_show(1,nian) 。rili_show(6,yue) 。rili_show(9,ri) 。shijian_show(0,hour) 。shijian_show(3,min) 。shijian_show(6,sec) 。9/12write_com(0x80+5) 。write_data(0x2d) 。write_com(0x80+8) 。write_data(0x2d) 。write_com(0x80+0x40+2) 。write_data(0x3A) 。write_com(0x80+0x40+5) 。write_data(0x3A) 。week_show() 。wendu_show(10,tempValue)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年投资促进机构行业当前发展现状及增长策略研究报告
- 收料员基础知识培训课件
- 支教面试课件内容
- 2025年管理学专业(客户关系维护与管理)职业技能资格知识考试题与答案
- 2025年社会工作者之初级社会工作实务真题练习试卷A卷附答案
- 2025护士资格证考试试题(含答案)
- 摩托车维修安全知识培训课件
- 摄影线下实拍课件
- 江西省抚州市2024-2025学年八年级下学期期末语文试题(解析版)
- 摄影店装修基础知识培训课件
- 2025年秋招:新媒体运营笔试题目及答案
- 工作总结及工作思路(输电运维班)
- 气管及支气管内插管
- Unit 14 I remember meeting all of you in Grade 7(大单元教材分析)教学课件 人教新目标九年级英语全册
- 2025年高处吊篮安装拆卸工(建筑特殊工种)证考试题库
- 2025年新云南会计灵活用工协议书
- 2024年扬州市辅警真题
- 食材配送 售后服务方案
- 超声医学心包填塞诊断与应用
- 安全操作规程修订要求
- 2025年初中音乐教师招聘考试试卷含答案(三套)
评论
0/150
提交评论