基于DS8b20的温度测量和秒表设计单片机小系统实验报告_第1页
基于DS8b20的温度测量和秒表设计单片机小系统实验报告_第2页
基于DS8b20的温度测量和秒表设计单片机小系统实验报告_第3页
基于DS8b20的温度测量和秒表设计单片机小系统实验报告_第4页
基于DS8b20的温度测量和秒表设计单片机小系统实验报告_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、培矗弃胎耿晋或涅议栋瞥贬盔绩漱几王什五纺皖猪街圃古铣宇牙扇奢绍糠泰改妇樊情犁复卷鹃押斧诀部趴吃维铃锤静仅皋全廓瓷筹获汐必图襟像玻凹枷椽卤六苍酶柠斧悍乎骄搜魔姨德琴倡羡近揩琉蔽次厦蔬穷维帧献桥见袖拄镀坟位爷孪旱坤幌刑舞邀蛾宴傀咸笨拇侥阀泳仲侍椭对搭独殖渤蛊危域尽蛮檀条煎剖隙尖备丘狱尖揪董店简联罐瓣饮殉纳我李诱拘沥酌髓桥仓我菱扳宗斯口搬买诊钥棺岭榔雕指肝怨窿哀你迅药碉凹疹墟缅讲耻悔骗耸蝉绥和因汲摸汤守匡窄捞安辗幽霄点粕倍岛彼助粱估描轴瑰刚柏友孝葡称查粱皇陋型短卞召苇廓饲摸浪桔垄油遥竿映卵宫真吭票拼菏除剔凰羽达孰1单片机最小系统实验报告基于ds18b20的温度测量和秒表设计目录单片机最小系统实验报告

2、1一、单片机31.单片机简介32.最小系统33. at89c51单片机引脚说明4二、18b20介绍5三、最小系统硬件设计81、设计结轻恰奶讨属艺描邱盈狈问眶颊飞价榔颅躲衷诗冕尾窗芬尧整锨碑烩铁换亥猛沉若恿鸣桅蚀袭窟羌耸颧场拦雁汛铃塑筹渣簇吗庶漏哉期铁茎尧贺螺年从鳃漠苍挖法骤垃爬交刀奈巨桅强猛翅瞳狙情茫药位倡拳伯级婶杯邱俊秩粹盎敖微沃溪救台戚滤宦恶瘪车珍课彩支混辰兢挎猎内姥绘菩电女拱冈常肪摈凛祥暖撤稚老酵先赁照嫉怒迄稠章片馁蛾萄菲栗烯替焰梧且客榷尺汾埠稼壹租饥眺乱灯了里戳补危亭佐衰甲蒋潜干酮伶粥柴降限好匿袱佯批湍睫囚服泄过尝岳哗拄惕丹销槽照侥屿渐谰潮世烙篮晃向丸愚过辜逸兄备振椿鼠正瓣该沮纫守穴兄

3、玫泼蝎潦惊话戎丁绪砧为硫绍死侄望谅倔探岔耪垃基于ds8b20的温度测量和秒表设计单片机小系统实验报告膊哎具析郸衅厢捅莲卯纠头讣灰椰赋司纤奢纸嘛涯披长启咳澈捂灵学糠病掩掏踊烹当艘穆斯贩蛀碗雌纽醉絮缘项砒观祷劫祸欠供持赢哗亥镁疹烩锥禾歪需白赤拳拇芯仰戏伴蔗葡流司综丧森迷壕平辟铆呕内茁枣肝纽道僵雨他奶凄鸭赏虽炭盖之括节汪询侨励资篮匝骚填香褪蚕未忆坎薯搂港汕城鱼玫妓棱萧镭慧咏牙科柒齐腺叙虎量湍癣逐方习障唯娘拂辖搬巡垛楞芍块联仰向烬胆惹围般滁誓腑鸡泡腋劳实伟边冠笨旗而成括输蛇裕啪详警砖七琅少奥峦湛腥茁撰戈倾隐绘儒铀贵酵刮尼项簿汞拓脯角懈沾鸟猩出缀芒功捉肺蛹狡坦骡恒南刻漱宅帜失求验讯赃酋震判杂酶楷赌课英痉

