1、 课程设计汇报 课程名称:单片机程序设计 汇报题目:电子时钟 学生姓名: 所在学院:信息科学和工程学院 专业班级: 学生学号: 指导老师: 12月25日 课程设计任务书 汇报题目 电子时钟 完成时间 12.25 学生姓名 专业班级 电子信息工程 指导老师 职称 讲师 总体设计要求和技术关键点 设计要求以下: 以AT89C51单片机为关键时钟,在LCD显示器上显示目前时间: 使用字符型LCD显示器显示目前时间。 显示格式为“时时:分分:秒秒”。 用4个功效键操作来设置目前时间。功效键K1~K4功效以下
2、 n K1—进入设置现在时间。 n K2—设置小时。 n K3—设置分钟。 n K4—确定完成设置。 程序实施后工作指示灯LED闪动,表示程序开始实施,LCD显示“00:00:00”,然后开始计时。 工作内容立即间进度安排 第17周 周1--3立题、论证方案设计 周4--5仿真试验 第18周 周1--3综合调试 周4--5验收答辩 课程设计结果 1.和设计内容对应软件程序 2.课程设计总结汇报 摘要 单片计算机即单片微型计算机。由RAM、ROM、CPU组成。定时,计数和 多个接口于一体微控制器。它体积小,成本低,功效强,广泛应用于智能产业
3、和工业自动化上。而51系列单片机是各单片机中最为经典和最有代表性一个。这次课程设计经过对它学习,应用,从而达成学习、设计、开发软、硬能力。 本设计关键设计了一个基于AT89C51单片机电子时钟。并在数码管上显示对应时间。并经过一个控制键用来实现时间调整和是否进入省电模式转换。应用ProteusISIS软件实现了单片机电子时钟系统设计和仿真。该方法仿真效果真实、正确,节省了硬件资源。 关键词:单片机;子时钟;键控制 目录 一、 概述………………………………………………………
4、………………5 1.1电子时钟介绍………………………………………………………………5 1.2电子时钟基础特点………………………………………………………5 1.3电子时钟原理……………………………………………………………5 二、方案设计选择………………………………………………………………5 2.1计时方案……………………………………………………………………5 2.2显示方案……………………………………………………………………5 三、硬件设计…………………………………………………………………………6 3.1单片机型号选择……………………………………………………………6 3.2数码
5、管显示工作原理………………………………………………………6 3.3键盘电路设计………………………………………………………………7 3.4电路原理图…………………………………………………………………7 四、软件设计…………………………………………………………………………7 五、结论和心得………………………………………………………………………15 六、参考文件……………………………………………………………………16 一、概述 1.1 电子时钟介绍 1957年,Ventura发明了世界上第
6、一个电子表,从而奠定了电子时钟基础, 电子时钟开始快速发展起来。现代电子时钟是基于单片机一个计时工具,采取延时程序产生一定时间中止用于一秒定义,经过计数方法进行满六十秒分钟进一,满六十分小时进一,满二十四小时小时清零。从而达成计时功效,是人民日常生活补课缺乏工具。 1.2 电子时钟基础特点 现在高精度计时工具大多数全部使用了石英晶体振荡器,因为电子钟、石英钟、石英表全部采取了石英技术,所以走时精度高,稳定性好,使用方便,不需要常常调试,数字式电子钟用集成电路计时时,译码替换机械式传动,用LED显示器替换指针显示进而显示时间,减小了计时误差,这种表含有时、分、秒显示时间功效,还能够进
7、行时和分校对,片选灵活性好。 1.3 电子时钟原理 该电子时钟由89C51,BUTTON,六段数码管等组成,采取晶振电路作为驱动电路,由延时程序和循环程序产生一秒定时,达成时分秒计时,六十秒为一分钟,六十分钟为一小时,满二十四小时为一天。而电路中唯一一个控制键却拥有多个不一样功效,按下又松开,能够实现屏蔽数码管显示功效,达成省电目标;直接按下不松开,则能够经过按键实现分钟累加,每按一次分钟加一;而连续两次按下按键不放松,则可实现小时调整,一样每按一次小时加一。 二、方案设计选择 2.1计时方案 方案1:采取实时时钟芯片 现在市场上有很多实时时钟集成电路,如
8、DS1287、DS12887、DS1302等。这些实时时钟芯片含有年、月、日、时、分、秒计时功效和多点定时功效,计时数据更新每秒自动进行一次,不需要程序干预。所以,在工业实时测控系统中多采取这一类专用芯片来实现实时时钟功效。 方案2:使用单片机内部可编程定时器。 利用单片机内部定时计数器进行中端定时,配合软件延时实现时、分、秒计时。该方案节省硬件成本,但程序设计较为复杂。 2.2显示方案 对于实时时钟而言,显示显然是另一个关键步骤。通常LED显示有两种方法:动态显示和静态显示。 静态显示优点是程序简单、显示亮度有确保、单片机CPU开销小,节省CPU工作时
9、间。但占有I/O口线多,每一个LED全部要占有一个I/O口,硬件开销大,电路复杂。需要多个LED就必需占有多个并行口,比较适适用于LED数量较少场所。当然当LED数量较多时候,能够使用单片机串行口经过移位寄存器方法加以处理,但程序编写比较麻烦。 LED动态显示硬件连接简单,但动态扫描显示方法需要占有CPU较多时间,在单片机没有太多实时测控任务情况下能够采取。 本系统需要采取6位LED数码管来分别显示时、分、秒,因数码管个数较多,故本系统选择动态显示方法。 三、硬件设计 3.1单片机型号选择 经过对多个单片机性能分析,最终认为89C51是最理想电子时钟开发芯
10、片。89C51是一个带4K字节闪烁可编程可擦除只读存放器低电压,高性能CMOS8 位微处理器,器件采取ATMEL高密度非易失存放器制造技术制造,和工业标准MCS-51指令集和输出管脚相兼容。因为将多功效8位CPU和闪烁存放器组合在单个芯片中,ATMEL89C5是一个高效微控制器,而且它和MCS-51兼容,且含有4K字节可编程闪烁存放器和1000写/擦循环,数据保留时间为等特点,是最好选择。 3.2数码管显示工作原理 数码管是一个把多个LED显示段集成在一起显示设备。有两种类型,一个是共阳型,一个是共阴型。共阳型就是把多个LED显示段阳极接在一起,又称为公共端。共阴型就是把多
11、个LED显示段阴极接在一起,即为公共商。阳极即为二极管正极,又称为正极,阴极即为二极管负极,又称为负极。通常数码管又分为8段,即8个LED显示段,这是为工程应用方便如设计,分别为A、B、C、D、E、F、G、DP,其中DP是小数点位段。而多位数码管,除某一位公共端会连接在一起,不一样位数码管相同端也会连接在一起。即全部A段全部会连在一起,其它段也是如此,这是实际最常见使用方法。数码管显示方法可分为静态显示和动态显示两种。静态显示就是数码管8段输入及其公共端电平一直有效。动态显示原理是,各个数码管相同段连接在一起,共同占用8位段引管线;每位数码管阳极连在一起组成公共端。利用人眼视觉暂留性,依次给出
12、各个数码管公共端加有效信号,在此同时给出该数码管加有效数据信号,当全段扫描速度大于视觉暂留速度时,显示就会清楚显示出来。
3.3键盘电路设计
该设计只用了一个键盘,但实现功效却是比较完善,降低了硬件资源损耗,该键盘能够实现小时和分钟调整;直接按下不松开,则能够经过按键实现分钟累加,每按一次分钟加一;而连续两次按下按键不放松,则可实现小时调整,一样每按一次小时加一。达成时间调整目标。
3.4电路原理图
四、软件设计
#include
13、int unsigned int #define somenop {_nop_();_nop_();_nop_();_nop_();_nop_();} //宏定义掩延时函数 sbit K1=P3^0; //位定义 sbit K2=P3^1; sbit K3=P3^2; sbit K4=P3^3; sbit D34=P3^4; sbit SCL = P2^0; sbit SDA = P2^1; void diyi(); void xianshi(); // 函数申明 void panduan(); //函数申明 void delay(uchar z); //函数申
14、明 uchar t=0,n=1,m=59,a,temp; //定义变量 uchar code at[]={0xe0,0xd0,0xb0,0x70}; //定义数组 uchar code as[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; uchar code b[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01}; uint cnt; void delay_us(uchar tt) //短延时函数 { while(tt--)
15、 } /****************************/ /***********初始化***********/ /**************************/ /********at24c02***********/ void I2C_start()//I^2C模块 { SDA = 1; _nop_(); SCL = 1; somenop; SDA = 0; somenop; SCL = 0; } void I2C_stop() { SDA = 0; _nop_(); SCL = 1;
16、 somenop; SDA = 1; } void I2C_ack(bit ackbit) { if(ackbit) SDA = 0; else SDA = 1; somenop; SCL = 1; somenop; SCL = 0; SDA = 1; somenop; } bit I2C_waitack() { SDA = 1; somenop; SCL = 1; somenop; if(SDA) { SCL = 0; I2C_stop(); return 0; } else
17、{ SCL = 0; return 1; } } void I2C_write(uchar dat) { uchar i; for(i=0;i<8;i++) { if(dat&0x80) SDA = 1; else SDA = 0; somenop; SCL = 1; dat <<= 1; somenop; SCL = 0; } } uchar I2C_read() { uchar dat; uchar i; for(i=0;i<8;i++) { SCL = 1;
18、 somenop; dat <<= 1; if(SDA) dat |= 0x01; SCL = 0; somenop; } return dat; } void W_at24c02(uchar add,uchar dat) { I2C_start(); I2C_write(0xa0); I2C_waitack(); I2C_write(add); I2C_waitack(); I2C_write(dat); I2C_waitack(); I2C_stop(); delay_us(300); }
19、 uchar R_at24c02(uchar add) { uchar AT_temp; I2C_start(); I2C_write(0xa0); I2C_waitack(); I2C_write(add); I2C_waitack(); I2C_start(); I2C_write(0xa1); I2C_waitack(); AT_temp = I2C_read(); I2C_ack(0); I2C_stop(); return AT_temp; } /**************************/ /***
20、main**********/ void main() { diyi(); t= R_at24c02(24); //程序运行时,读取掉电前数据 m= R_at24c02(23); n= R_at24c02(25); while(1) { panduan();//判定子函数 xianshi();//显示子函数 } } void diyi() //定义子函数 { P2=0xbf; P0=0xbf; TMOD=0x01;
21、 TH0=(65536-50000)/256; TL0=(65536-50000)%256; EA=1; ET0=1; TR0=1; } void exer1() interrupt 1 //定时器/计数器 1 { uchar t1; TH0=(65536-50000)/256; TL0=(65536-50000)%256; t1++; if(t1==10) {P2=0x9f;P0=0x00;} if(t1==20) { P2=0x9f;P0=0xff; t1=0; t++
22、 W_at24c02(24,t ); //每隔一秒,保留目前数据 delay(3); W_at24c02(23,m); delay(3); W_at24c02(25,n); if(t==60) { t=0; m++; if(m==60) { m=0; n++; } if(n==24) n=0; } } } void xianshi()//显示函数 { P2 = 0xdf; P0 =b[0]; P2=0x1f;
23、 P0=0xff; P2 = 0xff; P0 =as[t%10]; P2=0x1f;P0=0x00;delay(3); P2 = 0xdf; P0 =b[1]; P2=0x1f; P0=0xff; P2 = 0xff; P0 =as[(t/10)%10]; P2=0x1f;P0=0x00;delay(3); P2 = 0xdf; P0 =b[2]; P2=0x1f; P0=0xff; P2 = 0xff; P0 =0xbf; P2=0x1f;P0=0x00;delay(3); P2 = 0xdf; P0 =b[3]; P2=0x1f; P0=0xff; P2 = 0xff; P0
24、 =as[m%10]; P2=0x1f;P0=0x00;delay(3); P2 = 0xdf; P0 =b[4]; P2=0x1f; P0=0xff; P2 = 0xff; P0 =as[(m/10)%10]; P2=0x1f;P0=0x00;delay(3); P2 = 0xdf; P0 =b[5]; P2=0x1f; P0=0xff; P2 = 0xff; P0 =0xbf; P2=0x1f;P0=0x00;delay(3); P2 = 0xdf; P0 =b[6]; P2=0x1f; P0=0xff; P2 = 0xff; P0 =as[n%10]; P2=0x1f;
25、P0=0x00;delay(3);
P2 = 0xdf; P0 =b[7]; P2=0x1f; P0=0xff; P2 = 0xff; P0 =as[(n/10)%10]; P2=0x1f;P0=0x00;delay(3);
}
void delay(uchar z)//延时函数
{
uchar i,j;
for(i=0;i 26、0xf0;
if(temp!=0xf0)
{
delay(5);
if(temp!=0xf0)
{
while(P3!=0xfe);
if(temp==at[0])
{
a++;TR0=0; if(a==4) {a=0;TR0=1;}
}
if(temp==at[1])
{
if(a==1)
{ t++; if(t==60){ t=0;} }
if(a==2 27、)
{m++;if(m==60){m=0;}}
if(a==3)
{ n++;if(n==24){n=0;}}
}
if(temp==at[2])
{
if(a==1)
{if(t==0){t=60;}t--;}
if(a==2)
{if(m==0){m=60;}m--;}
if(a==3)
{if(n==0){n=24;}n--;}
}
P2 = 0xc0;P0 =b[7]; P2=0x00; 28、P0=0xff;P2 = 0xe0;P0 =0xff;P2=0x00;P0=0x00;delay(3);
}
}
}
五、结论和心得
在廖亦凡和曹铁军老师耐心指导下,我顺利完成了这次单片机课程设计课题中电子时钟设计,过这次设计使我认识到本人对单片机方面知识知道太少了,对于书本上很多知识还不能灵活利用,尤其是对程序设计语句了解和利用,不能够充足了解每个语句具体含义,造成编程程序过于复杂,使得需要存放空间增大。损耗了过多内存资源。
此次设计使我从中学到了部分很关键东西,那就是怎样从理论到实践转化,怎样将我所学到知识利用到我以后 29、工作中去。在大学课堂学习只是在给我们灌输专业知识,而我们应把所学用到我们现实生活中去,此次电子时钟设计给我奠定了一个实践基础,我会在以后学习、生活中磨练自己,使自己适应于以后竞争,同时在查找资料过程中我也学到了很多新知识,在和同学协作过程中促进同学间友谊,使我对团体精神主动性和关键性有了愈加充足了解。
最终,感谢廖亦凡和曹铁军老师对我细心指导,正是因为老师们细心教导和她们提供给我们参考资料,使得我课程设计能够顺利完成,同时在课程设计过程中,我们巩固和学习了我们单片机知识。相信这对我以后课程设计和毕业设计将会有很大帮助!
六、参考文件
[1] 张毅刚.《单片机原理及应用》.高等教育出版社,
[2] 谭浩强.《C程序设计教程》.清华大学出版社
[3] 周兴华.《单片机C程序设计》.北京航空航天大学出版社
老师评语及设计成绩
老师评语:
课程设计成绩:
指导老师:(署名)
日期:年月日






