微智科技网
您的当前位置:首页Proteus电子钟仿真实验高清版

Proteus电子钟仿真实验高清版

来源:微智科技网
 _

Proteus 仿真大赛

电 子 时 钟 仿 真

_

第一章 电子时钟总体设计

1.1电子时钟简介

电子钟是一种利用数字电路来显示秒、分、时的计时装置,与传统的机械钟

相比,它具有走时准确、显示直观、无机械传动装置等优点,因而得到广泛应用。随着人们生活环境的不断改善和美化,在许多场合都用到电子时钟。

很多单片机产品具有实时时钟的功能,例如智能化仪器仪表、工业过程系统及家用电器等。这里要求实现一个具有实时时钟显示和闹钟控制功能的数字钟。 通过数字钟的设计与制作,将前面所学的单片机内部定时资源、I/O端口、键盘和显示接口等知识融会贯通,锻炼设计、制作和调试应用系统的能力,深入领会单片机应用系统的硬件设计、模块化程序设计及软硬件调试方法等,并掌握单片机应用系统的开发过程。

1.2电子钟设计要求

设计并制作具有如下功能的数字钟:

(1) 自动计时,由6位LED先四起显示时、分、秒。

_

(2) 具备校准功能,可以设置当前时间。

(3) 具备定时启动功能,可以设置闹钟时间,启闹10s后自动关闭闹铃。

1.3电子钟计时方案

(1)采用实时时钟芯片。针对应用系统对实时功能的普遍需求,各大芯片生产厂家陆续推出了一系列实时时钟集成电路,如DS1287、DS12887、DS1302、PCF8563、S35190等。这些实时时钟芯片具备年、月、日、时、分、秒、计时功能和多点定时功能,计时数据每秒自动更新一次,不需程序干预。单片机可通过中断或查询方式读取计时数据。实时时钟芯片的计时功能无须占用CPU时间,功能完善,精度高,软件程序设计相对简单,在实时工业测控系统中多采用这一类专用芯片来实现。

(2)软件控制。利用ATS51内部定时/计数器进行中断定时,配合软件延时、分、秒的计时。该方案节省硬件成本,且能够使读者对前面所学知识进行综合运用,因此,本系统设计采用这一方案。

1.4电子钟显示方案

(1)利用串行口扩展LED,实现LED静态显示。

该方案占用单片机资源少,且静态显示亮度高,但硬件开销大,电路复杂,信息刷新速度慢,比适用于单片机并行口资源较少的场合。 (2)利用单片机并行I/O端口,实现LED动态显示。

该方案直接使用单片机并行口作为显示接口,无须外扩接口芯片,但占用资源较多,且动态扫描显示方式需占用CPU时间。在非实时测控或单片机具有足够并

_

行口资源的情况下可以采用。 这里采用动态显示方案。

第二章 硬件描述及系统设计构思

2.1电子时钟功能模块

主程序 函数

LED 显示 函数 键盘 检测 函数

查值 函数

时钟 设置 函数 闹钟 设置 函数

闹钟 判断 启动 函数 定时 器中 断函 数 加1 修改 功能 函数

2.2系统硬件描述

1. 控制器用ATS51 , 12M晶振 2. 数码管动态扫描驱动——P2口 3. 数码管段码驱动——P1口 4. 闹铃驱动——P1.0

5. 调整键K1——P3.2(外部中断0, 正常、调时、调分、调秒) 6. 定时/正常切换键K2——P3.3

_

7. 时间参数低位加1键K3——P3.4 8. 时间参数高位加1键K4——P3.5

2.3系统设计构思

1.主流程是取时间参数,显示时间参数。

2.利用T0中断来完成计时、比较定时时间、驱动闹铃。 3.利用T1中断完成动态显示中,调整时间闪烁效果的定时。 4.利用外部中断0来完成调整选择功能。

5.利用外部中断1完成定时显示,当前时间显示的切换 6.K3、K4键完成时间参数的循环加1操作 2.4 电子时钟电路原理图

_

如图为电子时钟电路原理图

第三章 电子钟硬件介绍

3.1 单片机的介绍

单片机也被称为微控制器(Microcontroller Unit),常用英文字母的

_

缩写MCU表示单片机,它最早是被用在工业控制领域。它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。相当于一个微型的计算机,和计算机相比,单片机只缺少了I/O设备。概括的讲:一块芯片就成了一台计算机。它的体积小、质量轻、价格便宜、为学习、应用和开发提供了便利条件。同时,学习使用单片机是了解计算机原理与结构的最佳选择。

单片机芯片

单片机是靠程序运行的,并且可以修改。通过不同的程序实现不同的功能,尤其是特殊的独特的一些功能,这是别的器件需要费很大力气才能做到的,有些则是花大力气也很难做到的。一个不是很复杂的功能要是用美国50年代开发的74系列,或者60年代的CD4000系列这些纯硬件来搞定的话,电路一定是一块大PCB板!但是如果要是用美国70年代成功投放市场的系列单片机,结果就会有天壤之别!只因为单片机的通过你编写的程序可以实现高智能,高效率,以及高可靠性!

