单片机综合设计报告Word下载.docx
- 文档编号:1192706
- 上传时间:2023-04-30
- 格式:DOCX
- 页数:20
- 大小:177.18KB
单片机综合设计报告Word下载.docx
《单片机综合设计报告Word下载.docx》由会员分享,可在线阅读,更多相关《单片机综合设计报告Word下载.docx(20页珍藏版)》请在冰点文库上搜索。
双击“RES”,则可将“RES”(电阻)添加至对象选择器窗口。
单击“OK”按钮,结束对象选择。
经过以上操作,在对象选择器窗口中,已有了7SEG-MPX6-CA-BLUE、AT89C51、RES三个元器件对象,若单击AT89C51,在预览窗口中,见到AT89C51的实物图,如图所示;
若单击RES或7SEG-MPX6-CA-BLUE,在预览窗口中,见到RES和7SEG-MPX6-CA-BLUE的实物图,如图所示。
此时,我们已注意到在绘图工具栏中的元器件按钮
处于选中状态。
放置元器件至图形编辑窗口PlacingComponentsontotheSchematic
在对象选择器窗口中,选中7SEG-MPX6-CA-BLUE,将鼠标置于图形编辑窗口该对象的欲放位置、单击鼠标左键,该对象被完成放置。
同理,将AT89C51和RES放置到图形编辑窗口中。
若对象位置需要移动,将鼠标移到该对象上,单击鼠标右键,此时我们已经注意到,该对象的颜色已变至红色,表明该对象已被选中,按下鼠标左键,拖动鼠标,将对象移至新位置后,松开鼠标,完成移动操作。
由于电阻R1~R8的型号和电阻值均相同,因此可利用复制功能作图。
将鼠标移到R1,单击鼠标右键,选中R1,在标准工具栏中,单击复制按钮
,拖动鼠标,按下鼠标左键,将对象复制到新位置,如此反复,直到按下鼠标右键,结束复制。
此时我们已经注意到,电阻名的标识,系统自动加以区分。
按照上述方法添加cap、crystal、button、buzzer、pnp、等元件。
(2)按照原理图绘制电路图。
利用proteus的线路自动路径功能(简称WAR),当选中两个连接点后,WAR将选择一个合适的路径连线。
WAR可通过使用标准工具栏里的“WAR”命令按钮
来关闭或打开,也可以在菜单栏的“Tools”下找到这个图标。
同理,我们可以完成其它连线。
在此过程的任何时刻,都可以按ESC键或者单击鼠标的右键来放弃画线。
画总线的时候为了和一般的导线区分,我们一般喜欢画斜线来表示分支线。
此时我们需要自己决定走线路径,只需在想要拐点处单击鼠标左键即可。
给与总线连接的导线贴标签PARTLABELS。
单击绘图工具栏中的导线标签按钮
,使之处于选中状态。
将鼠标置于图形编辑窗口的欲标标签的导线上,跟着鼠标的指针就会出现一个“×
”号,如图所示。
表明找到了可以标注的导线,单击鼠标左键,弹出编辑导线标签窗口,如图所示。
在“string”栏中,输入标签名称(如a),单击“OK”按钮,结束对该导线的标签标定。
同理,可以标注其它导线的标签,如图所示。
注意,在标定导线标签的过程中,相互接通的导线必须标注相同的标签名。
(3)用keilC编写软件程序。
进入keilCμVision2开发集成环境,创建一个新项目(Project),并为该项目选定合适的单片机CPU器件(如:
Atmel公司的AT89C51)。
并为该项目加入keilC源程序。
本系统的软件系统主要可分为主程序和定时器中断程序两大模块。
在程序过程中,加入了抗干扰措施。
软件程序包括主程序,子程序。
子程序有显示子程序、中断、延时等。
主程序的功能是完成系统的初始化。
中断程序(如图5所示)完成时间计数,时间调整,误差消除等功能。
中断采用AT89C2051内部T0中断实现,定时时间为125ms,当时间到达125ms×
8,即1分钟时,分计数缓冲器MINBUFFER增加1,到达1小时,则时计数缓冲器HOURBUFFER增加1,并将分、时的个位、十位放入显示缓冲器。
当分计数缓冲器和时计数缓冲器分别到达60min、24h时,则对它们清零,以便重新计数。
在中断设计中,还通过软件实现了累计误差消除功能,使整个系统时间的精确度得到保证。
二极管的阴极连接在一起,通常此公共阴极接地,而共阳极则将发光二极管的阳极连接在一起,接入+5V的电压。
一位显示器由8个发光二极管组成,其中7个发光二极管构成字型“8”的各个笔划(段)a~g,另一个小数点为dp发光二极管。
当在某段发光二极管施加一定的正向电压时,该段笔划即亮;
不加电压则暗。
为了保护各段LED不被损坏,需外加限流电阻。
图3LED数码管结构原理图
LED显示数码管通常由硬件7段译码集成电路,完成从数字到显示码的译码驱动。
本系统采用软件译码,以减小体积,降低成本和功耗,软件译码的另一优势还在于比硬件译码有更大的灵活性。
所谓软件译码,即由单片机软件完成从数字到显示码的转换。
从LED数码管结构原理可知,为了显示字符,要为LED显示数码管提供显示段码,组成一个“8”字形字符的7段,再加上1个小数点位,共计8段,因此提供给LED数码管的显示段码为1个字节。
各段码位与显示段的对应关系如表1。
表1各段码位的对应关系
段码位
D7
D6
D5
D4
D3
D2
D1
D0
显示段
dp
g
f
e
d
c
b
a
需说明的是当用数据口连接LED数码管a~dp引脚时,不同的连接方法,各段码位与显示段有不同的对应关系。
通常数据口的D0位与a段连接,D1位与b段连接,……D7位与dp段连接,如表1所示,表2为用于LED数码管显示的十六进制数和空白字符与P的显示段码。
表2LED显示段码
字型
共阳极段码
共阴极段码
C0H
3FH
9
90H
6FH
1
F9H
06H
A
88H
77H
2
A4H
5BH
B
83H
7CH
3
BOH
4FH
C
C6H
39H
4
99H
66H
D
A1H
5EH
5
92H
6DH
E
86H
79H
6
82H
7DH
F
84H
71H
7
F8H
07H
空白
FFH
00H
8
80H
7FH
P
8CH
73H
注:
(1)本表所列各字符的显示段码均为小数点不亮的情况。
(2)“空白”字符即没有任何显示。
系统的时分显示部件由4只7段共阳LED数码管构成,前两只用于时的显示,后两只用于分的显示。
值得一提的是,在设计中需要实现时与分之间的两个闪烁点,为此,将第三只LED数码管倒置摆放,这样就形成了两个很自然的闪烁点。
与此同时,为了能使两点显示能够形象的表示时钟“秒”的变化,设计时,将两个点由P1.7单独控制,每隔一秒使P1.7发送一个正脉冲,从而实现了两个点的闪烁显示,闪烁周期为一秒。
(4)用KeilC与Proteus连接仿真调试。
单击“Project菜单/OptionsforTarget”选项或者点击工具栏的“optionfortarget”按钮
,弹出窗口,点击“Debug”按钮,出现如图所示页面。
在出现的对话框里在右栏上部的下拉菜单里选中“ProteusVSMDriver”。
并且还要点击一下“Use”前面表明选中的小圆点。
再点击“Setting”按钮,设置通信接口,在“Host”后面添上“127.0.0.1”,如果使用的不是同一台电脑,则需要在这里添上另一台电脑的IP地址(另一台电脑也应安装Proteus)。
在“Port”后面添加“8000”。
设置好的情形如图所示,点击“OK”按钮即可。
最后将工程编译,进入调试状态,并运行。
设置Proteus。
进入Proteus的ISIS,鼠标左键点击菜单“Debug”,选中“useromotedebugermonitor”,如图所示。
此后,便可实现KeilC与Proteus连接调试。
KeilC与Proteus连接仿真调试。
单击仿真运行开始按钮
,我们能清楚地观察到每一个引脚的电频变化,红色代表高电频,蓝色代表低电频。
在LED显示器上,循环显示0、1、2、3、4、5。
(5)根据仿真结果进一步完善程序,改变程序变量参数使仿真结果更加接近实验要求。
(6)多次进行仿真,完善实验结果。
四硬件图
五软件程序
按照数码管显示数字要求计算定时器初值,定时器0模式1,50毫秒
#include<
at89x51.h>
//头文件包含
#defineucharunsignedchar//宏定义
#defineuintunsignedint
#defineON1//定义0为打开
#defineOFF0//定义1为关闭
#defineLEDBusP1//定义p1口为数码管段码口
sbitMIAO=P1^2;
//秒点
sbitHOU_S=P3^0;
//时十位位选
sbitHOU_G=P3^1;
//时个位位选
sbitMIN_S=P3^2;
//分十位位选
sbitMIN_G=P3^3;
//分个位位选
sbitH_KEY=P3^5;
//时调整键
sbitM_KEY=P3^7;
sbitbeep=P3^4;
//分调整键
bitSHAN;
//闪烁标志位
ucharsecond,minute,hour;
//定义秒、分、时寄存器
ucharcodeLEDTab[]={0x14,0xd7,0x4c,//数码管段码表0--9
0x45,0x87,0x25,0x24,0x57,0x04,0x05};
voiddelay(uchart);
//延时函数
voidinit();
//初始化函数
voiddisplay();
//显示函数
voidmin_tiao();
//分调整函数
voidhou_tiao();
voidbeer();
//时调整函数
/***************************************
函数名:
main
功能:
主函数
说明:
入口参数:
无
返回值:
无
****************************************/
voidmain()
{
init();
//调用初始化函数
while
(1)//主程序循环
{
if(!
H_KEY)hou_tiao();
//如果时调整键按下(为0),调用时调整函数
M_KEY)min_tiao();
if(minute==0)beer();
//如果分调整键按下(为0),调用分调整函数
display();
//调用显示函数
}
}
init
初始化函数
初始化定时器及中断
***************************************/
voidinit()
TMOD=1;
TH0=0X3C;
TL0=0XB0;
//定时器0模式1,50毫秒
ET0=1;
TR0=1;
EA=1;
//开定时器0中断、启动定时器0、开总中断
display
显示函数
voiddisplay()
LEDBus=LEDTab[minute%10];
MIAO=SHAN;
//分个位送数码管显示
MIN_G=ON;
//打开分个位位选
delay
(1);
//显示1毫秒
MIN_G=OFF;
//关闭分个位位选
LEDBus=LEDTab[minute/10];
//分十位送数码管显示
//秒点闪烁
MIN_S=ON;
//打开分十位位选
MIN_S=OFF;
//关闭分十位位选
LEDBus=LEDTab[hour%10];
//时个位送数码管显示
HOU_G=ON;
//打开时个位位选
HOU_G=OFF;
//关闭时个位位选
//if(hour/10)//如果时十位为0,不显示十位数字
//{
LEDBus=LEDTab[hour/10];
//时十位送数码管显示
HOU_S=ON;
//打开时十位位选
delay
(1);
//显示1毫秒
HOU_S=OFF;
//关闭时十位位选
//}
min_tiao
分调整
voidmin_tiao()
while(!
M_KEY)display();
//等待分调整键松开
second=0;
minute++;
//秒清零、分加1
if(minute==60)minute=0;
//如果分等于60,分变0
hou_tiao
时调整
voidhou_tiao()
H_KEY)display();
//等待时调整键松开
hour++;
//秒清零,时加1
if(hour==24)hour=0;
//如果时等于24,时变0
delay
延时函数
t:
延时时间长短
voiddelay(uchart)
uchari;
//定义变量
for(;
t>
0;
t--)//如果t大于0,t减1(外层循环)
for(i=124;
i>
i--);
//i等于124,如果i大于0,i减1
timer0
定时器0中断函数
voidtimer0()interrupt1//定时器0(中断1)
uchartim1,tim2;
//定义临时变量
TL0=TL0+0XB0;
//重装定时器初值
tim1++;
//每中断一次tim1加1
if(tim1==5)//中断10(0.5秒)
{SHAN=!
SHAN;
//闪烁标志取反
tim1=0;
tim2++;
//tim1清零,tim2加1
if(tim2==2)//到了1秒
{
tim2=0;
second++;
//tim2清零,秒加1
if(second==60)//如果秒到60
{
second=0;
//秒变0,分加1
if(minute==60)//如果分到60
{
minute=0;
//分变0,时加1
if(hour==24)hour=0;
//如果时到24,时变0
}
}
}
voidbeer()
{if(minute==0)
beep=1;
//beep=!
beep;
delay
(2);
beep=!
六仿真结果
运行后,时钟自动走,秒点一直闪烁,到六十秒后,分个位自动加一,到六十分后时个位自动加一,到24小时后显示小时的数码管自动清零。
引脚P3.7控制key1键,为调分按钮,按下调分按钮后,分加一,引脚P3.5控制key2键,为调时按钮,按下调时按钮后,时加一,
按下复位按钮后数码管自动清零。
当时间为整点时即分为零时,蜂鸣器响,响一分钟。
七心得体会
单片机是一门实用性非常强的课程,单单是课本上的只是并不能满足实际的需要,必须通过自己做试验才能了解如何使用KeilC与Proteus软件,如何编写程序、仿真、绘画流程图、原理图及调试运行,实现各种功能。
经过多次实验设计才能熟练掌握运用它,成为自己的东西。
这次实验实现了电子钟的整点报时,调时调分功能而且具有闹钟功能。
在实验中遇到的最大问题就是软件程序的编写。
试验中软件程序用的是C语言,我们已经忘记了C语言的大部分内容,在编写程序的过程中,我们一边学习一边写程序,又把C语言重新学习了一遍。
在编程的过程中我们会遇到实现不了的功能,我们会一起讨论或者是上网查找,最终完成了实验要求的功能。
通过这次单片机实验,我不仅加深了对单片机理论的理解,将理论很好地应用到实际当中去,而且我还学会了如何去培养我们的创新精神,从而不断地战胜自己,超越自己。
创新可以是在原有的基础上进行改进,使之功能不断完善,成为真己的东西。
这次实验对我们以后的学习和工作有极大的帮助。
我们以后将会有很多用到单片机的机会,这次试验让我们充分认识到如何用单片机实现我们需要的功能
八如何扩展深入
增加一个数码管用六位数码管,用于显示秒数,可以通过用KeilC软件编写程序,然后使用KeilC与Proteus连接仿真调试实现。
增加两个数码管,使用八位数码管,用于显示时与分,分与秒之间的间隔符。
在硬件图中加入灯,加入软件程序使时间到达设定的闹钟时间,灯亮,蜂鸣器响,提醒设定时间时间到。
在软件中加入语音程序,设定备忘,在设定时间到时提醒事件。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 综合 设计 报告