微机原理与接口技术课程设计题目时钟设计学院信息科学与工程学院专业班级自动化0804学号0909081523姓名詹强指导教师陈学,徐德刚目录内容提要 (3)关键词 (3)引言 (3)一、设计要求 (3)二、数字时钟的基本原理 (4)三、硬件电路设计 (4)四、数字电路软件设计 (5)五、软件调试 (6)六、结语 (6)七、程序附录 (9)单片机电子时钟设计【内容摘要】单片机技术是一门应用性很强的专业课,其理论与实践技能是从事机电类专业技术工作的人员所不可少的。
本次程设计是选择AT89C52为核心控制元件,设计了一个日常生活中用到的电子时钟系统。
当功能按键S1按下,时钟运行或停止。
当功能按键S2按下,时钟显示转换时,分,秒。
经过实践证明,本系统运行稳定,具有一定的实用价值。
【关键词】AT89C52 定时器1 定时器0 按键SW1、SW2引言单片机,亦称单片微电脑或单片微型计算机。
它是把中央处理器(CPU)、随机存取存储器(RAM)、只读存储器(ROM)、输入/输出端口(I/0)等主要计算机功能部件都集成在一块集成电路芯片上的微型计算机。
单片机是把主要计算机功能部件都集成在一块芯片上的微型计算机。
它是一种集计数和多中接口于一体的微控制器,被广泛应用在智能产品和工业自动化上,而52单片机是个单片机中最为典型和最有代表性的一种。
现在高精度的计时工具大多数都使用了石英晶体振荡器,由于电子钟、石英钟、石英表都采用了石英技术,因此走时精度高,稳定性好,使用方便,不需要经常调试,数字式电子钟用集成电路计时时,译码代替机械式传动,用LED显示器代替指针显示进而显示时间,减小了计时误差,这种表具有时、分、秒显示时间的功能,还可以进行时和分的校对,片选的灵活性好。
一、设计要求在实验板上用动态扫描显示00—591、6MHZ晶振2、L9,L10显示00—59十进制数并循环,相隔1S3、L9显示内寄存内部RAM30H,L10显示内寄存内部RAM31H4、定时器1产生2。
5MS中断,动态扫描显示L9,L10显示数5、定时器0产生50MS中断,计数20次产生1S时钟7、要求显示,时、分、秒二、数字时钟的基本原理数字时钟是用数字集成电路组成,用数码管显示的一种现代化计数器。
数字时钟实际上是一个对标准频率(1Hz)进行计数的计数电路。
振荡器产生的时钟信号经过分频器形成秒脉冲信号,秒脉冲信号输入计数器进行计数,并把累计结果“时”、“分”、“秒”的数字显示出来。
秒计数器电路计满60后触发分计数器电路,分计数器电路计满60后触发时计数器电路,当计满24小时后又开始下一轮的循环计数。
由于计数的起始时间不可能与标准时间(如北京时间)一致,故需在电路上加一个校时电路可以对分和时进行校时。
三、硬件电路设计(一)、电路板原理89C52的P0、P2口用作键盘/显示接口。
用程序扫描的方法进行键盘输入和显示输出。
P0口作为字段口,P2作为显示器的置位口以及键盘的输出口。
P2.0,P2.1接2个数码管,P2.2,P2.3接2个按钮。
(二)、电路元器件AT89C52芯片三极管按键发光二极管共阴级七段数码管电阻(三)、MAX7219MAX7219/MAX7221是一种集成化的串行输入/输出共阴极显示驱动器,它连接微处理器与8位数字的7段数字LED显示,也可以连接条线图显示器或者64个独立的LED。
其上包括一个片上的B型BCD编码器、多路扫描回路,段字驱动器,而且还有一个8*8的静态RAM 用来存储每一个数据。
只有一个外部寄存器用来设置各个LED的段电流。
MAX7221与SPI™、QSPI™以及MICROWIRE™相兼容,同时它有限制回转电流的段驱动来减少EMI (电磁干扰)。
一个方便的四线串行接口可以联接所有通用的微处理器。
每个数据可以寻址在更新时不需要改写所有的显示。
MAX7219/MAX7221同样允许用户对每一个数据选择编码或者不编码。
整个设备包含一个150μA的低功耗关闭模式,模拟和数字亮度控制,一个扫描限制寄存器允许用户显示1-8位数据,还有一个让所有LED发光的检测模式。
在应用时要求3V的操作电压或segment blinking,可以查阅MAX6951数据资料。
四、数字时钟的软件设计1、程序流程图五、软件调试通过WAVE6000编写程序用TOP8052烧写AT89C52芯片中,在上电的情况下,两个LED数码管显示的数值是00,当按键S1有按下的时候,启动时钟,当再次检测到按键S1按下时,就暂停时钟,S1起到一个启动\暂停的功能;可以通过按键S2的切换查看时、分、秒的数值。
首次按下S2,就会切换到显示分的数值,第二次按下S2,就会切换到显示时钟的数值,第三次按下S2,就跳回显示秒的数值。
六、结语本次课程设计的总结与体会微机原理与接口技术是一门很有趣的课程,任何一个计算机系统都是一个复杂的整体,学习计算机原理是要涉及到整体的每一部分。
讨论某一部分原理时又要涉及到其它部分的工作原理。
这样一来,不仅不能在短时间内较深入理解计算机的工作原理,而且也很难孤立地理解某一部分的工作原理。
所以,在循序渐进的课堂教学过程中,我总是处于“学会了一些新知识,弄清了一些原来保留的问题,又出现了一些新问题”的循环中,直到课程结束时,才把保留的问题基本搞清楚。
学习该门课程知识时,其思维方法也和其它课程不同,该课程偏重于工程思维,具体地说,在了解了微处理器各种芯片的功能和外部特性以后,剩下额是如何将它们用于实际系统中,其创造性劳动在于如何用计算机的有关技术和厂家提供的各种芯片,设计实用的电路和系统,再配上相应的应用程序,完成各种实际应用项目。
这次实验并不是很难,主要的困难来自对程序的理解。
功夫不负有心人,经过四个人的合作和努力,我们最后对实验的原理有了清晰的认识。
虽然实验台上的很多模块单元没有用到,但是就系统功能来说,我觉得我们做的还是不错的。
这次课设却让我们对实验台有了足够的了解,让我们知道了实验台上各个模块的用法;而且它还让我们对自己动手写程序来控制实验台的运作有了一定的基础。
虽然实验台只是一个小型的模拟平台,但是通过对它的学习和操作,我们对有关接口的知识将会有一个更广泛的认识,而且它对我们以后的学习也会有帮助的。
实验中个人的力量是不及群体的力量的,我们四个人分工合作,做事的效率高了很多。
虽然有时候会为了一些细节争论不休,但最后得出的总是最好的结论。
而且实验也教会我们在团队中要善于与人相处,与人共事,不要一个人解决所有问题。
总之,这次课程设计对于我们有很大的帮助,通过课程设计,我更加深入地理解了,微机原理课程上讲到的各种芯片的功能,以及引脚的作用,同时加深了对于主要芯片的应用的认识,同时在试验室的环境里熟悉了汇编程序的编写过程和运行过程,最后还提高了自己的动手能力。
感谢老师的悉心指导。
,七、程序附录#include "reg52.h"#define uchar unsigned char#define DECODE_MODE 0x09#define INTENSITY 0x0A#define SCAN_LIMIT 0x0B#define SHUT_DOWN 0x0C#define DISPLAY_TEST 0x0Fvoid Init_Max7219(void);void write_7219(uchar add, uchar dat);void send_byte(uchar i);void short_delay(void);void delay(int time);void init_timer();void display();sbit CLK = P0^0;sbit DIN = P0^1;sbit LOAD = P0^2;sbit D0=P1^0;sbit D7=P1^7;int second,minute,clock,t_sec,t_min;unsigned chardd[10]={0x7e,0x30,0x6d,0x79,0x33,0x5b,0x5f ,0x70,0x7f,0x7b};void main(){char k=0,i=1;Init_Max7219();for(i=0;i<9;i++){write_7219(i,0X00);}init_timer();second=54,minute=59,clock=23;while(1){if(t_sec==20) //到了1秒{D7=!D7;t_sec=0;second++;if(second==60) //到了1分{second=0;minute++;if(minute==60){minute=0;clock++;if(clock==24)clock=0;}}}display();}}void timer0() interrupt 1{TH0=(65535-46080)/256;TL0=(65535-46080)%256; //定时1msD0=!D0;t_sec++;}void display(){int ten1,num1,ten2,num2,ten3,num3;ten1=second/10; num1=second%10;ten2=minute/10; num2=minute%10;ten3=clock/10; num3=clock%10;write_7219(1,dd[num1]);write_7219(2,dd[ten1]);write_7219(3,dd[num2]);write_7219(4,dd[ten2]);write_7219(5,dd[num3]);write_7219(6,dd[ten3]);}void init_timer(){second=0; minute=0; t_sec=0; t_min=0;TMOD=0x01; //设置定时器0的工作方式为1TH0=(65535-46080)/256;TL0=(65535-46080)%256; //定时50ms EA=1; //开总中断ET0=1; //开定时器0中断TR0=1; //启动定时器0}void write_7219(uchar add, uchar dat) {LOAD=1;send_byte(add);send_byte(dat);LOAD=0;short_delay();LOAD=1;CLK=0;short_delay();CLK=1;}void send_byte(uchar i ) {char k;for(k=0;k<8;k++){if(0x80&i){DIN =1;}else{DIN=0;}CLK = 0;short_delay();CLK = 1;short_delay();i*=2;}}void Init_Max7219(void){write_7219(SHUT_DOWN, 0xff); //Normal Operation XXXXXXX1 Shutdown Mode XXXXXXXX0write_7219(DISPLAY_TEST, 0x00); //Normal Operation XXXXXXX0 Display Test Mode XXXXXXXX1write_7219(DECODE_MODE, 0x00); //Decode Mode Select D7~D0 1 B decode 0 No decodewrite_7219(SCAN_LIMIT, 0x07); //SCAN LIMIT 0~7 0xX0~0xX7write_7219(INTENSITY, 0x05); //Set Intensity 0xX0~0xXf}void short_delay(void){char j;for(j=0;j<50;j++);}void delay(int time)int i,j;for (i=3;i<time;i++) for (j=0;j<100;j++); }。