当前位置:文档之家› 基于51单片机的数字钟C语言程序设计及protuse仿真

基于51单片机的数字钟C语言程序设计及protuse仿真

实践教学报告2011-2012 学年第二学期项目名称基于51单片机的数字钟设计所属课程电子产品开发设计与实践教程班级电子10A1姓名赵祥琨学号1006013145指导教师张亚实训时间2012 . 6电子钟摘要本系统以MCS-51单片机为核心,以8位8段数码管显示时间,可以通过键盘设定时间和闹钟时间,并具备整点报时功能。

系统特色:1)使用定时器产生节拍,程序运行采用轮循机制,分时复用CPU 资源,增强系统可靠性。

2)采用采用三个按键设置时钟时间和闹钟时间,使用一个按键关闭闹钟,电路结构简单,使用方便。

关键词:电子钟;C语言;MCS-51;电子ELECTRONIC CLOCKAbstract:The system takes the MCS-51 single chip as the core,display time on 8X7seg,Through the keyboard to set the time and alarm time, and with the whole point timekeeping function.System characteristics:1)Use timer produces beats, running the round-robin mechanism, time division multiplexing CPU resources, improve the reliability of the system.2)Using three key clock set time and alarm time, the use of a button to turn off the alarm, the circuit structure is simple, easy to use.Keywords:…electronic ;C language;electronics目录1、方案设计与论证 (4)1、需求分析 (4)2 程序执行方案 (4)2. 系统框图 (4)2、电路设计 (6)a) 预处理、预定义、变量声明 (7)b) 显示节拍定时器初始化 (9)c) 走时计数定时器初始化 (9)d) 外部中断0 的初始化 (10)e) 软件延时 (11)f) 走时进位计数 (11)g) 显示译码 (12)h) 闹钟设定显示 (14)i) 闹铃 (16)j) 按键扫描译码 (17)k) 主函数 (21)l) 定时器0服务程序 (21)m) 定时器1服务程序 (22)n) 中断0服务程序 (23)4、测试方法与数据 (24)5、结论 (25)1、方案设计与论证1、需求分析时、分、秒正常走时。

时、分、秒在6个数码管上显示。

可调十、分。

可设置闹钟。

整点报时。

2 程序执行方案2.1 子函数顺序结构方案将各个模块放入main()函数顺序执行优点:结构简单,代码量少,层次清晰。

缺点:实时性差,用户体验较差,2.2 中断加顺序方案关键模块采用中断结构,如显示模块,以保证其实时性,对于实时性要求不高的模块采用循环结构嵌套顺序结构。

优点:实时性好,运行稳定,抗干扰性能好缺点:结构复杂综合比较后,选择方案2.2. 系统框图2、电路设计电路采用上电复位方式,设置三个校时按键和一个关闹铃按键,鉴于时钟通常不会人为复位,且主要用软件提高系统稳定性,正常使用不会出现程序崩溃,因此不设置手动复位按键。

P1口通过74HC541缓冲器向数码管发送段码,P2口发送位码,按键“set”接外部中断0,以确保设置选择急事响应并保证正确,加、减按键采用扫描方式接P0.5、P0.6,P3.7接蜂鸣器。

当依次按下set键时,分别对应的设置秒、分、时、闹铃秒、分、时和退出设置7个状态,当超过一定时间没有设置时,自动退出设置状态。

当时间到设定闹铃时间后响铃1分钟,当到59分50秒时,整点报时10秒。

3、软件设计a)预处理、预定义、变量声明#include<reg52.h>#include<intrins.h>#define uint unsigned int#define uchar unsigned char#define th0 TH0 = 0x3d;#define tl0 TL0 = 0xff;#define th1 TH1 = 0xec;#define tl1 TL1 = 0x78;sbit P3_0=P3^0;sbit P0_5=P0^5;sbit P0_6=P0^6;sbit P0_7=P0^7;uchar count = 0,shan=0;//count:计时器累加器,shan:设置闪烁标志位uchar ss=0,s=0,dd=0,d=0,hh=0,h=0;uint t_flag=0; //定时器溢出标志位uchar nh=0,nd=1,ns=0; //时分秒和闹钟时分秒uchar flag=0,key1=0,key2=0,key3=0,key4=0;uchar code table[18] = {0x3f, //00x06, //10x5b, //20x4f, //30x66, //40x6d, //50x7d, //60x07, //70x7f, //80x6f, //90x77, //a0x7c, //b0x39, //c0x5e, //d0x79, //e0x71, //f0x40, //-0x00 //消隐};/********下一行的数组可以显示数值外,还可以显示数码管的点*********/ uchar code table_d[17]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0xf7,0xfc,0xb9,0xde,0xf9,0xf1,0xc0};/*********数码管位选***************************/uchar code led[9] = {0xfe,0xFD,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff};b)显示节拍定时器初始化/****************显示定时器*********************** 名称 : Time1_Init()* 功能 : 定时器的初始化,12MZ晶振,5ms* 输入 : 无* 输出 : 无*************************************************/void Time1_Init(){TMOD = 0x11;th1tl1EA = 1;ET1 = 1;TR1 = 1;}c)走时计数定时器初始化/**************定时器0初始化************************ 名称 : Time0_Init()* 功能 : 定时器的初始化,12MZ晶振,50ms* 输入 : 无* 输出 : 无****************************************************/void Time0_Init(){TMOD = 0x11;th0tl0EA = 1;ET0 = 1;TR0 = 1;}d)外部中断0 的初始化/************外部中断0 的初始化*********************** * 名称 : Outside_Init()* 功能 : 外部中断0 的初始化* 输入 : 无* 输出 : 无*******************************************************/ void Outside_Init(void){EX0 = 1; //开外部中断0IT0 = 1; //负边沿触发EA = 1; //开总中断}e)软件延时/**************软件延时****************************** 名称 : delay()* 功能 : 延时。

* 输入 : uchar* 输出 : 无****************************************************/void delay(uchar k){int i,j;for(i=0; i<=k; i++)for(j=0; j<=200; j++);}f)走时进位计数/************************走时****************************** 名称 : time()* 功能 : 时分秒各位数字运算。

* 输入 : 无* 输出 : 无************************************************************/ void time(){if(h<=23){if(d<=59){if(s<=59){if(t_flag==1){s++;t_flag=0;}elses=s;}else{s=0;key1=0;d++;}}else{d=0;h++;}}elseh=0;}g)显示译码/***********************显示******************************* * 名称 : display()* 功能 : 将数字转换成相应的段码和位码,有定时器1控制。

* 输入 : 无* 输出 : 无************************************************************/ void display(){ flag++;switch(flag){case 1:P2=led[0];P1=table[s%10];break;case 2:P2=led[1];P1=table[s/10];break;case 3:P2=led[2];P1=table[16];break;case 4:P2=led[3];P1=table[d%10];break;case 5:P2=led[4];P1=table[d/10];break;case 6:P2=led[5];P1=table[16];break;case 7:P2=led[6];P1=table[h%10];break;case 8:P2=led[7];P1=table[h/10];break;default:flag=0;break;}}h)闹钟设定显示/*******************闹钟设定显示*************************** 名称 : ndisplay()* 功能 : 将数字转换成相应的段码和位码,有定时器1控制,区别于时间的是所有位均在下方多一点。

相关主题