当前位置:文档之家› 简易数字钟设计

简易数字钟设计

信息与电气工程学院课程设计说明书(2014 /2015 学年第二学期)课程名称:单片机课程设计题目:简易数字钟设计专业班级:学生姓名:学号:指导教师:设计周数:2周设计成绩:2015年6 月25 日1、课程设计目的(1)综合利用所学单片机知识完成一个单片机应用系统设计并在实验室实现,从而加深对单片机软硬知识的理解,获得初步的应用经验。

(2)学习A T89C51定时/计数器的原理及基本应用。

(3)掌握多为数码管动态显示方法。

(4)掌握Keil uVision2 IDE的使用方法。

【包括项目文件的建立,给项目添加程序件,编译、连接项目,形成目标文件,运行调试观察结果,多文件的处理,仿真环境的设置。

】(5)掌握Keil C51的调试技巧。

【包括如何设置和删除断点,如何查看和修改寄存器的内容,如何观察和修改变量,如何观察存储器区域,并行口的使用,定时器/计数器的使用,串行口的使用,外中断的使用。

】(6)掌握PROTEUS软件使用过程。

2、简易数字钟的要求及软硬件的分析2.1简易数字钟的设计要求利用电子电路构成一个简易数字钟,该数字钟电路主要由C51单片机、4位共阳极数码管、时计数、分计数器、蜂鸣器、LED灯、NPN型和PNP型三极管、按键、若干电阻和导线组成。

其中电路系统的分计数器采用60进制,时计数器采用24进制,。

译码器显示电路将时、分计数器的输出状态通过三个两位共阳数码管显示出来。

整点报时电路根据计时系统的输出状态产生一个脉冲信号,用蜂鸣器输出。

相对机械钟而言,数字钟能达到准确计时,并显示小时、分钟,同时通过不同按键的不同功能对该数字钟进行小时和分钟调整,也可通过按键来接她通蜂鸣器来发出响声。

2.2数字钟的软件分析2.1.1数字钟软件的系统分析系统的软件设计也是工具系统功能的设计。

单片机软件的设计主要包括执行软件(完成各种实质性功能)的设计和监控软件的设计。

单片机的软件设计通常要考虑以下几个方面的问题:(1)根据软件功能要求,将系统软件划分为若干个相对独立的部分,设计出合理的总体结构,使软件开发清晰、简洁和流程合理;(2)培养良好的编程风格,如考虑结构化程序设计、实行模块化、子程序化。

既便于调试、链接,又便于移植和修改;(3)建立正确的数学模型,通过仿真提高系统的性能,并选取合适的参数;(4)绘制程序流程图;(5)合理分配系统资源;(6)为程序加入注释,提高可读性,实施软件工程;(7)注意软件的抗干扰设计,提高系统的可靠性。

系统软件设计流程图这次的数字电子钟设计用到很多子程序,它们的流程图如下所示。

主程序是先开始,然后启动定时器,定时器启动后在进行按键检测,检测完后,就可以显示时间。

按键处理是先检测秒按键是否按下,秒按键如果按下,秒就加 1,如果没有按下,就检测分按键是否按下,分按键如果按下,分就加1,如果没有按下,就检测时按键是否按下,时按键如果按下,时就加1,如果没有按下,就把时间显示出来。