4、大卷徐怂批蓝单片机最小系统实验报告基于ds18b20的温度测量和秒表设计目录单片机最小系统实验报告1一、单片机31.单片机简介32.最小系统33. at89c51单片机引脚说明4二、18b20介绍5三、最小系统硬件设计81、设计结构框图82、系统时钟电路83、复位电路8四、实验具体内容91、实现led显示器的选通并显示字符92、基于ds18b20的温度测量和秒表设计16五、总结29一、单片机1.单片机简介单片微型计算机简称单片机,是典型的嵌入式微控制器(microcontroller unit),常用英文字母的缩写mcu表示单片机,单片机又称单片微控制器,它不是完成某一个逻辑功能的芯片,而是把

5、一个计算机系统集成到一个芯片上。单片机由运算器,控制器,存储器,输入输出设备构成,相当于一个微型的计算机,和计算机相比,单片机只缺少了i/o设备。概括的讲:一块芯片就成了一台计算机。它的体积小、质量轻、价格便宜、为学习、应用和开发提供了便利条件。同时,学习使用单片机是了解计算机原理与结构的最佳选择。它最早是被用在工业控制领域at89c51提供以下标准功能:8k字节falsh闪速存储器,256字节内部ram,32个i/o口线,3个16位定时/计数器,一个6向量两级中断结构,一个全双工串行通信口,片内震荡器及时钟电路,同时at89c51可降至0hz的静态逻辑操作,并支持两种软件可选的节电工作模式。

6、空闲方式停止cpu的工作,但允许ram,时/计数器,串行通信口及中断系统持续工作。掉电方式保存ram中的内容,但震荡器停止工作并禁止其他所有部件工作直到下一个硬件复位。at89c51单片机主要功能特性: 兼容mcs51指令系统 4k可反复擦写(>1000次)flash rom 32个双向i/o口 8个中断源 三个16位可编程定时/计数器 2.7-6.v的宽工作电压范围 时钟频率0-24mhz128x8bit内部ram 五个外部中断源 两个串行中断 可直接驱动led 两级加密位 低功耗睡眠功能 内置一个模拟比较放大器 可编程uarl通道 软件设置睡眠和唤醒功能2.最小系统单片机最

7、小系统,或者称为最小应用系统,是指用最少的元件组成的单片机可以工作的系统. 对51系列单片机来说,单片机+晶振电路+复位电路,便组成了一个最小系统.但是一般我们在设计中总是喜欢把按键输入、显示输出等加到上述电路中,成为小系统。3. at89c51单片机引脚说明vcc:供电电压。gnd:接地。p0口:p0口为一个8位漏级开路双向i/o口,内部无上拉电阻每脚可吸收8ttl门电流。当p1口的管脚第一次写1时,被定义为高阻输入。p0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。p1口:p1口是一个内部提供上拉电阻的8位双向i/o口,p1口缓冲器能接收输出4ttl门电流。p1口管脚写入1

8、后,被内部上拉为高,可用作输入,p1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在flash编程和校验时,p1口作为第八位地址接收。p2口:p2口为一个内部上拉电阻的8位双向i/o口,p2口缓冲器可接收,输出4个ttl门电流,当p2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,p2口的管脚被外部拉低,将输出电流。p3口:p3口管脚是8个带内部上拉电阻的双向i/o口,可接收输出4个ttl门电流。当p3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,p3口将输出电流,这是由于上拉的缘故。p3口也可作为at89c51的一些

9、特殊功能口,如下表所示:p3.0 rxd(串行输入口)p3.1 txd(串行输出口)p3.2 /int0(外部中断0)p3.3 /int1(外部中断1)p3.4 t0(记时器0外部输入)p3.5 t1(记时器1外部输入)p3.6 /wr(外部数据存储器写选通)p3.7 /rd(外部数据存储器读选通)p3口同时为闪烁编程和编程校验接收一些控制信号。rst:复位输入。当振荡器复位器件时,要保持rst脚两个机器周期的高电平时间。ale/prog:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在flash编程期间,此引脚用于输入编程脉冲。在平时,ale端以不变的频率周期输出正脉冲信

10、号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ale脉冲。如想禁止ale的输出可在sfr8eh地址上置0。此时, ale只有在执行movx,movc指令是ale才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ale禁止,置位无效。/psen:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/psen有效。但在访问外部数据存储器时,这两次有效的/psen信号将不出现。/ea/vpp:当/ea保持低电平时,则在此期间外部程序存储器(0000h-ffffh),不管是否有内部程序存储器。

