51可调电子时钟系统设计 最终版.docx
《51可调电子时钟系统设计 最终版.docx》由会员分享,可在线阅读,更多相关《51可调电子时钟系统设计 最终版.docx(16页珍藏版)》请在冰豆网上搜索。
51可调电子时钟系统设计最终版
51可调电子时钟系统设计
一.实验目的
1、熟悉protel软件的使用方法。
2、掌握LM324集成运放电路对放大器性能的影响。
3、学习电压放大倍数、输入电压、输出电压仿真方法。
4、学习掌握protel仪表波形分析
5、学会PCB制板
二.虚礼实验仪器及器材
双踪示波器
三.实验步骤
1.系统总体结构
本设计使用AT89C52单片机作为电子时钟主机的微控制器,系统由最小系统、键盘与显示和RS232通信模块等几部分组成。
系统实现的总体结构框图如图1所示。
图1系统总体结构框图
2.系统实现的功能
此电子时钟设计以单片机AT89C52为系统核心控制器,采用8255扩展芯片,可以实现日常时、分、秒时钟运行。
开机时钟时间默认为6位0,日期默认为110101,通过调节按键可实现时位和分位的加减,并且可以一键切换为日期年月日显示和日减,拥有开始、暂停和复位功能。
选用74LS245驱动6位7段LED数码管,设计以RS-232总线实现单片机和主机的信息交换电路。
四.硬件设计
1.系统总体方案
方案一:
以CPLD或FPGA为控制核心的设计方案。
此方案主要具有以下的优点:
控制器拥有丰富的硬件资源,可实现强大的逻辑功能,可减少系统外围电路的数量,提高系统的稳定性;直接由硬件实现逻辑功能,并行执行,从而能使系统的响应速度速度大大提高。
此种方案的缺点是:
芯片使用方法复杂,其中FPGA的编程信息还需存放在外部存储器上。
方案二:
以单片机为控制核心的设计方案。
此方案主要具有以下的优点:
单片机一般芯片面积非常小,工作频率很低,所以系统的整体功耗低,采用单片机为核心控制器的可调时钟系统具有成本低、效益高的优点。
另外,单片机控制系统在灵活性和程序的可移植性方面拥有明显优势。
考虑到题目要求及性价比,我们选择方案二。
AT89C52最小系统
所谓单片机的最小应用系统是指能维持单片机运行的最简单配置的系统,即组成单片机系统所必需的一些元器件,无论完成什么任务,这些东西都是必须的。
由于AT89C52芯片内部已有8KB程序存储器,本设计的程序也不长,所以只连接了晶体振荡电路、复位开关和电源部分等几个必须的功能部件,如图4所示。
图2最小系统
2.显示器键盘模块方案
显示器键盘是是单片机控制系统的输入输出通道,是系统与使用人员间信息传递的窗口,单片机系统常用显示器键盘设计方案如下:
方案一:
采用Intel8279可编程键盘/显示控制接口芯片。
Intel8279是一个专用的显示器键盘接口芯片,由硬件完成对显示器和键盘的扫描,大大方便了用户,是程序变得简洁、易读和模块化。
但其缺点是8279为并行接口芯片,占用CPU端口多,需要CPU有较强的负载携带能力。
方案二:
采用硬件译码器驱动数码管,如7407TTL集电极开路六正相高压驱动器等,考虑到该电子时钟系统的人机交互并不复杂,不需要设置太多的按键,键盘采用普通的矩阵式行列扫描,此硬件实现简单,程序代码也不复杂。
所以选择了方案二。
显示与键盘电路
本设计中,LED数码管采用共阴极动态显示,由7407选择位码,74LS245译码器将BCD码转化为LED七段码,硬件电路连接如图3所示。
图3LED显示
所需键盘数目比较少,故采用的是矩阵式行列扫描识别按键。
其键盘示意图如下:
图4键盘电路
3.主从机通信方式方案
方案一:
无线方案。
采用基于电信运营商的GSM或CDMA网络或蓝牙。
其中蓝牙实现的方案只适合短距离的传输,而基于电信运营商网络的虽然不受传输距离的限制,但会给客户带来向运营商交费的额外的费用。
方案二:
有线方案。
采用基于电信运营商的电话网络或Internet互联网或使用总线技术。
对比方案一和方案二都有其各自的特点,从用户的角度及结合题目系统应用的场合,选择方案二,通过RS-232总线实现单片机和计算机的通信。
RS-232通信模块
RS-232通信接口具有的噪声抑制能力、数据传输速率较快、电缆长度及可靠性较好等特点。
本系统采用的RS-232通信芯片是MAXIM公司生产的MAX232。
MAX232收发器在总线传送线上进行双向数据通信。
RS-232支持全双工模式。
图5RS-232通信电路
4.整机电路
5.整机电路PCB板
五.软件设计
本系统程序分为主程序和各种功能子程序,系统程序结构如图6所示。
图6系统程序结构框图
主程序设计主程序主要完成系统的初始化、接收键值并根据键号输出相应的处理。
程序流程图如图所示。
中断服务程序包括外部中断INT0、INT1和定时/计数器1的中断服务程序,外部中断INT0的中断服务程序实现键盘扫描。
1.主程序设计
从机主程序设计流程图如图7所示,初始以后送显,等待中断的发生。
图7从机主程序流程图
2.键盘扫描子程序
图8键盘扫描流程图
3.显示子程序
3.程序清单
#include
#include//用来定义XBYTE的头文件
#defineP_8255XBYTE[0x7fff]//写控制字的地址
#definePA_8255XBYTE[0x7cff]//8255PA口的地址
#definePB_8255XBYTE[0x7dff]//PB口地址
#definePC_8255XBYTE[0x7eff]//PC口的地址
codeunsignedcharTAB[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};//数码管的字符表
dataunsignedcharLEDcash[6];//显示缓冲区
unsignedcharsec,min,hour,day,month,year,key;//定义时分秒年月日
dataunsignedcharbuffer,flag;
bitoff_on;//暂停与开始off_on为1时开始工作为0时暂停工作
bitswi;//年月日转换swi为1显示小时分秒swi为0显示年月日
//延时1ms
voidDelay1ms()
{
unsignedchari;
i=0;
while(--i);
}
//显示
Display()
{
unsignedchari=0xfe;
unsignedcharj;
for(j=0;j<6;j++)
{
PB_8255=i;
PA_8255=TAB[LEDcash[j]];
i=(i<<1)|0x01;//循环移位显示
Delay1ms();
}
}
voidDelay10ms()//延时10ms
{
unsignedi,j,k;
for(i=0;i<0x0a;i++)
for(j=0;j<0x04;j++)
for(k=0;k<0xf9;k++);
}
voidRefreshdisplay()//刷新显示缓冲区
{
if(swi){//如果swi为1把时分秒送入显示缓冲区
LEDcash[0]=sec%10;//秒的个位
LEDcash[1]=sec/10;//秒的十位
LEDcash[2]=min%10;
LEDcash[3]=min/10;
LEDcash[4]=hour%10;
LEDcash[5]=hour/10;
}else{//否则当swi为0时把月日年送入显示缓冲区
LEDcash[0]=day%10;
LEDcash[1]=day/10;
LEDcash[2]=month%10;
LEDcash[3]=month/10;
LEDcash[4]=year%10;
LEDcash[5]=year/10;
}
}
//计算时分秒年月日之间的关系的函数
voidyunsuan()
{
if(sec>=60)//如果秒大于或等于60则把秒置零,分加一
{
sec=0;
min++;
if(min>=60)
{
min=0;
hour++;
if(hour>=24)
{
hour=0;
day++;
if(day>30)
{
day=0;
month++;
if(month>12)
{
year++;
month=0;
}
}
}
}
}
}
//50ms中断服务函数
voidINT_Timer0(void)interrupt1
{
TH0=(65536-50000)/256;//设置定时器0的TH0
TL0=(65536-50000)%256;
flag++;
if(flag==20)
{//每次定时器溢出计时50msflag=20则循环20次20乘以50ms等于1s
flag=0;
sec++;
yunsuan();//计算时分秒年月日之间的关系的函数
}
Refreshdisplay();
}
//判断按下了那个键盘以及各个键盘的处理
voidKey_Find()
{
PC_8255=0xc0;//把Pc口的PC6PC7置一
if((PC_8255&0xc0)!
=0xc0)//如果PC口和0x0c相与不等于0x0c了说明有键按下
{
Delay10ms();//延时10ms后再判断是为了消除键盘抖动
if((PC_8255&0xc0)!
=0xc0)//再次判断
PC_8255=0xfe;//设置8255PC0口为零其余都为1
if((PC_8255&0xc0)==0x80){//读取PC口的值然后和0x0c相与如果等于0x08则取键值key=1
key=1;
//以下为时针加1的处理
if(hour==23){//如果时针本来为23了则
hour=0;//把时针置零天数加1
day=day+1;
if(day>30){//如果天数大于30了
day=0;//把天数置零月数加1
month=month+1;
}
}
else{
hour=hour+1;//如果时针本来没有等于23则按正常情况时针加1
}
}
if((PC_8255&0xc0)==0x40){
key=2;//键值为2的时候
//以下为时针减1的处理
if(hour==0){
hour=23;
}
else{
hour=hour-1;
}
}
PC_8255=0xfd;
if((PC_8255&0xc0)==0x80){
key=3;
//以下为分针加1的处理
if(min==59){//如果分针本来就等于59则时针加1然后把分针置零
hour=hour+1;
min=0;
}
else{//否则按正常情况分针加1
min=min+1;
}
}
if((PC_8255&0xc0)==0x40){//fenjian1
key=4;
//以下为分针减1的处理
if(min==0){//如果分针本来就等于零则减1时把分针置为59
min=59;
}
else{
min=min-1;//否则按正常情况分针减1
}
}
PC_8255=0xfb;
if((PC_8255&0xc0)==0x80){//切换年月日时分秒
key=5;
//以下为切换年月日的处理
swi=~swi;//把swi取反
}
if((PC_8255&0xc0)==0x40){//rijian
key=6;
//以下为天数减1的处理
if(day==0){//如果天本来就等于0则天减1的话把天置为30
day=30;
}
else{//否则按正常情况把天数减1
day=day-1;
}
}
PC_8255=0xf7;
if((PC_8255&0xc0)==0x80){
key=7;
//以下为复位的处理
sec=0;
min=0;
hour=0;
}
if((PC_8255&0xc0)==0x40){
key=8;
//以下为时分秒与年月日切换的处理
off_on=~off_on;//把off_on标志取反
if(off_on){
TR0=1;//如果off_on为1则TR0=1开始计数器
}
else{
TR0=0;//否则TR0=0停止计数器
}
}
}
yunsuan();//执行一次计算时分秒年月日之间的关系的函数
Refreshdisplay();//刷新显示缓冲区
}
voidmain()
{unsignedchari;
TH0=(65536-50000)/256;//设置定时器0的TH0TL0
TL0=(65536-50000)%256;
TMOD=0x01;//设置定时器模式
ET0=1;
EA=1;//开中断
TR0=1;//开始计时
sec=min=hour=0;//初始化时分秒
day=month=1;//初始化月日
year=11;
key=8;
off_on=1;
swi=1;
for(i=0;i<6;i++)
{LEDcash[i]=0;//初始化显示缓冲区全部设置为0
}
P_8255=0x88;//设置8255控制字为0x88即PA口PB口为输出PC口高四位为输入低四位为输出
while
(1)
{
Refreshdisplay();//刷新显示缓冲区
Display();//调用显示函数
Key_Find();//调用键盘查找函数
}
}
四、设计总结及心得体会
回顾起此次课程设计,我学到很多很多的东西,不仅巩固了以前所学过的知识,加深了对51硬件设计和程序的理解,而且学到了很多在书本上所没有学到过的内容。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才是真正的知识,才能提高自己的实际动手能力和独立思考的能力。
而且在做课程设计的过程中,不仅是考验自己所学的理论知识,更是要锻炼自己的分析问题的能力和解决实际问题的能力,而在在此次课程设计过程中得到了充分的体现。
通过本次课程设计,使我在课堂中学到的东西充分的融入到实践当中。
进一步的熟悉了可并行通信接口8255、AT89C52及中断控制器的编程原理和6位7段LED数码管显示器的工作原理,为以后独立的设计系统提供了丰富的实践经验。
参考文献
[1]彭军.传感器与检测技术.西安电子科技大学出版社,2003
[2]蔡文斋.专业级串口调试器设计.现代电子技术,2006
[3]求是科技.单片机应用系统开发实例导航.人民邮电出版社,2003.
[4]曹乐南,霍大勇.单片机与PC机串行通信的实现.中国科技信息,2006
[5]张伟,孙颖.protel99se高级应用.人民邮电出版社,2007
[6]江峰,刘高嵩.串口通讯中系统资源分配问题的研究.计算机技术与发展,2006