合肥学院proteus仿真大赛 小时钟.docx

上传人:b****2 文档编号:2877720 上传时间:2023-05-04 格式:DOCX 页数:18 大小:578.49KB
下载 相关 举报
合肥学院proteus仿真大赛 小时钟.docx_第1页
第1页 / 共18页
合肥学院proteus仿真大赛 小时钟.docx_第2页
第2页 / 共18页
合肥学院proteus仿真大赛 小时钟.docx_第3页
第3页 / 共18页
合肥学院proteus仿真大赛 小时钟.docx_第4页
第4页 / 共18页
合肥学院proteus仿真大赛 小时钟.docx_第5页
第5页 / 共18页
合肥学院proteus仿真大赛 小时钟.docx_第6页
第6页 / 共18页
合肥学院proteus仿真大赛 小时钟.docx_第7页
第7页 / 共18页
合肥学院proteus仿真大赛 小时钟.docx_第8页
第8页 / 共18页
合肥学院proteus仿真大赛 小时钟.docx_第9页
第9页 / 共18页
合肥学院proteus仿真大赛 小时钟.docx_第10页
第10页 / 共18页
合肥学院proteus仿真大赛 小时钟.docx_第11页
第11页 / 共18页
合肥学院proteus仿真大赛 小时钟.docx_第12页
第12页 / 共18页
合肥学院proteus仿真大赛 小时钟.docx_第13页
第13页 / 共18页
合肥学院proteus仿真大赛 小时钟.docx_第14页
第14页 / 共18页
合肥学院proteus仿真大赛 小时钟.docx_第15页
第15页 / 共18页
合肥学院proteus仿真大赛 小时钟.docx_第16页
第16页 / 共18页
合肥学院proteus仿真大赛 小时钟.docx_第17页
第17页 / 共18页
合肥学院proteus仿真大赛 小时钟.docx_第18页
第18页 / 共18页
亲,该文档总共18页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

合肥学院proteus仿真大赛 小时钟.docx

《合肥学院proteus仿真大赛 小时钟.docx》由会员分享,可在线阅读,更多相关《合肥学院proteus仿真大赛 小时钟.docx(18页珍藏版)》请在冰点文库上搜索。

合肥学院proteus仿真大赛 小时钟.docx

合肥学院proteus仿真大赛小时钟

合肥学院proteus仿真大赛报告

设计题目:

proteus仿真小时钟

系别:

电子信息与电气工程系

成员信息:

赵鹏飞100507202410级电子信息工程2班

朱奎100507403710级电子信息工程2班

2013年4月10日

目录

一、引言3

二、方案设计3

1、方案选择3

2、方案确定3

三、总体设计4

1.整体电路设计4

2程序设计4

3单元电路设计4

3.1晶振电路4

3.2复位电路4

3.3主芯片部分5

3.4按键设置部分5

3.5显示部分6

四、电路测试7

五、结论7

六、参考文献7

七、附录8

1整体电路图8

2程序流程图8

3中断流程图9

4整体测试电路图9

5软件程序代码10

一、引言

本设计利用两片AT89C51单片机,进行串行通信串行口工作方式为方式1的全双工串行通信,并且利用数码管7SEG-COM-CAT-GRN显示出传送的数据。

AT89C51内置一个全双工串行通信口,利用两单片机互相发送控制命令字符,并接收其发送的数字,同时在数码管上显示。

二、方案设计

1、方案选择

方案一:

AT89C51是一种带4K字节FLASH存储器的低电压、高性能CMOS8位单片机,能提供以下标准功能:

4k字节Flash闪速存储器,128字节内部RAM,32个I/O口线,两个16位定时/计数器,一个5向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路。

同时,AT89C51可降至0Hz的静态逻辑操作,并支持两种软件可选的节电工作模式。

空闲方式停止CPU的工作,但允许RAM,定时/计数器,串行通信口及中断系统继续工作。

方案二:

