单片机课程设计说明书级电子信息工程专业班级题目基于单片机的数字时钟设计学号姓名指导教师二О一六年十二月十三日一、电子时钟的基本原理电子钟是一个将“ 时”,“分”,“秒”显示于人的视觉器官的计时装置,根据单片机内部的定时计时器实现定时计时,通过设定计数初值,由单片机晶振产生一定频率的脉冲,可以实现定时计时寄存器的计数,设定计数初值,在完成一次计数时自动请求中断清零,再进行下一步的计数,例如在本题中计数初值为55536,每完成一次计数,就可以实现十毫秒的累加,设置中间参量,累加100次,实现每一秒计数累加,从而完成时钟秒计时,对分钟,小时的设计,进行秒的累加,60秒一分,60分一小时,进行一定的条件控制从而实现了电子时钟计时功能. 通过单片机的数据输出端,将秒数,分数,时数(sec,min,hour),时——分——秒,动态扫描显示,通过控制段码和位码,完成对每个数码管的控制,一般的数字时钟中都要有对时分的控制,一般是通过键控,在本次课题中,通过按键K1,K2,K3,K4,分别实现对时钟的暂停,对分钟的调节,对小时的调节和开始计时,由单片机P3口进行数据控制,实现功能,设定初值在复位键按下后显示12—00—00,直接对hour,min,sec,进行初值设定就可实现本次设计时钟电路。
在本次实验中,我们使用了STC89C52单片机控制电路,使用定时器0工作方式1来实现定时功能,单片机控制电路简单且省去了很多复杂的路线,使得电路简单易懂,使用键盘上的按键来调整时钟的时,分,秒,同时用C语言程序来控制整个时钟的显示,使得编程变的更容易,这样通过三个模块:按键,芯片,显示屏即可满足设计要求。
二、 电子时钟的硬件设计此设计原理框图如图1-1所示,电路图如图1-2所示,此电路包括以下三个部分:单片机,按键和显示电路。
图1-1设计原理框图图1-2电路图经过我们小组讨论决定采用单片机和共阳极数码管等来实现对单片机电子时钟的控制,以下是对实现原理的描述:本设计采用C语言程序设计,使单片机控制数码管显示时,分,秒,当秒计数计满60就向分进位,分计数器计数满60后向时计数器进位,时计数器从12开始,满24后从新计数,时,分,秒结果经过数据处理后可直接送显示器显示,数码管显示采用共阳极,低电平有效,仿真开始运行后,时钟从12:00:00开始运行,当按下KEY1键时时钟暂停,当按下KEY2键时对分进行调整,当按下KEY3键时对时进行调整,当按下KEY4键时,从当前数据开始进行运行,而当按下复位键后程序从头开始执行,即从12:00:00开始从新计数。
原件清单:三、控制电路的C语言源程序#include<reg52.h>typedef unsigned int u16;typedef unsigned char u8;sbit k1=P3^0;//按键端口sbit k2=P3^1;sbit k3=P3^2;sbit k4=P3^3;u8 code smgduan[17]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff,0xc6,0xc0,0x86,0x8e };//显示0~F的值共阳极#define KEY1 1#define KEY2 2#define KEY3 3#define KEY4 4u8 hour,sec,min,ssec;//hour表示时min表示分sec表示秒secc表示中间变量u8 hour = 12,min = 00,sec = 00;//计数初值u8 DisplayData[8];/******************************************************************************** 函数名: delay* 函数功能: 延时函数,i=1时,大约延时10us*******************************************************************************/ void delay(u16 L)//延时{while(L--);}/******************************************************************************* * 函数名: Timer0Init* 函数功能: 定时器0初始化* 输入: 无* 输出: 无*******************************************************************************/ void Timer0Init()//定时器的启动{TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。
TH0=0Xd8; //给定时器赋初值,定时10msTL0=0Xf0;ET0=1;//打开定时器0中断允许EA=1;//打开总中断TR0=1;//打开定时器}/******************************************************************************* * 函数名: Timer0Init1* 函数功能: 定时器0初始化* 输入: 无* 输出: 无*******************************************************************************/ void Timer0Init1()//定时器的关闭{TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。
TH0=0Xd8; //给定时器赋初值,定时10msTL0=0Xf0;ET0=1;//打开定时器0中断允许EA=1;//打开总中断TR0=0;//关闭定时器}//mode=0 单次1:连续u8 KeyScan(u8 mode){static u8 keyen=1;if(mode==1){keyen=1;}if(keyen==1&&(k1==0||k2==0||k3==0||k4==0)) {delay(18000); //消抖处理keyen=0;if(k1==0)return KEY1;else if(k2==0)return KEY2;else if(k3==0)return KEY3;else if(k4==0)return KEY4;}else if(k1==1&&k2==1&&k3==1&&k4==1){keyen=1;}return 0;}void key_anjian()//按键功能的实现{u8 key=KeyScan(1);if(k1==0)//实现定时器的暂停{Timer0Init1();}if(k2==0)//实现分钟的调控{ min++;if(min>=60){min=0;hour++;if(hour>=24){hour=0;}}}if(k3==0)//实现小时的调控{hour++;if(hour>=24){hour=0;}}if(k4==0)//实现定时器的启动{Timer0Init();}}#define DIG P2void DigDisplay()//数码管的选择与显示{u8 i;for(i=0;i<8;i++)//共阳极,低电平有效{switch(i) //位选,选择点亮的数码管,{case(0):DIG=0Xfe; break;//显示第0位case(1):DIG=0Xfd; break;//显示第1位case(2):DIG=0Xfb; break;//显示第2位case(3):DIG=0Xf7; break;//显示第3位case(4):DIG=0Xef; break;//显示第4位case(5):DIG=0Xdf; break;//显示第5位case(6):DIG=0Xbf; break;//显示第6位case(7):DIG=0X7f; break;//显示第7位}P0=DisplayData[i];//发送段码delay(100); //间隔一段时间扫描P0=0x00;//消隐}}void datapros(){DisplayData[0]=smgduan[sec%10];//低位DisplayData[1]=smgduan[sec/10];//高位DisplayData[2]=0xbf;//-DisplayData[3]=smgduan[min%10];//低位DisplayData[4]=smgduan[min/10];高位DisplayData[5]=0xbf;//-DisplayData[6]=smgduan[hour%10];//低位DisplayData[7]=smgduan[hour/10];高位}/******************************************************************************* * 函数名: main* 函数功能: 主函数* 输入: 无* 输出: 无*******************************************************************************/ void main()//主函数,调用子函数{Timer0Init(); //定时器0初始化while(1){datapros();DigDisplay();key_anjian();}}/******************************************************************************* * 函数名: void Timer0() interrupt 1* 函数功能: 定时器0中断函数* 输入: 无* 输出: 无*******************************************************************************/ void Timer0() interrupt 1//程序内部计时{TH0=0Xd8; //给定时器赋初值,定时10msTL0=0Xf0;//计数初值55536ssec++;//中间变量if(ssec>=100) //1s{ssec=0;sec++;if(sec>=60){sec=0;min++;if(min>=60){min=0;hour++;if(hour>=24){hour=0;}}}}}四、课程设计总结五、指导教师评语。