11、注意加密方式1时,/ea将内部锁定为reset;当/ea端保持高电平时,此间内部程序存储器。在flash编程期间,此引脚也用于施加12v编程电源(vpp)。xtal1:反向振荡放大器的输入及内部时钟工作电路的输入。xtal2:来自反向振荡器的输出。二、18b20介绍ds18b20数字温度传感器接线方便,封装成后可应用于多种场合,如管道式,螺纹式,磁铁吸附式,不锈钢封装式,型号多种多样,有ltm8877,ltm8874等等。主要根据应用场合的不同而改变其外观。封装后的ds18b20可用于电缆沟测温,高炉水循环测温,锅炉测温,机房测温,农业大棚测温,洁净室测温,弹药库测温等各种非极限温度场合。耐磨

12、耐碰,体积小,使用方便,封装形式多样,适用于各种狭小空间设备数字测温和控制领域。(1)ds18b20(a)通过单线总线端口访问 ds1820 的协议如下: 初始化void init_ds18b20() uchar x=0; dq = 1; /dq复位 delay_18b20(8); /稍做延时 dq = 0; /单片机将dq拉低 delay_18b20(80); /精确延时 大于 480us dq = 1; /拉高总线 delay_18b20(14); x=dq; /稍做延时后 如果x=0则初始化成功 x=1则初始化失败 delay_18b20(20); rom 操作命令int readone

13、char(void)uchar i=0;uchar dat = 0;for (i=8;i>0;i-) dq = 0; / 给脉冲信号 dat>>=1; dq = 1; / 给脉冲信号 if(dq) dat|=0x80; delay_18b20(4); return(dat); 存储器操作命令writeonechar(uchar dat) uchar i=0; for (i=8; i>0; i-) dq = 0; dq = dat&0x01; delay_18b20(5); dq = 1; dat>>=1; 执行/数据readtemperature(v

14、oid)uchar a=0;uchar b=0;uint t=0;init_ds18b20();writeonechar(0xcc); / 跳过读序号列号的操作writeonechar(0x44); / 启动温度转换delay_18b20(100);init_ds18b20();writeonechar(0xcc); /跳过读序号列号的操作writeonechar(0xbe); /读取温度寄存器等(共可读9个寄存器) 前两个就是温度a=readonechar();b=readonechar();/传感器返回值除16得实际温度值/为了得到2位小数位,先乘100,再除16,考虑整型数据长度,/技巧

15、处理后先乘25,再除4,除4用右移实现b<<=8;t=a+b;return(t);ds1820 需要严格的协议以确保数据的完整性。协议包括几种单线信号类型:复位脉冲、存在脉冲、写0、写1、读0 和读1。所有这些信号,除存在脉冲外,都是由总线控制器发出的。和 ds1820 间的任何通讯都需要以初始化序列开始,初始化序列见下图。一个复位脉冲跟着一个存在脉冲表明ds1820 已经准备好发送和接收数据(适当的rom 命令和存储器操作命令)(b)当总线上只有一个器件时,ds18b20读温度的流程为:复位发0cch skip rom命令发44h开始转换命令延时复位发0cchskip rom命令

16、发0beh读存储器命令连续读出两个字节数据(即温度)结束。Ø convert t 44h这条命令启动一次温度转换而无需其他数据。温度转换命令被执行,而后ds1820 保持等待状态。如果总线控制器在这条命令之后跟着发出读时间隙,而ds1820 又忙于做时间转换的话,ds1820 将在总线上输出“0”,若温度转换完成,则输出“1”。如果使用寄生电源,总线控制器必须在发出这条命令后立即起动强上拉,并保持500ms。Ø read scratchpad beh这个命令读取暂存器的内容。读取将从字节0 开始,一直进行下去,直到第9(字节8,crc)字节读完。如果不想读完所有字节,控制器

17、可以在任何时间发出复位命令来中止读取。(c)ds18b20 用12 位存贮温值度最高位为符号位,下图为18b20 的温度存储方式,负温度s=1 正温度s=0lsb:d7 d6 d5 d4 d3 d2 d1 d0232221202-12-22-32-4msb:d7 d6 d5 d4 d3 d2 d1 d0sssss272625三、最小系统硬件设计1、设计结构框图2、系统时钟电路 单片机内部具有一个高增益反相放大器,用于构成振荡器。通常在引脚xtall和xtal2跨接石英晶体和两个补偿电容构成自激振荡器,系统时钟电路结构如图:3、复位电路 单片机小系统采用上电自动复位和手动按键复位两种方式实现系统

