要求:1.秒表最长计时为23:59:59; 2.秒表精度为1秒; 3.设置三个按键,分别为启动,暂停和清零; 4. 用数码管(或液晶)进行显示。
电路模块介绍2.3.1时钟电路图 3时钟振荡电路 在内部方式时钟电路中,必须在XTAL1和XTAL2引脚两端跨接石英晶体振荡器和两个微调电容构成振荡电路。 2.3.2按键电路图 4按键电路 按键电路分矩阵键盘和独立按键两种。独立按键式直接用I/O口线构成的单个按键电路,其特点是每个按键单独占用一根I/O口线,每个按键的工作不会影响其他I/O口线的状态。独立式按键电路配置灵活,软件结构简单,但每个按键必须占用一个I/O口线,因此,在按键较多时,I/O口线浪费较大,不宜采用。 本次设计采用的是独立按键,按键处理设置为: 按下K1键,启动;K2键,暂停;K3键,清零。 2.3.3显示电路图 5显示电路 显示电路中使用的是8位共阴极数码管,其中,由P2口进行位选,P0口进行段选并利用数码管进行动态显示。 2.3.4复位电路图 6复位电路 51单片机一般要求的是高电平复位。复位电路的目的就是在上电的瞬间提供一个与正常工作状态下相反的电平。一般利用电容电压不能突变的原理,将电容与电阻串联,上电时刻,电容没有充电,两端电压为零,此时,提供复位脉冲,电源不断的给电容充电,直至电容两端电压为电源电压,电路进入正常工作状态。
3.软件设计3.1软件简介Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。Keil提供了包括C编译器、宏汇编、链接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(μVision)将这些部分组合在一起。运行Keil软件需要WIN98、NT、WIN2000、WINXP等操作系统。 C51工具包的整体结构,μVision与Ishell分别是C51 for Windows 和for Dos的集成开发环境(IDE),可以完成编辑、编译、连接、调试、仿真等整个开发流程。开发人员可用IDE本身或其它编辑器编辑C或汇编源文件。然后分别由C51及C51编译器编译生成目标文件(.obj)。目标文件可由LIB51创建生成库文件,也可以与库文件一起经L51连接定位生成绝对目标文件(.abs)。abs文件由OH51转换成标准的hex文件,以供调试器dScope51或tScope51使用进行源代码级调试,也可由仿真器使用直接对目标板进行调试,也可以直接写入程序存贮器如EPROM中。 使用独立的Keil仿真器时,注意事项: *仿真器标配11.0592MHz的晶振,但用户可以在仿真器上的晶振插孔中换插其他频率的晶振。 *仿真器上的复位按钮只复位仿真芯片,不复位目标系统。 *仿真芯片的31脚(/EA)已接至高电平,所以仿真时只能使用片内ROM,不能使用片外ROM;但仿真器外引插针中的31脚并不与仿真芯片的31脚相连,故该仿真器仍可插入到扩展有外部ROM(其CPU的/EA引脚接至低电平)的目标系统中使用。
3.2流程图
3.3设计思路利用单片机16位定时/计数器方式,TMOD为0X01。每1ms计数一次,共计1000次即1s,此时秒单位进一;当秒数值达到60时,秒数值清零,分单位进一;分数值达到60时,时单位进一,分数值清零,以此达到时钟功能。k1控制中断总开关,用来控制计数器工作。按下k1键启动中断,按下k2键关闭,k3键则用来控制秒、分、时的数值清零。
4.总结本次设计主题为基于单片机设计的时钟电路,体现了AT89C51的简易性、可控性等诸多优良特性。用单片机来设计时钟电路,其优点十分明显,即稳定性高、方便维护和操作简单。但它的缺点也较明显,即难以满足较为复杂的功能。 拿到课题后,我们小组每个成员先上网查阅资料以及翻阅单片机课本,复习本次设计内容,比如七段译码显示器、计数器、振荡器等等。然后根据设计要求画出整体设计框架。做完准备工作后就正式开始设计与绘图。 在软件设计过程中我们遇到了许多困难,其中最主要的困难是设计好按键程序后,进行实际开发板测试时按键无法工作,我们经过多次检查和测试后发现是由于P2口控制数码管位选时连续发送的数据对按键造成了干扰,最后我们更换了接口,解决了这个问题。 我们小组从这次的设计中收获颇多,不仅温习了一遍大二学过的单片机编程知识,而且还加深了对单片机的理解,感受到了设计的乐趣。
附录1.总电路图 8总电路图 2.程序代码- #include<reg51.h>
- #include<intrins.h>
- #define uint unsigned int
- #define uchar unsigned char
- void Delayms(uint x);
- sbit L=P2^0;
- sbit LA=P2^1;
- sbit LB=P2^2;
- void Display();
- sbit key1=P1^5;
- sbit key2=P1^6;
- sbit key3=P1^7;
- /*位码*/uchar tablew[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07};
- /*位选*/uchar shu[8]={0};
- /*共阴极*/
- uchar table6[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
- uint aa,bb,cc,dd;
- void main()
- {
- TMOD=0x01;//设置工作方式
- TH0=(65536-1000)/256;//设置定时器高八位
- TL0=(65536-1000)%256;//设置定时器低八位
- ET0=1;//打开定时器T0的中断开关
- TR0=1;//启动定时器T0工作
- EA=0;//打开总中断开关
- while(1)
- {
- uchar mshi,mge,fshi,fge,sshi,sge;
- if(key1==0)
- {
- EA=1;
- }
- else if(key2==0)
- {
- EA=0;
- }
- else if(key3==0)
- {
- bb=0;cc=0;dd=0;
- }
- else;
- mshi=bb/10;
- mge=bb%10;
- if(bb>59)
- {
- bb=0;
- cc++;
- }
- fshi=cc/10;
- fge=cc%10;
- if(cc>59)
- {
- cc=0;
- dd++;
- }
- sshi=dd/10;
- sge=dd%10;
- if(dd>23)
- {
- dd=0;
- }
- shu[7]=table6[mge];
- shu[6]=table6[mshi];
- shu[5]=0x40;
- shu[4]=table6[fge];
- shu[3]=table6[fshi];
- shu[2]=0x40;
- shu[1]=table6[sge];
- shu[0]=table6[sshi];
- Display();
- }
- }
- void int0_0() interrupt 1
- {
- TH0=(65536-1000)/256;
- TL0=(65536-1000)%256;
- aa++;//1ms加一次
- if(aa>1000)
- {
- aa=0;
- bb++;//1S加一次
- }
- }
- void Display()
- {
- uint i;
- for(i=0;i<8;i++)
- {
- P2=tablew[i];
- P0=shu[i];
- Delayms(1);
- }
- }
- void Delayms(uint x)
- {
- uchar j;
- while(x--)
- {
- for(j=0;j<125;j++);
- }
- }
复制代码
以上图文的Word格式文档下载(内容和本网页上的一模一样,方便保存):
基于单片机的电子时钟.docx
(272.49 KB, 下载次数: 53)
|