_ 3.2 数码管的工作原理 a.七段数码管分共阳管和共阴管,使用时要注意区分,本项目使用共阳数码管。109876 即公共端接正极。数码管引脚示意图如下:gcomfab 1e2dfeagdbcdpb.该电路使用芯片74LS244来驱动发光两极管,74LS244芯片说明书如下,使用时注意判断芯片的引脚号,引脚示意图如下: 3com345cdp4 _

c.人眼的视觉暂停时间大约是0.02秒,当画面每秒变化超过24帧时,

人眼会将这些快速变动的画面视作连续画面。数码管动态显示正是利用了人的这一特性。

第四章 控制系统的软件设计

4.1 程序设计

本系统的软件系统主要可分为主程序、定时计数中断程序、时间调整程序、

_

闹钟设置程序四大模块。在程序设计过程中,加强了部分软件抗干扰措施,下面对部分模块作介绍。

/***************数字钟程序***************/ #include

#define uchar unsigned char

sbit buzzer=P2^7; //定义蜂鸣器控制端口 /**************函数声明*************/ void display(uchar *p); uchar keyscan(); uchar search(); void alarm(); void ftion0(); void ftion1(); void cum();

//扫描键盘有无键按下 //按键识别

//闹钟判断启动

//时钟修改 //闹钟修改 //加1修改

/***************全局变量定义****************/

uchar clockbuf[3]={0,0,0};//存放时钟时分秒的十进制数 uchar bellbuf[3]={0,0,0};//存放闹钟时分秒的十进制数 uchar msec1; uchar msec2;

//10ms中断次数 //1s循环次数

uchar timdata,rtimdata; //时钟和闹钟修改位置标志 uchar count; uchar *dis_p;

//闹钟启动后10s计时单元

//显示缓冲区指针

_

bit armbit;//闹钟标志,为0闹钟未设定,为1已设定 bit rtimbit;//闹钟是否启动标志,为1已启动

bit rhourbit;//闹钟小时修改标志,为1正在修改闹钟小时 bit rminbit;//闹钟分修改标志,为1正在修改闹钟分 bit hourbit;//时钟小时修改标志,为1正在修改时钟小时 bit minbit;//时钟分修改标志,为1正在修改时钟分 bit secbit;//时钟秒修改标志,为1正在修改时钟秒 /****************主函数****************/ void main() {

uchar a;

armbit=0; //清零闹钟标志位

msec1=0; //设置10ms中断次数初值 msec2=0; //设置1s中断次数初值 timdata=0; //时钟内容修改位置记忆单元清零 rtimdata=0;//闹钟内容修改位置记忆单元清零 count=0; //闹钟启动后保持10s计时单元清零 TMOD=0x02; //定时器T0为工作方式2 TL0=0x06; //定时初始值为250us TH0=0x06;

EA=1; //中断总允许位开启 ET0=1; //定时器1开中断

_

数 数

TR0=1; //启动定时器T0

dis_p=clockbuf;//将时钟值所在地址送入显示指针 P1=0x00;buzzer=0; while(1) {

a=keyscan(); //调用键盘扫描子程序 if(a==0x07) { } else {

display(dis_p);//调用显示子函数作为延时去抖动 a=keyscan();

if(a!=0x07) //没有抖动,表示有键按下 {

a=search(); //调用查键值子函数 switch(a){

case 0x00:ftion0();break;//是时钟参数修改功能键,调用时钟设置子函display(dis_p);//无键输入调用显示程序

if(armbit==1)alarm();//判断闹钟设定否,若设定则调用闹钟启动函数

case 0x01:ftion1();break;//是闹钟参数修改功能键,调用闹钟设置子函

_

}}}}

case 0x02:cum();break;//是加1功能键,调用加1修改功能子函数 default:break;}

/***************6位LED显示函数***************/ void display(uchar *p)

{ uchar buffer[6]={0,0,0,0,0,0};

uchar k,i,j,m,temp;

uchar led[]={0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f}; buffer[0]=p[0]/10; buffer[1]=p[0]%10; buffer[2]=p[1]/10; buffer[3]=p[1]%10; buffer[4]=p[2]/10; buffer[5]=p[2]%10; for(k=0;k<2;k++) {temp=0x01;

for(i=0;i<6;i++) {

j=buffer[i]; P0=~temp;

P1=led[j]; //P1送断码

_

}}}

temp<<=1;

for(m=0;m<100;m++);//每一位显示延时 P1=0x00;

//关显示

/**************键盘扫描函数************/ uchar keyscan() { }