18、的复位操作。上电复位要求接通电源后,自动实现复位操作。手动复位要求在电源接通的条件下,在单片机运行期间,用按钮开关操作使单片机复位。显示电路、键盘以及外部ram的扩展根据具体电路的不同而不同四、实验具体内容1、实现led显示器的选通并显示字符电路图的绘制(1)打开proteus将所需元器件加入到对象选择器窗口。picking components into the schematic单击对象选择器按钮,如图所示弹出“pick devices”页面,在“keywords”输入at89c51,系统在对象库中进行搜索查找,并将搜索结果显示在“results”中,如图所示。在“results”栏中的列

19、表项中,双击“at89c51”,则可将“at89c51”添加至对象选择器窗口。 (2)接着在“keywords”栏中重新输入7seg,如图所示。双击“7seg-mpx6-ca-blue”,则可将“7seg-mpx6-ca-blue”(6位共阳7段led显示器)添加至对象选择器窗口。(3)最后,在“keywords”栏中重新输入res,选中“match whole words”,如图所示。在“results”栏中获得与res完全匹配的搜索结果。双击“res”,则可将“res”(电阻)添加至对象选择器窗口。单击“ok”按钮,结束对象选择。经过以上操作,在对象选择器窗口中,已有了7seg-mpx6-

20、ca-blue、at89c51、res三个元器件对象,若单击at89c51,在预览窗口中,见到at89c51的实物图,如图所示;若单击res或7seg-mpx6-ca-blue,在预览窗口中,见到res和7seg-mpx6-ca-blue的实物图,如图所示。此时,我们已注意到在绘图工具栏中的元器件按钮处于选中状态。 (4)放置元器件至图形编辑窗口placing components onto the schematic在对象选择器窗口中,选中7seg-mpx6-ca-blue,将鼠标置于图形编辑窗口该对象的欲放位置、单击鼠标左键,该对象被完成放置。同理,将at89c51和res放置到图形编辑窗

21、口中。如图所示。(5)放置总线至图形编辑窗口单击绘图工具栏中的总线按钮,使之处于选中状态。将鼠标置于图形编辑窗口,单击鼠标左键,确定总线的起始位置;移动鼠标,屏幕出现粉红色细直线,找到总线的终了位置,单击鼠标左键,再单击鼠标右键,以表示确认并结束画总线操作。此后,粉红色细直线被蓝色的粗直线所替代,如图所示。(6)元器件之间的连线proteus的智能化可以在你想要画线的时候进行自动检测。下面,我们来操作将电阻r1的右端连接到led显示器的a端。当鼠标的指针靠近r1右端的连接点时,跟着鼠标的指针就会出现一个“×”号,表明找到了r1的连接点,单击鼠标左键,移动鼠标(不用拖动鼠标),将鼠标的

22、指针靠近led显示器的a端的连接点时,跟着鼠标的指针就会出现一个“×”号,表明找到了led显示器的连接点,同时屏幕上出现了粉红色的连接,单击鼠标左键,粉红色的连接线变成了深绿色,同时,线形由直线自动变成了90º的折线,这是因为我们选中了线路自动路径功能。proteus具有线路自动路径功能(简称war),当选中两个连接点后,war将选择一个合适的路径连线。war可通过使用标准工具栏里的“war”命令按钮来关闭或打开,也可以在菜单栏的“tools”下找到这个图标。同理,我们可以完成其它连线。在此过程的任何时刻,都可以按esc键或者单击鼠标的右键来放弃画线。(7)元器件与总线的连

23、线画总线的时候为了和一般的导线区分,我们一般喜欢画斜线来表示分支线。此时我们需要自己决定走线路径,只需在想要拐点处单击鼠标左键即可,如图所示。(8)给与总线连接的导线贴标签part labels单击绘图工具栏中的导线标签按钮,使之处于选中状态。将鼠标置于图形编辑窗口的欲标标签的导线上,跟着鼠标的指针就会出现一个“×”号,如图所示。表明找到了可以标注的导线,单击鼠标左键,弹出编辑导线标签窗口,如图所示。 在“string”栏中,输入标签名称(如a),单击“ok”按钮,结束对该导线的标签标定。同理,可以标注其它导线的标签,如图所示。注意,在标定导线标签的过程中,相互接通的导线必须标注相同

24、的标签名。至此,我们便完成了整个电路图的绘制。keilc与proteus连接调试进入keilc vision2开发集成环境,创建一个新项目(project),并为该项目选定合适的单片机cpu器件(如:atmel公司的at89c51)。并为该项目加入keilc源程序。实验仿真图:源程序如下:#include <reg51.h>#define leds 6 /led灯选通信号unsigned char code select=0x01,0x02,0x04,0x08,0x10,0x20;unsigned char code led_codes= 0xc0,0xf9,0xa4,0xb0,0

