单片机课程设计报告 精品.docx
《单片机课程设计报告 精品.docx》由会员分享,可在线阅读,更多相关《单片机课程设计报告 精品.docx(16页珍藏版)》请在冰豆网上搜索。
单片机课程设计报告精品
1.题目设计要求
要求:
利用51单片机+8位数码管+AD0809设计数字直流电压表系统,精度为0.01V。
完成以下设计环节:
1)使用AltiumDesinger或Protel99SE开发工具,设计电路原理图与PCB制板图。
2)使用Uvision2开发平台,采用C语言或汇编语言设计软件程序。
3)使用PROTEUS仿真软件,设计仿真原理图并运行软件程序,完成系统仿真。
2.系统的组成及工作原理
2.1电路原理图
图2.1电路原理图
2.2A/D转换原理
模拟量可以是电压、电流等电信号,也可以是压力、温度、湿度、位移、声音等非电信号。
但在A/D转换前,输入到A/D转换器的输入信号必须经各种传感器把各种物理量转换成电压信号。
A/D转换器的工作原理:
采用逐次逼近法,逐次逼近式A/D是比较常见的一种A/D转换电路,转换的时间为微秒级。
逐次逼近法转换过程是:
初始化时将逐次逼近寄存器各位清零;转换开始时,先将逐次逼近寄存器最高位置1,送入D/A转换器,经D/A转换后生成的模拟量送入比较器,称为 Vo,与送入比较器的待转换的模拟量Vi进行比较,若Vo<Vi,该位1被保留,否则被清除。
然后再置逐次逼近寄存器次高位为1,将寄存器中新的数字量送D/A转换器,输出的 Vo再与Vi比较,若Vo<Vi,该位1被保留,否则被清除。
2.3数据处理原理
由ADC0809的转换原理可以知道我们从其得到数据还只是二进制数据,我们还需要进一步处理来的到x的十进制数,并且对其进行精度处理,也就是课题要求的的精确到小数点后两位,在这里我们用51单片机对数据进行处理。
我们处理数据的思路是:
首先将得到的二进制数直接除以十进制数51,然后取整为x的整数部分,然后就是将得到的余数乘以10,然后再除以51,再取整为x的十分位,最后将得到的余数除以5得到x的百分位。
2.4器件列表
系统所用到的主要器件如下:
1.MCS51单片机--AT89C51
2.ADC0809芯片
3.LED显示器
4.电阻若干
5.二极管若干
3.器件的功能和作用
3.1AT89C51功能介绍
3.1.1AT89C51的简单概述
AT89C51是一种带4K字节闪存可编程可擦除只读存储器(FPEROM—FlashProgrammableandErasableReadOnlyMemory)的低电压、高性能CMOS8位微处理器,俗称单片机。
AT89C51是一种带2K字节闪存可编程可擦除只读存储器的单片机。
单片机的可擦除只读存储器可以反复擦除1000次。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。
AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
图3.1AT89C51芯片模型
3.1.2AT89C51的引脚介绍
89C51单片机多采用40只引脚的双列直插封装(DIP)方式,下面分别简单介绍。
(1)电源引脚
电源引脚接入单片机的工作电源。
Vcc(40引脚):
+5V电源。
GND(20引脚):
接地。
(2)时钟引脚
XTAL1(19引脚):
片内振荡器反相放大器和时钟发生器电路的输入端。
XTAL2(20引脚):
片内振荡器反相放大器的输出端。
图3.2电源接入方式
(3)复位RST(9引脚)
在振荡器运行时,有两个机器周期(24个振荡周期)以上的高电平出现在此引脚时,将使单片机复位,只要这个脚保持高电平,51芯片便循环复位。
(4)
/Vpp(31引脚)
为外部程序存储器访问允许控制端。
当它为高电平时,单片机读片内程序存储器,在PC值超过0FFFH后将自动转向外部程序存储器。
当它为低电平时,只限定在外部程序存储器,地址为0000H~FFFFH。
Vpp为该引脚的第二功能,为编程电压输入端。
(5)ALE/
(30引脚)
ALE为低八位地址锁存允许信号。
在系统扩展时,ALE的负跳沿江P0口发出的第八位地址锁存在外接的地址锁存器,然后再作为数据端口。
为该引脚的第二功能,在对片外存储器编程时,此引脚为编程脉冲输入端。
(6)
(29引脚)
片外程序存储器的读选通信号。
在单片机读片外程序存储器时,此引脚输出脉冲的负跳沿作为读片外程序存储器的选通信号。
(7)pin39-pin32为P0.0-P0.7输入输出脚,称为P0口。
P0是一个8位漏极开路型双向I/O口。
内部不带上拉电阻,当外接上拉电阻时,P0口能以吸收电流的方式驱动八个LSTTL负载电路。
通常在使用时外接上拉电阻,用来驱动多个数码管。
在访问外部程序和外部数据存储器时,P0口是分时转换的地址(低8位)/数据总线,不需要外接上拉电阻。
(8)Pin1-Pin8为P1.0-P1.7输入输出脚,称为P1口,是一个带内部上拉电阻的8位双向I/0口。
P1口能驱动4个LSTTL负载。
(9)Pin21-Pin28为P2.0-P2.7输入输出脚,称为P2口。
P2口是一个带内部上拉电阻的8位双向I/O口,P2口能驱动4个LSTTL负载。
端口置1时,内部上拉电阻将端口拉到高电平,作输入用。
对内部Flash程序存储器编程时,接收高8位地址和控制信息。
在访问外部程序和16位外部数据存储器时,P2口送出高8位地址。
而在访问8位地址的外部数据存储器时其引脚上的内容在此期间不会改变。
(10)Pin10-Pin17为P3.0-P3.7输入输出脚,称为P3口。
P3口是一个带内部上拉电阻的8位双向I/O口,P2口能驱动4个LSTTL负载,这8个引脚还用于专门的第二功能。
端口置1时,内部上拉电阻将端口拉到高电平,作输入用。
对内部Flash程序存储器编程时,接控制信息。
3.2AD0809功能介绍
AD0809是CMOS逐次逼近型A/D转换器,具有八路模拟量输入通道,有转换起停控制,模拟输入电压范畴0v-5v,转换时间为100us,AD0809有八路模拟通道选择开关、地址所存和译码器、比较器、八位开关树型D/A转换器、逐层逼近型寄存器、定时和控制电路及三态输出锁存器组成。
其中,八路模拟通道选择开关实现从8路模拟量中选择一路送给后面的比较器进行比较;地址所存和译码器用于当ALE信号有效时锁存器从ADDA、ADDB、ADDC3根地址线中送来的3位地址,译码后产生通道信号,从8路模拟通道中选择8位A/D转换器,当START信号有效时,就开始对输入的当前通道的模拟量进行转换,转换完后,把转换得到的数字量送到8位锁存器,同时通过EOC引脚送出转换结束信号。
三态输出锁存器保存当前模拟通道转换得到的数字量,当OC信号有效时,把转换的结果通过D0-D7送出。
3.3LED数码管功能介绍
LED的段码端口A~G分别接至AT89C51的P1.0~P1.7口,位选端1~4分别接至P3.5、P3.4、P3.1、P3.0。
4.系统硬件设计
用一片ADC0809和必要的外围器件与80C51进行接口连接,要求对IN0所输入的模拟电压进行识别,将其转换成相应的二进制数并以发光二极管的形式显示。
图4.189C51单片机
图4.2ADC0809芯片
5.系统软件设计
5.1程序流程图
图5.1数字式电压表主程序流程图
图5.2A/D转换流程图
5.2程序代码
#include"reg51.h"
sbitST_ALE=P3^0;//STARTandALEbothconnecttoP3.0
sbitEOC=P3^1;//EOCconnecttoP3.1
sbitOE=P3^2;//OEconecttoP3.2
sbitCLK=P3^3;//CLKconnecttoP3.3
unsignedcharCHANNEL;//ADchannelvariable
unsignedcharLED[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
//moncathodeLEDcode
unsignedcharCHECK[4]={0xEF,0xDF,0xBF,0x7F};//chooseLEDchannel
voiddelay(unsignedchartime)
{
unsignedchari,j;
for(i=time;i>0;i--)
for(j=250;j>0;j--)
;
}
voiddisplay()
{
unsignedlongtemp;
unsignedcharDATA,digit[4];
unsignedintk,l;
DATA=P0;//saveADdata
temp=DATA;//thetemporaryvariable
temp=temp*1000/51;//ADformula:
D=A*5/255
digit[0]=temp/1000;//thethousandsplace
digit[1]=temp%1000/100;//thehundredsplace
digit[2]=temp%1000%100/10;//thetensplace
digit[3]=temp%1000%100%10;//theonesplace
DATA=P2;//saveP2
for(k=0;k<10000000;k++)
{
/*lighteneachLEDandequalthebelowforloop
P1=LED[digit[0]]+0x80;
P2_4=0;
P2_4=1;
P1=LED[digit[1]];
P2_5=0;
P2_5=1;
P1=LED[digit[2]];
P2_6=0;
P2_6=1;
P1=LED[digit[3]];
P2_7=0;
P2_7=1;
*/
for(l=0;l<4;l++)
{
P2=P2|0xF0;//avoidLEDresidual
P1=LED[digit[l]]+0x80*(l==0);//LEDcode
P2=DATA&CHECK[l];//chooseLEDchannel
}
}
P2=DATA;//restoreP2
}
voidmain()
{
CHANNEL=0xF8;//ADchannel0
ST_ALE=0;//STARTandALEdefault
OE=0;//OEdefault
TMOD=0x02;//T0operateinmode2
TH0=0xFF;//autoloadvalue
TL0=0xFF;//defaultvalue
EA=1;//allinterruptenable
ET0=1;//T0interruptenable
TR0=1;//T0run
while
(1)
{
P2=CHANNEL;//chooseADchannel
ST_ALE=1;//locktheADchanneladdress
ST_ALE=0;//ADrun
while(EOC==0);//waituntilADover
OE=1;//enabletotransmitADdata
display();//viewtheADresultanddiaplayLED
delay(250);//delaytopreparefornextADchannel
OE=0;//forbittotransmitADdata
/*if(CHANNEL==0xFF)
CHANNEL=0xF7;//ADchannelloop
CHANNEL++;//nextADchannel
*/
}
}
voidT1_TIME()interrupt1using0
{
CLK=!
CLK;//CLK500kHz
}
6.系统仿真调试
6.1仿真原理图设计
图6.1仿真原理图
6.2与程序代码链接
6.2.1运用keiluVision4生成.hex文件并链接
新建一个工程的步骤:
(1)新建一个文件夹,放置工程文件,避免与其他文件混淆,如新建文件夹project1;
(2)点击桌面keil图标,出现启动界面如图6.2:
图6.2keil启动界面
(3)点击“project---NewuVisionProject”新建一个工程,如新建工程project1,并将其保存在文件夹project1中:
图6.3新建工程界面
(4)弹出一个框,在CPU类型下我们找到并选中“Atmel”下的AT89S51或AT89S52:
图6.4选择芯片型号
(5)点击file,新建文件,并将其保存,如果是C语言,则将文件后缀改为.c并保存,如果是汇编语言,将后缀改为.asm后保存。
(6)将保存好的文件将添加进工程,右击project窗口中的SourceGroup1,在打开的菜单中选择”AddFiletoGroup‘SourceGroup1’”保存的文件添加进来:
图6.5添加文件至工程
添加文件至工程中后即可点击添加的文件进行编程。
对程序进行编译,成成文件中包含.hex格式文件。
按后按.hex格式文件所在路径链接仿真电路。
6.3仿真运行结果
链接后即可获得结果,结果显示在LED数码管上,如图6.1所示,测得的电压为2.49V,与实际电压值相比较,其值在误差允许范围内,故其结果正确。
7.心得体会
通过此次课程设计,学到了不少的东西,在此期间,我们通过网上搜索资料,逛图书馆,看视频教程了解本次课程设计的相关知识,真的使人受益匪浅,收获颇多!
通过大家的努力,在同学和指导老师的帮助下,成功的完成了本次课程设计。
通过对数字电压表的设计,让我真正的了解了数字电压表的工作原理,另外以前岁单片机就有一定的认识及应用,这次课程设计更加加深了自己对单片机应用技术的掌握,虽然以前就做过一些单片机制作,并且对单片机C语言的应用并不陌生,但是本次设计中系统,纤细的设计工作使我更加深刻的掌握了单片机设计的一些细节,尤其是对A/D转换技术的掌握。
这次课程设计所涉及的知识虽然并不是很全面,但是同样让我受益匪浅,尤其是在做课程设计的同时,让我找到了自己的一些不足之处。
并在做课程设计时让我觉得用平时所学,真的的接触一些东西时,是多么的快乐,动手之后完全没有了在课堂上学习时的枯燥,这样能够更快的吸收知识。
另一方也让我看到了交流的重要性,又不懂得时候,和同学交流解决问题可以高效的解决问题。