/**************查键值函数*************/ uchar search() {

uchar a,b,c,d,e; //P2=0xfe; c=0xfe; a=0;

//首列扫描字送变量c //首列号送a

uchar c; P0=0xf0; c=P2;

c=c&0x07;//按键行输入为P2.0-P2.2,屏蔽无关位 return(c);

while(1) {

_

}

}

P0=c; //列扫描字送P0口

d=P2; //读入P2口的行状态

if((d&0x01)==0){b=0;break;}//第0行有键按下,第0行行首号送b else if((d&0x02)==0){b=4;break;}//第1行有键按下,第1行行首号送b

else if((d&0x04)==0){b=8;break;}//第2行有键按下,第2行行首号送b

//扫描列号加1

a++;

c<<=1; //修改列扫描字,扫描下一列

e=a+b; //将行首号与列号相加,求键号

do{display(dis_p);}

while((d=keyscan())!=0x07);//等待释放按键 return(e);

/***********闹钟判断启动函数*************/ void alarm() {

if((clockbuf[0]==bellbuf[0])&&(clockbuf[1]==bellbuf[1]))

{buzzer=1;rtimbit=1;}//设置闹钟计时标志,时钟将进行10s计时标志

//判断闹钟保持10s时间到否

if(count==10)

{

count=0; //清除闹钟保持10s计时 buzzer=0; //清除闹钟

_

armbit=0; //清闹钟标志,否则闹钟设置将继续有效 rtimbit=0; }}

/*************时钟设置函数*************/ void ftion0() {

if(rhourbit==1||rtimbit==1||rtimdata==1)

{secbit=0;minbit=0;hourbit=0;timdata=0;}

else { }}

TR0=0;

//关定时器

dis_p=clockbuf;//将时钟缓冲区首地址送显示指针 timdata++; //将时钟修改记录值加1 switch(timdata){

case 0x01:secbit=1;break;//记录值为1,则将时钟秒修改标志置1

case 0x02:secbit=0;minbit=1;break;//记录值为2,则将时钟分修改标志置1 case 0x03:minbit=0;hourbit=1;break;//记录值3,则将时钟时修改标志置1 case 0x04:timdata=0;hourbit=0;TR0=1;break;//按4次则清时钟单元修改位置

//记录,定时器重新开启

default:break;}

/***************闹钟设置函数**************/

_

void ftion1() {

if(secbit==1||minbit==1||hourbit==1||timdata==1) {rhourbit=0;rtimbit=0;rtimdata=0;} else { }}

dis_p=bellbuf; //设置闹钟显示标志 rtimdata++;

//将闹钟修改记录值加1

switch(rtimdata){

case 0x01:rminbit=1;break;//记录值为1,将闹钟分修改标志置1 case 0x02:rminbit=0;rhourbit=1;break;

//记录值为2,将时钟分修改标志置1

case 0x03:rtimdata=0;rhourbit=0;//按3次则清闹钟单元修改位置记录

armbit=1; //设置闹钟已设置标志位 dis_p=clockbuf;//恢复时钟显示标志 break;

default:break;}

/*************加1修改功能函数**************/ void cum()

{ if(secbit==1){ //时钟秒修改标志为1,秒单元内容加1

if(clockbuf[2]==59) clockbuf[2]=0;

_

}

else clockbuf[2]++;}

else if(minbit==1){ //时钟分修改标志为1,分单元内容加1

if(clockbuf[1]==59) clockbuf[1]=0; else clockbuf[1]++;}

else if(hourbit==1){ //时钟小时修改标志为1,小时单元内容加1

if(clockbuf[0]==23) clockbuf[0]=0; else clockbuf[0]++;}

else if(rminbit==1){ //闹钟分修改标志为1,分单元内容加1

if(bellbuf[1]==59) bellbuf[1]=0; else bellbuf[1]++;}

else if(rhourbit==1){ //闹钟小时修改标志为1,小时单元内容加1

if(bellbuf[0]==23) bellbuf[0]=0; else bellbuf[0]++;}

/************定时器中断函数*************/ void clock() interrupt 1 {

EA=0;

//关中断

if(msec1!=40) msec1++; else

{ msec1=0; //到10ms否,不到则msec1加1

if(msec2!=10)msec2++;//到1s否,不到则msec2加1

_

}

else {

if(rtimbit==1)count++;msec2=0;

if(clockbuf[2]!=59)clockbuf[2]++;//到1min否,不到则clockbuf[2]加1 else { }}}

//开中断 clockbuf[2]=0;

if(clockbuf[1]!=59)clockbuf[1]++;//到1h否,不到则clockbuf[1]加1 else { }

clockbuf[1]=0; if(clockbuf[0]!=23)

clockbuf[0]++; //到24h否,不到则clockbuf[0]加1 else clockbuf[0]=0;

EA=1;

第五章 电子时钟仿真结果

电子钟正常显示仿真:

_

启动闹钟:

设置定时数值:(如图设置为10分钟)

因篇幅问题不能全部显示,请点此查看更多更全内容