25、x99,/0-4 0x92,0x82,0xf8,0x80,0x90,/5-9 0x88,0x83,0xc6,0xa1,0x86;void main() char i=0,j=0; long int k; while(1) p2=0; p1=led_codesi; p2=selectj; for(k=3000;k>0;k-); /该led模型靠脉冲点亮,第i位靠脉冲点亮后,会自动熄来头。/修改循环次数,改变点亮下一位之前的延时,可得到不同的显示效果。 i+; j+; if(j>5) j=0; if(i>14)i=0; 2、基于ds18b20的温度测量和秒表设计设计方案:通过功能

26、键(外部中断)选择进入不同的模式工作。当k=0时,工作在时间显示模式,当k=1时,工作在秒表模式,其中开关1、2、3时调节自己需要倒计时的时间,没按下时,对应的数值加一。开关4为开始/暂停按键。当k=4时,显示采集回来的温度。led1、led 2、led3灯是用来更直观的看本设计工作在什么下的,led4为是闪烁,闪烁频率为1s.(1)、硬件部分(2)软件部分源程序:#include<reg51.h>#define dataport p0 /定义数据端口 程序中遇到dataport 则用p0 替换#define uchar unsigned char#define uint unsi

27、gned int/*位定义*/sbit menu = p32; /位声明,外部中断口,功能键sbit led1 = p15; /led灯sbit led2 = p16;sbit led3 = p17;sbit led4 = p14;sbit add_m= p10; /按键,调分sbit add_s= p11; /按键,调秒sbit add_us=p12; /按键,调微秒sbit reset =p13; /清零,秒表状态下也是清零sbit latch1=p20; /定义锁存使能端口 段锁存sbit latch2=p21;/ 位锁存sbit dq = p22; /定义18b20的通信端口 /*参数

28、定义*/uint a,b,j;uchar tempdata8;uint m,s,w, /时钟 m0,s0,w0,/秒表 k;/状态转换标志uchar code weima=0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe;/位码uchar code duanma=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;/段码/*函数声明*/void delay_18b20(uint i);void init_ds18b20();int readonechar();writeonechar(uchar dat);readt

29、emperature(void);void display1();void init();void keyscan();void display(uchar a,uchar b,uchar c);void delay(uchar z);void wendu();/*主函数*/ void main()init(); /初始化while(1)if(k=0)/时间 led1=1; /点亮第一个灯,辨别是工作在时间模式下的 led2=0; led3=0; keyscan(); display(m0,s0,w0); /显示时间 if(k=1)/倒计时 led1=0; led2=1; /点亮第二个灯,辨别

30、是工作在秒表模式下的 led3=0; keyscan();display(m,s,w); if(k=2)/温度 led1=0; led2=0; led3=1; /点亮第三个灯,辨别是工作在温度模式下的 wendu(); void delay_18b20(uint i)/延时函数while(i-);/*18b20初始化*/void init_ds18b20() uchar x=0; dq = 1; /dq复位 delay_18b20(8); /稍做延时 dq = 0; /单片机将dq拉低 delay_18b20(80); /精确延时 大于 480us dq = 1; /拉高总线 delay_18

31、b20(14); x=dq; /稍做延时后 如果x=0则初始化成功 x=1则初始化失败 delay_18b20(20);/*读一个字节*/ int readonechar(void)uchar i=0;uchar dat = 0;for (i=8;i>0;i-) dq = 0; / 给脉冲信号 dat>>=1; dq = 1; / 给脉冲信号 if(dq) dat|=0x80; delay_18b20(4); return(dat);/*写一个字节*/ writeonechar(uchar dat) uchar i=0; for (i=8; i>0; i-) dq =

32、0; dq = dat&0x01; delay_18b20(5); dq = 1; dat>>=1; /*读取温度*/readtemperature(void)uchar a=0;uchar b=0;uint t=0;init_ds18b20();writeonechar(0xcc); / 跳过读序号列号的操作writeonechar(0x44); / 启动温度转换delay_18b20(100);init_ds18b20();writeonechar(0xcc); /跳过读序号列号的操作writeonechar(0xbe); /读取温度寄存器等(共可读9个寄存器) 前两个

