51单片机课程设计-AD转换_第1页
51单片机课程设计-AD转换_第2页
51单片机课程设计-AD转换_第3页
51单片机课程设计-AD转换_第4页
51单片机课程设计-AD转换_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

成绩.课程设计报告华中师范大学武汉传媒学院传媒技术学院电子信息工程2011仅发布百度文库,版权所有.AD转换要求:A.使用单片机实现AD转换B.可以实现一位AD转换,并显示(保留4位数字)设计框图:外部模拟电压信号模数转换处理器(STC89C52)外部显示器方案设计:AD转换时单片机设计比较重要的实验。模数转换芯片种类多,可以满足不同用途和不同精度功耗等。外部模拟量选择的是简单的电位器,通过控制电位器来改变模拟电压。显示电压值采用一般的四位七段数码管。而AD转换芯片采用使用最广的ADC0809ADC0809芯片有28条引脚,采用双列直插式封装,如图所示。下面说明各引脚功能: IN0IN7:8路模拟量输入端。 2-12-8:8位数字量输出端。 ADDA、ADDB、ADDC: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转换有中断请求是接受并分解电压数据数码管显示电压值仿真图:制作实物图:AD转换模块:最小系统及显示:整体效果:调试:调试最多的是数码管显示问题扫描太慢显示会太暗和有闪烁问题,通过不断改变延迟来调整达到最佳状态。心得体会:通过这次的实验设计特别是前期的电路设计,和芯片选择以及后期的实物焊接。对我们专业的电路认识了很多,学到了很多。做一个东西要选择你要的芯片的,你必须要先了解一些大体的东西当你选择好后你更要全面了解它的性能。对于单片机硬件来说要了解芯片,你要如何去驱动他来满足你的要求。这对于编程和看懂芯片的时序有着高要求。毕竟现在硬件更新换代太快,必须要学习怎么去设计去编写你要的程序来控制它。这是我这次实验最深刻的理解。这次实验也培养了我团队合作能力积极主动沟通,遇到问题一起解决。对于现在的我们即将走出校门的人来说意义重大。同时这次实验也大大拓宽了我的视野我还有很多东西要去理解去学习。原程序:#include / 引用标准库的头文件 #include #include #define uchar unsigned char #define uint unsigned int uint temp=0; sbit ST=P36; /启动信号 sbit EOC=P33; /转换结束信号,连到外部中断1口,转换结束后进入外部中断 sbit OE=P37; /输出使能 /sbit ls=P27;sbit dig_hc595_sh_dr=P17; /数码管的74HC595程序sbit dig_hc595_st_dr=P16; sbit dig_hc595_ds_dr=P15;void initial_myself(); void initial_peripheral();void delay_short(unsigned int uiDelayShort);void delay_long(unsigned int uiDelayLong);/void display_service();void display_drive();void dis_service(int temp);/unsigned char ucDigShow8; /第8位数码管要显示的内容/unsigned char ucDigShow7; /第7位数码管要显示的内容/unsigned char ucDigShow6; /第6位数码管要显示的内容/unsigned char ucDigShow5; /第5位数码管要显示的内容unsigned char ucDigShow4; /第4位数码管要显示的内容unsigned char ucDigShow3; /第3位数码管要显示的内容unsigned char ucDigShow2; /第2位数码管要显示的内容unsigned char ucDigShow1; /第1位数码管要显示的内容unsigned char code dig_table17=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的显示码unsigned char ucDigShowTemp=0; /临时中间变量unsigned char ucDisplayDriveStep=1; /动态扫描数码管的步骤变量void dig_hc595_drive(unsigned char ucLedStatusTemp16_09,unsigned char ucLedStatusTemp08_01);main() initial_myself();/初始化单片机 delay_long(100); initial_peripheral();/初始化外围 while(1) P0=0xff; ST=0;ST=1;ST=0;/ 启动A/D转换 while(EOC=0);OE=1; /EA=0; /temp=0xff; dis_service(temp);/EA=0; display_drive();/显示电压值/delay_long(1);/EA=1;OE=0; void dis_service(int temp) int Tp=0; Tp=temp*1.0/255*500;ucDigShow1 = dig_tableTp / 1000;ucDigShow2 = dig_tableTp % 1000 / 100 | 0x80;ucDigShow3 = dig_tableTp % 100 / 10 ;ucDigShow4 = dig_tableTp % 10 / 1;void display_drive()/显示电压值 uchar i=1; for(i=1;i5;i+) switch(i) case 1: /显示第1位 ucDigShowTemp=ucDigShow1; dig_hc595_drive(ucDigShowTemp,0xfe); break; case 2: /显示第2位 ucDigShowTemp=ucDigShow2; dig_hc595_drive(ucDigShowTemp ,0xfd); break; case 3: /显示第3位 ucDigShowTemp=ucDigShow3; dig_hc595_drive(ucDigShowTemp,0xfb); break; case 4: /显示第4位 ucDigShowTemp=ucDigShow4; dig_hc595_drive(ucDigShowTemp,0xf7); break; /*case 5: /显示第5位 ucDigShowTemp=ucDigShow5; dig_hc595_drive(ucDigShowTemp,0xef); break; case 6: /显示第6位 ucDigShowTemp=ucDigShow6; dig_hc595_drive(ucDigShowTemp,0xdf); break; case 7: /显示第7位 ucDigShowTemp=ucDigShow7; dig_hc595_drive(ucDigShowTemp,0xbf); break; case 8: /显示第8位 ucDigShowTemp=ucDigShow8; dig_hc595_drive(ucDigShowTemp,0x7f); break; */ /数码管的74HC595驱动函数void dig_hc595_drive(unsigned char ucDigStatusTemp16_09,unsigned char ucDigStatusTemp08_01) unsigned char i; unsigned char ucTempData; dig_hc595_sh_dr=0; dig_hc595_st_dr=0; ucTempData=ucDigStatusTemp16_09; /先送高8位 for(i=0;i=0x80)dig_hc595_ds_dr=1; else dig_hc595_ds_dr=0; dig_hc595_sh_dr=0; /SH引脚的上升沿把数据送入寄存器 delay_short(1); dig_hc595_sh_dr=1; delay_short(1); ucTempData=ucTempData1; ucTempData=ucDigStatusTemp08_01; /再先送低8位 for(i=0;i=0x80)dig_hc595_ds_dr=1; else dig_hc595_ds_dr=0; dig_hc595_sh_dr=0; /SH引脚的上升沿把数据送入寄存器 delay_short(1); dig_hc595_sh_dr=1; delay_short(1); ucTempData=ucTempData1; dig_hc595_st_dr=0; /ST引脚把两个寄存器的数据更新输出到74HC595的输出引脚上并且锁存起来 delay_short(1); dig_hc595_st_dr=1; delay_short(1); dig_hc595_sh_dr=0; /拉低,抗干扰就增强 dig_hc595_st_dr=0; dig_hc595_ds_dr=0;void delay_short(unsigned int uiDelayShort) unsigned int i; for(i=0;iuiDelayShort;i+) ; void delay_long(unsigned int uiDelayLong) unsigned int i; unsigned int j; for(i=0;iuiDelayLong;i+) for(j=0;j500;j+) ; void initial_myself() P0=0xff; P1=0xff; P2=0xff; P3=0xff; TMOD=0x02;/T1工作模式2 TH0=0x14; TL0=0x00;void initial_peri

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论