80C51单片机属于MCS-51系列单片机,由Intel公司开发,其结构是8048的延伸,改进了8048的缺点,增加了如乘(MUL)、除(DIV)、减(SUBB)、比较(PUSH)、16位数据指针、布尔代数运算等指令,以及串行通信能力和5个中断源。

采用40引脚双列直插式DIP(DualInLinePackage),内有128个RAM单元及4K的ROM。

80C51有两个16位定时计数器,两个外中断,两个定时计数中断,及一个串行中断,并有4个8位并行输入口。

80C51内部有时钟电路,但需要石英晶体和微调电容外接。

2、方案确定

鉴于89C51是CMOS工艺、8051是NMOS工艺制造(80C51则是CMOS工艺制造),而CMOS工艺制造的功耗更加小。

89C51的内部ROM是FLASH-ROM,可多次更新改写(相当于8751,不过8751是EEROM),而8051一般是掩膜ROM,不可更新改写。

并且89C51提供一个全双工串行通信口,基于题目要求,我们选择方案一。

三、总体设计

1.整体电路设计

利用AT89C51单片机、7SEG-COM-CAT-GRN数码管、button按钮开关等元器件组成整体仿真电路。

整体电路图见附录。

2程序设计

甲单片机向乙机发送控制命令字符,同时接收乙机发送的数字,当乙单片机的开关K2按下一次时,就向甲单片机发送一次数据,甲单片机上数码管显示接收的数据。

乙单片机向甲机发送控制命令字符,同时接收甲机发送的数字,当甲单片机的开关K1按下一次时,就向乙单片机发送一次数据,乙单片机上数码管显示接收的数据。

程序流程图和程序代码见附录。

3单元电路设计

3.1晶振电路

本设计中的振荡电路如下图所示。

3.2复位电路

MCS-51单片机的复位是由外部的复位电路来实现的。

复位引脚RST通过一个斯密特触发器与复位电路相连,斯密特触发器用来抑制噪声,在每个机器周期的S5P2,斯密特触发器的输出电平由复位电路采样一次,然后才能得到内部复位操作所需要的信号。

上电复位:

上电复位电路是—种简单的复位电路,只要在RST复位引脚接一个电容到VCC,接一个电阻到地就可以了。

电路如下图所示

3.3主芯片部分

本设计使用AT89C51单片机作为主控芯片。

电路如下图所示

3.4按键设置部分

本设计总的用了两个按扭开关,用于设置状态和调整输出的数据。

电路如下图所示

3.5显示部分

本设计采用7SEG-COM-CAT-GRN数码管显示。

电路如下图所示

四、电路测试

1.当甲机开关K1按下一次时,就向乙机发送一次数据,把0~9十个数循环发送到乙机数码管上显示。

2.当乙机的开关K1按下一次时,就向甲机发送一次数据,把0~9十个数循环发送到甲机数码管上显示。

整体测试电路见附录。

五、结论

单片机技术是现代电子工业中不可缺少的一项技术,掌握单片机技术是产品开发的重要条件,Proteus在单片机应用产品研发中有着非常重要的作用。

是产品研发的高效、经济、可靠的单片机系统设计与仿真平台。

基于Proteus的单片机虚拟开发环境有利于提高产品的开发效率;利用仿真系统,不但可以节约开发时间和开发成本,而且还具有很大的灵活性和可扩展性,相信随着越来越多的人对Proteus的了解和使用,它会对我们的学习、科研和工作带来越来越多的帮助。

六、参考文献

1彭伟《单片机C语言程序设计实训100例—基于8051+Proteus仿真》电子工业出版社

2周润景张丽娜刘映群《proteus入门实用教程》北京:

机械工业出版社2007年9月

七、附录

1整体电路图

2程序流程图

3中断流程图

4整体测试电路图

5软件程序代码

/***************数字钟程序***************/

#include

#defineucharunsignedchar

sbitbuzzer=P2^7;//定义蜂鸣器控制端口

/**************函数声明*************/

voiddisplay(uchar*p);

ucharkeyscan();//扫描键盘有无键按下

ucharsearch();//按键识别

voidalarm();//闹钟判断启动