2.2.2 简易数字钟程序#include <regx52.h>#define uchar unsigned char#define uint unsigned intsbit k1 = P3^5; //按键1sbit k2 = P3^4; //按键2sbit k3 = P3^3; //按键3sbit k4 = P3^2; //按键4sbit LED = P1^0; //LED显示sbit beep = P3^6; //蜂鸣器int m1 = 0, m2 = 0, m3 = 0, m4 = 0; //数码管要显示的数字int time_n = 0; //1s时间到标志位int smg_n = 0; //位选控制哪个数码管闪int xz_flg = 0; //选择键是否被按下int shi = 0, fen = 0; miao = 0;int zd_flg = 0; //整点标志char duan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};//段选编码0~9~null; //----------------------------------------------------- //本文件函数 void System_Init();//初始化函数void Smg_Scan(); //数码管动态扫描void Delay_1ms(uint z); //延时函数void Blink(uint wei); //数码管闪烁函数void Key_Scan(); //按键扫描函数void Bao_Shi(); //整点报时/**********************************************************************************/ void main(){System_Init();while(1){Smg_Scan();Key_Scan();Bao_Shi();}} /**********************************初始化子函数 void System_Init() //初始化函数{ TMOD = 0X01; //定时器0 工作方式1TH0 = 0X4C; //定时50000usTL0 = 0X00;EA = 1;ET0 = 1;TR0 = 1;} /************************************延时子函数void Delay_1ms(uint z) //1ms延时函数{uint x,y;for(x = z;x > 0;x--)for(y = 110;y >0;y--);} /***************************************数码管扫描子函数void Smg_Scan(){P2_0= 0; //数码管1位选通P0 = duan[m1]; //送段选Delay_1ms(1); //延时1msP2_0=1; //数码管1位关断P2_1=0; //数码管2位选通P0 = (duan[m2]& 0x7f); //送段选Delay_1ms(1); //延时1msP2_1=1;P2_2=0; //数码管3位选通P0 = duan[m3]; //送段选Delay_1ms(1); //延时1msP2_2=1;P2_3= 0; //数码管4位选通P0 = duan[m4]; //送段选Delay_1ms(1); //延时1msP2_3=1;} /***************************************中断子函数void time0() interrupt 1 //yanshi zi chengxu{TH0 = 0X4C; //定时50000usTL0 = 0X00;time_n++;if(time_n == 10) //0.5s 到了吗?{ LED = ~LED;if(xz_flg == 1){switch(smg_n) //到了0.5s 对应位的数码管灭{case 0 : m1 = 10;Delay_1ms(500); break;case 1 : m2 = 10; Delay_1ms(500); break;case 2 : m3 = 10; Delay_1ms(500);break;case 3 : m4 = 10;Delay_1ms(500); break;}}}if(time_n == 20) //1s 到了{time_n = 0;miao++;if(miao == 60){miao = 0;fen++;if(fen ==60){zd_flg = 1; //整点标志shi++;if(shi == 24){shi = 0;}}}m4 = fen % 10; //数码管4显示分钟的低位m3 = fen / 10; //数码管3显示分钟的高位m2 = shi % 10; //数码管2显示小时的低位m1 = shi / 10; //数码管1显示小时的高位}} /*****************************************************键盘扫描子函数void Key_Scan(){if(k1 == 0) //选择键{Delay_1ms(21); //延时20msif(k1 == 0) //按键1确实被按下{xz_flg = 1; //选择键按下EA = 0;smg_n++; //改变选择的数码管if(smg_n == 4){smg_n = 0;}while(!k1) //松手检测{Smg_Scan(); //使按下键时所有数码管都亮}Delay_1ms(21);while(!k1);}}if(xz_flg == 1){if(k2 == 0) //加1键{Delay_1ms(21);if(k2 == 0){switch(smg_n){case 0 : m1++;if(m1 == 2){m1 = 0;}break;case 1 : m2++;if(m2 == 10){m2 = 0;}break;case 2 : m3++;if(m3 == 6){m3 = 0;}break;case 3 : m4++;if(m4 == 10){m4 = 0;}break;}while(!k2) //松手检测{Smg_Scan();}Delay_1ms(21);while(!k2);}}if(k3 == 0) //减1键{Delay_1ms(21);if(k3 == 0){ switch(smg_n){case 0 : m1--; if(m1 == -1) { m1 = 2; } break;case 1 : m2--; if(m2 == -1) { m2 = 9; } break;case 2 : m3--; if(m3 == -1) { m3 = 5; } break;case 3 : m4--; if(m4 == -1) { m4 = 9; } break;}while(!k3){Smg_Scan();}Delay_1ms(21);while(!k3);}}if(k4 == 0) //确定键{Delay_1ms(21);if(k4 == 0){xz_flg = 0;EA = 1;while(!k4){Smg_Scan();}Delay_1ms(21);while(!k4);}}}}/*********************************************************************/void Bao_Shi(){uint i,j; //定义循环变量if(zd_flg == 1){for(j=0;j<3;j++){for(i=0;i<m1;i++){beep=!beep; //蜂鸣器开关Delay_1ms(80); //延时80ms}Delay_1ms(1000);}zd_flg = 0;}}2.3 简易数字钟硬件分析2.3.1 数字钟的总电路图2.3.2数字钟的硬件单元电路分析(1)最小系统设计(2)晶体(3)常用的复位电路如下图所示:图3 常用复位电路图(4)最常用的显示器数码管,如下图所示。

相关主题