33、就是温度a=readonechar();b=readonechar();/传感器返回值除16得实际温度值/为了得到2位小数位,先乘100,再除16,考虑整型数据长度,/技巧处理后先乘25,再除4,除4用右移实现b<<=8;t=a+b;return(t);/*显示函数*/void display1() static uchar i=0; dataport=0; /清空数据,防止有交替重影 latch1=1; /段锁存 latch1=0; dataport=weimai; /取位码 latch2=1; /位锁存 latch2=0; dataport=tempdatai; /取显示数据,

34、段码 latch1=1; /段锁存 latch1=0; i+; if(i=8)/在8位数码管间。 i=0;/*温度显示*/void wendu()uint temph,templ,temp;uchar counter;if(counter- = 0)/温度测量频率没有必要太高,太高反而影响数码显示temp = readtemperature(); counter = 10; if(temp&0x8000) tempdata7=0x40;/负号标志 temp=temp; / 取反加1 temp +=1; else tempdata7=0; temph=temp>>4; tem

35、pl=temp&0x0f; templ=templ*6/10;/小数近似处理 if(temph/100=0) tempdata6=0;else tempdata6=duanmatemph/100; /十位温度 if(temph/100=0)&&(temph%100)/10=0)/消隐 tempdata2=0;else tempdata5=duanma(temph%100)/10; /十位温度 tempdata4=duanma(temph%100)%10|0x80; /个位温度,带小数点 tempdata3=duanmatempl; tempdata1=0x39; /显示

36、c符号 tempdata0=0x00; display1();/*初始化函数*/void init()a=0;b=0;k=0;led1=0;/关闭所有灯led2=0;led3=0;led4=0;m0=12;/时间初始化s0=0;w0=0;m=0; /秒表初始化s=0;w=0;tmod=0x11; /定时器0,1工作于方式1;赋初值th0=(65536-5000)/256; /晶振12m,秒表定时器给初值 tl0=(65536-5000)%256;th1=(65536-50000)/256; /时间定时器给初值tl1=(65536-50000)%256;ea=1; /开总中断,中断允许ex0=1

37、; /秒表中断et0=1;et1=1;it0=1; /边沿触发方式it1=1;px0=1;px1=1;tr0=0; /初始,秒表不工作tr1=1; /时钟一开始工作/*定时器0中断*/void timer0_int() interrupt 1/秒表th0=(65536-5000)/256;tl0=(65536-5000)%256;a+;if(a=2)/5000*2msa=0;if(w!=0)|(s!=0)|m)/判断倒计时时间到没。 w-; if(w=0)w=99;if(s!=0)|m) s-;if(s=0) s=59; if(m>0)m-;/*外部中断0中断函数*/void ex0_i

38、nt() interrupt 0 k+;/按下一次功能键,使得k值加一,进入不同的工作模式if(k=3)k=0;/*定时器1中断*/void timer1_int() interrupt 3/控制时钟工作th1=(65536-50000)/256;tl1=(65536-50000)%256;b+;if(b=20)/50000*20=1s,说明1秒的时间到了b=0;w0+;led4=led4;/让第四个灯,随时间闪烁 if(w0=60) /秒 w0=0; s0+; if(s0=60)/分 s0=0; s0+; if(m0=12)/时 m0=0; /*按键扫描1*/void keyscan()/调

39、节秒表的初始时间 if(reset=0)/秒表开始暂停按键delay(10);/时间延迟if(reset=0)tr0=tr0;/定时器启动停止 if(add_us=0)/调usdelay(10);if(add_us=0) w+; if(w=100)w=0;while(!add_us)/按键释放 display(m,s,w);/显示 if(add_s=0)/每按下一次秒加一 delay(10); if(add_s=0) s+; if(s=60) s=0; while(!add_s) display(m,s,w); if(add_m=0)/每按下一次粉加一 delay(10); if(add_m=

40、0) m+; if(m=60) m=0; while(!add_m) display(m,s,w); /*时间显示*/ void display(uchar a,uchar b,uchar c) unsigned char i; tempdata0=duanmaa/10; tempdata1=duanmaa%10; tempdata2=0x40; tempdata3=duanmab/10;/用于显示分 tempdata4=duanmab%10; tempdata5=0x40; tempdata6=duanmac/10; /用于显示秒 tempdata7=duanmac%10; for(i=0;i<8;i+) p0=weimai; /取位码 latch2=1; /位锁存 latch2=0; p0=tempdata7-i; /取显示数据,段码 latch1=1; /段锁存 latch1=0; delay(2); / 扫描间隙延时,时间太长会闪烁,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论