51单片机课程设计AD转换Word下载.docx
《51单片机课程设计AD转换Word下载.docx》由会员分享,可在线阅读,更多相关《51单片机课程设计AD转换Word下载.docx(16页珍藏版)》请在冰豆网上搜索。
3位地址输入线,用于选通8路模拟输入中的一路。
∙ALE:
地址锁存允许信号,输入端,高电平有效。
∙START:
A/D转换启动脉冲输入端,输入一个正脉冲(至少100ns宽)使其启动(脉冲上升沿使0809复位,下降沿启动A/D转换)。
∙EOC:
A/D转换结束信号,输出端,当A/D转换结束时,此端输出一个高电平(转换期间一直为低电平)。
∙OE:
数据输出允许信号,输入端,高电平有效。
当A/D转换结束时,此端输入一个高电平,才能打开输出三态门,输出数字量。
∙CLK:
时钟脉冲输入端。
要求时钟频率不高于640KHz。
∙REF(+)、REF(-):
基准电压。
∙Vcc:
电源,单一+5V。
∙GND:
地
工作原理:
首先输入3位地址,并使ALE=1,将地址存入地址锁存器中。
此地址经译码选通8路模拟输入之一到比较器。
START上升沿将逐次逼近寄存器复位。
下降沿启动A/D转换,之后EOC输出信号变低,指示转换正在进行。
直到A/D转换完成,EOC变为高电平,指示A/D转换结束,结果数据已存入锁存器,这个信号可用作中断申请。
当OE输入高电平时,输出三态门打开,转换结果的数字量输出到数据总线上。
本次实验采用中断方式
把表明转换完成的状态信号(EOC)作为中断请求信号,以中断方式进行数据传送。
不管使用上述哪种方式,只要一旦确定转换完成,即可通过指令进行数据传送。
首先送出口地址并以信号有效时,OE信号即有效,把转换数据送上数据总线,供单片机接受。
采用中断可以减轻单片机负担。
并可以使程序有更多的空间作二次开发。
硬件原理图:
程序流程图:
是
仿真图:
制作实物图:
AD转换模块:
最小系统及显示:
整体效果:
调试:
调试最多的是数码管显示问题扫描太慢显示会太暗和有闪烁问题,通过不断改变延迟来调整达到最佳状态。
心得体会:
通过这次的实验设计特别是前期的电路设计,和芯片选择以及后期的实物焊接。
对我们专业的电路认识了很多,学到了很多。
做一个东西要选择你要的芯片的,你必须要先了解一些大体的东西当你选择好后你更要全面了解它的性能。
对于单片机硬件来说要了解芯片,你要如何去驱动他来满足你的要求。
这对于编程和看懂芯片的时序有着高要求。
毕竟现在硬件更新换代太快,必须要学习怎么去设计去编写你要的程序来控制它。
这是我这次实验最深刻的理解。
这次实验也培养了我团队合作能力积极主动沟通,遇到问题一起解决。
对于现在的我们即将走出校门的人来说意义重大。
同时这次实验也大大拓宽了我的视野我还有很多东西要去理解去学习。
原程序:
#include<
reg51.h>
//引用标准库的头文件
#include<
intrins.h>
stdio.h>
#defineucharunsignedchar
#defineuintunsignedint
uinttemp=0;
sbitST=P3^6;
//启动信号
sbitEOC=P3^3;
//转换结束信号,连到外部中断1口,转换结束后进入外部中断
sbitOE=P3^7;
//输出使能
//sbitls=P2^7;
sbitdig_hc595_sh_dr=P1^7;
//数码管的74HC595程序
sbitdig_hc595_st_dr=P1^6;
sbitdig_hc595_ds_dr=P1^5;
voidinitial_myself();
voidinitial_peripheral();
voiddelay_short(unsignedintuiDelayShort);
voiddelay_long(unsignedintuiDelayLong);
//voiddisplay_service();
voiddisplay_drive();
voiddis_service(inttemp);
//unsignedcharucDigShow8;
//第8位数码管要显示的容
//unsignedcharucDigShow7;
//第7位数码管要显示的容
//unsignedcharucDigShow6;
//第6位数码管要显示的容
//unsignedcharucDigShow5;
//第5位数码管要显示的容
unsignedcharucDigShow4;
//第4位数码管要显示的容
unsignedcharucDigShow3;
//第3位数码管要显示的容
unsignedcharucDigShow2;
//第2位数码管要显示的容
unsignedcharucDigShow1;
//第1位数码管要显示的容
unsignedcharcodedig_table[17]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码
unsignedcharucDigShowTemp=0;
//临时中间变量
unsignedcharucDisplayDriveStep=1;
//动态扫描数码管的步骤变量
voiddig_hc595_drive(unsignedcharucLedStatusTemp16_09,unsignedcharucLedStatusTemp08_01);
main()
{
initial_myself();
//初始化单片机
delay_long(100);
initial_peripheral();
//初始化外围
while
(1)
{
P0=0xff;
ST=0;
ST=1;
//启动A/D转换
while(EOC==0);
OE=1;
//EA=0;
//temp=0xff;
dis_service(temp);
display_drive();
//显示电压值
//delay_long
(1);
//EA=1;
OE=0;
}
}
voiddis_service(inttemp)
intTp=0;
Tp=temp*1.0/255*500;
ucDigShow1=dig_table[Tp/1000];
ucDigShow2=dig_table[Tp%1000/100]|0x80;
ucDigShow3=dig_table[Tp%100/10];
ucDigShow4=dig_table[Tp%10/1];
voiddisplay_drive()//显示电压值
uchari=1;
for(i=1;
i<
5;
i++)
{switch(i)
{
case1:
//显示第1位
ucDigShowTemp=ucDigShow1;
dig_hc595_drive(ucDigShowTemp,0xfe);
break;
case2:
//显示第2位
ucDigShowTemp=ucDigShow2;
dig_hc595_drive(ucDigShowTemp,0xfd);
case3:
//显示第3位
ucDigShowTemp=ucDigShow3;
dig_hc595_drive(ucDigShowTemp,0xfb);
case4:
//显示第4位
ucDigShowTemp=ucDigShow4;
dig_hc595_drive(ucDigShowTemp,0xf7);
/*case5:
//显示第5位
ucDigShowTemp=ucDigShow5;
dig_hc595_drive(ucDigShowTemp,0xef);
case6:
//显示第6位
ucDigShowTemp=ucDigShow6;
dig_hc595_drive(ucDigShowTemp,0xdf);
case7:
//显示第7位
ucDigShowTemp=ucDigShow7;
dig_hc595_drive(ucDigShowTemp,0xbf);
case8:
//显示第8位
ucDigShowTemp=ucDigShow8;
dig_hc595_drive(ucDigShowTemp,0x7f);
*/
}
//数码管的74HC595驱动函数
voiddig_hc595_drive(unsignedcharucDigStatusTemp16_09,unsignedcharucDigStatusTemp08_01)
unsignedchari;
unsignedcharucTempData;
dig_hc595_sh_dr=0;
dig_hc595_st_dr=0;
ucTempData=ucDigStatusTemp16_09;
//先送高8位
for(i=0;
8;
if(ucTempData>
=0x80)dig_hc595_ds_dr=1;
elsedig_hc595_ds_dr=0;
//SH引脚的上升沿把数据送入寄存器
delay_short
(1);
dig_hc595_sh_dr=1;
ucTempData=ucTempData<
<
1;
ucTempData=ucDigStatusTemp08_01;
//再先送低8位
//ST引脚把两个寄存器的数据更新输出到74HC595的输出引脚上并且锁存起来
dig_hc595_st_dr=1;
//拉低,抗干扰就增强
dig_hc595_ds_dr=0;
voiddelay_short(unsignedintuiDelayShort)
unsignedinti;
uiDelayShort;
;
voiddelay_long(unsignedintuiDelayLong)
unsignedintj;
uiDelayLong;
for(j=0;
j<
500;
j++)
voidinitial_myself()
{
P1=0xff;
P2=0xff;
P3=0xff;
TMOD=0x02;
//T1工作模式2
TH0=0x14;
TL0=0x00;
voidinitial_peripheral()//初始化外围
IE=0x82;
//IE.7位为1表示CPU开放中断,IE.1位也为1,表示允许定时器T0溢出中断
TR0=1;
//使能定时器
//选择ADC0809的通道7(111)(P1.0~P1.2)
//ls=0;
IT1=1;
//下降沿触发
EX1=1;
//使能外部中断1
EA=1;
//允许全局中断
voidcounter1(void)interrupt2using2
EX1=0;
temp=P0;
//temp=0xfe;