单片机++实训.docx
《单片机++实训.docx》由会员分享,可在线阅读,更多相关《单片机++实训.docx(27页珍藏版)》请在冰豆网上搜索。
单片机++实训
目录
引言……………………………………………………………………2
一、设计任务与要求…………………………………………………3
二、方案设计与论证…………………………………………………3
三、硬件电路设计……………………………………………………5
(1)单片机概述…………………………………………………5
(2)AT89C51芯片介绍……………………………………………6
(3)系统构成……………………………………………………9
(4)工作流程图…………………………………………………10
(5)交通灯控制硬件路图(PROTEL原理图、PCB图)……………12
四、软件设计……………………………………………………………13
(1)延时的设定………………………………………………………13
(2)程序设计说明……………………………………………………15
五、仿真过程与仿真结果………………………………………………15
六、安装与调试…………………………………………………………16
七、结论与心得…………………………………………………………17
八、参考文献……………………………………………………………18
九、致谢………………………………………………………………18
十、附录…………………………………………………………………19
附录1程序…………………………………………………19
附录2元件清单……………………………………………24
交通灯设计
引言
今天,红绿灯安装在各个道口上,已经成为疏导交通车辆最常见和最有效的手段。
信号灯的出现,使交通得以有效管制,对于疏导交通流量、提高道路通行能力,减少交通事故有明显效果。
1968年,联合国《道路交通和道路标志信号协定》对各种信号灯的含义作了规定。
绿灯是通行信号,面对绿灯的车辆可以直行,左转弯和右转弯,除非另一种标志禁止某一种转向。
左右转弯车辆都必须让合法地正在路口内行驶的车辆和过人行横道的行人优先通行。
红灯是禁行信号,面对红灯的车辆必须在交叉路口的停车线后停车。
黄灯是警告信号,面对黄灯的车辆不能越过停车线,但车辆已十分接近停车线而不能安全停车时可以进入交叉路口。
中国车辆数量不断增加,交通控制在未来的交通管理中起着越来越重要的作用。
智能交通灯的管理比重修一条马路无论在经济、交通运行速率上都有很好的效益、更加节约资源。
使交管人员有更多的精力投入到管理整个城市交通控制,带来更大的经济和社会效益,为创造美好的城市交通形象发挥更多的作用。
一、设计任务与要求
(1)车辆通行繁忙的十字交叉路口,设计一交通灯控制器,设东西方向通行时间为40秒,当剩余3秒时黄灯亮,南北方向通行时间为25秒,当剩余3秒时黄灯亮。
(2)东西、南北方向各用三个(绿、黄、红)LED表示,并用数码管显示东西、南北方向的剩余时间。
二、方案设计与论证
方案一:
整个交通灯系统的设计按照实验要求,设置东西方向通行时间为40秒,当剩余3秒时黄灯亮,南北方向通行时间为25秒,当剩余3秒时黄灯亮。
整个系统由四个状态组成,东西南北方向通行时间一致。
数码管的的5ms延时由软件延时实现。
这样设计的缺点是不符合实际的交通灯运作,而且用软件延时也会出现较大误差,造成定时时间的不准确,浪费CPU资源。
方案二:
按照设计任务的扩展可以得到下面的设计方案:
东西、南北两干道交于一个十字路口,各干道有一组红、绿,黄和左转绿四个指示灯,指挥车辆和行人安全通行。
红灯亮禁止通行,绿灯亮允许通行。
东西方向红灯的设计时间为40秒,绿灯为40秒,左转绿灯25秒,在同一方向的指示灯状态变换的倒数3秒时黄灯与当前状态的灯一起亮。
南北方向红灯的设计时间为65秒,绿灯为25秒,左转绿灯15秒,在同一方向的指示灯变换的倒数3秒时黄灯与当前状态的灯一起亮。
把具体情况分为以下8个状态
状态
各方向的
显示时间
十六
进制
东西方向
南北方向
红灯
P1.7
绿灯
P1.6
黄灯
P1.5
左转
灯
P1.4
红灯
P1.3
绿灯
P1.2
黄灯
P1.1
左转
灯
P1.0
状态一
000
东西40s-4s
南北65s-29s
0xB7
1
0
1
1
0
1
1
1
状态二
001
东西3s-0s
南北28s-25s
0x97
1
0
0
1
0
1
1
1
状态三
010
东西25s-4s
南北25s-4s
0xE7
1
1
1
0
0
1
1
1
状态四
011
东西3s-0s
南北3s-0s
0xC5
1
1
0
0
0
1
0
1
状态五
100
东西40s-19s
南北25s-4s
0x7B
0
1
1
1
1
0
1
1
状态六
101
东西18s-15s
南北3s-0s
0x79
0
1
1
1
1
0
0
1
状态七
110
东西15s-4s
南北15s-4s
0x7E
0
1
1
1
1
1
1
0
状态八
111
东西3s-0s
南北3s-0s
0x5C
0
1
0
1
1
1
0
0
注:
0:
表示有效灯亮1:
表示无效灯不亮
表
(1)显示状态表
整个交通灯系统由八个状态组成,可以用程序设计实现,在数码管的控制上可以通过不断刷新数码管的方法,利用人眼对刷新速度小于20ms的显示不敏感的特点,让人可以看到四个数码管同事显示的现象。
用P0口输出要显示的数据,外接一个译码器74HC595,这样可以减少显示部分占用的用P0口资源(用译码器只占用3个端口,不用译码器则要占用8个端口)选择数码管输出(P1口也可以用外接译码器的方式节省端口)。
在显示上可以用软件延时,但是缺点是显示数字时可能会闪烁,延时时间比较不准确,用CPU消耗时钟周期指令计时(浪费资源)。
方案三:
与方案二的设计思想大体相同,只是在5ms的延时上改用定时器延时,这样可以避免CPU资源的浪费而且还能精确定时,把误差减小到最小。
在P0口和P1口的输出上只采用直接连接数码管的方式,因为这次的设计较简单,用到的资源较少,用直接连接的方式可以简化电路
方案比较:
比较以上三个方案,方案一设计状态简单只有四个,但不符合实际生活中的设计要求;方案二,设计较节省端口资源,充分考虑到了单片机端口资源的充分利用,但电路稍微复杂;方案三设计上考虑到了显示时间的准确性,电路设计简单,用的集成块少,设计成本小,但这样的电路扩展难,不适合复杂系统的设计。
综合分析以上三种方案,由于交通灯系统用到的芯片资源较少对定时的要求较高,所以采用第三种方案来设计。
三、硬件电路设计
(1)单片机概述
单片机是由运算器、控制器、存储器、输入设备以及输出设备共五个基本部分组成的。
单片机是把包括运算器、控制器、少量的存储器、最基本的输入输出口电路、串行口电路、中断和定时电路等都集成在一个尺寸有限的芯片上。
通常,单片机由单个集成电路芯片构成,内部包含有计算机的基本功能部件:
中央处理器、存储器和I/O接口电路等。
因此,单片机只需要和适当的软件及外部设备相结合,便可成为一个单片机控制系统。
(2)AT89C51芯片介绍
1.主要特性
·与MCS-51兼容
·4K字节可编程闪烁存储器
寿命:
1000写/擦循环
数据保留时间:
10年
·全静态工作:
0Hz-24Hz
·三级程序存储器锁定
·128*8位内部RAM
·32可编程I/O线
·两个16位定时器/计数器
·5个中断源
·可编程串行通道
·低功耗的闲置和掉电模式
·片内振荡器和时钟电路
2.管脚说明:
VCC:
供电电压。
GND:
接地。
P0口:
P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。
当P1口的管脚第一次写1时,被定义为高阻输入。
P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。
在FIASH编程时,P0口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。
P1口:
P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。
P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。
在FLASH编程和校验时,P1口作为第八位地址接收。
P2口:
P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。
并因此作为输入时,P2口的管脚被外部拉低,将输出电流。
这是由于内部上拉的缘故。
P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。
在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。
P2口在FLASH编程和校验时接收高八位地址信号和控制信号。
P3口:
P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。
当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。
作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。
P3口也可作为AT89C51的一些特殊功能口,如下表所示:
P3口管脚备选功能
P3.0RXD(串行输入口)
P3.1TXD(串行输出口)
P3.2/INT0(外部中断0)
P3.3/INT1(外部中断1)
P3.4T0(记时器0外部输入)
P3.5T1(记时器1外部输入)
P3.6/WR(外部数据存储器写选通)
P3.7/RD(外部数据存储器读选通)
P3口同时为闪烁编程和编程校验接收一些控制信号。
RST:
复位输入。
当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。
ALE/PROG:
当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。
在FLASH编程期间,此引脚用于输入编程脉冲。
在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。
因此它可用作对外部输出的脉冲或用于定时目的。
然而要注意的是:
每当用作外部数据存储器时,将跳过一个ALE脉冲。
如想禁止ALE的输出可在SFR8EH地址上置0。
此时,ALE只有在执行MOVX,MOVC指令是ALE才起作用。
另外,该引脚被略微拉高。
如果微处理器在外部执行状态ALE禁止,置位无效。
/PSEN:
外部程序存储器的选通信号。
在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。
但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。
/EA/VPP:
当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。
注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。
在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。
XTAL1:
反向振荡放大器的输入及内部时钟工作电路的输入。
XTAL2:
来自反向振荡器的输出。
3.振荡器特性:
XTAL1和XTAL2分别为反向放大器的输入和输出。
该反向放大器可以配置为片内振荡器。
石晶振荡和陶瓷振荡均可采用。
如采用外部时钟源驱动器件,XTAL2应不接。
有余输入至内部时钟信号要通过一个二分频触发器,因此对外部时钟信号的脉宽无任何要求,但必须保证脉冲的高低电平要求的宽度。
4.芯片擦除:
整个PEROM阵列和三个锁定位的电擦除可通过正确的控制信号组合,并保持ALE管脚处于低电平10ms来完成。
在芯片擦操作中,代码阵列全被写“1”且在任何非空存储字节被重复编程以前,该操作必须被执行。
此外,AT89C51设有稳态逻辑,可以在低到零频率的条件下静态逻辑,支持两种软件可选的掉电模式。
在闲置模式下,CPU停止工作。
但RAM,定时器,计数器,串口和中断系统仍在工作。
在掉电模式下,保存RAM的内容并且冻结振荡器,禁止所用其他芯片功能,直到下一个硬件复位为止。
(3)系统构成
硬件电路是一个最小系统板,有晶振(12M)电路,复位电路,按键电路,喇叭电路,发光二极管电路,数码管显示电路,单片机芯片AT89C51,其中P0口控制数码管显示的内容,P1口控制交通指示灯的显示,部分P2口控制数码管显示的选择,部分P3口连接按键。
P0口外接共阳的数码管,故外部要接限流电阻,由于数码管的驱动电流大约为10ma~20ma,设计的电源为5V,所以选用的限流电阻大小的选择范围可以在200~500欧之间。
在实际制做电路扳时选用的是220欧的电阻。
P1口外接的是交通指示灯,采用灌电流的方式会比较容易点亮发光二极管,所以设计P1口低电平有效,既P1口输出低电平时点亮发光二极管。
发光二极管的反向击穿电压约5伏。
它的正向伏安特性曲线很陡,使用时必须串联限流电阻以控制通过管子的电流。
限流电阻R可用下式计算:
R=(E-UF)/IF
式中E为电源电压,UF为LED的正向压降,IF为LED的一般工作电流。
红色和黄色的发光二极管的工作电压是2伏的,其他颜色的工作电压都是3伏的一般的发光二极管的工作电流是20毫安,如果接在五伏的电源上,电源电压减二极管的工作电压就是分压电阻要分掉的电压,再用这个电压除以二极管工作的电流就能计算出这个电阻的阻值。
比如说3伏的二极管(5-3)/0.02=100欧,2伏的二极管(5-2)/0.02=150欧,但是不是所有的发光二极管的工作电流都是20毫安,有的大一点有的小一点,实际制板中选用220欧的8排电阻与发光二极管连接,构成限流电阻。
P2口外接数码管控制引脚,由于也采用灌电流的方式驱动,所以低电平有效,选择外接PNP三极管的基集当端口输出低电平时驱动该端口对应的数码管显示P0口输出的数据。
要注意的是数码管位显示控制端口(决定第几位显示的几个引脚)在数码管不接外电路时默认为高电平,因此当三极管的集电极直接接数码管显示控制端口时,四个数码管会同时显示P0口输出的数据,这与我们的设计思想不符合,如果在PNP管的C端并联一个连接到地的大电阻10K,则当PNP管不导通时,数码管输出控制端的本身高电平,可以通过电阻连到地,使该控制端口为低电压;当PNP管倒通时,三极管的集电极端输出的高电平连接到数码管输出控制端,控制让该端口显示P0口输出的数据,这样便可以用芯片控制数码管的显示。
P3口连接的外电路是按键,由于本次设计中没有用到按键的功能,这里便简单介绍,P3口外连接按键,按键连接到地。
初始化P3口都为高电平,当有按键按下时,对应的P3口的电压通过按键连接到地,出现低电平。
通过芯片的查询功能,可以判断是否有按键按下,是否执行有按键按下时对应的逻辑功能。
(4)工作流程图
B
B11
流程图说明:
(1)程序设置初始时间,通过AT89S51单片机内部相应寄存器来实现。
(2)由AT89C51单片机的定时器每秒钟通过P1口输出口显示红、绿、黄灯和左转绿的的燃亮情况
(3)AT89C51通过程序设置各状态各种交通指示灯的燃亮时间,由AT89C51的P0口向数码管输出数据。
(4)通过AT89C51单片机的P2口来控制各位数码管的显示情况。
(5)状态二到状态八的流程图与状态一的相似,这里省略。
(6)图中标注A对A连接、B对B连接、C对C连接。
(5)交通灯控制路图
1)PROTEL原理图
注,元器件清单见附录。
2)PROTEL画好的PCB图(该PCB图画得实在是烂到了极点)
元件清单见附录
(2)
四、软件设计
在硬件电路的基础上根据流程图进行软件设计,
(1)延时的设定
延时方法可以有两种一种是利用AT89C51内部定时器的溢出中断来确定1秒的时间,另一种是采用软件延时的方法。
①软件延时的C程序
5ms的延时可以由子程序
voiddelay2.5ms(void)
{
unsignedcharj,k;
for(j=10;j>0;j--)
for(k=120;k>0;k--);
}
②定时器延时的C程序
定时器工作时必须给计数器送计数器初值,这个值是送到TH和TL中的。
它是以加法记数的,并能从全1到全0时自动产生溢出中断请求。
因此,我们可以把计数器记满为零所需的计数值设定为C和计数初值设定为TC可得到如下计算通式:
TC=M-C
式中,M为计数器模值,该值和计数器工作方式有关。
在方式0时M为213;在方式1时M的值为216;在方式2和3为28;
算法公式:
T=(M-TC)T计数或TC=M-T/T计数
T计数是单片机时钟周期TCLK的12倍;TC为定时初值
如单片机的主脉冲频率为TCLK12MHZ ,经过12分频
方式0 Tmax=213*1微秒=8.193毫秒
方式1 Tmax=216*1微秒=65.536毫秒
显然1秒钟已经超过了计数器的最大定时间,所以我们只有采用定时器和软件相结合的办法才能解决这个问题.
实现1秒的方法:
1)软件循环50次用FOR语句然后包再含4个定时为5ms的延时的循环由于是5ms的延时,所以用到方式0
既TMOD=00
2)定时器T0初值的设定如下
(213–X)*1/(12*106)*12=5ms
得X=3192
转二进制为X=1100001111000
得TL0=11000既TL0=0x18
得TH0=11000011既TH0=0x63
我们在主程序中使用定时器0,定时方式设置为方式0,设定TH0的初值为0x63、TL0的初值为0x18的软件计数器和使T1定时5毫秒.这样每当T1到5毫秒时CPU就响应它的溢出中断请求,返回到主程序中。
3)程序设计
voiddelay5ms(void)//5m秒的延时
{
TMOD=0x00;//设置为13位定时模式
TH0=0x63;//初值
TL0=0x18;
TR0=1;//启动定时器T0
ET0=1;//开T0中断控制
EA=1;//开中断总控制
if(TF0)
{
TF0=0;//清除中断标志
return;//返回主程序
}
}
(2)程序设计说明:
程序开始部分先把包含AT89C51芯片信息的C语言的库文件和基本的C语言库文件都包含到程序中,接下来定义一些变量和参数。
在延时部分的设计要在程序中先体现中断设置。
在程序正式开始循环部分设计思想是;先设置P1口交通指示灯的状态,再设置每个5ms数码管该显示的数字。
由于每组数字都要显示1秒,而四个数码管轮流显示一遍需要20ms,所以在设置完P1口后,要让接下来的数码管显示部分显示循环50次,才能达到每组数字显示1s的效果。
具体程序见附录
(1)
五、仿真过程与仿真结果
本次实训用PROTEL软件进行原理图设计和画PCB图,用KEILL软件进行设计程序和生成HEX文件,在PROTEUS软件中进行仿真。
在原理图初步设计好时用正确的程序进行仿真,发现仿真结果不正确,错误出现在1)发光二极管会全部点亮,而不是状态一的东西方向绿灯亮,南北方向红灯亮而且发光二极管两端的电压也一直是高电压。
2)数码管显示的出错,不是预想的一组数据亮一秒后各自减一,而是四个数码管同时快速地逐个显示本应同时显示在数码管上的数据。
本应有变化的PNP管的集电极电压一直处于高电平状态,使得四个数码管会同时显示同样的数字。
经过老师的指点后,发现单片机输出的信号是正确的,其输出端口的高低电压变化符合设计要求,那么分析可能就是我设计的硬件电路有问题。
首先P2口外接的PNP管与数码管显示控制端口直接相连接,犯了前面硬件电路设计说明部分中说明的P2口连接方式注意事项的错误,在修改电路,添加一接地的并联大电阻电路后,PNP管的集电极电压开始有高低的变化,数码管显示的数据开始正确。
其次P1口二极管全部发光,两端电压无变化,那么可能是发光二极管的一端直接与5V的电源连接造成的,在把限流电阻与发光二极管调换位置后发现其两端的电压也开始有变化,发光二极管的亮灭也符合设计的状态变化。
PROTEUS的仿真图如下:
六、安装与调试
在软硬件设计好后便进行制板调试,首先用PROTEL软件画PCB图进行制板;其次PCB图画好后把图打印在转印纸的光滑面上;第三,把打印好的图纸贴到磨掉氧化面的有铜附着的板上,固定好后进行热转印;第四,把转印好的铜板拿去腐蚀掉多余的铜面,使之出现完整的电路图;第五,在板上应钻孔的地方用打孔机钻孔,完成后把铜板上的墨迹用砂纸磨掉。
板制好后进行检查发现短路的地方用导线或焊锡连接,发现未腐蚀干净而导致本不应连接的线路连接到一起的地方用小刀将其分开。
焊接元器件,将元件插到对应的孔中并焊接起来,注意不虚焊不漏焊,还要注意某些元件的正负极性不能放错。
焊接完再次检查电路无短接,无断开。
电路板物理连接及物理检查完毕后要进行逻辑功能验证。
首先将源程序生成的HEX文件通过单片机烧写器写如单片机芯片AT89C51内,把烧写好的芯片插到电路板上,接上5V的电源进行调试。
调试过程发现逻辑功能有错,检查程序发现程序进入死循环,改正后,发现还是有错,数码管的显示一直不正确。
把数码管拆开来检查,发现我自己做的PCB封装与实际的元器件不符合,这样修改电路便变得很麻烦了。
接下来我用万用表一个一个检查元器件的引脚分布,发现若按照数码管的A连接P1.7口B连接P1.6口C连接P1.5口等的方式连接电路则有10条线连错,要修改的话就要断开这10条线,在用导线连接20条线,若不按照前面的方式连线,只把数码管显示数字的控制引脚与数码管选择控制引脚分开,按照修改的电路编码则只有3条线出错,只修改6条线即可。
为了电路修改的简单性,我选则了第二种方法修改。
七、结论与心得
通过这次的实训我学到了很多知识和实践经验,实训的内容和量都比较大,大家都很认真地编程、画图、仿真、制板、焊接和调试。
编程中学到了怎样用高级语言(C语言)对单片机进行编程和控制,实现输出显示和定时等功能,进一步掌握了KEILL软件的使用。
画图过程中回顾了PROTEL软件的使用,还第一次全手工布线制作了自己设计的电路板图,为以后的毕业设计做好了准备。
仿真过程中出现了很多问题,在老师的指导下都一一解决了,学会了一些分析问题的方法,其实每个错误都是有原因的,也很明显地表现在仿真过程中,只是我还不怎么会分析,以后还是要多和老师同学交流,才能进步,另外在使用PROTEUS仿真过程中也学到了这个软件的使用。
制板和焊接让我增强了自己的动手能力。
调试过程中发现的问题比较严重而且不好修改,这时我想到了利用网络资源来帮助解决问题,并解决了问题。
总的来说,这次的实训让我学到了很多东西,学会了一些分析和解决问题的方法,发现网络是一个知识宝藏。
但是也让我清醒地认识到自己的不足之处,平时太缺少实践锻炼,因此这次的实训还是在很基础的地方遇到困难,为此对自己也有点失望。
但是还好认识到了自己的不足,让我以后更好地弥补不足。
这次的实训也是为以后的毕业设计做了准备,熟悉了一些设计制作的流程,收获很丰富。
八、参考文