1、 郑州轻工业学院 实 训 报 告 实训名称: 单片机数字电子时钟实训 姓 名: 院 (系): 软件学院 专业班级: 学 号: 指导教师: 杨 学 东 成 绩: 时间: 2014年6月9日 至 2013年6月15日 单片机数字电子时钟实训报告 目 录 一、实训目的 1、时钟设计的要求 2、设计要求 二、工作原理
2、 三、系统的组成 1键盘 2单片机系统 四、电子时钟程序代码编写 1、主程序流程以及部分代码 2、定时器中断流程以及部分代码 3、时间显示流程以及部分代码 五、心得体会 一、实训目的 本次实训是使用89C51单片机,通过C语言来编写的程序,然后在单片机上来运行程序来实现预定的控制目的。本实训主要是通过单片机的LCD来显示时间(主要是小时、分钟和秒钟的显示)。而且可以通过四个按键来调节时间(主要是开始、暂停、复位和一个备用键)。通过本次的实训(我们的目标是掌握数字电子钟的制作,实现分、秒、毫秒的显示功能)能对
3、单片机编程有熟练的了解和简单的引用,能独立自主的编写简单的高级语言通过单片机来实现一定的功能。 1、时钟设计的要求 数字钟是一个将“分”,“ 秒”,“ 毫秒”显示与人的视觉器官的计时装置。它的计时周期为1小时,显示满刻度为59分59秒990时,钟电路主要由译码显示器、“分”,“秒”,“ 毫秒”计数器 2设计要求: 设计一个基于51单片机的数字电子钟,画出防真电路图. 键盘显示图 时钟显示器图 二、工作原理 整个系统工作时,毫秒信号产生器是整个系统的时基信号,它直接决定计时系统的精度,将标准毫秒信号送入“秒计数器”,“秒计数器”
4、采用60进制计数器,每累计60秒发出一个“分脉冲”信号,该信号将作为“分计数器”的时钟脉冲。“分计数器”也采用60进制计数器,每累计60秒,发出一个“时脉冲”信号,该信号将被送到“分钟计数器”。 1、键盘 键盘是控制和修改时钟的重要输入模块,通过键盘可以暂停,开始,复位。 2、片机系统 AT89C51是一种低功耗、高性能的片内含有4K字节闪烁可编程可擦除只读存储器,高性能CMOS8位微处理器,俗称单片机。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。 单片机是一种集成电路芯片,采用超大规模技术把具有数据处理能力(如算术运算
5、逻辑运算、数据传送、中断处理)的微处理器(CPU),随机存取数据存储器(RAM),只读程序存储器(ROM),输入输出电路(I/O口),可能还包括定时计数器,串行通信口(SCI),显示驱动电路(LCD或LED驱动电路),脉宽调制电路(PWM),模拟多路转换器及A/D转换器等电路集成到一块单块芯片上,构成一个最小然而完善的计算机系统。这些电路能在软件的控制下准确、迅速高效地完成程序设计者事先规定的任务。 四、系统软件设计流程 1、主程序流程 主程序先开始,然后启动定时器,启动后在进行按键检测,然后就可以显示时间。 主程序流程图 2、定时器中断流程 分 定时器中断时先检测一毫秒是
6、否到,到的话秒就加1,没到就检测秒,秒到就加1,没到检测分,分到加1,没到就显示时间。 时间 定时器中断流程图 3、时间显示流程 时间显示是先毫秒十位计算显示,然后是毫秒百位,再是秒个位,秒十位,然后是分个位,然后是分十位。 结束 时间显示流程图 五、心得体会 通过本次单片机电子时钟的实训,确实学到了很多的东西。虽然说实训过程中遇到了很多的问题,但是通过和老师同学的学习和探讨,通过课下图书馆相关书籍的借阅问题都得到了解决。主要是以前没有过这方面的学习,所以说我感觉真正做实验的时候比较吃力,为了弄懂它,不但要学习单片机这方面的知识还要学习电学的知识。所以我借阅了8
7、0C51单片机和电路基础,学习之后对很多知识都能基本了解。
代码
#include
8、XED,0X81,0XF4,0XB5,0X99,0X3D,0X7D,0X85,0XFD,0XBD}; uchar code weima[]={0XFE,0XFD,0XFB,0XF7,0XEF,0XDF}; void display(uchar disp,uchar num); void xianshi(void); void delay1ms(uint ms); void Timer0Init(void); uchar key(); uchar key1(); uchar key2(); uchar key3(); uchar key4(); void main() {
9、 Timer0Init(); P3=0xff; ET0 =1; EA =1; LEN1 =1; LEN2 =1; while(1) { uchar a; uint counterbuf; counterbuf=counter; xianshi(); a=key(); if(a==1) { TR0=0; } else if(a==2) { TR0=1; } else if(a==3) { counter=0; } else if(a==4)
10、 { ;; } else ;; } } void timer0() interrupt 1 //中断 { TL0 = (65536-11000)%256; TH0 = (65536-11000)/256; counter++; xsh[5]=counter%10; if(xsh[0]==5 && xsh[1]==9 && xsh[2]==5 && xsh[3]==9 && xsh[4]==9 && xsh[5]==9) { delay1ms(10); counter=0; } if(xsh[1]==
11、9 && xsh[2]==5 && xsh[3]==9 && xsh[4]==9 && xsh[5]==9) { delay1ms(10); xsh[0]++; xsh[1]=0; xsh[2]=0; xsh[3]=0; xsh[4]=0; } if(xsh[2]==5 && xsh[3]==9 && xsh[4]==9 && xsh[5]==9) { delay1ms(10); xsh[1]++; xsh[2]=0; xsh[3]=0; xsh[4]=0; } if(xsh[3]==9 && xsh[4
12、]==9 && xsh[5]==9) { delay1ms(10); xsh[2]++; xsh[3]=0; xsh[4]=0; } if(xsh[4]==9 && xsh[5]==9) { delay1ms(10); xsh[3]++; xsh[4]=0; } if(xsh[5]==9) { delay1ms(10); xsh[4]++; } // } void xianshi(void) { display(0,xsh[0]); delay1ms(2); display(1,
13、xsh[1]); delay1ms(2); display(2,xsh[2]); delay1ms(2); display(3,xsh[3]); delay1ms(2); display(4,xsh[4]); delay1ms(2); display(5,xsh[5]); delay1ms(2); } void display(uchar disp,uchar num) { LEN2=1; P0=weima[disp];//P0=weima[1]; LEN2=0; LEN1=1; P0=duanma[num];
14、//P0=duanma[8]; LEN1=0; } uchar key() { if (key1()==1) return 1; else if (key2()==1) return 2; else if (key3()==1) return 3; else if (key4()==1) return 4; else return 0; } uchar key1() { if(KEY1==0&&KEY2==1&&KEY3==1&&KEY4==1) { delay1ms(50); if(KEY1==0&&KEY2==1&&KEY3=
15、1&&KEY4==1) { while(KEY1==0&&KEY2==1&&KEY3==1&&KEY4==1);; P1=~P1; return 1; // 暂停 } else return 0; } else return 0; } uchar key2() { if(KEY1==1&&KEY2==0&&KEY3==1&&KEY4==1) { delay1ms(50); if(KEY1==1&&KEY2==0&&KEY3==1&&KEY4==1) { while(KEY1==1&&KE
16、Y2==0&&KEY3==1&&KEY4==1);; P1=~P1; return 1; // 开始 } else return 0; } else return 0; } uchar key3() { if(KEY1==1&&KEY2==1&&KEY3==0&&KEY4==1) { delay1ms(50); if(KEY1==1&&KEY2==1&&KEY3==0&&KEY4==1) { while(KEY1==1&&KEY2==1&&KEY3==0&&KEY4==1);; P1=~P1;
17、 return 1; // 复位 } else return 0; } else return 0; } uchar key4() { if(KEY1==1&&KEY2==1&&KEY3==1&&KEY4==0) { delay1ms(50); if(KEY1==1&&KEY2==1&&KEY3==1&&KEY4==0) { while(KEY1==1&&KEY2==1&&KEY3==1&&KEY4==0);; P1=~P1; return 1; // 备用 } else return 0; } else return 0; } void Timer0Init(void) { TMOD &= 0xF0; TMOD |= 0x01; TL0 = (65536-10000)%256; TH0 = (65536-10000)/256; TF0 = 0; TR0 = 1; } void delay1ms(uint ms) { uint j,k; for(j=ms;j>0;j--) for(k=120;k>0;k--); }






