《单片机_电子时钟实验报告》由会员分享,可在线阅读,更多相关《单片机_电子时钟实验报告(18页珍藏版)》请在金锄头文库上搜索。
1、 单片机原理与接口技术课程设计电子时钟电子信息工程学院一、实验实验任任务务及要求及要求在焊接的电路板中,4个LED数码管,设计带有闹铃功能的数字时钟,要求:1、在4位数码管上显示当前时间。显示格式“时时分分”;”2、由LED闪动做秒显示;3、利用按键可对时间及闹玲进行设置,并可显示闹玲时间。当闹玲时间到蜂鸣器发出声响,按停止键使可使闹玲声停止。二、方案二、方案论证论证与比与比较较2.1数字数字时钟时钟方案方案数字时钟是本设计的最主要的部分。根据需要,可利用两种方案实现。方案一:本方案采用Dallas公司的专用时钟芯片DS12887A。该芯片内部采用石英晶体振荡器,其芯片精度不大于10ms/年,
2、且具有完备的时钟闹钟功能,因此,可直接对其以用于显示或设置,使得软件编程相对简单。为保证时钟在电网电压不足或突然掉电等突发情况下仍能正常工作,芯片内部包含锂电池。当电网电压不足或突然掉电时,系统自动转换到内部锂电池供电系统。而且即使系统不上电,程序不执行时,锂电池也能保证芯片的正常运行,以备随时提供正确的时间。方案二:本方案完全用软件实现数字时钟。原理为:在单片机内部存储器设三个字节分别存放时钟的时、分、秒信息。利用定时器与软件结合实现5毫秒定时中断,每产生一次中断,存储器内相应的计数值加1;若计数值达到200,则将其清零,并将相应的秒字节值加1;若秒值达到60,则清零秒字节,并将分字节值加1
3、;若分值达到60,则清零分字节,并将时字节值加1;若值达到24,则将时字节清零。该方案具有硬件电路简单的特点。但由于每次执行程序时,定时器都要重新赋初值,所以该时钟精度不高。而且,由于是软件实现,当单片机不上电,程序不执行时,时钟将不工作。基于硬件电路的考虑,本设计采用方案二完成数字时钟的功能。2.2数数码码管管显显示方案示方案方案一:静态显示。所谓静态显示,就是当显示器显示某一字符时,相应的发光二极管恒定的导通或截止。该方式每一位都需要一个8 位输出口控制。静态显示时较小的电流能获得较高的亮度,且字符不闪烁。但当所显示的位数较多时,静态显示所需的I/O口太多,造成了资源的浪费。方案二:动态显
4、示。所谓动态显示就是一位一位的轮流点亮各个位,对于显示器的每一位来说,每隔一段时间点亮一次。利用人的视觉暂留功能可以看到整个显示,但必须保证扫描速度合适,字符才不闪烁。显示器的亮度既与导通电流有关,也于点亮时间与间隔时间的比例有关。调整参数可以实现较高稳定度的显示。动态显示节省了I/O口,降低了能耗。从节省I/O口和降低能耗出发,本设计采用方案二。三、各个部分的分析三、各个部分的分析1) )显显示示电电路:通路:通过过 4 个个 LED 显显示屏示屏显显示分示分钟钟和小和小时时两个两联的 LED 显示器,通过与单片机 P1 接口连接实现显示功能。而实现 4 个 LED 灯动态显示,靠的是位选电
5、路2)位)位选电选电路路四位共阳 LED 数码管,其标号分别为 HourH,HourL,MinL,MinH,低电平选通,且任何时候仅有一位输出低电平,显示时对各显示器进行动态扫描,显示器分时轮流工作。虽然每次只有一个显示器显示,但是由于人的视觉暂留现象我们仍会感觉所有的显示器都在同时显示。P0 口作为输出口控制 8 个发光二极管的亮灭,控制数码管的显示。因此,可以实现 4 个LED 在我们看来同时亮,显示时间。3) 闹铃闹铃部分:使用蜂部分:使用蜂鸣鸣器器实现闹钟实现闹钟功能功能其中,buzzer 端口接到单片机的 P1.7 输出。 (端口连接在最后介绍)4) 开关部分开关部分:使用了使用了
6、5 个开关控制整个个开关控制整个电电路的启路的启动动,修改,修改时间时间, ,设设置置闹钟闹钟,关,关闭闭电电路等功能路等功能为查询方式典型电路。其中 Setbutton 为复位开关,swtich 为转换模式开关,即工作模式和调时间模式,Increase 为调时间模式中控制时间变化的按钮,STRAT 和 STOP 分别为开启和结束按钮,这 5 个开关分别接到 P2.0-P2.5 端口,以控制其输入。5) 串串转转并并电电路路为了进一步节省 I/O 口,有添加了一个额外的串转并电路由以上电路,我们将 P1.0-P1.2 扩展到 7 个 I/O 口,我们采用的是 74HC595 芯片,管脚图如下:
7、7)复位)复位电电路路整体整体电电路路图图如下:如下:四、四、软软件件设计设计由于由于汇编语汇编语言繁言繁琐琐,我,我们们采用的是采用的是 C 语语言言编编程,源程序及注程,源程序及注释释如下:如下:#include #include /时分#define TYPE unsigned char#define HOUR 0 #define MIN 1 /显示状态#define NORMAL 0 #define BELLTIME 1 #define SETTING_N 2 #define SETTING_C 3 /闪烁显示#define NoMask 0 #define MaskHour 1 #d
8、efine MaskMin 2 #define MaskAll 3 #define uchar unsigned char #define uint unsigned int /Bit Definition /数码管 sbit HourH = P13; /低电平,数码管使能sbit HourL = P14; sbit MinH = P15; sbit MinL = P16; /蜂鸣器 sbit Buzzer = P17; /低电平,蜂鸣器响 /键盘sbit SetButton = P20;/按键定义,设置(正常,定时显示切换)键,时位分位转换键,增加键sbit Switch =P21; sbi
9、t Increase = P22; sbit Start = P23; sbit Stop = P24; /LED sbit SecLed = P25; /秒显示,低电平点亮 sbit ClockStartLED = P26; /闹钟定闹开始 /74HC595 输入管脚定义sbit SH_CP = P10; sbit DS = P11; sbit ST_CP = P12; /Function Definition void delay5ms(void); void Clock(); void Display(); void Set(); void Ring(); void StopRing()
10、; void ShowANum(uchar i);void StartRing(); void delaykey(void); void MaskShow(uchar Num,TYPE t); /Variable Definition /正常时间uchar hour=8; uchar min=0; uchar sec=0; uint count=0; /闹钟定时uchar mp=1; uchar st=0; uchar cHour=8; uchar cMin=0; /模式标示uchar displayMode=NORMAL; uchar currentSelect=HOUR; /数码管数字显示
11、编码uchar H1; uchar H2; uchar M1; uchar M2; uchar temp; uchar code DSY_CODE=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff; /闪烁显示uchar MaskType=NoMask; uint blinkcount=0; /音乐uchar p=0; uchar temp=0; uchar jiepai=0; uchar yindiao=0; uchar Pai1_4=20; uchar jpLength=0; /音调数组unsigned char code mus
12、ic= 0xFF,0xFF,0xF8,0x89,0xf9,0x59,0xfa,0x13,0xfa,0x68,0xfb,0x04,0xfb,0x90,0xfc,0x0c,0xfc,0x44,0xfc,0xad,0xfd,0x0a,0xfd,0x34,0xfd,0X82,0xfd,0xc8,0xfe,0x06,0xfe,0x22,0xfe,0x56,0xfe,0x85,0xfe,0x9a,0xfe,0xc1,0xfe,0xe4,0xff,0x03,0xff,0x11 ; /音乐编码unsigned char code Mmusic= /音阶测试/1,4,2,4,3,4,4,4,5,4,6,4,7,
13、4,8,4, /9,4,10,4,11,4,12,4,13,4,14,4,15,4, /16,4,17,4,18,4,19,4,20,4,21,4,22,4,/两只老虎 1,4,2,4,3,4,1,8,1,4,2,4,3,4,1,8,3,2,4,8,5,5,3,2,4,8,5,5, 5,5,6,2,5,5,4,4,3,4,1,8,5,5,6,2,5,5,4,4,3,4,1,8,3,4,1,4,2,8,3,4,1,4,2,8 ,0xff,0x00/结束标记; void main() /设置 T0,T1TMOD = 0x11;TH0 = 0x0EC;TL0 = 0x78;TH1 = 0x0F0;T
14、L1 = 0x60; ET0=1; ET1=1; EA=1; TR0=1; /设置定时器的优先级 PT0=1; /5ms 标准时钟设为高优先级,保证计时的准确性PT1=0; /顺序执行(主循环)while(1) /设置何时开启 T1 定时器if(displayMode!=NORMAL|mp=0) TR1=1; else TR1=0; MaskType=NoMask; /方法并行 Display(); Display(); Set(); StartRing(); Ring(); StopRing(); void Clock() interrupt 1 TH0 = 0x0EC;TL0 = 0x78
15、; count+; if(mp=0) /控制音乐节拍if(jpLength-=100) blinkcount=0; if(displayMode=BELLTIME) if(MaskType=NoMask) MaskType=MaskAll; else MaskType=NoMask; else if(displayMode=SETTING_C|displayMode=SETTING_N) if(currentSelect=HOUR) if(MaskType=NoMask) MaskType=MaskHour; else MaskType=NoMask; if(currentSelect=MIN
16、) if(MaskType=NoMask) MaskType=MaskMin; else MaskType=NoMask; void StartRing() if(Start=0) ClockStartLED=0; st=1; Start=1; void Ring() if(st=1 mp=0; void StopRing() if(Stop=0) Buzzer=1; mp=1; p=0; ClockStartLED=1; st=0; MaskType=NoMask; void Display() /分析 COUNT,合成 HOUR,MIN if(count=200) count=count-200; sec+; if(sec=60) s