voidftion0();//时钟修改

voidftion1();//闹钟修改

voidcum();//加1修改

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

ucharclockbuf[3]={0,0,0};//存放时钟时分秒的十进制数

ucharbellbuf[3]={0,0,0};//存放闹钟时分秒的十进制数

ucharmsec1;//10ms中断次数

ucharmsec2;//1s循环次数

uchartimdata,rtimdata;//时钟和闹钟修改位置标志

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

uchar*dis_p;//显示缓冲区指针

bitarmbit;//闹钟标志,为0闹钟未设定,为1已设定

bitrtimbit;//闹钟是否启动标志,为1已启动

bitrhourbit;//闹钟小时修改标志,为1正在修改闹钟小时

bitrminbit;//闹钟分修改标志,为1正在修改闹钟分

bithourbit;//时钟小时修改标志,为1正在修改时钟小时

bitminbit;//时钟分修改标志,为1正在修改时钟分

bitsecbit;//时钟秒修改标志,为1正在修改时钟秒

/****************主函数****************/

voidmain()

{

uchara;

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)

{

display(dis_p);//无键输入调用显示程序

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

}

else

{

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

a=keyscan();

if(a!

=0x07)//没有抖动,表示有键按下

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

switch(a){

case0x00:

ftion0();break;//是时钟参数修改功能键,调用时钟设置子函数

case0x01:

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

case0x02:

cum();break;//是加1功能键,调用加1修改功能子函数

default:

break;}

}}}}

/***************6位LED显示函数***************/

voiddisplay(uchar*p)

{ucharbuffer[6]={0,0,0,0,0,0};

uchark,i,j,m,temp;

ucharled[]={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;//关显示

}}}

/**************键盘扫描函数************/

ucharkeyscan()

{

ucharc;

P0=0xf0;

c=P2;

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

return(c);

}

/**************查键值函数*************/

ucharsearch()

{

uchara,b,c,d,e;

//P2=0xfe;

c=0xfe;//首列扫描字送变量c

a=0;//首列号送a

while

(1)

{

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

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

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

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

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

a++;//扫描列号加1

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

}

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

do{display(dis_p);}

while((d=keyscan())!

=0x07);//等待释放按键

return(e);

}

/***********闹钟判断启动函数*************/

voidalarm()

{

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

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

if(count==10)//判断闹钟保持10s时间到否

{

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

buzzer=0;//清除闹钟

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

rtimbit=0;

}}

/*************时钟设置函数*************/

voidftion0()

{

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){

case0x01:

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

case0x02:

secbit=0;minbit=1;break;//记录值为2,则将时钟分修改标志置1

case0x03:

minbit=0;hourbit=1;break;//记录值3,则将时钟时修改标志置1

case0x04:

timdata=0;hourbit=0;TR0=1;break;//按4次则清时钟单元修改位置

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

default:

break;}

}}

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

voidftion1()

{

if(secbit==1||minbit==1||hourbit==1||timdata==1)

{rhourbit=0;rtimbit=0;rtimdata=0;}

else

{

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

rtimdata++;//将闹钟修改记录值加1

switch(rtimdata){

case0x01:

rminbit=1;break;//记录值为1,将闹钟分修改标志置1

case0x02:

rminbit=0;rhourbit=1;break;

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

case0x03:

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

armbit=1;//设置闹钟已设置标志位

dis_p=clockbuf;//恢复时钟显示标志

break;

default:

break;}

}}

/*************加1修改功能函数**************/

voidcum()

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

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

elseclockbuf[2]++;}

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

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

elseclockbuf[1]++;}

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

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

elseclockbuf[0]++;}

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

if(bellbuf[1]==59)bellbuf[1]=0;

elsebellbuf[1]++;}

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

if(bellbuf[0]==23)bellbuf[0]=0;

elsebellbuf[0]++;}

}

/************定时器中断函数*************/

voidclock()interrupt1

{

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

elseclockbuf[0]=0;

}

}}}

EA=1;//开中断

}

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 初中教育 > 语文

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2