



版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、成绩课程设计课程名称单片机原理与应用课程设计课题名称时钟跑表设计专业班级学号姓名指导老师林国汉、王迎旭、汪超、李晓秀等2017 年 5月 22日电气信息学院课程设计任务书课题名称姓名专业时钟跑表设计班级学号指导老师林国汉课程设计时间2017 年5 月22 日-2017年6月3日一、任务及要求设计任务:本课题要求以 MCS-51系列单片机为核心,设计一个数字时钟。(1) 具有时钟和跑表功能,用 LED或者液晶显示器进行显示;(2) 具有时钟调整功能(3)*具有闹钟功能,且闹钟时间可调整。(4)* 其它功能设计要求:(1)确定系统设计方案;(2)进行系统的硬件设计;(3)完成应用程序设计;(4)
2、应用系统的硬件和软件的调试。二、进度安排第一周:周一:集中布置课程设计任务和相关事宜,查资料确定系统总体方案。周二周三:完成硬件设计和电路连接周四周日:完成软件设计第二周:周一周三:程序调试周四周五:设计报告撰写。周五进行答辩和设计结果检查。三、参考资料1、 王迎旭等 . 单片机原理及及应用M . 2 版. 机械工业出版社, 20122、 胡汉才 . 单片机原理及其接口技术M .3 版. 清华大学出版社, 2010.3、戴灿金 .51 单片机及其 C 语言程序设计开发实例M . 清华大学出版社, 2010目录第一章总体方案设计错误!未定义书签。1.1 设计方案设计任务与要求.错误!未定义书签。
3、1.2 设计思路及系统框架图.1第二章硬件电路设计错误!未定义书签。2.1单片机 AT89C5132.2矩阵键盘电路42.3蜂鸣器电路42.4 LED 数码管显示电路5第三章软件设计63.1 系统主程序 .63.2 矩阵键盘功能程序 .63.4 定时功能程序 .8第四章调试104.1 系统调试方法 .104.2 调试结果10第五章总结错误!未定义书签。附录11附录 A电路仿真原理图11附录 B程序清单错误!未定义书签。第一章总体方案设计1.1 设计任务与要求设计任务:本课题要求以 MCS-51系列单片机为核心,设计一个数字时钟。(1) 具有时钟和跑表功能,用 LED或者液晶显示器进行显示;(2
4、) 具有时钟调整功能(3)*具有闹钟功能,且闹钟时间可调整。(4)* 其它功能设计要求:(1) 确定系统设计方案;(2) 进行系统的硬件设计;(3) 完成应用程序设计;(4) 应用系统的硬件和软件的调试。1.2 设计思路及系统框架图我们采用的是 AT89C51作为时钟控制芯片。本次方案主要由时钟模块、秒表模块和闹钟模块组成,其中时钟模块包含时钟显示功能、时钟调整功能和时钟暂停功能,秒表模块包含秒表启动功能、秒表暂停功能、秒表时间存储功能和秒表回显功能,闹钟模块包含闹钟调整功能、闹钟显示功能和闹钟存储功能。时钟通过定时器T0 对时、分、秒的数值进行操作,并且秒计算到 60 的时候,要自己清零并向
5、分进 1,分计算到 60 的时候,要自己清零并向时进 1,时进到 24 的时候,要清零,这样才能进行循环计时。秒表模块需要重新显示一个秒表界面,同时也应该需要通过另外一个定时器T1 对秒表进行操作,从而保证在秒表界面,时钟显示模块的时间还在进行。闹钟模块则需要设计闹钟时间,当设计的闹钟时间和时钟的时间相等,蜂鸣器响起,从而达到闹钟功能,此外通过外接24c02 存储芯片,将闹钟时间进行存储,且具有断电存储功能,当系统断电重新开启以后,可显示之前设定的闹钟值。此外还要实现对时间的调整功能, AT89C51的 P1 口外接一个矩阵键盘,当按下 K3 键时,进行时钟调整,当 K3 按下一次时,是对时间
6、的分钟进行调整,按下 K5 键数值加一,按下 K6 键数值减一。当按下 K12键时,进行闹钟的调整,当 K3 按下一次时,是对闹钟的分钟进行调整,按下 K5 键数值加一,按下 K6 键数值减一。对于秒表模块,当按下 K7 键时,秒表启动,当按下 K8 键时,显示秒表当前值,但秒表继续走动。在秒表计时过程中,每按下一次 K9 键,则对秒表当前值进行存储,每按下 K10 键,则对存储值进行一一回显(矩阵键盘按键标号详见电路仿真图)。在单片机内部构建两个模块:控制模块、定时模块,用以实现根据要求进行自动计数功能。单片机外部构建四个电路:矩阵键盘电路、数码管显示电路、蜂鸣器电路、24C021存储电路,
7、用以实现对单片机内部计数选择控制、闹钟响铃、闹钟存储和时间输出的正确显示。该电子时钟是显示分、时值,秒为数码表的DP 位闪烁的一种计时装置本次计时周期设置为 24 小时。为了确保时间正常校对,在系统中设有校对按钮,用以实现对数码管显示的正确调整,如图 1.1 所示为系统框架图。图 1.1系统框架图2第二章 硬件电路设计2.1单片机 AT89C51AT89C51是一低电压、高性能 CMOS的 8 位微处理器,俗称单片机。 AT89C51是一种带 2K 字节闪存可编程可擦除只读存储器的单片机。 单片机的可擦除只读存储器可以反复擦除 1000 次。由于将多功能 8 位 CPU和闪烁存储器组合在单个芯
8、片中, ATMEL的 AT89C51是一种高效微控制器。 AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案,如图 2.1 所示为 AT89C51的管脚图。本次电路中用到单片机的P0、P1、P2、P3 口,所示下面对这四个端口进行详细介绍。P0 口: P0 口为一个 8 位漏级开路双向 I/O 口,每脚可吸收 8TTL 门电流。当 P0 口的管脚第一次写 1 时,被定义为高阻输入。 P0 能够用于外部程序数据存储器,它可以被定义为数据 / 地址的低八位。在 FIASH编程时, P0 口作为原码输入口,当 FIASH进行校验时, P0 输出原码,此时 P0外部必须接上拉电阻。
9、本次课设中 P0 口接的是数码管的 8 个管脚,P00P07 依次接数码管的 A DP管脚。P1 口:P1口是一个内部提供上拉电阻的 8 位双向 I/O 口,P1 口缓冲器能接收输出 4TTL 门电流。 P1 口管脚写入 1 后,被内部上拉为高,可用作输入, P1 口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在 FLASH编程和校验时, P1 口作为低八位地址接收。本次 P1 课设口接的数码管的 6 个位选端口。图 2.1 89C51 引脚图P2 口: P2 口为一个内部上拉电阻的8 位双向 I/O 口, P2 口缓冲器可接收,输出4 个3TTL 门电流,当 P2 口被写“ 1
10、”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时, P2 口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2 口当用于外部程序存储器或16 位地址外部数据存储器进行存取时,P2 口输出地址的高八位。在给出地址“ 1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时, P2 口输出其特殊功能寄存器的内容。 P2口在 FLASH编程和校验时接收高八位地址信号和控制信号。本次课设中 P2 口的 P24 P27 分别接的是数码管的位选 W1W4。P3 口:本次课设中 P3口的 P33 和 P34 分别接的是 24C02的 SCL和 SDA,P37接的是蜂鸣器的一端。2
11、.2矩阵键盘电路在本次设计中,矩阵键盘的 S1 S4 列分别接 P17P14 引脚 ,H1 H4行分别接的是P13P10 引脚。先从 P1 口的高四位输出高电平,低四位输出低电平,从 P1 口的高四位读取键盘状态。再从 P1 口的高四位输出低电平,低四位输出高电平,从 P1口的低四位读取键盘状态。将两次读取结果组合起来就可以得到当前按键的特征编码。使用上述方法我们得到 16 个键的特征编码。如图 2.2 所示为矩阵键盘接线图。图 2.2矩阵键盘接线图2.3蜂鸣器电路当时钟显示的时间与闹钟存储的时间相同时,P37 引脚输出低电平,使蜂鸣器接通,发出滴滴的响声,响声持续时间为20 秒,20 秒后
12、P37 引脚输出高电平,蜂鸣器关断,如图 2.3 所示为蜂鸣器接线图。4图 2.3蜂鸣器接线图2.4LED数码管显示电路在本次的设计中,采用的 4 位的数码管显示器。数码管如果按照段数分可为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元,也就是多了一个小数点的显示;如果按照发光二极管单元的连接方式又可以分为共阳极数码管和共阴极数码管。共阳极的数码管是将所有发光二极管的阳极接到一起后就形成公共阳极(COM)的数码管,共阳极数码管在应用时要将公共极( COM)接到 +5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮,当某一字段的阴极为高电平时,相应字段就不亮。共阴极数
13、码管是将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管,共阴极数码管在应用时应将公共极( COM)接到地线 GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮,当某一字段的阳极为低电平时,相应字段就不亮。本次课设的数码管选用共阳极八段数码管,如图 2.4 所示为 LED数码管接线图。图 2.4 LED 数码管接线图5第三章软件设计3.1系统主程序先对显示单元和定时器/ 计数器初始化,然后重复调用数码管显示模块和按键处理模块,检测矩阵按键值,则转入相应的功能程序。主程序流程图如图3.1 所示。图 3.1主程序流程图3.2矩阵键盘功能程序本次设计的 16 个矩阵按键共用到了
14、12 个按键,每个按键都有相应的功能。K1键为时钟启动键,按下 K1 键后数码管显示时钟。此时按下K3 键以后进行时钟调整,按一下进行分钟调整,按两下进行小时调整。接着按K5 键数值加一,按 K6 键数值减一。每次调整分钟或小时之后都要按 K1 键进行确定之后才能重新按 K3 键进行调整。按下 K7 键启动秒表,接着按下 K8 键,秒表暂停,但此时秒表还在走动,只是显示按键时秒表的当前值。在秒表走动过程中,按下K9 键则存储当前按下值,每按一下,存储一个值,按下K10 键后则回显秒表之前存储的值,每按一下,回显一个时间,循环显示。K11 键为闹钟显示功能按键,K12为闹钟调整按键,按一下进行分
15、钟调整,按两下进行小时调整。接着按K5 键数值加一,按 K6 键数值减一。每次调整分钟或小时之后都要按 K11 键进行确定之后才能重新按 K12 键进行调整。此外 K2 键为时钟暂停键, K4 键为系统清零键。时钟模块、秒表模块和闹钟模块对应的矩阵键盘功能程序流程图分别如图 3.3 、图 3.4 、图 3.5 所示。6初始化N是否有按键按下初始化N是否有按键按下YNNYK7键?K1键?Y时钟显示NK3键是否按下?Y两下按几下?一下分钟调整小时调整图 3.3时钟模块矩阵键盘功能流程图Y秒表启动NNK9键是否按下?K8键是否按下?YY存储按下时秒表时秒表暂停间NK10键是否按下?Y秒表回显图 3.
16、4秒表模块矩阵键盘功能流程图7初始化N是否有按键按下YNK12键?Y闹钟调整NN按一下?按两下?YY分钟调整小时调整NNK5键是否按下?K6键是否按下?YY数值加一数值减一图 3.5闹钟模块矩阵键盘功能流程图3.3定时功能程序T0 用于时钟定时,定时时间设为 50ms,定时时间到则中断,在中断服务程序中用一个计数器对 50ms计数,计 20 次则对秒单元加一。秒单元加到 60 则对分单元加一,同时秒单元清 0;分单元加到 60 则对时单元加一,同时分单元清 0;时单元加到 24 则对时单元清 0,标志一天时间计满。 T1 用于秒表定时,定时时间设为 20ms,定时时间到则中断,在中断服务程序中
17、用一个计数器对 20ms计数,计 5 次则对秒表的 100 毫秒单元加一。 100毫秒单元加到 10 则对秒单元加一,同时 100 毫秒单元清 0;秒单元加到 1000 则自动清 0。时钟的秒显示为数码管第四位管子的 DP值闪烁,每次秒加一 DP就会闪烁一次。 定时器 T0 功能流程图如图 3.4 所示,定时器 T1 功能流程图如图 3.5 所示。8开始现场保护,重装出值,启动下一个50ms50ms计数器加一N50ms 计数器=20 ?Y秒单元加一,50ms计数器清零N秒单元=60 ?Y分单元加一,秒单元清零N分单元=60 ?Y时单元加一,分单元清零N时单元=24 ?Y时单元清零中断返回图 3
18、.4定时器 T0 功能流程图开始现场保护,重装出值,启动下一个20ms20ms 计数器加一N20ms 计数器=5 ?Y100ms 单元加一,20ms 计数器清零N100ms 单元=10 ?Y秒单元加一,100ms单元清零N秒单元=1000?Y秒单元清零中断返回图 3.5定时器 T1 功能流程图9第四章调试4.1系统调试方法先在电脑上使用 Proteus 仿真软件进行电路的仿真进行仿真, 编程使用 keil、调试工具并生成可执行文件加载到单片机中,在 Proteus 中点击运行,查看运行结果是否与预期要求相符,如果仿真成功,便可以到实验板上进行实物实验。4.2调试结果图 4.1 时钟显示调试图图
19、 4.2 秒表显示调试图图 4.3 闹钟显示调试图第五章总结与体会10附录附录 A电路仿真原理图11附录 B程序清单#include"reg52.h"#include"intrins.h" #ifndef _I2C_H_ #define _I2C_H_ #define uint unsigned int #define uchar unsigned charuint xdata resultm100; uint xdata resultf100; uchar codeduanxuan= 0xc0,0xf9,0xa4,0xb0,0x99 ,0x92,0x8
20、2,0xf8,0x80,0x90,0x7f,0x83,0xc6,0xa1,0x86,0x8e,0xff;/共阳极 0f数码管编码uchar codeduanxuan1= 0xc0-0x80,0xf9-0x80,0xa 4-0x80,0xb0-0x80,0x99-0x80,0x92-0x80, 0x82-0x80,0xf8-0x80,0x80-0x80,0x90-0x 80,0x7f-0x80,0x83-0x80,0xc6-0x80,0xa1 -0x80,0x86-0x80,0x8e-0x80 ,0xff-0x80 ;uchar codeweixuan=0xe0,0xd0,0xb0,0x70;u
21、char flag3;uchartemp,timer0_shi,timer0_fen,timer0_mia o;uchar timer1_fm,nao1,nao2,nao3,nao4; uint timer1_zm;uchar timer1_bw, timer1_sw, timer1_gw; uchar c,z,k;sbit beep =P37 ;sbit scl=P34;sbit sda=P35;uint t0=0,t1=0;/-定义使用的 IO 口-/sbit I2C_SCL = P34;sbit I2C_SDA = P35;void I2C_Delay10us();void I2C_St
22、art();void I2C_Stop();uchar I2C_SendByte(uchar dat, uchar ack);uchar I2C_ReadByte();void At24c02Write(unsigned char addr,unsigned char dat);unsigned char At24c02Read(unsignedchar addr);#endifvoid init(void)TMOD=0x11;TCON=0x01;TH0=0x3c; /定时 50msTL0=0x0b0;TH1=0xb1;/ 定时 20msTL1=0xe0;EA=1;EX0=1;ET0=1;ET
23、1=1;void delay(uint x) /12Mhz延时 xmsuint i,j;for(i=x;i>0;i-)for(j=20;j>0;j-);12void smg_display(uchar dx,uchar wx)/数码管位选return temp1_keyvalue;P0=duanxuandx;P2=weixuanwx-1;voidnaozhong(uchar s,uchar f)delay(1);if(s=timer0_shi&&f=timer0_fen)void smg_display1(uchardx,ucharwx)/数码管位选if(timer
24、0_miao<=20)beep=0;P0=duanxuan1dx;if(timer0_miao>20)P2=weixuanwx-1;beep=1;delay(1);uchar keyscan()void disposal(void)uchar hour,second,timer1_ffm;uchar temp_keyvalue,temp1_keyvalue;P1=0xf0;uchardelay(1);zt_bw,zt_sw,zt_gw,zt_fm;temp_keyvalue=P1;uchar nao_fen,nao_shi;if(temp_keyvalue!=0xf0)uchard
25、elay(2);nao_gsw,nao_ggw,nao_dsw,nao_dgw;temp_keyvalue=P1;if(temp_keyvalue!=0xf0)ucharkey_progress,timer0_gsw,timer0_ggw,fltemp1_keyvalue=temp_keyvalue&0xf0;ag1,flag2;P1=0x0f;uchardelay(2);timer0_dsw,timer0_dgw,s1,s2,f1,f2;temp_keyvalue=P1;key_progress=keyscan();temp1_keyvalue=temp1_keyvalue|temp
26、switch(key_progress)_keyvalue;case 0xbe:/时钟暂停while(temp_keyvalue!=0x0f)TR0=0;timer0_gsw=timer0_shi/10;P1=0x0f;timer0_ggw=timer0_shi%10;temp_keyvalue=P1;timer0_dsw=timer0_fen/10;13timer0_dgw=timer0_fen%10;flag3=1;smg_display(timer0_gsw,1);timer0_gsw=timer0_shi/10;smg_display1(timer0_ggw,2);timer0_ggw
27、=timer0_shi%10;smg_display(timer0_dsw,3);timer0_dsw=timer0_fen/10;smg_display(timer0_dgw,4);timer0_dgw=timer0_fen%10;break;smg_display(timer0_gsw,1);case 0xee:/清零delay(30);TR0=0;TR1=0;smg_display1(timer0_ggw,2);timer1_zm=0;delay(30);timer1_fm=0;timer0_shi=0;smg_display(timer0_dsw,3);timer0_fen=0;del
28、ay(30);timer0_dgw=timer0_fen%10;timer0_gsw=timer0_shi/10;smg_display(timer0_dgw,4);timer0_ggw=timer0_shi%10;delay(30);timer0_dsw=timer0_fen/10;if(nao1|nao2)!=0)timer0_dgw=timer0_fen%10;naozhong(nao2,nao1);smg_display(timer0_gsw,1);temp=P1;smg_display1(timer0_ggw,2);break;smg_display(timer0_dsw,3);sm
29、g_display(timer0_dgw,4);case 0xde: /时钟调整break;keyscan();flag3=0;case 0x7e:/时钟启动temp=P1;keyscan();flag2=0;temp=P1;flag1+;nao1=At24c02Read(1);if(flag1>2)nao1=At24c02Read(1);flag1=2;nao2=At24c02Read(2);while(temp =0xf0)nao2=At24c02Read(2);while(temp =0xf0)s1=timer0_gsw;TR0=1;s2=timer0_ggw;14f1=timer
30、0_dsw;delay(50);f2=timer0_dgw;smg_display(f1,3);hour=s2+s1*10;delay(50);second=f2+f1*10;smg_display(f2,4);smg_display(s1,1);delay(50);delay(50);nao1=f2+f1*10;smg_display1(s2,2);nao2=s2+s1*10;delay(50);temp=P1;smg_display(f1,3);if(keyscan()=0x7e)delay(50);smg_display(f2,4);timer0_fen=f2+f1*10;delay(5
31、0);timer0_shi=s2+s1*10;temp=P1;flag1=0;flag2=0;break;if(keyscan()=0xdb)case 0x7d: /加时钟 flag3=0;nao_fen=f2+f1*10;if(flag1=1|flag2=1)nao_shi=s2+s1*10;second+;flag1=0;if(flag1=2|flag2=2)flag2=0;hour+;if(hour>=24)hour=0;break;if(second>=60)second=0;case 0xbd:/减时钟keyscan();flag3=0;temp=P1;if(flag1=
32、2|flag2=2)while(temp =0xf0) s1=hour/10;if(hour<=0)s2=hour%10;hour=24;f1=second/10;hour-;f2=second%10;smg_display(s1,1);if(flag1=1|flag2=1)delay(50);smg_display(s2,2);if(second<=0)15second=60;break;second-;case 0xeb:/闹钟调整keyscan();keyscan();temp=P1;flag3=0;while(temp =0xf0)temp=P1; s1=hour/10;f
33、lag2+;s2=hour%10;flag1=0;f1=second/10;if(flag2>2)f2=second%10;flag2=2;smg_display(s1,1);while(temp =0xf0)delay(50);smg_display(s2,2);nao_gsw=nao2/10;delay(50);nao_ggw=nao2%10;smg_display(f1,3);if(flag2=1)delay(50);nao_dsw=nao1/10;smg_display(f2,4);nao_dgw=nao1%10;delay(50);temp=P1;nao3=nao_ggw+na
34、o_gsw*10;nao1=f2+f1*10;nao4=nao_dgw+nao_dsw*10;nao2=s2+s1*10;smg_display(nao_gsw,1);if(keyscan()=0x7e)delay(50);smg_display1(nao_ggw,2);timer0_fen=f2+f1*10;delay(50);timer0_shi=s2+s1*10;smg_display(nao_dsw,3);flag1=0;delay(50);flag2=0;smg_display(nao_dgw,4);delay(50);if(keyscan()=0xdb)temp=P1;nao_fe
35、n=f2+f1*10;break;nao_shi=s2+s1*10;flag1=0;case 0xdb:/闹钟确定flag2=0; flag3=0;keyscan();temp=P1;16while(temp =0xf0)timer1_gw=timer1_zm%100%10;timer1_ffm=timer1_fm;nao_gsw=nao2/10;smg_display(timer1_bw,1);nao_ggw=nao2%10;delay(10);nao_dsw=nao1/10;smg_display(timer1_sw,2);nao_dgw=nao1%10;delay(10);nao3=na
36、o_ggw+nao_gsw*10;nao4=nao_dgw+nao_dsw*10;smg_display1(timer1_gw,3);smg_display(nao_gsw,1);delay(10);delay(20);smg_display(timer1_fm,4);smg_display1(nao_ggw,2);delay(10);delay(20);temp=P1;smg_display(nao_dsw,3);delay(20);keyscan();smg_display(nao_dgw,4);if(keyscan()=0xed)delay(20);temp=P1;zt_bw=timer
37、1_bw;zt_sw=timer1_sw;At24c02Write(1,nao1);zt_gw=timer1_gw;At24c02Write(1,nao1);zt_fm=timer1_fm;At24c02Write(2,nao2);At24c02Write(2,nao2);break;break;case 0xed:/跑表暂停case 0xdd:/ 跑表启动keyscan();flag3=0;flag3=0;smg_display(zt_bw,1);temp=P1;delay(20);while(temp =0xf0)smg_display(zt_sw,2);delay(20);TR1=1;s
38、mg_display1(zt_gw,3);delay(20);timer1_bw=timer1_zm/100;smg_display(zt_fm,4);delay(20);timer1_sw=(timer1_zm/10)%10;break;17case 0x7b:/跑表计次数zt_sw=timer1_sw;k+;zt_gw=timer1_gw;c=k;zt_fm=timer1_fm;z=k;flag3=0;keyscan();keyscan();temp=P1;if(keyscan()=0xbb)resultfk-1=timer1_fm;k=0;break;resultmk-1=timer1_
39、bw*100+timer1_sw*10+timer1_gw;case 0xbb:/跑表回显while(temp =0xf0)flag3=0;k=0;TR1=1;c-;timer1_ffm=resultfc;timer1_bw=timer1_zm/100;timer1_bw=resultmc/100;timer1_sw=(timer1_zm/10)%10;timer1_sw=(resultmc/10)%10;timer1_gw=timer1_zm%100%10;timer1_gw=resultmc%100%10;timer1_ffm=timer1_fm;keyscan();smg_display
40、(timer1_bw,1);temp=P1;delay(5);while(temp =0xf0)smg_display(timer1_sw,2);delay(5);if(c=0)c=z;smg_display1(timer1_gw,3);smg_display(timer1_bw,1);delay(5);delay(30);smg_display(timer1_fm,4);smg_display(timer1_sw,2);delay(5);delay(30);temp=P1;smg_display1(timer1_gw,3);keyscan();delay(30);if(keyscan()=0
41、xed)smg_display(timer1_ffm,4);zt_bw=timer1_bw;delay(30);18temp=P1;timer0_fen=0;timer0_shi+;break;if(timer0_shi=24)timer0_shi=0;void main()init();void timer1() interrupt 3while(1)keyscan();TH1=0xb1;/ 定时 20msdisposal();TL1=0xe0;t1+;if(t1=5)void timer0() interrupt 1t1=0;timer1_fm+;TH0=0x3c;TL0=0x0b0;if
42、(timer1_fm=10)t0+;if(t0=20)timer1_fm=0;timer1_zm+;t0=0;timer0_miao+;if(timer1_zm>=1000)if(flag3=1)smg_display(10,4);timer1_zm=0;delay(25);void I2C_Delay10us()if(timer0_miao=60)uchar a, b;timer0_miao=0;for(b=1; b>0; b-)timer0_fen+;for(a=2; a>0; a-);if(timer0_fen=60)19void I2C_Start()I2C_SDA = 1;I2C_Delay10us();I2C_SCL = 1;I2C_Delay10us();/ 建立时间是I2C_SDA保持时间 >4.7usI2C_SDA = 0;I2C_Delay10us();/保持时间是 >4usI2C_SCL = 0;I2C_Delay10us();void I2C_Stop()I2C_SDA = 0;I2C_Delay10us();I2C_SCL = 1;I2C_Dela
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 公租房承建合同样本
- fisic合同标准文本交钥匙
- 企业加工合同样本
- 个人业务合同样本
- 粪污治理合同范本
- 婚礼策划服务合同(2篇)
- 2025至2030年中国十二生肖纪念章数据监测研究报告
- 2025至2030年中国化玻仪器市场调查研究报告
- 2025至2030年中国刷握盒行业发展研究报告
- 餐饮会所转让合同范本
- GB/T 1972-2005碟形弹簧
- GB/T 13452.2-2008色漆和清漆漆膜厚度的测定
- 2023年中国工商银行天津分行校园招聘考试录用公告
- 送达地址确认书(诉讼类范本)
- 班组工程量结算书
- 生产件批准申请书
- 环境监测考试知识点总结
- 爵士音乐 完整版课件
- 冀教版七年级下册数学课件 第8章 8.2.1 幂的乘方
- XX公司“十四五”战略发展规划及年度评价报告(模板)
- 计算机辅助设计(Protel平台)绘图员级试卷1
评论
0/150
提交评论