第一篇:单片机课程设计 (51单片机实现电子时钟)
湖北文理学院
单片机课程设计
题目:用51单片机实现电子时钟
院 部 物理与电子信息工程学院 专 业 名 称 电子信息科学与技术 班 级 1111 姓 名 杨庆月 学 号 2011111136 指 导 教 师 李刚
2013年12月09日
目录
摘要------------------------------1 1 单片机的相关知识------------1 1.1 单片机的简介--------------------1 1.2 单片机的特点--------------------1 1.3 89C52单片机的基本特点------------2 2 电子时钟--------------------3 2.1电子时钟的基本特点----------------3 2.2电子时钟的原理-------------------4 控制系统的硬件设计---------4 3.1单片机型号的选择-----------------4 3.2 lcd1602工作的原理---------------4 3.3 键盘电路的设计------------------6 3.4 复位电路设计-------------------------6
3.5 时钟电路设计-------------------7 3.6 整体电路原理图-----------------7 控制系统的软件的设计------8 4.1程序的设计----------------------8 4.2程序源代码----------------------8 5 仿真结果和实物图---------------19 5.1仿真结果------------------------------19 5.2实物图-19 6 总结--20
参考文献------------------------21
摘要:单片计算机即单片微型计算机。由 RAM ,ROM,CPU构成,定时,计数和多种接口于一体的微控制器。它体积小,成本低,功能强,广泛应用于智能产业和工业自动化上。而 51系列单片机是各单片机中最为典型和最有代表性的一种。这次课程设计通过对它的学习,应用,从而达到学习、设计、开发软、硬的能力。
本设计主要设计了一个基于 AT89C52单片机的电子时钟。并在 1602上显示相应的时间。并通过一个控制键用来实现时间的调节和是否进入省电模式的转换。
具有时钟和日历的功能,年限显示范围是2013-2099(可修改),且具有闰年自动修正功能
关键字:单片机;子时钟;键盘控制;LCD1602。单片机识的相关知识 1.1 单片机简介
MCS-51是 INTEL公司在成功推广的 MCS-48单片机基础上加以改进而成的 8位单片机。
这种单片机大约是上世纪 70年代末推出的,内部程序可重写的为 8751,外扩程序的是 8031,一次性生产,不可改变程序的是 8051。外形一般为 DIP40封装。不久又推出了增强型的 8052,其资源更加丰富。以后又采用 CHMOS技术推出了 80c51,耗电大大降低。到了 90年代,INTEL公司把精力放到更赚钱的计算机上,将 51单片机技术转让给了一此其它公司,如 ATMEL Philips等半导体制造公司,使 51系列单片机的市场份额不断扩大。
尽管十多年前就有人认为 51单片机会很快淘汰,但事实证明 51单片机经过不断的改进后,由于技术成熟,使用方便,至今在 8位单片机市场仍然拥有庞大的用户。特别是 MCS-51技术的 20年专利期限到期后,大量的兼容型号不断推出。从上世纪 90年代后期开始,美国 ATMEL公司在掌握快速擦写的存储器后,推出了 AT89C系列,此系列在中国获得了广泛的应用。
在此之前,由于可擦写的 8751价格昂贵,国内长时间采用 8031+27C64这样的外扩存程序储器方式。
51单片机最初只有 DIP40这种很古老的封装,后来推出了 CHMOS工艺的80C51后开始有了 PLCC44这种相对较小的方形封装。AT89C系列中开始有 20脚的 DIP20的精简型封装,这极大方便了在一些相对简单的单片机应用,缩小了 PCB的体积。20脚的有 AT89C1051、AT89C1051、AT89C1051,对应程序存储器分别为 1K、2K、4K。
标准的 51为 4K程序空间,128字节的 RAM,32条端口,5个中断,2个定时/计数器,12个时钟周期执行一条基本指令,最长的除法为 48个周期。52为 8K程序空间,256字节的 RAM,32条端口,6个中断,3个定时/计数器。AT89S51是可在板上直接下载程序的改进型号,并增加了看门狗功能,AT89C51只能在编程器下写入程序,所以经常会有人在 PCB上安装 IC插座,以便取下来编程更新程序。
AT的 51系列后来也推出了单周期的 51,但价格没什么优势,国内很少使用。最近几年宏晶在国内大量推广 STC51系列单片机,最近又推出不少所谓 1T的单
片机,价格较低
STC采用串口直接下载程序,写入程序很方便。
1.2 单片机的特点.单片机的存储器ROM 和RAM 时严格区分的。ROM 称为程序存储器,只存放 程序,固定常数,及数据表格。RAM 则为数据存储器,用作工作区及存放用户数 据。2.采用面向控制的指令系统。为满足控制需要,单片机有更强的逻辑控制能力,特别是单片机具有很强的位处理能力。.单片机的I/O 口通常时多功能的。由于单片机芯片上引脚数目有限,为了 解决实际引脚数和需要的信号线的矛盾,采用了引脚功能复用的方法,引脚处于 何种功能,可由指令来设置或由机器状态来区分。.单片机的外部扩展能力很强。在内部的各种功能部件不能满足应用的需求 时,均可在外部进行扩展,与许多通用的微机接口芯片兼容,给应用系统设计带 来了很大的方便。
1.3 89C52单片机介绍
P0 口:P0 口为一个8 位漏级开路双向I/O 口,每脚可吸收8TTL 门电流。当 P1 口的管脚第一次写1 时,被定义为高阻输入。P0 能够用于外部程序数据存储 器,它可以被定义为数据/地址的第八位。在FIASH 编程时,P0 口作为原码输入 口,当FIASH 进行校验时,P0 输出原码,此时P0 外部必须被拉高。
P1 口:P1 口是一个内部提供上拉电阻的8 位双向I/O 口,P1 口缓冲器能接 收输出4TTL 门电流。P1 口管脚写入1 后,被内部上拉为高,可用作输入,P1 口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH 编程和校验时,P1 口作为第八位地址接收。
P2 口:P2 口为一个内部上拉电阻的8 位双向I/O 口,P2 口缓冲器可接收,输出4 个TTL 门电流,当P2 口被写“1”时,其管脚被内部上拉电阻拉高,且 作为输入。并因此作为输入时,P2 口的管脚被外部拉低,将输出电流。这是由 于内部上拉的缘故。P2 口当用于外部程序存储器或16 位地址外部数据存储器 进行存取时,P2 口输出地址的高八位。在给出地址“1”时,它利用内部上拉优 势,当对外部八位地址数据存储器进行读写时,P2 口输出其特殊功能寄存器的 内容。P2 口在FLASH 编程和校验时接收高八位地址信号和控制信号。
P3 口:P3 口管脚是8 个带内部上拉电阻的双向I/O 口,可接收输出4 个TTL 门电流。当P3 口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输 入,由于外部下拉为低电平,P3 口将输出电流(ILL)这是由于上拉的缘故。P3 口也可作为AT89C52 的一些特殊功能口,如下表所示: 口管脚备选功能
P3.0 RXD(串行输入口)P3.1 TXD(串行输出口)P3.2 /INT0(外部中断0)P3.3 /INT1(外部中断1)P3.4 T0(记时器0 外部输入)P3.5 T1(记时器1 外 部输入)P3.6 /WR(外部数据存储器写选通)P3.7 /RD(外部数据存储器读选通)P3 口同时为闪烁编程和编程校验接收一些控制信号。
RST:复位输入。当振荡器复位器件时,要保持RST 脚两个机器周期的高电平时 间。
ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的 地位字节。在FLASH 编程期间,此引脚用于输入编程脉冲。在平时,ALE 端以不
变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外
部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE 脉冲。如想禁止ALE 的输出可在SFR8EH 地址上置0。此时,ALE 只有在执行MOVX,MOVC 指令是ALE 才起作用。另外,该引脚被略微拉高。
如果微处理器在外部执行状态ALE 禁止,置位无效。PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机 器周期两次/PSEN 有效。但在访问外部数据存储器时,这两次有效的/PSEN 信号
将不出现。
EA/VPP:当/EA 保持低电平时,则在此期间外部程序存储(0000H-FFFFH),不
管是否有内部程序存储器。注意加密方式1 时,/EA 将内部锁定为RESET;当/EA 端保持高电平时,此间内部程序存储器。在FLASH 编程期间,此引脚也用于施加 12V 编程电源(VPP)。电子时钟
2.1 电子时钟的基本特点
现在高精度的计时工具大多数都使用了石英晶体振荡器,由于电子钟、石英 钟、石英表都采用了石英技术,因此走时精度高,稳定性好,使用方便,不需要 经常调试,数字式电子钟用集成电路计时时,译码代替机械式传动,用用液晶显 示器代替指针显示进而显示时间,减小了计时误差,这种表具有时、分、秒显示 时间的功能,还可以进行时和分的校对,片选的灵活性好。
2.2 电子时钟的原理
该电子时钟由89C52,1602 液晶等构成,采用晶振电路作为驱动电路,由延时程序和循环程序达到时分秒的计时,六十秒为一分钟,六十分钟为一小时,满二十四小时为一天。而电路中有四个控制按键,一个是选择,一个进行加数,一个进行减数,还有一个保存。例如按下选择键,然后1602显示光标,此时可以用加或减来进行调节,在按下选择键,光标移到不同的单位上,同理进行调节,最后待日期时间调节好后,按下保存键,时钟开始计时。控制系统的硬件设计 3.1 单片机型号的选择
通过对51单片机的学习,认为STC89C52 是最理想的电子时钟开发芯片。STC89C52,最终认为89C52是一种带8K 字节闪烁可编程可擦除只读存储器的低电压,高性能CMOS8位微处理器,器件采用高密度非易失存储器制造技术制造,与工业标准的MCS-52指令集和输出引脚相兼容。还有一点重要原因,就是采用AT89C52时不能用开发板进行程序的下载,所以最终选用STC89C52进行设计。
3.2 1602 工作原理及显示电路
字符型LCD 通常有14 条引脚线或16 条引脚线的LCD,多出来的2 条线是背 光电源线VCC(15 脚)和地线GND(16 脚),其控制原理与14 脚的LCD 完全一样 1602液晶的基本的操作分为以下四种:
状态字读操作:输入RS=低、RW=高、EP=高; 输出:DB0~7 读出为状态字; 数据读出操作:输入RS=高、RW=高、EP=高; 输出:DB0~7 读出为数据; 指令写入操作:输入RS=低、RW=低、EP=上升沿; 输出:无; 数据写入操作:输入RS=高、RW=低、EP=上升沿; 输出:无。
如图 1602模块的引脚
LCD1602正面
LCD1602背面
1602与单片机连接图 3.3 键盘电路设计
本时钟采用四个按键控制,一个(实物图蓝色线24号引脚)是选择,一个进行加数(实物图紫色线25号引脚),一个进行减数(实物图灰色线26号引脚),还有一个保存(实物图白色线27号引脚)。例如按下选择键,然后1602显示光标,此时可以用加或减来进行调节,在按下选择键,光标移到不同的单位上,同理进行调节,最后待日期时间调节好后,按下保存键,时钟开始计时。
3.4 复位电路设计
单片机复位有上电复位和手动复位两种方式,上电复位是接通电源后利用RC充电来实现复位。手动复位是通过人为干预,强制系统复位。
连接至9号复位引脚
复位电路如图所示,可以实现上电复位和手动复位功能。
3.5 时钟电路设计
系统时钟源由内部时钟方式产生,时钟电路由12MH晶振和两个30PF瓷片电容组成,构成自激振荡,形成振荡源提供给单片机。电容可在5PF到30PF之间选择,电容的大小对振荡频率有微小影响,可起频率微调作用。
3.6整体电路原理图 控制系统的软件设计 4.1 程序设计
由于C 语言程序设计较汇编可读性强,可移植性,且可以大大降低编程的难 度和缩短开发周期,本系统程序采用c 语言设计。
4.2 程序源代码
#include
//包含单片机寄存器的头文件 #include
#define uchar unsigned char #define uint unsigned int
sbit RS=P2^0;
//寄存器选择位,将RS位定义为P2.0引脚 sbit RW=P2^1;
//读写选择位,将RW位定义为P2.1引脚 sbit E=P2^2;
//使能信号位,将E位定义为P2.2引脚 sbit BF=P0^7;
//忙碌标志位,将BF位定义为P0.7引脚
uchar code table[]=“2013-12-07 WEEK6”;
//初始化液晶显示 16 uchar code table1[]=“TIME: 19-27-50”;
//14
uchar count,s1num;char second,minute,hour,day,month,year,week;
sbit s1=P2^3;
//功能键
sbit s2=P2^4;
//加键 sbit s3=P2^5;
//减键
sbit s4=P2^6;
//保存并退出
/*
延时若干毫秒
*/ void delay(uchar n){ uchar i,a,b;for(i=0;i for(b=199;b>0;b--) for(a=1;a>0;a--);} /*********************************************** 函数功能:判断液晶模块的忙碌状态 返回值:result。result=1,忙碌;result=0,不忙 ************************************************/ uchar BusyTest(void){ bit result;RS=0;//根据规定,RS为低电平,RW为高电平时,可以读状态 RW=1;E=1; //E=1,才允许读写 _nop_(); //空操作 _nop_();_nop_();_nop_(); //空操作四个机器周期,给硬件反应时间 result=BF;//将忙碌标志电平赋给result E=0; //将E恢复低电平 return result;} /******************************************** 函数功能:写指令 入口参数:dictate *********************************************/ void WriteInstruction(uchar dictate){ while(BusyTest()==1); //如果忙就等待 RS=0;//根据规定,RS和R/W同时为低电平时,可以写入指令 RW=0;E=0; //E置低电平(根据表8-6,写指令时,E为高脉冲,//就是让E从0到1发生正跳变,所以应先置“0” _nop_(); _nop_(); //空操作两个机器周期,给硬件反应时间 P0=dictate; //将数据送入P0口,即写入指令或地址 _nop_();_nop_();_nop_();_nop_(); //空操作四个机器周期,给硬件反应时间 E=1; //E置高电平 _nop_();_nop_();_nop_();_nop_(); //空操作四个机器周期,给硬件反应时间 E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令 } /********************************************* 函数功能:写数据 入口参数:y(为字符常量)**********************************************/ void WriteData(uchar y){ while(BusyTest()==1);RS=1; //RS为高电平,RW为低电平时,可以写入数据 RW=0;E=0; //E置低电平(根据表8-6,写指令时,E为高脉冲,//就是让E从0到1发生正跳变,所以应先置“0” P0=y;//将数据送入P0口,即将数据写入液晶模块 _nop_();_nop_();_nop_();_nop_(); //空操作四个机器周期,给硬件反应时间 E=1; //E置高电平 _nop_();_nop_();_nop_();_nop_(); //空操作四个机器周期,给硬件反应时间 E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令 } /****************************************** 函数功能:对LCD的显示模式进行初始化设置 *******************************************/ void LcdInitiate(void){ uchar num; second=50;minute=27;hour=19;week=6;day=7;month=12;year=13;count=0;s1num=0;E=0;delay(15);//延时15ms,首次写指令时应给LCD一段较长的反应时间 WriteInstruction(0x38);//显示模式设置:16×2显示,//5×7点阵,8位数据接口 delay(5);//延时5ms?,给硬件一点反应时间 WriteInstruction(0x38);delay(5);WriteInstruction(0x38);//连续三次,确保初始化成功 delay(5);WriteInstruction(0x0c);//显示模式设置:显示开,无光标,//光标不闪烁 delay(5);WriteInstruction(0x06);//显示模式设置:光标右移,字符不移 delay(5);WriteInstruction(0x01);//清屏幕指令,将以前的显示内容清除 delay(5);WriteInstruction(0x80);for(num=0;num<16;num++)//让液晶显示日期 { WriteData(table[num]);delay(5);} WriteInstruction(0x80+0x40);for(num=0;num<14;num++)//让液晶显示时间 { WriteData(table1[num]);delay(5);} TMOD=0x01; //定时器中断初始化 TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1; ET0=1;TR0=1;} //-------写年月日---------------void write_nyr(uchar add,uchar date){ uchar i,j;i=date/10;j=date%10;WriteInstruction(0x80+add);WriteData(0x30+i);WriteData(0x30+j);} //--------写时分秒---------------void write_sfm(uchar add,uchar date){ uchar i,j;i=date/10;j=date%10;WriteInstruction(0x80+0x40+add);WriteData(0x30+i);WriteData(0x30+j);} //-------------写星期-------------void write_week(uchar add,uchar date){ WriteInstruction(0x80+add);WriteData(0x30+date);} //---------该年是否是闰年-------------bit leap_year(){ int leap;if((year%4==0&&year%100!=0)||year%400==0) leap=1; //是闰年 else leap=0; //非闰年 return leap;} //----------键盘扫描--------------------void keyscan(){ if(s1==0) //第一个键是否按下 { delay(5); if(s1==0) { while(!s1); s1num++; if(s1num>7) s1num=1; if(s1num==1) //第一个键被按一次 { TR0=0; WriteInstruction(0x80+0x40+13); WriteInstruction(0x0f); } if(s1num==2) { WriteInstruction(0x80+0x40+10); } if(s1num==3) { WriteInstruction(0x80+0x40+7); } if(s1num==4) { WriteInstruction(0x80+9); } if(s1num==5) { WriteInstruction(0x80+6); } if(s1num==6) { WriteInstruction(0x80+3); } if(s1num==7) { WriteInstruction(0x80+15); } } } if(s1num!=0) //如果功能键被按下 { if(s2==0)//第二个按下 { delay(5); if(s2==0) { while(!s2); if(s1num==1) //第一个键被按一次,秒钟加一 { second++; if(second==60) second=0; write_sfm(12,second); WriteInstruction(0x80+0x40+13); } if(s1num==2) //第一个键被按二次,分钟加一 { minute++; if(minute==60) minute=0; write_sfm(9,minute); WriteInstruction(0x80+0x40+10); } if(s1num==3) //第一个键被按三次,时钟加一 { hour++; if(hour==24) hour=0; write_sfm(6,hour); WriteInstruction(0x80+0x40+7); } if(s1num==4) //日期加一 { day++; if(day==32) day=1; write_nyr(8,day); WriteInstruction(0x80+9); } if(s1num==5) //月加一 { month++; if(month==13) month=1; write_nyr(5,month); WriteInstruction(0x80+6); } if(s1num==6) //年加一 { year++; if(year==99) year=0; write_nyr(2,year); WriteInstruction(0x80+3); } if(s1num==7) //星期加一 { week++; if(week==8) week=1; write_week(15,week); WriteInstruction(0x80+15); } } } if(s3==0) //第三个键被按下 { delay(5);if(s3==0){ while(!s3); if(s1num==1) //秒减一 { second--; if(second==-1) second=59; write_sfm(12,second); WriteInstruction(0x80+0x40+13); } if(s1num==2) //分减一 { minute--; if(minute==-1) minute=59; write_sfm(9,minute); WriteInstruction(0x80+0x40+10); } if(s1num==3) //时减一 { hour--; if(hour==-1) hour=23; write_sfm(6,hour); WriteInstruction(0x80+0x40+7);} if(s1num==4) //日减一 { day--; if(day==0) day=31; write_nyr(8,day); WriteInstruction(0x80+9);} if(s1num==5) //月减一 { month--; if(month==0) month=12; write_nyr(5,month); WriteInstruction(0x80+6);} if(s1num==6) //年减一 { year--; if(year==-1) year=99; write_nyr(2,year); WriteInstruction(0x80+3);} if(s1num==7) //日期减一 { week--; if(week==0) week=7; write_week(15,week); WriteInstruction(0x80+15); } } } if(s4==0) //保存并退出 { s1num=0; WriteInstruction(0x0c); TR0=1; } } } /****************************************** main function *******************************************/ void main(void){ uchar k=0;LcdInitiate(); //调用LCD初始化函数 while(1){ keyscan(); k=1;} } /***************************************** 函数功能:定时器T0的中断服务函数 ******************************************/ void timer0()interrupt 1 { count++;if(count==13){ count=0; second++; if(second==60) //秒计满60,秒归0,分+1 { second=0; minute++; if(minute==60)//分计满60,分归0,时+1 { minute=0; hour++; if(hour==24)//时计满24,时归0,星期+1,日+1 { hour=0; week++; day++; if(week==8) week=1;//星期计满7,星期归1 if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)//大月三十一天 { if(day==32) //大月天数计满31,日归1,月+1 { day=1; month++; } } if(month==4||month==6||month==9||month==11)//小月三十天 { if(day==31) { //小月天数计满30,日归1,月+1 day=1; month++; } } if(month==2) { if(leap_year()) { if(day==30)//闰年二月29天??计满,日归1,月+1 { day=1; month++; } } else { if(day==29)//非闰年二月28天 计满,日归1,月+1 { day=1; month++; } } } if(month==13)//月计满12,月归1,年+1 { month=1; year++; } if(year==99)//年计满99,年归0 { year=0; } write_nyr(2,year); } write_nyr(5,month); } write_nyr(8,day); write_week(15,week); } write_sfm(6,hour); } write_sfm(9,minute);} write_sfm(12,second);5 仿真结果和实物图 5.1 仿真结果 5.2 实物图 总结: 说句实话,这个时钟在硬件上没有什么太多的技术含量,只有一个单片机的最小系统和一个显示电路,其实它们可以结合在一起,但是为了以后的方便,我还是将它们设计了两个部分,方便以后最小系统的其他方面的应用。还有就是程序,这个时钟程序如果让我自己写的话那我肯定不能再规定时间内完成,所以还是靠外界力量的帮忙。也正是如此,我找到我学习单片机的弱点,那就是程序的编写,记得室友百度开玩笑说:“程序是单片机的灵魂”,想想当时很搞笑,但仔 细一想,那还真是个恰当的比喻,如果说单片机没有程序的输入,那么它不能完成任何事情。虽然本学期的单片机课程即将结束,但是我学习单片机的过程还没有结束,以后还是要在程序的编写上多多下工夫。 此次的电子时钟设计给我奠定了一个实践基础,我会在以后的学习、生活中磨练自己,使自己适应于以后的竞争。当遇到不会或是设计不出来的地方,我们就会在QQ 群里讨论或者是同学之间相互帮助。团结就是力量,无论在现在的学习中还是在以后的工作中,团结都是至关重要的,有了团结会有更多的理念、更多的思维、更多的情感。 参考文献 [1]郭天祥.新概念51单片机C语言教程—— 入门,提高,开发,拓展 全攻略[M].北京:电子工业出版社,2009. 《电子时钟》 课程设计说明书 专业班级: 11级自动化<3>班 姓 名: 欧阳明长 李徐军 陈龙 指导教师: 郭 玉 设计时间: 2013--12--17 物理与电气工程学院 2013年12月17日 摘要 电子钟在生活中应用非常广泛,而一种简单方便的数字电子钟则更能受到人们的欢迎。所以设计一个简易数字电子钟很有必要。本电子钟采用STC公司的AT89S52单片机为核心,使用12MHz 晶振与单片机AT89S52 相连接,通过软件编程的方法实现以24小时为一个周期,同时8位7段LED数码管(两个四位一体数码管)显示小时、分钟和秒的要求,并在计时过程中具有定时功能,当时间到达提前定好的时间进行蜂鸣报时。该电子钟设有四个按键S12、S13、S14和S15键,进行相应的操作就可实现小时调整、分钟调整和启停功能。具有时间显示、整点报时、校正等功能。走时准确、显示直观、运行稳定等优点。 关键词 电子钟;AT89S52;硬件设计;软件设计 目录 设计课题任务、功能要求说明及方案介绍……………………………………3 1.1 设计课题任务………………………………………………………………3 1.2 功能要求说明………………………………………………………………3 1.3 设计总体方案介绍及原理说明……………………………………………3 2 设计课题硬件系统的设计………………………………………………………3 2.1 设计课题硬件系统各模块功能简要介绍…………………………………4 3 设计课题软件系统的设计………………………………………………………4 3.1 设计课题软件系统各模块功能简要介绍…………………………………4 3.2 设计课题软件系统程序流程框图…………………………………………4 4 设计结论、仿真结果、误差分析………………………………………………7 4.1 设计课题的设计结论及使用说明…………………………………………4 4.2 设计课题的误差分析………………………………………………………7 4.3 设计体会……………………………………………………………………7 参考文献 ……………………………………………………………………………7 附 录 ……………………………………………………………………………8 1 设计课题任务、功能要求说明及方案介绍 1.1 设计课题任务 设计一个具有特定功能的电子钟。具有启停、时间显示、报时等功能。并有时间设定,时间调整功能。 1.2 功能要求说明 设计一个具有特定功能的电子钟。电子钟上电从12时0分0秒开始运行,按下启停键进入时钟运行状态;再按启停键暂停运行,并且再次按下时能够在原来的时间上继续计时;运行到整点是能够自动响铃,通过外部按键可以进行实践的调整,并且在运行时相应的LED灯等同步亮灭。 1.3 设计课题总体方案介绍及工作原理说明 本电子钟主要由单片机、4*4独立键盘、显示接口电路和电源电路构成,设 计课题的总体方案如图1.1所示: 图1.1 总体设计方案图 本电子钟的所有的程序、参数均存放在AT89S52的内部RAM中。键盘采用动态扫描方式。利用单片机定时器产生定时效果通过编程形成数字钟效果,再利用数码管动态扫描显示单片机内部处理的数据,同时通过端口读入当前外部控制状态来改变程序的不同状态,实现不同功能。设计课题硬件系统的设计 2.1 设计课题硬件系统各模块功能简要介绍 本设计的硬件系统主要采用以下基本模块来实现,单片机最小系统模块,输入模块、输出模块、电源模块。 (1)单片机最小系统模块:包括8位微控制器AT89S52;电源复位电路;晶振电路。本模块AT89S52系统控制核心,单片机系统复位由电源上电完成。 (2)输入模块:本模块共用到了4个按键(S12、S13、S14、S15),分别完成时间的调整、启停。1个电源开关(具有复位功能)。 (3)输出模块:本次设计显示为8位,采用两个四位一体数码管(共阳极)8个PNP三极管驱动,并且还有蜂鸣器模块。(4)电源模块:USB供电及下载器。 设计课题软件系统的设计 3.1 设计课题软件系统个模块功能简要介绍 本设计的软件系统主要采用以下基本模块来实现,主程序、中断服务程序、键盘输入程序模块、数码管及其驱动模块和延时模块。 主程序:主要是用于对输入信号的处理、输出信号的控制和对各个功能程序模块的控制。 中断服务程序:主要是用于电子钟的1S延时。键盘输入程序模块:主要是用于完成特定时间调整。 数码管及其驱动模块:主要是用于驱动数码管及利用数码管显示时间。延时模块:短延时用于数据的动态显示,按键的判断。 3.2 设计课题软件系统程序流程框图 系统程序采用汇编语言按模块化方式进行设计,然后通过Keil软件开发平台将程序转变成可烧写文件。 主循环程序框图如3.1所示;判断进位程序如3.2所示; 计时一秒中断程序如3.3所示; 启停中断框图如3.4所示; 延时子程序框图如3.5所示; 图3.1 主循环程序 5 图3.2 判断进位子程序 图3.3 计时一秒中断 图3.4 启停中断程序 图3.5 延时子程序 设计结论、运行结果、误差分析 4.1 设计课题的设计结论及使用说明 本设计为基于单片机的电子钟的设计。刚开始,我们很多地方理不清头绪,无从下手,只能从平时的实验中得到一些方法,但通过认真研究设计课题,找书上网查资料,确定基本设计方案,对所用芯片功能进行查找、调试,设计中有四个按键,其中S12为分钟加1调整,S13为小时加1调整,S14为外部响铃按键,S15为启停按键,另外当整点时间到时,蜂鸣器报警。这样的结果与设计基本相符,基本上完成了设计任务。 4.2 设计课题的误差分析 该电子钟在运行中存在一定的误差,误差产生有三种原因,首先是采用的计时利用中断来实现。而当电子钟运行时间1秒时,又得去执行中断程序,这个过程需要几个机器周期。第二,硬件系统有一定的影响。第三,设计用到12MHz晶振,计算是满20次为一秒钟,实际会慢很多。 4.3 设计体会 本次课程设计,让我们三人受益匪浅,认识到了自己的许多缺点和不足,使我深深的感受到了理论联系实际的必要性及其重要性。 参考文献 [1] 李全利.单片机原理与接口技术[M].高等教育出版社.2009.1.[2] 刘文秀.单片机应用系统仿真的研究[J].现代电子技术.2005, 第286 期.[3] 胡学海.单片机原理及应用系统设计[M],北京:电子工业出版社,2005.[4] 李广第.单片机基础[M],北京航空航天大学出版社,2006.7.附录 程序代码为: ORG 0000H LJMP START ORG 0003H LJMP INTT0 ORG 0013H LJMP INTT1 ORG 000BH LJMP INTT ORG 0100H START:SETB EA SETB ET0 SETB IT0 SETB EX0 SETB IT0 SETB EX1 SETB IT1 MOV R7,#16 MOV TMOD,#01H MOV TH0,#15536/256 MOV TL0,#15536 MOD 256 MOV R0,#12 MOV R1,#0 MOV R2,#0 MOV R6,0FEH CLR TR0 L1: LCALL PANDUAN;***************** ;记秒 MOV A,R2 MOV B,#10 DIV AB MOV P2,#0FDH LCALL XIANSHI LCALL DELAY MOV A,B MOV P2,#0FEH LCALL XIANSHI LCALL DELAY;*************** ;调分 JB P3.0,L40 L41:JB P3.0,L42 LJMP L41 L42:INC R1 ;计分 L40: MOV A,R1 MOV B,#10 DIV AB MOV P2,#0EFH LCALL XIANSHI LCALL DELAY MOV A,B MOV P2,#0F7H LCALL XIANSHI LCALL DELAY MOV P2,#0FBH MOV P0,#0BFH LCALL DELAY;****************** ;调时 JB P3.1,L45 L47:JB P3.1,L46 LJMP L47 L46:INC R0 ;计时 L45: MOV A,R0 MOV B,#10 DIV AB MOV P2,#07FH LCALL XIANSHI LCALL DELAY MOV A,B MOV P2,#0BFH LCALL XIANSHI LCALL DELAY MOV P2,#0DFH MOV P0,#0BFH LCALL DELAY ;*************************;判断5分钟闹铃 CJNE R1,#5,L51 CLR P3.5 MOV P1,R6 MOV A,R6 RL A MOV R6,A LJMP L52 L51:CJNE R1,#6,L52 SETB P3.5 L52: LJMP L1 ;***************;执行1秒钟 INTT:DJNZ R7,L33 MOV R7,#16 INC R2 MOV P1,R6 MOV A,R6 RL A MOV R6,A L33:RETI;********************* ;外部中断 INTT0:CPL P3.5 MOV P1,#0 RETI;*********************** ;启停功能 INTT1:MOV P1,#0 LCALL DELAY JB P3.3,L97 CPL TR0 L97: RETI;********************** ;显示子程序 XIANSHI:MOV DPTR,#TAB MOVC A,@A+DPTR MOV P0,A RET ;********************** ;延时子程序 DELAY:MOV R3,#20 DEL1:MOV R4,#50 DEL2:DJNZ R4,DEL2 DJNZ R3,DEL1 RET ;******************* ;判断进位子程序 PANDUAN: CJNE R2,#60,L31 MOV R2,#0 INC R1 L31:CJNE R1,#60,L32 MOV R1,#0 INC R0 L32:CJNE R0,#24,L35 MOV R0,#0 L35:RET ;******************** TAB:DB 0C0H,0F9H,0A4H,0B0H,99H DB 92H,82H,0F8H,80H,90H END 题 目:单片机课程设计报告 目 录 一、设计目的二、程设计具体要求 三、单片机发展简史 四、8051单片机系统简介 五、8051单片机内部定时器/计数器简介 六、程序电路 七、程序流程 八、程序代码 九 实验总结-要求写出完整的论文以及心得体会 十 参考资料及小结 原 文 :一.目的1. 进一步熟悉和掌握8051单片机的结构及工作原理。 2. 掌握单片机的接口技术及相关外围芯片的外特性,控制方法。 3. 通过课程设计,掌握以单片机核心的电路设计的基本方法和技术,了解表关电路参数的计算方法。 4. 通过实际程序设计和调试,逐步掌握模块化程序设计方法和调试技术。 5. 通过完成一个包括电路设计和程序开发的完整过程,使学生了解开发一单片机应用系统的全过程,为今后从事相应打下基础。 二.课程设计的体要求 a)原理图设计。 1. 原理图设计要符合项目的工作原理,连线要正确,端了要不得有标号。 2. 图中所使用的元器件要合理选用,电阻,电容等器件的参数要正确标明。 3. 原理图要完整,CPU,外围器件,扩器接口,输入/输出装置要一应俱全。 b)程序调计 1. 根据要求,将总体项能分解成若干个子功能模块,每个功能模块完成一个特定的功能。 2. 根据总体要求及分解的功能模块,确定各功能模块之间的关系,设直出完整的程序流程图。c)程序调试将设计完的程序输入,汇编,排除语法错误,生成*OBJ文件。 1. 按所设计的原理图,在实验平台上连线,检查无误。 2. 将汇编后生成的*OBJ文件传送到实验装置的,执行该程序,检查该程序、是否达到设计要求,若未达 到,修改程序,直到达到要求为止,d)说明书 1. 原理图设计说明 简要说明设计目的,原理图中所使用的元器件功能及在图中的作用,各器件的工作过程及顺序。 2. 程序设计说明 对程序设计总体功能及结构进行说明,对各子模块的功能以及各子模块之间的关系作较详细的描述。 3. 画出工作原理图,程序流程图并给出程序清单。 目前,单片机已广泛应用到图民经济建设和日常生活的许多领域,成为测控技术现代化必不可少的重要工具。 单片机电子时钟 作者:佚名来源:本站原创点击数: 491更新时间:2007年06月27日 DS1302是Dallas公司生产的一种实时时钟芯片。它通过串行方式与单片机进 行数据传送,能够向单片机提供包括秒、分、时、日、月、年等在内的实时时间 信息,并可对月末日期、闰年天数自动进行调整;它还拥有用于主电源和备份电源的双电源引脚,在主电源关闭的情况下,也能保持时钟的连续运行。另外,它还能提供31字节的用于高速数据暂存的RAM。鉴于上述特点,DS1302已在许多单片机系统中得到应用,为系统提供所需的实时时钟信息。 一、DS1302的主要特性 1.引脚排列 500)this.width=500 border=0> 图1DS1302引脚排列图 DS1302的引脚排列如图1所示,各引脚的功能如下: X1,X2——32768Hz晶振引脚端; RST——复位端; I/O——数据输入/输出端; SCLK——串行时钟端; GND——地; VCC2,VCC1——主电源与后备电源引脚端。 2.主要功能 DS1302时钟芯片内主要包括移位寄存器、控制逻辑电路、振荡器、实时时钟电路以及用于高速暂存的31字节RAM。DS1302与单片机系统的数据传送依靠RST,I/O,SCLK三根端线即可完成。其工作过程可概括为:首先系统RST引脚驱动至高电平,然后在作用于SCLK时钟脉冲的作用下,通过I/O引脚向DS1302输入地址/命令字节,随后再在SCLK 时钟脉冲的配合下,从I/O引脚写入或读出相应的数据字节。因此,其与单片机之间的数据传送是十分容易实现的。 二、时钟的产生及存在的问题 (1)在实际使用中,我们发现DS1302的工作情况不够稳定,主要表现在实时时间的传送有时会出现误差,有时甚至整个芯片停止工作。我们对DS1302的工作电路进行了分析,其与单片机系统的连接如图2所示。从图中可以看出,DS1302的外部电路十分简单,惟一外接的元件是32768Hz的晶振。通过实验我们发现:当外接晶振电路振荡时,DS1302计时正确;当外接晶振电路停振时,DS1302计时停止。因此,我们认为32768Hz晶振是造成 DS1302工作不稳定的主要原因。 500)this.width=500 border=0> 图2DS1302与单片机系统的连接图 (2)DS1302时钟的产生基于外接的晶体振荡器,振荡器的频率为32768Hz。该晶振通过引脚X1、X2直接连接至DS1302,即DS1302是依靠外部晶振与其内部的电容配合来产生时钟脉冲的。由于DS1302在芯片本身已经集成了6pF的电容,所以,为了获得稳定可靠的时钟,必须选用具有6pF负载电容的晶振。 然而,许多人在选用晶振时仅仅注意了晶振的额定频率值,而忽视了晶振的负载电容大小,甚至连许多经销商也不能提供所售晶振的负载电容。所以即使在使用中选用了符合32768Hz的晶振,但如果该晶振的负载电容与DS1302提供的6pF不一致时,就会影响晶振的起振或导致振荡频率的偏移,出现上述在应用中的问题。 三、利用辅助电容实现负载匹配 (1)当所选的晶振负载电容不是6pF时,可以采用增加辅助电容的方法提高或降低DS1302振荡器的电容性负载,使之与晶体所需的电容值匹配。如果已知晶体的负载电容为CI,若CI<6pF,则可以增加一个并联电容CS以产生所需的总负载电容CI,即CI=6pF+CS;若CI>6pF,则可以在晶体的一端增加一个串联电容CS,以产生所需的负载电容CI,即1/CI=1/6pF+1/CS,通过计算即可得出应增加的辅助电容大小。辅助电容的接法如图3所示。 图3CS连接电路图 (2)在使用前对晶体的负载电容并不知道的情况下,通过测定晶体振荡频率的方法可以确定该晶体的负载电容。 对于晶体振荡器来说,其振荡频率与负载电容之间的关系是确定的。以本文讨论的DS1302使用的32768Hz晶振为例:当它工作于所要求的负载电容时,能较准确地产生 32768Hz的频率;当它的负载电容小于6pF时,其振荡频率会正向偏移;当它的负载电容大于6pF时,其振荡频率就会负向偏移。因此,对于未知负载电容的晶体应首先采用实验的方法,在其两端加入辅助电容使晶体起振,然后用频率计测出振荡频率。若测得频率大于32768Hz,说明负载电容偏小;若测得频率小于32768Hz,说明负载电容偏大。对辅助电容逐步调整,最终使振荡频率尽可能接近32768Hz,则此时晶体端所接负载电容的总和就是适合该晶体的负载电容。 结论 以上方法经我们在实际工作中多次使用,证明确实有效。它放宽了DS1302在使用中对晶振的条件要求,增强了DS1302在工作中的稳定性,对DS1302更广泛地应用具有积极的意义。 华东交大理工学院_2007-2008 _学年第_ 一 学期 课程设计安排计划 班级:_05应电__课程:_单片机原理及接口技术_ 一、课程设计题目:数码管时钟电路的设计 二、设计内容及要求: LED数码管时钟电路24小时计时方式,时、分、秒用6位数码管显示。选用AT89C2051单片机,12MHZ晶振,6位共阳数码管,要求有调时功能,其他功能学生可自由发挥。 三、设计方法与步骤: 1.设计硬件原理电路,选择元器件、确定其参数。 2.设计印刷电路板电路(用面包板做)、焊接硬件电路。 3.设计汇编语言程序,调试硬件电路和程序。 4.编写课程设计报告。 四、设计时间安排: 1.第十九周:周一、二,设计硬件原理电路,选择元器件、确定其参数。 周三、四、五,设计印刷电路板电路(用面包板做)、焊接硬件电路。 2.第二十周:周一、二,设计汇编语言程序。 周三、四,烧录程序,调试硬件电路和程序。 周五,编写课程设计报告。 指导老师: 杨威 时间: 2007、1 青岛理工大学琴岛学院 课题名称:单片机原理及应用课程设计学院: 专业班级: 学号: 学生: 指导教师: 设 计 报 告 五.实验总结及感想 在实验的开始几天,基本上没有收获,不知何从下手,不知所措。为了看得更远,不妨站在前人的肩膀上,我在整体思路模糊的情况下,在网上大量招资粮,各种与电子时钟相关的文章,我阅读了不少。随着涉猎的点滴积累,我对电子时钟的设计方案已经慢慢酝酿而成。有了方向和不少知识储备后,在接下来的几天,几乎每天都有突破,虽然有时只是一句程序的修改或诞生,但那种收获的感觉很暖人心。 实验中遇到了不少问题,接下来总结一下,共同探讨。 1,按键问题。我的设计中,很多功能选择是通过按键开关实现的。在仿真中发现,调整数值时,有时按键反应太快,按一次,跳了几下,使设置时间,日期很不方便。但是仿真多了之后,找到了按键(实际上是按鼠标)的节奏,对按键的掌控力提高了不少,不怎么会出现跳变的情况了。有些开关我采用了长按键的方式来防抖,效果不错,但是每次都要长按键,调整效率太低,我没有普及。本来想把所有的按键都加延时防抖电路,但仿真中感觉对键盘的控制力没提高多少,有时还是会出问题,这个方案放弃了。索性将板子焊接出来了在调试软件吧,仿真毕竟不是那么“真”啊!实际电路调试中,按键反应没有出现过于灵敏的问题,基本可控制。 出现以上问题,我认为是电路板上焊接点太多,接触不是很好,影响了信号的传输时间,从而解决了按键问题!也有可能是按键质量问题,接触不良。 2,P0口开关问题。P0口比较特殊,它存在高阻态,要使其输入不是高电平就是低电平,就要接上拉电阻,给其高电平输入。 3,音乐闹铃问题。在闹铃时间到,闹铃提醒时,我的数码管为熄灭状态,因为开始我的响铃程序内,没有数码管扫描显示程序。但加入数码管显示子程序后,我的闹铃音乐被影响了,一开始不知所措,有点怀疑是显示程序时间过长,影响音乐的定时(节拍),我就在响铃程序中加延时模块,延时长度逐渐提高,最后出现了类似的问题,看来时显示程序占用时间太长,使音乐每个音符的节拍出现了紊乱,音乐功能被遏制了!鱼和熊掌不能兼得,我只能牺牲显示来获得音乐闹铃,但为了弥补显示,我设计了闪烁提醒方案,就是在手动或音乐自然停止后,进入当前时间闪烁提示,8秒后若不按返回键,则自动跳入主程序。 在仿真中,老师提供的响铃电路不能实现功能,但是在我的电路板中效果很好,令人费解!4,中断冲突问题,为了实现秒表,我在T0中断嵌套了秒表相关进位程序,由于秒表要求精度0.01秒,故我的T0中断定时为就刚好0.01秒,中断100次,刚好1秒。秒表确实实现了,但是我的闹铃音质变差了。一开始以为是闹铃程序存太多冗余环节,影响了T1的音乐输出中断,但是检查程序后,发现没什么多余的,裁剪无从下手。 在仿真中,我让音乐模块运行,发现音质很好。添加T0中断服务程序,但是将中断进入的间隔变大,即0.05秒进入一次中断,发现音质有所下降,有滋滋声,但比原来的好。最后认定应该是T0中断过于频繁,T1音乐频率发生中断被打破,当单位时间内被打破的次数达到一定程度时,音符和节拍的对应发生紊乱,最终音质变差。 虽然如此,我的焊接的电路板的表现却很争气,闹铃音质可以接受!虽然这次实际表现不错,但问题还是有的,还是要解决的,我的方案是把秒表程序放在T1中断服务程序,虽然音乐的发生要用到T1中断,但是秒表的显示和闹铃音乐的演奏上不会重合在一起,闹铃判断是在主程序,而秒表实现是在秒表子程序,故原本相互矛盾的两个功能,在T1中断服务程序中找到了共同的归宿,和谐相处。 5,显示数字分隔问题。本实验中用8个共阴极数码管显示日历及其时间,但是8个数码管连在一起,显示过程中不能有效地区分时,分,秒和年,月,日,数码管是两两组合起来,形成某位的十位和个位,故用小数点在适当位置一直保持高亮状态,形成分隔符,实现方便的读取数据。具体方法是,将需要小数点位高亮的数码管找出来,在动态显示扫描到该数码管时,先将提取的字段码的最高位变为1,利用语句 ORL A,#10000000B 实现,修正字码后,再将字码送入P1口显示数字,如此问题得以解决。 6,添加倒计时器嘀嘀声提示功能。这个功能我用到了T1中断,作为音调频率发生器,但是T1已经承担了音乐闹铃的音调发生功能,在此通过设立标志位实现中断服务程序的转变。即使我将秒表的实现服务程序放入T1中断实现,也没问题,只要选择标志位判断就可以了。在此,我们用调整状态指示灯的状态来做标志位,具体的说是P0.1口做标志位。 还有一个问题就是如何使铃声有间隔的响,这就牵涉到定时,在此我们用硬件定时,即T1中断的次数作为定时参数。我的设计是音调响0.25秒,然后用T1延时0.5秒,由于计数器工作于方式1时,12MHZ时钟频率下时,一次中断最多定时65536*1us=0.065536秒,为了实现0.5秒的响声间隔,将T1中断1次定时为0.05秒,中断10次后,重新装音调发生计数初值。对于响铃时间的设定原理类似,可以有发声频率求出一次发声定时中断的时间,N次发声定时中断后,使时间变化0.25秒,而后转入发声间隔定时程序。 设计体会 以前看别人的一个电子表卖十几块钱,心里面有点愤愤不平,现在,自己做过一个电子钟,才发现,其中的不容易,还有艰辛。其实做其他的事情也是一样,都会经过很多的困难,才能成功。突然想起一句话“不经历风雨,怎么见彩虹”。其实想想,这一个月,也留下了很多美好的回忆。一分耕耘,一分收获。只有亲自用实践来验证这句话,在能得其要领。经过这次单片机课程设计,我从一个单片机实践的门外汉,已经越升为略知一二的新手。虽然还有很多有关单片机的应用有待学习,但万变不离其宗,只要深入了解单片的原理,全部知识点,各个细节,一切设计皆有可能。还记得那个晚上通宵达旦仿真,不成功,誓不睡觉,很困了,都还在弄着。却当仿真成功时,没有一丝睡意,有的只是心中的喜悦通过这次的设计使我认识到本人对单片机方面的知识知道的太少了,对于书本上的很多知识还不能灵活运用,尤其是对程序设计语句的理解和运用,不能够充分理解每个语句的具体含义,导致编程的程序过于复杂,使得需要的存储空间增大。损耗了过多的内存资源。本次的设计使我从中学到了一些很重要的东西,那就是如何从理论到实践的转化,怎样将我所学到的知识运用到我以后的工作中去。只要我们有耐心,够细心,都可以把它们解决。在大学的课堂的学习只是在给我们灌输专业知识,而我们应把所学的用到我们现实的生活中去,此次的电子时钟设计给我奠定了一个实践基础,我会在以后的学习、生活中磨练自己,使自己适应于以后的竞争,同时在查找资料的过程中我也学到了许多新的知识,在和同学协作过程中增进同学间的友谊,使我对团队精神的积极性和重要性有了更加充分的理解。我知道,今后我的路还是很长,我要学的东西也有很多。通过这次实习,我深刻的认识到计算机专业的路的不平坦,但我会以一种良好的态度去迎接每一个挫折和挑战。第二篇:单片机课程设计电子时钟说明书
第三篇:单片机课程设计报告,单片机电子时钟
第四篇:单片机电子时钟课程设计报告
第五篇:单片机数字时钟课程设计感想