基于AT89C51单片机的电子表设计.doc
- 文档编号:4886534
- 上传时间:2023-05-07
- 格式:DOC
- 页数:26
- 大小:281.50KB
基于AT89C51单片机的电子表设计.doc
《基于AT89C51单片机的电子表设计.doc》由会员分享,可在线阅读,更多相关《基于AT89C51单片机的电子表设计.doc(26页珍藏版)》请在冰点文库上搜索。
课程设计说明书
课程:
单片机应用技术课程设计
题目:
基于AT89C51单片机的电子表设计
姓名:
学号:
1
专业:
机械设计制造及其自动化
班级:
2011级机
院系:
工学院机械系
指导老师:
朱煜钰
课程设计时间:
2014.10.27至2014.11.10
黄河科技学院课程设计任务书
工学院机械系机械设计制造及其自动化专业11级3班
学号姓名指导教师朱煜钰
题目:
基于AT89C51单片机的电子表设计
课程:
单片机应用技术课程设计
课程设计时间2014年10月27日至2014年11月10日共2周
课程设计工作内容与基本要求(设计要求、设计任务、工作计划、所需相关资料)(纸张不够可加页)
1.设计要求
利用AT89C51单片机作为微控制器,在数码管通过一个控制键转换来显示的时间和日期;能通过多个控制键用来实现时间和日期的调节。
2.设计任务与要求
2.1系统硬件电路设计
根据该系统设计的功能要求选择所用元器件,设计硬件电路。
要求用Proteus绘制整个系统电路原理图。
2.2软件设计
根据该系统要求的功能进行软件设计,绘制整个系统的软件流程图;根据流程图编写程序并汇编调试通过;列出软件清单,软件清单要求逐条加以注释。
2.3Proteus仿真
用Proteus对系统软硬件进行仿真调试并通过。
2.4编写设计说明书
内容包括任务书、设计方案分析、硬件部分设计、软件部分设计、调试结果整理分析、设计调试的心得体会等,字数不少于5000字;硬件部分设计要绘制整个系统电路原理图,对各部分电路设计原理做出说明;软件设计部分要(用visio2003画图软件)绘制整个系统框图及各部分的软件流程图,列出程序清单,逐条加以注释,并注明各程序功能块的功能。
3.工作计划
序号
设计内容
所用时间
1
布置任务及调研
4天
3
制作与调试
8天
4
撰写设计报告书
2天
合计
14天
4.主要参考资料
单片机课程设计指导书 皮大能 北京理工大学出版社 2012.7
8051单片机实践与应用 吴金戎 清华大学出版社 2003.8
单片机技术基础教程与实践夏路易 电子工业出版社 2008.1
单片机原理及应用 张毅刚高等教育出版社2012.11
基于Proteus的单片机系统设计与仿真实例蒋辉平机械工业出版社
2007.7
…
指导老师签字:
日期:
目录
第1章概述…………………………………………4
1.1内容摘要……………………………………4
1.2实验基本原理………………………………4
第2章设计思路及框图……………………………5
2.1设计思路……………………………………5
2.2设计框图……………………………………5
第3章硬件的设计…………………………………6
3.1主控制部件…………………………………6
3.2显示模块…………………………………7
3.3晶振模块……………………………………7
3.4按键模块……………………………………8
3.5驱动模块……………………………………8
第4章电路设计原理图……………………………9
第5章程序的设计…………………………………10
5.1程序流程图…………………………………10
5.2源程序……………………………………12
第6章系统验证及调试……………………………23
第7章总结…………………………………………24
第8章参考文献……………………………………25
第1章概述
1.1内容摘要
本次课程设计基于单片机原理技术介绍了一款于AT89C51芯片作为核心控制器的单片机电子表的设计与制作,主要有两个功能:
时钟和秒表。
其制作流程主要包括硬件电路原理的实现方案设计、软件程序编辑的实现、电子表正常工作的流程、原理图仿真实现、硬件实物的调试过程。
该单片机数字电子表采用LED数码管能够准确显示时间(显示格式为:
时时,分分,秒秒),可随时进行时间调整,时间可采用24小时制显示,还可实现时钟与秒表的切换,暂停与调时调分调秒,可按自己的要求设置扩展其它的功能。
1.2实验基本原理
利用AT89C51单片机定时器完成计时功能,定时器0计时中断程序每隔0.01s中断一次并当作一个计数,设定定时1秒的中断计数初值为0,每中断一次中断计数初值加1,当加到100时,则表示1s到了,秒变量加1,同理再判断是否1min钟到了,再判断是否1h到了。
为了将时间在6位LED数码管上显示,可采用静态显示法和动态显示法,由于静态显示法需要译码器,数据锁存器等较多硬件,可采用动态显示法实现LED显示,通过对每位数码管的依次扫描,使对应数码管亮,同时向该数码管送对应的字码,使其显示数字。
由于数码管扫描周期很短,由于人眼的视觉暂留效应,使数码管看起来总是亮的,从而实现了各种显示。
第2章设计思路及框图
2.1设计思路
针对要实现的功能,采用AT89S51单片机进行设计,AT89S51单片机是一款低功耗,高性能CMOS8位单片机,第一,熟悉AT89S51单片机,在编程之前必须了解硬件结构尤其是各引脚的用法,以及内部寄存器、存储单元的用法,否则,编程无从下手,电路也无法设计。
这是前期准备工作。
第二,设计硬件部分:
依据想要的功能分块设计设计,比如输入需要开关电路,输出需要显示驱动电路和数码管电路等。
第三,画图部分:
设计好电路后进行画图。
第四,软件部分:
先学习理解汇编语言的编程方法再根据设计的硬件电路进行分块的编程调试,最终完成程序设计。
第五部分是软件仿真部分:
软硬件设计好后将软件载入芯片中进行仿真,仿真无法完成时检查软件程序和硬件电路并进行修改直到仿真成功。
第六部分是硬件实现部分:
连接电路并导入程序检查电路,实现想要的功能。
2.2设计框图
此次设计主要是应用单片机来设计电子时钟,硬件部分主要分以下电路模块:
显示电路用8个共阴极数码显示管、按键模块、晶振模块。
显示管分别显示:
小时、分钟和秒,通过动态扫描进行显示。
电路的总体设计框架如下:
LED显示模块
单片机模块
时钟模块
按键模块
晶振模块
驱动模块
图1
第3章硬件的设计
3.1主控制部件
89C51是一个8位单片机,片内ROM全部采用FLASHROM技术,晶振时钟为12MHz。
89C51是标准的40引脚双列直插式集成电路芯片,有4个八位的并行双向I/O端口,分别记作P0、P1、P2、P3。
第31引脚需要接高电位使单片机选用内部程序存储器;第40脚为电源端VCC,接+5V电源,第20引脚为接地端VSS,通常在VCC和VSS引脚之间接0.1μF高频滤波电容。
硬件原理图如图2所示
图2
3.2显示模块
方案一:
静态显示。
静态显示,即当显示器显示某一字符时,相应的发光二极管恒定导通或截止。
该方式每一位都需要一个8位输出口控制。
静态显示时较小电流能获得较高的亮度,且字符不闪烁。
但因当所需显示的位数较多时,静态显示所需的I/O口数较大,造成资源的浪费。
方案二:
动态显示。
动态显示,即各位数码管轮流点亮,对于显示器各位数码管,每隔一段延时时间循环点亮一次。
利用人的视觉暂留功能可以看到整个显示,但须保证扫描速度足够快,人的视觉暂留功能才可察觉不到字符闪烁。
显示器的亮度与导通电流、点亮时间及间隔时间的比例有关。
调整参数可实现较高稳定度的显示。
动态显示节省了I/O口,降低了能耗。
从节省单片机芯片I/O口和降低能耗角度出发,本数字电子钟数码管显示选择设计采用方案二。
3.3晶振模块
单片机芯片可使用内部时钟电路和外部时钟电路两种方式产生电路所需的时钟脉冲,内部时钟电路实现可用石英晶体和微调电容外接即可达到,外部时钟电路实现需要一个外部脉冲源引入脉冲信号以保证个单片机之间时钟信号的同步。
从硬件实现难易角度考虑,内部时钟电路的实现比外部时钟电路的实现更简易。
既本数字电子钟设计所需的时钟源采用内部时钟电路实现。
所用定时方式为工作方式1,石英晶振为12M,即最小定时时间为1us,最大定时时间约为65.5ms,其电路图如下图2所示。
图3
3.4按键模块
本数字电子钟设计所需按键用于进行显示时间的调整与设置扩展的小键盘。
单片机芯片4个I/O口可与按键直接相连,通过编程,单片机芯片即可控制按键接口电平的高低,即按键的开与关,以达到用按键进行显示时间的调整与设置扩展的小键盘的设计要求,本电路采用P1口与按键相连。
其电路图如图4所示:
图4
3.5驱动模块
从实物制作简易程度与驱动数码管段码能力角度出发,本数字电子钟设计采用数码管段码与AT89C51P0口相连,单片机AT89C51的P2口控制数码管的片选信号,通过编程,单片机芯片即可控制段码电平的高低的方式实现数码管段码控制。
第4章电路设计原理图
图5
第5章程序设计
5.1程序流程图
在主程序的开始定义了一组固定单元用来存储计数的分、秒、时的存储单元。
在主程序中,对不同的按键进行扫描,实现秒表,时间调整。
系统总体流程图如图6所示。
图6
T0中断入口
通过查表方式显示数据
位选数值=0
秒计数加1
秒计数=1000
秒计数=0
Seconds加1
中断返回
开始
系统子程序流程图如图7所示:
是否满24h?
显示缓冲单元清0
返回
N
Y
是否满60m?
小时加1
分值加1
N
计数器重新加载
循环次数加1
是否满1s?
是否满60s?
秒值加1
N
开始
5.2源程序
程序清单如下:
#include
#defineucharunsignedchar
#defineuintunsignedint
//七段共阴数码显示管段码表//
ucharcodedispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//定义初始化变量//
//秒表部分//
ucharDecisec=0;//分秒//
ucharSec=0;//秒//
ucharMint=0;//分//
//时钟部分//
ucharSeconds=0;
ucharMinutes=0;
ucharHours=0;
ucharCount=0;
ucharNumb=0;
//按键部分//
sbitCHANGE=P1^0; //切换:
可实现跑表与时钟互切//
sbitSTART=P1^1; //开始//
sbitSTOP=P1^2; //暂停//
sbitRST=P1^3;
sbitrst=P1^4;
sbitjia1=P1^5;
sbitjia2=P1^6;
sbitjia3=P1^7;
//复位//
//函数声明//
voiddelay(ucharms);//延迟函数//
voidtime_pro1();//秒表处理函数//
voidtime_pro2();//时钟处理函数//
voidkeyscan(); //键盘扫描//
voiddisplay1();//数码管显示秒表//
voiddisplay2();//数码管显示时钟//
/*******************/
// 主函数//
/*******************/
voidmain()
{
P1=0xff;
TMOD=0x11;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
TH1=(65536-10000)/256;
TL1=(65536-10000)%256;
EA=1;
ET0=1;
ET1=1;
TR0=1;
while
(1)
{
keyscan();
if(Numb==1)
{
display1();
}
if(Numb==0)
{
display2();
if(rst==0)
{
Hours=0;
Seconds=0;
Minutes=0;
}
if(jia1==0)
{
delay(5);
if(jia1==1)
{
Hours++;
if(Hours==24)
{Hours=0;}
}
}
if(jia2==0)
{
delay(5);
if(jia2==1)
{
Minutes++;
if(Minutes==60)
{Minutes=0;}
}
}
if(jia3==0)
{
delay(5);
if(jia3==1)
{
Seconds++;
if(Seconds==60)
{Seconds=0;}
}
}
}
}
}
/*******************/
//延迟函数//
/*******************/
voiddelay(ucharms)
{
uchari,j;
for(i=ms;i>0;i--)
for(j=500;j>0;j--);
}
/*******************/
//秒表处理函数//
/******************/
voidtime_pro1()
{
if(Decisec==100)
{
Decisec=0;
Sec++;
if(Sec==1000)
{
Sec=0;
}
}
}
/*******************/
//时钟处理函数//
/******************/
voidtime_pro2()
{
if(Seconds==60)
{
Seconds=0;
Minutes++;
if(Minutes==60)
{
Minutes=0;
Hours++;
if(Hours==24)
{
Hours=0;
}
}
}
}
/*******************/
//键盘扫描函数 //
/******************/
voidkeyscan()
{
//秒表/时钟切换//
if(CHANGE==0)
{
delay(5);
if((CHANGE==0)&&(Numb==0))
{
display1();
Numb=!
Numb;
while(!
CHANGE)
{
display1();
}
}
if((CHANGE==0)&&(Numb==1))
{
Numb=!
Numb;
while(!
CHANGE)
{
display2();
}
}
}
//开始计时//
if((START==0)&&(Numb==1))
{
delay(5);
if(START==0)
{
TR1=1;
while(!
START)
{
display1();
}
}
}
//暂停计时//
if((STOP==0)&&(Numb==1))
{
delay(5);
if(STOP==0)
{
TR1=0;
while(!
STOP)
{
display1();
}
}
}
//重新计时//
if((RST==0)&&(Numb==1))
{
delay(5);
if(RST==0)
{
Hours=0;
Seconds=0;
Minutes=0;
Decisec=0;
Sec=0;
while(!
RST)
{
Decisec=0;
Sec=0;
display1();
}
}
}
}
/********************/
//数码管显示秒表//
/********************/
voiddisplay1()
{
P2=0x7f;
P0=dispcode[Decisec/10];//显示分秒//
delay
(1);
P2=0xbf;
P0=dispcode[(Sec%100)%10]|0x80;//显示秒个位//
delay
(1);
P2=0xdf;
P0=dispcode[(Sec%100)/10];//显示秒十位//
delay
(1);
P2=0xef;
P0=dispcode[Sec/100];
delay
(1);
}
/*********************/
//数码管显示时钟//
/*********************/
voiddisplay2()
{
P2=0x7f;
P0=dispcode[Seconds%10];//显示秒个位//
delay
(1);
P2=0xbf;
P0=dispcode[Seconds/10];//显示秒十位//
delay
(1);
P2=0xdf;
P0=dispcode[Minutes%10]|0x80;//显示分个位//
delay
(1);
P2=0xef;
P0=dispcode[Minutes/10];//显示分十位//
delay
(1);
P2=0xf7;
P0=dispcode[Hours%10]|0x80;//显示时个位//
delay
(1);
P2=0xfb;
P0=dispcode[Hours/10];//显示时十位//
delay
(1);
}
/*********************/
//定时器T1中断服务程序//
/********************/
voidtime_T1()interrupt3
{
TH1=(65536-10000)/256;
TL1=(65536-10000)%256;
Decisec++;
time_pro1();//秒表时间处理函数//
}
/**********************/
//定时器T0中断服务程序//
/**********************/
voidtime_T0()interrupt1
{
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
Count++;
if(Count==100)
{
Seconds++;
time_pro2();//时钟时间处理函数//
Count=0;
}
}
第6章系统的验证及调试
时钟调试:
秒表调试:
第7章总结
这两周的课程设计学到了不少的东西,刚开始的时候我感觉毫无头绪,又要忙着安装软件,又要学习Proteus,以前没有用过,担心忙不过来,做完之后才明白原来用单片机做一个实物也不是想象中的那样困难重重,在这整个的设计过程中,不但复习了书本上的理论知识,提高了自己的动手能力,而且还强化了自己的编程水平,总的来感觉效果还是挺不错的。
为期两星期的课程设计使我对单片机的理论知识有了具体的认识。
通过这次设计,我的理论知识掌握得更扎实,动手能力明显提高。
通过实践让我知道了单片机大致开发的步骤同时,通过网上搜索等多方面的查询资料。
通过本次课程设计我学到许多在书本上没有的知识,也认识到理论联系实践的重要。
理论学得好,但如果只会纸上谈兵,一点用都没有。
通过这次课程设计,我掌握了常用元件的识别和测试,通过对电路的分析,并利用其它电路作为辅助,解决了在制作数字钟时经常出现的数字显示不了,显示数字模糊的问题。
以及如何提高电路的性能等等。
在实验过程中,遇到了不少的问题。
比如:
显示不出数字,数字模糊这样的问题。
在老师和同学的帮助下,把问题一一解决,那种心情别提有多高兴,很有成就感。
同时,在实验中暴露出我们在理论学习中所存在的问题,有些理论知识还处于半只半解的状态,通过实验加深了我们对这些知识的理解。
特别是在排查电路,程序问题时,使我们熟练掌握了一些处理电路故障程序BUG的方法。
虽然两周的课程设计很短,但是充分锻炼了我们的团队合作能力以及对知识点的巩固,也培养了我们独立思考和设计能力,树立了对知识点应用的信心
最后,我非常感谢同学和老师的无私帮助,由于自身对于许多的东西都了解的不够透彻,许多问题都是在同学的帮助下得以解决。
第8章参考文献
1、楼然苗编.《51系列单片机设计实例》[M].北京航空航天大学出版社.
2、黄勤编.《计算机硬件技术基础实验教程》[M].重庆大学出版社
3、刘乐善编.《微型计算机接口技术及应用》[M].华中科技大学出版社.
4、陈光东编.《单片微型计算机原理及接口技术》[M].华中科技大学出版社.
5、皮大能编.《单片机课程设计指导书》[M].北京理工大学出版社20
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 AT89C51 单片机 电子表 设计
文档标签
- 基于AT89C51单片机数字
- 基于AT89C51单片机双机
- 基于AT89C51单片机LED
- 基于单片机AT89C51数字
- 基于AT89C51单片机倒车
- 基于单片机电表自动
- 基于AT89C51单片机水位
- 基于AT89C51单片机智能
- 毕业设计基于AT89C51单片机
- 课程设计基于AT89C51单片机
- 基于at89c51单片机数字
- 基于AT89C51单片机多点
- 基于AT89C51单片机最小
- 单片机AT89C51设计一个
- 基于AT89C51单片机电子
- 基于AT89C51单片机蔬菜
- 基于单片机AT89C51电子琴
- 基于单片机数字温度计
- 基于单片机数字温度计
- 基于单片机数字温度计
- 基于单片机数字温度计
- AT89C51基于单片机温度
- 基于单片机数字温度
- 基于单片机数字温度计