用AT80S51单片机控制可测试电压.docx
《用AT80S51单片机控制可测试电压.docx》由会员分享,可在线阅读,更多相关《用AT80S51单片机控制可测试电压.docx(21页珍藏版)》请在冰豆网上搜索。
![用AT80S51单片机控制可测试电压.docx](https://file1.bdocx.com/fileroot1/2023-4/28/d5f510f4-014e-47ea-b20b-18354562ae5a/d5f510f4-014e-47ea-b20b-18354562ae5a1.gif)
用AT80S51单片机控制可测试电压
桂林电子科技大学
微机单片机接口
设
计
报
告
指导老师:
吴兆华
学生:
黄超
学号:
09210204
桂林电子科技大学机电工程学院
一、设计题目与要求
单片机A/D接口应用
用AT80S51单片机控制可测试电压范围0-10V,分辨率0.1V。
将范围0-10V的电压模拟信号通过ADC0809转换成数字信号,经过单片机AT80S51将数字信号在数码管上显示出来。
二、设计目的
1、通过单片机最小系统的设计,了解常用单片机应用系统开发手段和过程,进一步熟悉和掌握单片机的结构和工作原理,并能初步掌握一般单片机控制系统的编程和应用,从而进一步加深对单片机理论知识的理解。
2、掌握单片机内部功能模块的应用:
如定时器、计数器、中断系统、I/O口等。
3、掌握以单片机核心的电路设计的基本方法和技术,了解单片机的基本外围电路的设计和矩阵按键电路及数码管驱动电路的设计。
4、熟悉基本硬件电路的设计与制作,学习UVISION的编程和调试方法。
5、学习PROTEL软件的使用与基本用法,懂得绘制简单原理图及PCB。
6、通过此次课程设计能够将单片机软硬件结合起来,对程序进行编辑,校验。
三、系统硬件图
3.1电路设计原理图
整个设计主要包括单片机基本的晶振电路,按键复位电路,设计中需要的矩阵键盘电路,数码管显示电路等几部分组成。
具体的电路图如下图所示:
图1电路原理图
3.2电路设计PCB图
本次小系统的设计要求设计的电路板实单面板,因为设计中电路板较小,二元器件的数目较多,尤其是矩阵按键部分需要连线较多,所以本次设计的PCB板中夹杂着几根跳线。
PCB的生成,主要是在绘制好电路原理图之后,定义各个元器件的封装形式,生成网络表之后,在新建的PCB中导入网络表,即可自动生成PCB。
根据元器件之间的飞线,设置各个参数之后手动布线。
本次设计的PCB图如图2所示。
图2电路PCB图
四、程序流程图
图3程序流程图
五、系统说明与分析
5.1设计思路及设计过程
本系统的设计主要是采用ADC0809对电压进行模拟/数字转换,将模拟量(电压0~10V)用LED数码管显示出来。
ADC0809芯片自动会将输入的电压信号,自动转化为0~255范围所对应的值,然后我们根据不同的电压转换成的不同数值,通过一定的计算方法,将其显示出来。
设计的主要思想:
图4系统结构图
软件设计主要是通过UVISION软件使用C语言进行编程。
设计过程:
(1)设计相应的电路原理图,编写C语言程序;
(2)在实验箱上进行程序调试;
(3)程序通过调试后,使用绘图软件PROTEL99,绘制相应的原理图,进行元器件封装后,生成相应的PCB图,对其进行布局整理和单面板布线;
(4)打印PCB图,印制在电路板上,放入氯化铁溶液中进行腐蚀;
(5)腐蚀电路板之后进行元器件的焊接工作,焊接相应的电源线;
(6)通过试验箱和下载软件,将程序烧如到单片机中;
(7)进行最终的软、硬件的调试,直至完成相应的功能。
5.2系统结构及各部分说明
本次设计的单片机最小系统包括:
单片机AT89S51部分,ADC0809芯片,数码管显示部分以及软件设计部分。
下面就针对个法儿部分的特点进行简要的说明。
1、单片机部分
(1)AT89S51介绍
AT89S51单片机是美国ATMEL公司生产的低功耗,高性能CMOS8位单片机,片内含4Kbytes的可系统编程的Flash只读程序存储器,器件采用ATMEL公司的高密度,非易失性存储技术生产,兼容标准8051指令系统及引脚。
它集Flash程序存储器,既可在线编程(ISP)也可用传统方法进行编程及通用8位微处理器于单片芯片中,ATMEL公司的功能强大,低价AT89S51单片机可为您提供许多高性价比的应用场合,可灵活应用于各种控制领域。
图5AT89S51引脚图
AT89S51是一个低功耗,高性能CMOS8位单片机,片内含8kBytesISP(In-systemprogrammable)的可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及89C51引脚结构,芯片内集成了通用8位中央处理器和ISPFlash存储单元,功能强大的微型计算机的AT89S51可为许多嵌入式控制应用系统提供高性价比的解决方案。
AT89S51具有如下特点:
40个引脚,8kBytesFlash片内程序存储器,128bytes的随机存取数据存储器(RAM),32个外部双向输入/输出(I/O)口,5个中断优先级2层中断嵌套中断,2个16位可编程定时计数器,2个全双工串行通信口,看门狗(WDT)电路,片内时钟振荡器。
AT89S51有两种节电运行模式:
空闲模式和掉电模式。
①空闲模式
在空闲模式下,CPU处于睡眠状态,振荡器和所有片内外围电路仍然有效。
空闲模式可由软件设置进入(设IDL=1)。
在这种模式下,片内RAM和SFR中的内容保持不变。
空闲模式可通过任何一个允许中断或硬件复位退出。
若用硬件复位方式结束空闲模式,则在片内复位控制逻辑发生作用前长达约两个机器周期时间内,器件从断点处开始执行程序。
片内硬件禁止访问内部RAM,但不禁止访问端口。
为避免采用复位方式退出空闲模式时对端口的不应有的访问,在紧随设置进入空闲指令(即设IDL=1)的后面,不能是写端口或外部RAM的指令。
②掉电模式
引起掉电模式的指令是执行程序中的最后一条指令(使PD=1的指令)。
在掉电模式下,振荡器停止工作,CPU和片内所有外围部件均停止工作,但片内RAM和SFR中的内容保留不变,直到掉电模式结束。
退出掉电模式可用硬件复位或任何一个有效的外部中断INT0和INT1。
复位可重新设置SFR中的内容,但不改变片内RAM中的内容。
在Vcc电源恢复到正常值并维持足够长的时间之后,允许振荡器恢复并达到稳定,方可进行复位,以退出掉电模式。
(2)晶振电路
图6系统晶振电路
系统的时钟电路设计是采用的内部方式,即利用芯片内部的振荡电路(如图6所示)。
AT89S单片机内部有一个用于构成振荡器的高增益反相放大器。
引脚XTAL1和XTAL2分别是此放大器的输入端和输出端。
这个放大器与作为反馈元件的片外晶体谐振器一起构成一个自激振荡器。
外接晶体谐振器以及电容C1和C2构成并联谐振电路,接在放大器的反馈回路中。
对外接电容的值虽然没有严格的要求,但电容的大小会影响震荡器频率的高低、震荡器的稳定性、起振的快速性和温度的稳定性。
因此,此系统电路的晶体振荡器的值为12MHz,电容应尽可能的选择陶瓷电容,电容值约为22μF。
在焊接刷电路板时,晶体振荡器和电容应尽可能安装得与单片机芯片靠近,以减少寄生电容,更好地保证震荡器稳定和可靠地工作。
(3)按键复位电路
复位电路的基本功能是:
系统上电时提供复位信号,直至系统电源稳定后,撤销复位信号。
为可靠起见,电源稳定后还要经一定的延时才撤销复位信号,以防电源开关或电源插头分-合过程中引起的抖动而影响复位。
图7所示的复位电路可以实现上述基本功能。
但解决不了电源毛刺(A点)和电源缓慢下降(电池电压不足)等问题而且调整RC常数改变延时会令驱动能力变差。
左边的电路为高电平复位有效右边为低电平Sm为手动复位开关,Ch可避免高频谐波对电路的干扰。
图7按键复位电路
图7复位电路图
2、ADC0809芯片
ADC0809是带有8位A/D转换器、8路多路开关以及微处理机兼容的控制逻辑的CMOS组件。
它是逐次逼近式A/D转换器,可以和单片机直接接口。
(1)ADC0809的内部逻辑结构
图8ADC0809的内部逻辑结构图
由上图可知,ADC0809由一个8路模拟开关、一个地址锁存与译码器、一个A/D转换器和一个三态输出锁存器组成。
多路开关可选通8个模拟通道,允许8路模拟量分时输入,共用A/D转换器进行转换。
三态输出锁器用于锁存A/D转换完的数字量,当OE端为高电平时,才可以从三态输出锁存器取走转换完的数据。
(2)引脚结构
图9ADC0809的引脚结构
IN0-IN7:
8条模拟量输入通道
ADC0809对输入模拟量要求:
信号单极性,电压范围是0-5V,若信号太小,必须进行放大;输入的模拟量在转换过程中应该保持不变,如若模拟量变化太快,则需在输入前增加采样保持电路。
地址输入和控制线:
4条
ALE为地址锁存允许输入线,高电平有效。
当ALE线为高电平时,地址锁存与译码器将A,B,C三条地址线的地址信号进行锁存,经译码后被选中的通道的模拟量进转换器进行转换。
A,B和C为地址输入线,用于选通IN0-IN7上的一路模拟量输入。
通道选择表如下表所示。
表1ADC0809通道选择
C
B
A
选择的通道
0
0
0
IN0
0
0
1
IN1
0
1
0
IN2
0
1
1
IN3
1
0
0
IN4
1
0
1
IN5
1
1
0
IN6
1
1
1
IN7
数字量输出及控制线:
11条
ST为转换启动信号。
当ST上跳沿时,所有内部寄存器清零;下跳沿时,开始进行A/D转换;在转换期间,ST应保持低电平。
EOC为转换结束信号。
当EOC为高电平时,表明转换结束;否则,表明正在进行A/D转换。
OE为输出允许信号,用于控制三条输出锁存器向单片机输出转换得到的数据。
OE=1,输出转换得到的数据;OE=0,输出数据线呈高阻状态。
D7-D0为数字量输出线。
CLK为时钟输入信号线。
因ADC0809的内部没有时钟电路,所需时钟信号必须由外界提供,通常使用频率为500KHZ,
VREF(+),VREF(-)为参考电压输入。
(3)ADC0809应用说明
①ADC0809内部带有输出锁存器,可以与AT89S51单片机直接相连。
②初始化时,使ST和OE信号全为低电平。
③送要转换的哪一通道的地址到A,B,C端口上。
④在ST端给出一个至少有100ns宽的正脉冲信号。
⑤是否转换完毕,我们根据EOC信号来判断。
⑥当EOC变为高电平时,这时给OE为高电平,转换的数据就输出给单片机了。
3、数码显示部分
八段LED数码管由8个发光二极管组成。
基中7个长条形的发光管排列成“日”字形,另一个圆点形的发光管在显示器的右下角作为显示小数点用,它能显示各种数字及部份英文字母。
LED数码管有两种不同的形式:
一种是8个发光二极管的阳极都连在一起的,称之为共阳极LED数码管;另一种是8个发光二极管的阴极都连在一起的,称之为共阴极LED数码管。
四位八段数码管的引脚结构如下图所示:
图16四位八段数码管的引脚结构
其中S1,S2,S3,S4为字位选择端口,A,B,C,D,E,F,G,DP为字形选择端口。
数码管要正常显示,就要用驱动电路来驱动数码管的各个段码,从而显示出我们要的数字,因此根据数码管的驱动方式的不同,可以分为静态式和动态式两类。
①静态显示驱动:
静态驱动也称直流驱动。
静态驱动是指每个数码管的每一个段码都由一个单片机的I/O端口进行驱动,或者使用如BCD码二-十进制译码器译码进行驱动。
静态驱动的优点是编程简单,显示亮度高,缺点是占用I/O端口多,如驱动5个数码管静态显示则需要5×8=40根I/O端口来驱动,要知道一个89S51单片机可用的I/O端口才32个呢:
),实际应用时必须增加译码驱动器进行驱动,增加了硬件电路的复杂性。
②动态显示驱动:
数码管动态显示接口是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8个显示笔划"a,b,c,d,e,f,g,dp"的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于单片机对位选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。
通过分时轮流控制各个数码管的的COM端,就使各个数码管轮流受控显示,这就是动态驱动。
在轮流显示过程中,每位数码管的点亮时间为1~2ms,由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O端口,而且功耗更低。
数码管使用条件:
①段及小数点上加限流电阻;
②使用电压:
段:
根据发光颜色决定;小数点:
根据发光颜色决定;
③使用电流:
静态:
总电流80mA(每段10mA);动态:
平均电流4-5mA峰值电流100mA。
4、软件设计部分
(1)时钟信号产生设计
由于ADC0809没有自带的时钟信号,因此,通过定时器T0产生500KHZ的时钟信号,用P3.3口与ADC0809的CLK引脚相连。
以提供合适的时钟信号,使ADC0809芯片工作。
(2)显示程序设计
静态显示是将段码和位码输送到相应的驱动口P1口和P2口。
根据所给定的高低电平,点亮不同数码管的段,从而显示不同的数值。
5.3系统连线说明
(1)把“单片机系统”区域中的P1.0-P1.7与“动态数码显示”区域中的a、b、c、d、e、f、g、dp端口用8芯排线连接。
(2)把“单片机系统”区域中的P2.0-P2.7与“动态数码显示”区域中的S1、S2、S3、S4端口用4芯排线连接。
(3)把“单片机系统”区域中的P3.0与“模数转换模块”区域中的ST端子用导线相连接。
(4)把“单片机系统”区域中的P3.1与“模数转换模块”区域中的OE端子用导线相连接。
(5)把“单片机系统”区域中的P3.2与“模数转换模块”区域中的EOC端子用导线相连接。
(6)把“单片机系统”区域中的P3.3与“模数转换模块”区域中的CLK端子用导线相连接。
(7)把“模数转换模块”区域中的A2A1A0端子用导线连接到“电源模块”区域中的GND端子上。
(8)把“模数转换模块”区域中的IN0端子用导线连接到“三路可调电压模块”区域中的VR1端子上。
(9)把“单片机系统”区域中的P0.0-P0.7用8芯排线连接到“模数转换模块”区域中的D0、D1、D2、D3、D4、D5、D6、D7端子上。
5.4系统参数分析
1、复位电路一般R取10K,C取10UF,教科书上R肯定是8.2K,都可以的,RC越大,充电时间越长,单片机上电复位过程越长,其实RC取值不是需要特别严格。
还有种说法,R=1K,C=22UF,抗干扰性更好。
复位电路的电阻和电容要根据复位脉冲的宽度要求计算得到:
比如如果单片机的复位脉冲要求至少20ms,高电平是5V,最大低电平为0.8V,则应按RC电路的放电(或充电)方程计算,使从5V放电到0.8V(或相反)所用的时间不小于20ms。
2、两晶振电路的小电容一般取15-30PF即可。
影响不大的。
理论上是用的晶体越高,应该用更小的电容。
比如说12M晶体,用20PF,1M晶体,用30PF,其实日常应用,根本是没有差别的,用20、30PF都一样。
3、I/O口上拉电阻是用来提高它的带载能力的,编程后让某个I/O口置高电平,不带载应该电位就是5V,因为它的带载能力很弱,尤其这种输出为高电平带载,稍微带点负载(输出电流哪怕不到毫安级),这点电位用万用表量的话,要下降很大,接一电阻并到这个I/O口跟VCC,可以提高它的带载能力,这个电阻就叫上拉电阻。
一般这个电阻取值都是1K到10K左右,注意这个电阻也不能太小啊,虽然越小上拉能力越强,但是I/O承受的灌电流越大,太大要烧I/O口的。
5.5电路板的制作
Protel99功能强大,为我们进行电子电路原理图和印制板图的设计提供了良好的操作环境。
用Protell99进行电路设计分为两大部分:
原理图的设计和电路板的设计。
原理图的设计实在SCH系统中进行的,电路原理图是印刷板电路设计的基础,只有设计好原理图才有可能进行下一步的电路板设计。
用protel99进行电路板设计的第一步是其原理图的设计。
显然,原理图决定整个电路的基本功能,也是接下来生成网表和设计印刷板电路的基础。
具体步骤如下:
(1)图面设置:
Protel99允许用户根据电路的规模设置图面的大小,按照偏好和习惯设置图面的样式。
实际上,设置图面就是设置了一个工作平面,以后的工作就要在这个平面上进行。
所以图面应该设置得足够大,为进一步工作提供一个足够大的工作空间。
(2)放置元件:
所谓放置元件就是从元件库中选取所需得元件,将其布置到图面上合适的位置,有时还要重定义元件的编号、封装。
元件的封装很重要,要根据元件的实际尺寸和实际封装来决定,要是元件没封装好,将会给以后电路板的制作带来很大的麻烦。
这些都是下一步工作的基础。
Protel99为用户提供了一个非完备的元件库,并且允许用户对这个元件库进行编辑或者新建自己的元件库。
电路板的制作过程
(1)打印:
将生成的PCB图打印到热转印纸上,需注意线不能太窄,墨要加重,否则制板时容易断线,如果在操作过程中断了线,可用电烙铁将锡带过。
(2)熨烫:
将热转印纸覆在铜板上,用电熨斗进行熨烫,关键要注意熨烫的时间,不能太久,也不能时间太短,否则,太久会把铜板烫坏,不够的话墨迹覆不上去。
(3)腐蚀:
把铜板放到三氯化铁溶液中腐蚀,需注意溶液浓度要较高,最好用热水配置,这样腐蚀更快,一般3分钟即可。
如果时间过长,需剩下的铜线也可能被腐蚀。
(4)打孔:
打孔时注意钻头尺寸,本次用的钻头大小是0.712mm的,最需注意的地方是集成块的管脚,如果打孔误差大,管座就很难插上。
(5)放置元件:
放置前应先打磨一下打孔后留下的毛刺,并均匀地涂上松香水(目的是防止铜线氧化,易于焊锡覆着焊盘,但多涂会导致焊接时焊点变黑,影响美观)。
放置元件时注意集成块的管脚,二极管和电解电容的正负,这些都是平时比较容易出错的地方。
(6)焊接:
焊接技术比较难掌握,焊锡、烙铁与焊盘的位置关系,焊锡熔化时间
长短,松香水的浓度,烙铁的温度等等,都是影响焊点美观的因素。
(7)检查:
检查是否有虚焊,集成块管脚位置是否正确,电源引线位置是否恰当等。
检查完毕就能进行调试了。
六、源程序
#include
#defineuintunsignedint
#defineucharunsignedchar
sbitwei4=P2^0;
sbitwei3=P2^1;
sbitwei2=P2^2;
sbitwei1=P2^3;
sbitST=P3^0;
sbitOE=P3^1;
sbitEOC=P3^2;
sbitCLK=P3^3;
uintshi,ge,sf,bf,getdata;
unsignedlongtemp;
ucharcodetable[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0x00};
voiddelay(uintz);
voidxs();
voidmain(void)
{
ST=0;
OE=0;
ET0=1;
EA=1;
TMOD=0x12;
TH0=216;
TL0=216;
TR0=1;
ST=1;
delay(100);
ST=0;
while
(1)
{
if(EOC==1)
{
OE=1;
getdata=P0;
OE=0;
ST=1;
delay
(1);
ST=0;
}
xs();
}
}
voidt0(void)interrupt1using0
{
CLK=~CLK;
}
voidxs()
{
temp=getdata*255;
temp=temp/65;
shi=temp/1000;
ge=temp%1000/100;
sf=temp%100/10;
bf=temp%10;
wei4=0;
P1=table[bf];
delay
(1);
wei4=1;
wei3=0;
P1=table[sf];
delay
(1);
wei3=1;
wei2=0;
P1=table[ge]|0x80;
delay
(1);
wei2=1;
wei1=0;
P1=table[shi];
delay
(1);
wei1=1;
}
voiddelay(uintz)
{uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
七、总结
1、制作了这个最小系统后,基本理解了protel软件的一些基本使用思路:
(1)主要分两个部分,一个为原理图,一个为PCB图,原理图为你所要实现电路的基本原理结构,只是实现其原理的框图。
一个为PCB,就是你所做的电路的具体实现形式,所做电路的大小,元件大小,导线大小都完全和做出后的电路板一摸一样,做PCB的时候,要考虑到很多的因素,比如导线的宽度,焊盘大小,安全间距,元件摆放位置,元件大小,干涉情况等。
(2)原理图和PCB又是有关联的,它们电气特性是一样的,在一边的修改完全可以反映到另一方面。
这就使的设计思路的唯一性,也让改动变得更加合理以及人性化。
(3)原理图和PCB都有自己元件库里的元件和一些基本的电路线路组成的。
在做原理图和PCB的时候,最好先吧它们的元件进行统一。
似得原理图和PCB能环环相扣,减少设计出错得可能性。
2、在进行这个最小系统的编程设计时,不用以前学习的汇编编程,改用C语言进行编程。
学习了单片机的C语言编程后,发现C语言编单片机程序的时候比汇编更加直观,逻辑性也更加强,也更加容易编出大的程序。
由于C语言强大的逻辑功能,有时后能编出一些汇编无法或者很难编写出来的功能,或者是说用软件逻辑实现硬件控制的一些操作。
虽然C编程的时候对时间延迟有些不足,但是经过网上搜索后也找到了比较好的解决办法,延迟程序编写时应该也能和汇编做到差别不大。
通过这次最小系统的制作,也已经基本掌握用C编单片机程序。
3、在进行电路板和元件的组装过程中,自己也摸索出一些方法。
比如元件放置到电路板上的时候,最好一个模块一个模块地放上去,做好第一次(比如是单片机及其最基本电路),先检测成功,然后再计划放第二个模块。
放前事先考虑好放入模块后可能出现地电气特性(比如灯的亮灭,某些引脚的高的电平的状态),放入模块后检测这些状态是否和原先设想的一样,不一样就分析问题解决问题。
每放上一个模块都要尽量保证其正确,这样能很大解决以后的故障分析时间。
检查整个板子的时候从电源和接地检查起,确定所有电源和接地都正确,然后对每个模块进行检查。
按照这样顺序,能减少不少的检查时间。
4、在调试的过程中也出现了一些问题.
①譬如因为电路板大小的原因,布线太密,造成了局部电容耦合,使得在试验箱上调试好的程序在电路板上不能完全的实现。
使用跳线后解决了该问题。
②数码管的限流电阻接的太大导致数码管的亮度不够。
设计中使用的限流电阻是1K的阻值,使用200欧的电阻能够使数码管达