




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、一、数字钟设计1.1课程设计目的 了解数字钟的组成及其工作原理; 巩固、加深和扩大单片机应用的知识面,提高综合及灵活运用所学知识解 决实际问题的能力; 培养针对课题需要,选择和查阅有关手册、图表及文献资料的自学能力,提高组成系统、编程、调试的动手能力; 通过对课题设计方案的分析、选择、比较,熟悉单片机应用系统的开发。研制的过程,掌握软件设计的方法、内容及步骤; 通过对单片机程序的设计,基本掌握51单片机开发系统的操作、编程技巧,完成数字钟的控制功能,掌握寄存器/定时器与中断的使用,实现对单片机的了解从感性认识上升为理性认识。1.2课程设计的设计任务和基本要求 设计任务 掌握at89c51实验开
2、放系统中的实验模块原理,画出电路原理图; 综合运用实验模块,用at89c51开发设计具有一定功能的单片机控制系统,进行软件的设计与调试; 基本要求 能直接显示时、分、秒的数字钟,要求二十四为一计数周期。 当电路发生走时误差时,要求电路具有校时功能。 设计数字电子钟,电子钟时间格式为:xx-xx-xx,由左向右分别为:时、分、秒。完成显示由秒01一直加1至59,再恢复为00;分由00一直加1至59,再恢复为00;分由00一直加1至59,再恢复为00。 设计数字电子钟,电子钟日期格式为:xx-xx-xx,开机显示当日设计日期11-06-09,由左向右分别为:年、月、日。完成显示由日01一直加1至3
3、0(28,29,31因具体情况而定),再恢复为00;月由01一直加1至12,再恢复为00;年则一直进行累加运算。 设计控制按键k0实现计时、时间与日期的切换功能,k1实现按键转移进而进行校时的功能,k2,k3,分别实现加1、减1的功能。1.3课程设计原理 数字钟实际上是一个对标准频率(1hz)进行计数的计数电路。标准的频率时间信号必须做到准确稳定,通常使用石英晶体振荡电路构成数字钟。本次课程设计的内容是设计一个多功能的数字钟,要综合实现时间校准,正常计时,显示日期、时间显示与日期显示切换等功能。 多功能数字钟就是基于单片机的特性来实现其功能的。本系统采用的单片机是at89s51型号。主要实现可
4、调整时间的24小时数字钟。电路设计时,采用了8个数码管,4个按键开关,本系统需实现4个功能,所以需要通过按键进行切换。 数字钟是一种精确计算时间的仪器,需要较高的精度,并要削去人为的抖动,防止因此产生的延时误差。所以开始设置初时置为00,等待按键按下,有键按下,就开始计时,特此在编程设计时,应加入延时去抖动的子函数,计数单元则采用中断定时方式,对于校时部分,一般都是手动进行,通过按键来控制时、分、秒的快速校准。至于,显示时间的部分可由8位数码管来完成。1.4课程设计的电路原理图 按键的开关状态通过一定的电路转换为高、低电平状态。按键闭合过程在相应的i/o端口形成一个负脉冲。闭合和释放过程都要经
5、过一定的过程才能达到稳定,这一过程是处于高、低电平之间的一种不稳定状态,称为抖动。抖动持续时间的长短与开关的机械特性有关,一般在5-10ms之间。为了避免cpu多次处理按键的一次闭合,应采用措施消除抖动。本次课程设计采用的是独立式按键,直接用i/o口线构成单个按键电路,每个按键占用一条i/o口线,每个按键的工作状态不会产生互相影响。 时钟是单片机的心脏,单片机各功能部件的运行都是以时钟频率为基准,有条不紊的一拍一拍地工作。因此,时钟频率直接影响单片机的速度,时钟电路的质量也直接影响单片机系统的稳定性。常用的时钟电路有两种方式:一种是内部时钟方式,另一种为外部时钟方式。本次课程设计采用的是内部时
6、钟方式。图1 总电路图 基于以上电路图,数字钟的操作如下:按键k0状态1:k0=1,数字钟正常时钟显示状态。状态2:k0=2,数字钟调整时钟状态。状态3:k0=3,数字钟正常日期显示状态。状态4:k0=4,数字钟调整日期状态。按键k1状态1:k1=1,调整数字钟的时/年值。状态2:k1=2,调整数字钟的分/月值。状态3:k1=3,调整数字钟的秒/日值。状态4:k1=4,数字钟复位。按键k2:状态1:k2=1,调整数字钟的值,完成加一操作。按键k3:状态1:k3=1,调整数字钟的值,完成减一操作。说明:状态n次表示该键按下n次。1.5课程设计的参考流程图设计过程流程图: 在本次课程设计中,首先我
7、们在电脑上应用keil软件,进行数字钟程序的编程和编译,然后使用protues软件绘制好本次课程设计的电路原理图,程序调试完毕,编译没问题后,我们再通过应用protues软件进行软件仿真,在protues已绘制好的电路原理图中,调入已编译好的目标代码文件:*.hex,然后可以在protues的电路原理图中看到模拟的实物运行状态和过程,并进行测试,并分析程序,直到完成要求为止。 本次课程设计的软件程序包括主程序、中断主程序、时钟显示程序和延时子程序等等。另外由于电路中有四个按键,还另外设计了防抖动程序来防止干扰。它们的流程图如下所示,主程序是先开始,然后启动定时器,定时器启动后再进行按键检测,检
8、测完后就可以显示时间。 时间的运行依靠定时中断子程序对时钟单元数值进位调整来实现的。计数器t0打开后,进入计时,满50毫秒后,重装定时。中断一次,定时器中断时是先检测1秒是否到,1秒如果到,秒单位进位,满60秒后即为1分钟,分钟单元进位,60分到了后,时单元进位。日期的显示与时间显示方法相同,日期部分,24小时满后,日单元进位,日满后月单位进位,12月满后,年单位进位。这样然后根据进率,得到时、分、秒、年、月、日存储单元的值,并经译码后,通过扫描程序送led数码管显示出来,实现时钟计时功能。 开始ny24小时到?时单元清零,日单元加1n30日(31日)到?y日单元记1,月单元加1n12月到?y
9、月单元记1,年单元加1日期显示1.6课程设计的参考程序#include #define uchar unsigned char #define uint unsigned int uchar code tab=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40; /0,1,2,3,4,5,6,7,8,9,- uchar table1=31,31,29,31,30,31,30,31,31,30,31,30,31; /闰年uchar table2=31,31,28,31,30,31,30,31,31,30,31,30,31; /非闰年uch
10、ar n; uchar hh,mm,ss,nn,yy,rr; uchar hhs,hhg,mms,mmg,sss,ssg;uchar year; uchar day,mon;uchar days,dayg,mons,mong,years,yearg;uchar set1=0,set2=0;sbit p3_0=p30;sbit p3_1=p31;sbit p3_2=p32;sbit p3_3=p33;sbit p3_4=p34;sbit p3_5=p35;sbit p3_6=p36;sbit p3_7=p37;sbit k0=p10; sbit k1=p11; sbit k2=p12; sbit
11、 k3=p13; void jishi(); /计时函数void set_time(); /设置时间void key_change(); /按键转移void key_set(); /按键设置void set_mdw(); /设置日期void delay(int m) /延时程序 uint i; uint j; for (i=0;im;i+) for(j=0;j500;j+); void timer0() interrupt 1 / timer0每50ms中断一次 tmod=0x01; /定时器/计数器t0工作方式1 th0=0x3c; /赋初值 tl0=0xb0; n+; jishi(); m
12、ain() /主函数 tmod=0x01; /定时器/计数器t0工作方式1 th0=0x3c; /赋初值 tl0=0xb0; tr0=1; ea=1; et0=1; hh=00;mm=00;ss=00;/开机显示00-00-00 year=11;mon=6;day=9; /开机显示11-06-09 while(1) hhs=hh/10%10; /时十位 hhg=hh%10; /时个位 mms=mm/10%10; /分十位 mmg=mm%10; /分个位 sss=ss/10%10; /秒十位 ssg=ss%10; /秒个位 days=day/10%10; /日十位 dayg=day%10; /日
13、个位 mons=mon/10%10; /月十位 mong=mon%10; /月个位 years=year/10%10; /年十位 yearg=year%10; /年个位 /调用函数 key_change(); key_set(); set_time(); set_mdw(); if(set1=1) /k0键按一下正常计时 p0=tabhhs;p3_0=0;delay(1);p3_0=1; /显示时十位 p0=tabhhg;p3_1=0;delay(1);p3_1=1; /显示时个位 p0=tab10;p3_2=0;delay(1);p3_2=1; /显示“” p0=tabmms;p3_3=0;
14、delay(1);p3_3=1; /显示分十位 p0=tabmmg;p3_4=0;delay(1);p3_4=1; /显示分个位 p0=tab10;p3_5=0;delay(1);p3_5=1; /显示“” p0=tabsss;p3_6=0;delay(1);p3_6=1; /显示秒十位 p0=tabssg;p3_7=0;delay(1);p3_7=1; /显示秒个位 if(set1=2) /k0键按二下调整时间 p0=tabhhs;p3_0=0;delay(1);p3_0=1; p0=tabhhg;p3_1=0;delay(1);p3_1=1; p0=tab10;p3_2=0;delay(1
15、);p3_2=1; p0=tabmms;p3_3=0;delay(1);p3_3=1; p0=tabmmg;p3_4=0;delay(1);p3_4=1; p0=tab10;p3_5=0;delay(1);p3_5=1; p0=tabsss;p3_6=0;delay(1);p3_6=1; p0=tabssg;p3_7=0;delay(1);p3_7=1; if(set1=3) /k0键按三下正常计日期 p0=tabyears;p3_0=0;delay(1);p3_0=1; p0=tabyearg;p3_1=0;delay(1);p3_1=1; p0=tab10;p3_2=0;delay(1);
16、p3_2=1; p0=tabmons;p3_3=0;delay(1);p3_3=1; p0=tabmong;p3_4=0;delay(1);p3_4=1; p0=tab10;p3_5=0;delay(1);p3_5=1; p0=tabdays;p3_6=0;delay(1);p3_6=1; p0=tabdayg;p3_7=0;delay(1);p3_7=1; if(set1=4) /k0键按四下调整日期 p0=tabyears;p3_0=0;delay(1);p3_0=1; /年十位 p0=tabyearg;p3_1=0;delay(1);p3_1=1; /年个位 p0=tab10;p3_2=
17、0;delay(1);p3_2=1; /- p0=tabmons;p3_3=0;delay(1);p3_3=1; /月十位 p0=tabmong;p3_4=0;delay(1);p3_4=1; /月个位 p0=tab10;p3_5=0;delay(1);p3_5=1; /- p0=tabdays;p3_6=0;delay(1);p3_6=1; /日十位 p0=tabdayg;p3_7=0;delay(1);p3_7=1; /日个位 void jishi() if(n=20) / 1s时间到,调整显示时间 n=0;ss+; if(ss=60) ss=0;mm+; /秒满60,秒位清零,分位加一
18、if(mm=60) mm=0;hh+; /分满60,分位清零,时位加一 if(hh=24) hh=0;day+; /时满24,时位清零,日位加一 if(year%4=0&year%100!=0|year%400=0) /闰年 if(day=table1mon+1) /调用table1函数 day=1;mon+; if(mon=13) mon=1;year+; else /非闰年 if(day=table2mon+1) /调用table1函数 day=1;mon+; if(mon=13) mon=1;year+; uchar incone(uchar n) /加函数 if(k2=0) delay
19、(20); if(k2=0) /按下k2键,进行加一 n+; while(!k2); return(n); uchar decone(uchar m)/减函数 if(k3=0) delay(20); if(k3=0) /按下k3键,进行减一 m-; while(!k3); if(m4)set1=1; void key_set() /k1键按下,进入设置状态 if(k1=0) delay(20); if(k1=0) set2+; while(!k1); if(set24) set2=1; void set_time()/设置时间函数 if(set1=2) /ko按二下进入时间调整状态 if(se
20、t2=1)/k1按一下调整时 hh=incone(hh); /时加一 if(hh=24) hh=0; /当时累加到24时,时为0 if(hh=-1) hh=23; /当时累加到-1时,时为23 hh=decone(hh); /日减一 if(set2=2) /k1按二下调整分 mm=incone(mm); /分加一 if(mm=60) mm=0; /当分累加到60时,时为0 if(mm=-1) mm=59; /当分累减到-1时,分为59 mm=decone(mm); /分减一 if(set2=3) /k1按三下调整秒 ss=incone(ss); /秒加一 if(ss=60) ss=0; /当秒
21、累加到60时,时为0 if(ss=-1) ss=59; /当秒累减到-1时,分为59 ss=decone(ss); /秒减一 if(set2=4) /k1按四下清零 hh=00;mm=00;ss=00; void set_mdw() /设置年月日函数 if(set1=4) /ko按四下进入日期调整状态 if(set2=1) /k1按一下调整月 mon=incone(mon); /月加一 if(mon=13) mon=1;/当月累加到13时,月为1 mon=decone(mon); /月减一 if(mon=0) mon=12; /当月累减到0时,月为12 if(set2=2) /k1按二下调整日
22、 day=incone(day); /日加一 if(day=32) day=1; /当日累加到32时,日为1 day=decone(day); /日减一 if(day=0) day=31; /当日累减到0时,日为31 if(set2=3) /k1按三下调整年 year=incone(year); /年加一 if(year=99) year=00; /当年累加到99时,年清零 year=decone(year); /年减一 if(year=-1) year=00; /当年累减到-1时,年清零 时间的运行依靠定时中断子程序对时钟单元数值进位调整来实现的。计数器t0打开后,进入计时,满50毫秒后,重
23、装定时。中断一次,满一秒后秒进位,满60秒后即为1分钟,分钟单元进位,60分到了后,时单元进位,24小时满后,日单元进位,日满后月单位进位,12月满后,年单位进位。这样然后根据进率,得到时、分、秒、年、月、日存储单元的值,并经译码后,通过扫描程序送led数码管显示出来,实现时钟计时功能。1.7课程设计过程中遇到的问题及其解决方法 在本次课程设计中,首先我们在电脑上使用protues软件绘制好本次课程设计的电路原理图,然后应用keil软件,进行数字钟程序的编程和编译,发现很多语法和逻辑的错误。通过这个编译器可以很好的发现并解决问题,程序调试完毕,编译没问题后,我们再通过应用protues软件进行
24、软件仿真,在protues已绘制好的电路原理图中,调入已编译好的目标代码文件:*.hex,然后可以在protues的电路原理图中看到模拟的实物运行状态和过程,并进行测试,并分析程序,直到完成要求为止。 课程设计刚开始时,首先我通过上网查阅相关资料,找到了与本次课程设计要求相近的数字钟程序代码,本以为此次编程只要在其基础上做相应的修改即可,但是等到实际操作起来,才发现编程的复杂性,没有想象之中的那么得心应手。费了九牛二虎之力,终于帮编译语法错误修改完后,迫不及待的将程序调入protues已绘制好的电路原理图中,但是数字钟的6位数码管什么都没有显示,当时有些倍受打击,但是告诉自己不要气馁。于是,硬
25、着头皮反复看程序,发现了网上查找的程序代码是4位显示并且是共阳数码管,接着,我再做修改。这一次数码管是给了些显示,但是抖动很快,我请教了同学,同学说可能是抖动太快的原因。 就这样,一次次的反复修改程序,一次次的软件仿真结果,终于通过与同学们的交流讨论,再加上老师的耐心指导后,顺利地完成了本次单片机课程设计,达到了数字钟的功能控制要求。二、基于ds18b20的温度测量模块设计1.1课程设计目的 了解ds18b20的温度测量模块的组成及其工作原理; 巩固、加深和扩大单片机应用的知识面,提高综合及灵活运用所学知识解 决实际问题的能力; 培养针对课题需要,选择和查阅有关手册、图表及文献资料的自学能力,
26、提高组成系统、编程、调试的动手能力; 通过对课题设计方案的分析、选择、比较,熟悉单片机应用系统的开发。研制的过程,掌握软件设计的方法、内容及步骤; 通过对单片机程序的设计,基本掌握51单片机开发系统的操作、编程技巧,完成ds18b20的温度测量模块的显示功能,实现对单片机的了解从感性认识上升为理性认识。1.2课程设计的设计任务和基本要求 设计任务 掌握at89c51实验开放系统中的实验模块原理,画出电路原理图; 综合运用实验模块,用at89c51开发设计具有一定功能的单片机控制系统,进行软件的设计与调试; 用at89c51控制ds18b20,读取数据,对ds18b20转换后的数据进行处理,转换
27、成实际温度值,并将符号位,整数值和小数值分别存放在特定的存储单元中. 基本要求 在数码管上显示ds18b20测出的温度,只要求显示出温度值的整数部分及符号位. 使用6位数码管显示测得的温度,最高位为符号位,如果温度值为正,不显示,如果温度为负,则显示负号,第24位显示温度值的整数部分,并在第4位数据上显示小数点,第5位显示一位小数,最低位显示摄氏度符号“c“。 1.3课程设计原理 ds18b20测温原理如图3所示。图中低温度系数晶振的振荡频率受温度影响很小,用于产生固定频率的脉冲信号送给计数器1。高温度系数晶振随温度变化其振荡率明显改变,所产生的信号作为计数器2的脉冲输入。计数器1和温度寄存器
28、被预置在55所对应的一个基数值。计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当计数器1的预置值减到0时,温度寄存器的值将加1,计数器1的预置将重新被装入,计数器1重 新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温度。图3中的斜率累加器用于补偿和修正测温过程中的非线性,其输出用于修正计数器1的预置值。 图3: ds18b20测温原理框图 ds18b20有4个主要的数据部件: (1)光刻rom中的64位序列号是出厂前被光刻好的,它可以看作是该ds18b20的地址序列码。64位光刻rom的排列是:开始8位
29、 (28h)是产品类型标号,接着的48位是该ds18b20自身的序列号,最后8位是前面56位的循环冗余校验码(crc=x8+x5+x4+1)。光刻rom的作用 是使每一个ds18b20都各不相同,这样就可以实现一根总线上挂接多个ds18b20的目的。 (2)ds18b20中的温度传感器可完成对温度的测量,以12位转化为例:用16位符号扩展的二进制补码读数形式提供,以 0.0625/lsb形式表达,其中s为符号位。 表1: ds18b20温度值格式表 这是12位转化后得到的12位数据,存储在18b20的两个8比特的ram中,二进制中的前面5位是符号位,如果测得的温度大于0, 这5位为0,只要将测
30、到的数值乘于0.0625即可得到实际温度;如果温度小于0,这5位为1,测到的数值需要取反加1再乘于0.0625即可得到实际 温度。 例如+125的数字输出为07d0h,+25.0625的数字输出为0191h,-25.0625的数字输出为ff6fh,-55的数字输出为fc90h 。 1.4课程设计的电路原理图 ds18b20温度传感器与单片机的接口电路ds18b20可以采用两种方式供电,一种是采用电源供电方式,此时ds18b20的1脚接地,2脚作为信号线,3脚接电源。另一种是寄生电源供电方式,单片机端口接单线总线。外部电源供电方式是ds18b20最佳的工作方式,工作稳定可靠,抗干扰能力强,而且电
31、路也比较简单,可以开发出稳定可靠的多点温度 监控系统。 本次课程设计中采用ds18b20的外部电源供电方式 在外部电源供电方式下,ds18b20工作电源由vdd引脚接入,此时i/o线不需要强上拉,不存在电源电流不足的问题,可以保证 转换精度,同时在总线上理论可以挂接任意多个ds18b20传感器,组成多点测温系统。注意:在外部供电的方式下,ds18b20的gnd引脚不能悬空 ,否则不能转换温度,读取的温度总是85。 电路原理图设计如下: 1.5课程设计的参考流程图主程序开始初始化、设置常量调ds18b20初始化子程序读取转换温度值调数据处理子程序生成显示码显示温度值ds18b20复位子程序dq置
32、1dq置0延时至少80微秒dq置1短延时,等待ds18b20回应dq=0?temp=0延时dq置1返回temp=1yn 主机首先发出一个480960微秒的低电平脉冲,然后释放总线变为高电平,并在随后的480微秒时间内对总线进行检测,如果有低电平出现说明总线上有器件已做出应答。若无低电平出现一直都是高电平说明总线上无器件应答。做为从器件的ds18b20在一上电后就一直在检测总线上是否有480960微秒的低电平出现,如果有,在总线转为高电平后等待1560微秒后将总线电平拉低60240微秒做出响应存在脉冲,告诉主机本器件已做好准备。若没有检测到就一直在检测等待。 设i初值为8,i-将value最后一
33、位写入dqvalue右移一位读温度值子程序dq置1ds18b20复位fla=1发送0cch命令,跳过rom匹配发送温度转换命令44h延时750微秒以上ds18b20初始化发送0cch命令发送读温度命令0beh调用读数据子程序返回写ds18b20命令子程序设i初值为8dq置1dq置0短延时短延时将value值写入dq短延时value右移一位已读8位dq置1返回ynyn ds18b20 单线通信功能是分时完成的,他有严格的时隙概念,如果出现序列混乱, 1-wire 器件将不响应主机,因此读写时序很重要。系统对 ds18b20 的各种操作必须按协议进行 读取ram内的温度数据要接照三个步骤。首先,主
34、机发出复位操作并接收ds18b20的应答(存在)脉冲。接着,主机发出跳过对rom操作的命令(cch)。最后,主机发出读取ram的命令(beh),随后主机依次读取ds18b20发出的从第0一第8,共九个字节的数据。 ds18b20的写操作,数据线先置低电平“0”, 延时确定的时间为15微秒。然后, 按从低位到高位的顺序发送字节(一次只发送一位)。延时时间为45微秒, 将数据线拉到高电平。 不断重复上(1)到(6)的操作直到所有的字节全部发送完为止。最后将数据线拉高。 1.6课程设计的参考程序#include #include #include #define uint unsigned int#
35、define uchar unsigned charuchar data temp_data2=0x00,0x00; /读出温度暂放uchar dispaly7;uchar seg10=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f; 共阴led段码表 0 1 2 3 4 5 6 7 8 9 uchar seg1 =0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef; sbit dq=p24; /dq=p24;sbithc138a=p30;/数码管位选sbithc138b=p31;sbithc1
36、38c=p32;sbithc138d=p33;sbithc138e=p34;sbithc138f=p35;/函数申明void delay1(uint i);void ds_reset(void);void write_byte(uchar value);uchar read_byte(void);void read_temp();void work_temp();void delay1(uint i)/延时函数for(;i0;i-); void ds_reset(void) /ds1820复位函数char temp=1;while(temp) while(temp) dq=1;_nop_();
37、_nop_(); /从高拉到低dq=0;delay1(80);dq=1; /释放数据线(将数据线拉高)delay1(9);temp=dq; / temp=0 复位成功,继续下一步 delay1(64); temp=dq; dq=1; /拉高电平 void write_byte(uchar value) / 按从低位到高位的顺序发送字节uchar i;for(i=8;i0;i-) dq=1; / 先将数据线拉高_nop_();_nop_(); / 等待一个机器周期 dq=0; / 再将数据线拉低_nop_();_nop_();_nop_();_nop_();_nop_();/ 等待一个机器周期
38、dq=value&0x01; /最后一位输出 delay1(9); value=1; /右移 dq=1;delay1(1);uchar read_byte(void)/向-wire 总线上写个字节uchar i;uchar value1=0; /储存读出的一个字节数据for(i=8;i0;i-)dq=1; / 先将数据线拉高_nop_();_nop_(); /等待一个机器周期value1=1;/右移dq=0;_nop_();_nop_();_nop_();_nop_();dq=1;_nop_();_nop_();_nop_();_nop_();if(dq) value1|=0x80; /进行按
39、位或运算 delay1(9);dq=1;return(value1);/返回读出的十六进制数据void read_temp() /读取温度ds_reset(); / 复位操作write_byte(0xcc); /出跳过对rom操作write_byte(0xbe); /读取ram的命令temp_data0=read_byte(); /读取温度高位temp_data1=read_byte(); /读取温度低位ds_reset(); / 复位操作write_byte(0xcc); /忽略64 位rom 地址write_byte(0x44); /启动ds1820进行温度转换void work_temp
40、() /温度换算处理uchar n=0;if(temp_data1128)temp_data1=(255-temp_data1);temp_data0=(256-temp_data0);n=1; /为负值时,n=1dispaly6=(temp_data0&0xf0)4)|(temp_data1&0x0f)4); /取整数部分,dispaly5=dispaly6/100;/百位dispaly4=dispaly6%100;dispaly2=dispaly4/10;/十位dispaly1=dispaly4%10;/个位switch(temp_data0&0x0f)/小数位case 0x0f:disp
41、aly0=9;break;case 0x0e:dispaly0=9;break;case 0x0d:dispaly0=8;break;case 0x0c:dispaly0=8;break;case 0x0b:dispaly0=7;break;case 0x0a:dispaly0=6;break;case 0x09:dispaly0=6;break;case 0x08:dispaly0=5;break;case 0x07:dispaly0=4;break;case 0x06:dispaly0=4;break;case 0x05:dispaly0=3;break;case 0x04:dispaly
42、0=3;break;case 0x03:dispaly0=2;break;case 0x02:dispaly0=1;break;case 0x01:dispaly0=1;break;case 0x00:dispaly0=0;break;default:break;if(n)/n=1,负值时符号位显示“-” dispaly3=0x40;else dispaly3=0x00; /正值时符号位不显示void disdignit()p0=dispaly3; /符号位显示hc138a=0;delay1(300);hc138a=1; p0=segdispaly0;/小数位显示hc138e=0; delay
43、1(300);hc138e=1;p0=seg1dispaly1; /个位显示hc138d=0; delay1(300);hc138d=1;p0=segdispaly2; /十位显示hc138c=0;delay1(300);hc138c=1;p0=segdispaly5; /百位显示hc138b=0;delay1(300);hc138b=1; p0=0x39; /显示“c”hc138f=0;delay1(300);hc138f=1; void main(void) ds_reset(); /复位 write_byte(0xcc); /忽略64 位rom 地址 write_byte(0x44); /启动ds1820进行温度转换 while(1)read_temp(); /读取温度work_temp();/温度换算处理delay1(500);disdignit(); /数码管显示1.7课程设计过程中遇到的问题及其解决方法 在本次课程设计中,与上周的数字钟一样,我们在电脑上使用protues软件和keil软件,进行基于
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 公司积分等级管理制度
- 浙江省杭州市S9联盟2024-2025学年高二下学期期中联考语文试卷(含答案)
- 管道防腐交底
- 河南省信阳市2023−2024学年高二下册期末教学质量检测数学试卷附解析
- 河南省南阳市方城县2024-2025学年高一下册第二次月考模拟演练数学试卷
- 安徽省六安市2025届高三适应性考试数学试卷附解析
- 2025届河南省焦作市焦作中考二模数学试卷
- 身份验证安全专家基础知识点归纳
- 沈阳市医疗卫生系统国内医学院校招聘笔试真题2024
- 河北省烟草专卖局(公司)考试题库2024
- 2025年河北省万唯中考定心卷地理(一)
- 村文书考试题及答案岷县
- 2025年广东省广州市白云区中考数学二模试卷
- 创造性思维与创新方法(大连民族大学)知到网课答案
- 2024北京西城区四年级(下)期末数学试题及答案
- GB 42590-2023民用无人驾驶航空器系统安全要求
- 钢管悬挑脚手架方案
- 新时达机器人系统说明书
- 图形推理图形汇总62页
- 药物溶出度数据处理软件
- (完整word版)神态描写技巧
评论
0/150
提交评论