基于51单片机的模数转换AD实验设计
基于51单片机的AD和DA
基于51单片机的AD和DA本讲内容:介绍AD/DA芯片PCF8591,通过例程讲解AD和DA过程。
AD和DA的概念:AD转换的功能是把模拟量电压转换为数字量电压。
DA转换的功能正好相反,就是讲数字量转换位模拟量。
分辨率的概念:一位数字量所表示的电压值。
对于5V的满量程,采用8位的DAC 时,分辨率为5V/256=19.5mV。
PCF8591简介:PCF8591是单片、单电源低功耗8位CMOS数据采集器件,具有4个模拟输入、一个模拟输出和一个串行IIC总线接口。
3个地址引脚A0、A1和A2用于编程硬件地址,允许将最多8个器件连接至IIC总线而不需要额外硬件。
PCF8591管脚图:PCF8591接口电路图:PCF8591的控制寄存器:例程:AD程序/**********************AD转换**********************单片机型号:STC89C52RC*开发环境:KEIL*功能:IIC协议 PCF8591 AD转换**************************************************/#include<reg52.h>#include <intrins.h>#define LCD_Data P0#define Busy 0x80#define uchar unsigned char#define delay0;_nop_();#define AddWr 0x90#define AddRd 0x91sbit RST=P2^4;sbit Sda=P2^0;sbit Scl=P2^1;sbit LCD_RS=P1^0;sbit LCD_RW=P1^1;sbit LCD_E =P2^5;bit ADFlag;uchar code table0[]={" SL-51A "};uchar code table1[]={" AD CONVERT "};uchar code table2[]={"CH1: . V"};uchar code table3[]={"CH2: . V"};uchar code table4[]={"CH3: . V"};uchar code table5[]={"CH4: . V"};uchar TempData[8];void Delay5Ms(void);void delay(int In,int Out); void WriteDataLCD(unsigned char WDLCD);void WriteCommandLCD(unsigned char WCLCD,BuysC);uchar ReadDataLCD(void);uchar ReadStatusLCD(void);void LCDInit(void);void DisplayOneChar(unsigned char X,unsigned char Y,unsigned char DData);void DisplayListChar(unsigned char X,unsigned char Y,unsigned char code *DData);void Init_Timer1(void);void Start(void);void Stop(void);void Ack(void);void NoAck(void);void Send(unsigned char Data);uchar Read(void);void DAC(unsigned char Data);uchar ReadADC(unsigned char Chl);void info_disp(void);/**********5ms延时函数***************************/void Delay5Ms(void){unsigned int TempCyc=3552;while(TempCyc--);}/********************延迟函数********************/void delay(int In,int Out) {int i,j;for(i=0;i<In;i++){for(j=0;j<Out;j++){;}}}/*------------------------------------------------初始化定时器1------------------------------------------------*/void Init_Timer1(void){TMOD|=0x10;TH1=0xff;TL1=0x00;EA=1;ET1=1;TR1=1;}/*------------------------------------------------启动IIC总线------------------------------------------------*/void Start(void){Sda=1;delay0;Scl=1;delay0;Sda=0;delay0;Scl=0;}/*------------------------------------------------停止IIC总线------------------------------------------------*/void Stop(void){Sda=0;delay0;Scl=1;delay0;Sda=1;delay0;Scl=0;}/*------------------------------------------------应答IIC总线------------------------------------------------*/void Ack(void){Sda=0;delay0;Scl=1;delay0;Scl=0;delay0;}/*------------------------------------------------非应答IIC总线------------------------------------------------*/void NoAck(void){Sda=1;delay0;Scl=1;delay0;Scl=0;delay0;}/*------------------------------------------------发送一个字节------------------------------------------------*/ void Send(unsigned char Data){uchar BitCounter=8;uchar temp;do{temp=Data;Scl=0;delay0;if((temp&0x80)==0x80){Sda=1;}else{Sda=0;}Scl=1;temp=Data<<1;Data=temp;BitCounter--;}while(BitCounter);Scl=0;}/*------------------------------------------------读入一个字节并返回------------------------------------------------*/ uchar Read(void){uchar temp=0;uchar temp1=0;uchar BitCounter=8;Sda=1;do{Scl=0;delay0;Scl=1;delay0;if(Sda){temp=temp|0x01;}else{temp=temp&0xfe;}if(BitCounter-1){temp1=temp<<1;temp=temp1;}BitCounter--;}while(BitCounter);return(temp);}/*------------------------------------------------写入DA数模转换值------------------------------------------------*/ void DAC(unsigned char Data){Start();Send(AddWr);Ack();Send(0x40);Ack();Send(Data);Ack();Stop();}/*------------------------------------------------读取AD模数转换的值,有返回值------------------------------------------------*/ uchar ReadADC(unsigned char Chl){uchar Data;Start();Send(AddWr);Ack();Send(0x40|Chl);Ack();Start();Send(AddRd);Ack();Data=Read();Scl=0;NoAck();Stop();return Data;}/*******************写数据函数*******************/ void WriteDataLCD(unsigned char WDLCD){ReadStatusLCD();LCD_Data=WDLCD;LCD_RS=1;LCD_RW=0;LCD_E=0;LCD_E=0;LCD_E=1;}/*******************写指令函数*******************/ void WriteCommandLCD(unsigned char WCLCD,BuysC) {if(BuysC)ReadStatusLCD();LCD_Data=WCLCD;LCD_RS=0;LCD_RW=0;LCD_E=0;LCD_E=0;LCD_E=1;}/*******************读数据函数*******************/unsigned char ReadDataLCD(void){LCD_RS=1;LCD_RW=1;LCD_E=0;LCD_E=0;LCD_E=1;return(LCD_Data);}/*******************读状态函数*******************/unsigned char ReadStatusLCD(void){LCD_Data=0xFF;LCD_RS=0;LCD_RW=1;LCD_E=0;LCD_E=0;LCD_E=1;while (LCD_Data&Busy);return(LCD_Data);}/********************LCD初始化*******************/void LCDInit(void){LCD_Data=0;WriteCommandLCD(0x38,0);Delay5Ms();WriteCommandLCD(0x38,0);Delay5Ms();WriteCommandLCD(0x38,0);Delay5Ms();WriteCommandLCD(0x38,1);WriteCommandLCD(0x08,1);WriteCommandLCD(0x01,1);WriteCommandLCD(0x06,1);WriteCommandLCD(0x0C,1);}/********************清屏函数********************/void LCD_Clear(void){WriteCommandLCD(0x01,1);Delay5Ms();}/**************按指定位置显示一个字符*************/void DisplayOneChar(unsigned char X,unsigned char Y,unsigned char DData) {Y&=0x1;X&=0xF;if(Y)X|=0x40;X|=0x80;WriteCommandLCD(X, 0);WriteDataLCD(DData);}/**************按指定位置显示一串字符*************/void DisplayListChar(unsigned char X,unsigned char Y,unsigned char code *DData) {unsigned char ListLength;ListLength=0;Y&=0x1;X&=0xF;while(DData[ListLength]>=0x20){if(X<=0xF){DisplayOneChar(X, Y, DData[ListLength]);ListLength++;X++;}}}/********************系统初始化*******************/void sys_init(void){LCDInit();delay(5,100);Init_Timer1();DisplayListChar(0,0,table0);DisplayListChar(0,1,table1);}/*------------------------------------------------显示------------------------------------------------*/void info_disp(void){DisplayListChar(0,0,table2);DisplayOneChar(4,0,(0x30+TempData[0]));DisplayOneChar(6,0,(0x30+TempData[1]));DisplayListChar(8,0,table3);DisplayOneChar(12,0,(0x30+TempData[2]));DisplayOneChar(14,0,(0x30+TempData[3]));DisplayListChar(0,1,table4);DisplayOneChar(4,1,(0x30+TempData[4]));DisplayOneChar(6,1,(0x30+TempData[5]));DisplayListChar(8,1,table5);DisplayOneChar(12,1,(0x30+TempData[6]));DisplayOneChar(14,1,(0x30+TempData[7]));}/*------------------------------------------------主程序------------------------------------------------*/void main(){uchar num;uchar ADtemp;sys_init();delay(100,1000);LCD_Clear();while(1){DAC(num);num++;delay(5,100);if(ADFlag){ADFlag=0;ADtemp=ReadADC(0);TempData[0]=(ReadADC(0))/50;TempData[1]=((ReadADC(0))%50)/10; ADtemp=ReadADC(1);TempData[2]=(ReadADC(1))/50;TempData[3]=((ReadADC(1))%50)/10; ADtemp=ReadADC(2);TempData[4]=(ReadADC(2))/50;TempData[5]=((ReadADC(2))%50)/10; ADtemp=ReadADC(3);TempData[6]=(ReadADC(3))/50;TempData[7]=((ReadADC(4))%50)/10; info_disp();}}}/*------------------------------------------------定时器中断程序------------------------------------------------*/void Timer1_isr(void) interrupt 3 using 1{static unsigned int j;TH1=0xfb;TL1=0x00;j++;if(j==200){j=0;ADFlag=1;}}DA程序/******************DA转换LED输出*******************单片机型号:STC89C52RC*开发环境:KEIL*功能:此程序通过IIC协议对DAAD芯片操作, 并输出模拟量,用LED亮度渐变指示***************************************************/#include<reg52.h>#include <intrins.h>#define delay0; _nop_();#define uchar unsigned char#define AddWr 0x90#define AddRd 0x91sbit RST=P2^4;sbit Sda=P2^0;sbit Scl=P2^1;sbit Fm=P2^3;sbit LE1=P2^6;sbit LE2=P2^7;bit ADFlag;uchar code Datatab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; data uchar Display[8];/*------------------------------------------------延时程序------------------------------------------------*/void mDelay(uchar j){unsigned int i;for(;j>0;j--){for(i=0;i<125;i++){;}}}/*------------------------------------------------初始化定时器1------------------------------------------------*/void Init_Timer1(void){TMOD|=0x10;TH1=0xff;TL1=0x00;EA=1;ET1=1;TR1=1;}/*------------------------------------------------启动IIC总线------------------------------------------------*/void Start(void){Sda=1;delay0;Scl=1;delay0;Sda=0;delay0;Scl=0;}/*------------------------------------------------停止IIC总线------------------------------------------------*/ void Stop(void){Sda=0;delay0;Scl=1;delay0;Sda=1;delay0;Scl=0;}/*------------------------------------------------应答IIC总线------------------------------------------------*/ void Ack(void){Sda=0;delay0;Scl=1;delay0;Scl=0;delay0;}/*------------------------------------------------非应答IIC总线------------------------------------------------*/ void NoAck(void){Sda=1;delay0;Scl=1;delay0;Scl=0;delay0;}/*------------------------------------------------发送一个字节------------------------------------------------*/ void Send(uchar Data){uchar BitCounter=8;uchar buffer;do{buffer=Data;Scl=0;delay0;if((buffer&0x80)==0x80)Sda=1;else Sda=0;Scl=1;buffer=Data<<1;Data=buffer;BitCounter--;}while(BitCounter);Scl=0;}/*------------------------------------------------读入一个字节并返回------------------------------------------------*/ uchar Read(void){uchar buffer=0;uchar buffer1=0;uchar BitCounter=8;Sda=1;do{Scl=0;delay0;Scl=1;delay0;if(Sda)buffer=buffer|0x01;else buffer=buffer&0xfe;if(BitCounter-1){buffer1=buffer<<1;buffer=buffer1;}BitCounter--;}while(BitCounter);return(buffer);}/*------------------------------------------------写入DA数模转换值------------------------------------------------*/ void DAC(uchar Data){Start();Send(AddWr);Ack();Send(0x40);Ack();Send(Data);Ack();Stop();}/*------------------------------------------------读取AD模数转换的值,有返回值------------------------------------------------*/ uchar ReadADC(uchar Chl){uchar Data;Start();Send(AddWr);Ack();Send(0x40|Chl);Ack();Start();Send(AddRd);Ack();Data=Read();Scl=0;NoAck();Stop();return Data;}void fmg(void){Fm=1;}void cmg(void){LE1=1;P0=0x00;LE1=0;LE2=1;P0=0x00;LE2=0;RST=0;}/*------------------------------------------------主程序------------------------------------------------*/ void main(){uchar num;uchar ADbuffer;Init_Timer1();cmg();fmg();while(1){DAC(num);num++;mDelay(20);if(ADFlag){ADFlag=0;ADbuffer=ReadADC(0);Display[0]=Datatab[(ReadADC(0))/50]|0x80;Display[1]=Datatab[((ReadADC(0))%50)/10];ADbuffer=ReadADC(1);Display[2]=Datatab[((ReadADC(1))/50)]|0x80;Display[3]=Datatab[((ReadADC(1))%50)/10];ADbuffer=ReadADC(2);Display[4]=Datatab[((ReadADC(2))/50)]|0x80;Display[5]=Datatab[((ReadADC(2))%50)/10];ADbuffer=ReadADC(3);Display[6]=Datatab[((ReadADC(3))/50)]|0x80; Display[7]=Datatab[((ReadADC(3))%50)/10]; }}}。
单片机AD模数转换实验报告
单片机AD模数转换实验报告一、实验目的和要求1、掌握单片机与ADC0809的接口设计方法。
2、掌握Proteus软件与Keil软件的使用方法。
二、设计要求。
1、用Proteus软件画出电路原理图,在单片机的外部扩展片外三总线,并通过片外三总线与0809接口。
2、在0809的某一模拟量输入通道上接外部模拟量。
3、在单片机的外部扩展数码管显示器。
4、分别采用延时和查询的方法编写A/D 转换程序。
5、启动A/D转换,将输入模拟量的转换结果在显示器上显示。
三、电路原理图。
图1、电路仿真图四、实验程序流程框图和程序清单。
1、查询法:ORG 0000HSTART: LJMP MAINORG 0100HMAIN: MOV SP, #2FH NT: MOV DPTR, #0FF78H MOVX @DPTR, A LOOP: JB P3.3, LOOP MOVX A, @DPTR MOV B, #51 DIV AB MOV R0, A MOV A, B MOV B, #5 DIV AB MOV R1, A MOV R2, B LCALL DIR SJMP NT DIR: MOV R7, #0 SJMP LOOP1 BH: MOV A, R1 MOV R2, A LOOP1: MOV DPTR, #WK MOV A, R7 MOVC A, @A+DPTR MOV P2, A MOV DPTR, #DK MOV A, R2 MOVC A, @A+DPTR MOV P1, A LCALL DELAY INC R7 CJNE R7, #2, BH MOV DPTR, #WK MOV A, R7 MOVC A, @A+DPTR MOV P2, A MOV DPTR, #DK MOV A, R0 MOVC A, @A+DPTR ANL A, #7FH MOV P1, A LCALL DELAY RET DELAY: M OV R5, #01H DL1: MOV R4, #8EH DL0: MOV R3, #02H DJNZ R3, $ DJNZ R4, DL0 DJNZ R5, DL1 RET WK: DB 10H DB 20H DB 40H DK: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H ENDdisplay 送百分位字符代码送位选信号延时1ms 送十分位字符代码送位选信号延时1ms 送个位及小数点字符代码送位选信号延时1ms 熄灭第四位数码管延时1ms 返回display 送百分位字符代码送位选信号延时1ms 送十分位字符代码送位选信号延时1ms 送个位及小数点字符代码送位选信号延时1ms 熄灭第四位数码管延时1ms 返回2、延时法:ORG 0000H START: LJMP MAIN ORG 0100H MAIN: MOV SP, #2FH LOOP: MOV DPTR, #0FF78H MOVX @DPTR, A LCALL DELAY MOVX A, @DPTR MOV B, #51 DIV AB MOV R0, A MOV A, B MOV B, #5 DIV AB MOV R1, A MOV R2, B LCALL DIR SJMP LOOP DIR: MOV R7, #0 SJMP LOOP1 BH: MOV A, R1 MOV R2, A LOOP1: MOV DPTR, #WK MOV A, R7 MOVC A, @A+DPTR MOV P2, A MOV DPTR, #DK MOV A, R2 MOVC A, @A+DPTR MOV P1, A LCALL DELAY INC R7 CJNE R7, #2, BH MOV DPTR, #WK MOV A, R7 MOVC A, @A+DPTR MOV P2, A MOV DPTR, #DK MOV A, R0 MOVC A, @A+DPTR ANL A, #7FH MOV P1, A LCALL DELAY RET DELAY: M OV R5, #01H DL1: MOV R4, #8EH DL0: MOV R3, #02H DJNZ R3, $ DJNZ R4, DL0 DJNZ R5, DL1 RET WK: DB 10H DB 20H DB 40H DK: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H开始启动AD 延时从AD中取数据数据处理结束调显示子函数END五、实验结果。
51单片机课程设计 AD转换
成绩课程设计报告华中师范大学武汉传媒学院传媒技术学院电子信息工程2011仅发布百度文库,版权所有.AD转换要求:A.使用单片机实现AD转换B.可以实现一位AD转换,并显示(保留4位数字)设计框图:方案设计:AD转换时单片机设计比较重要的实验。
模数转换芯片种类多,可以满足不同用途和不同精度功耗等。
工作原理:首先输入3位地址,并使ALE=1,将地址存入地址锁存器中。
此地址经译码选通8路模拟输入之一到比较器。
START上升沿将逐次逼近寄存器复位。
下降沿启动A/D转换,之后EOC输出信号变低,指示转换正在进行。
直到A/D转换完成,EOC 变为高电平,指示A/D转换结束,结果数据已存入锁存器,这个信号可用作中断申请。
当OE输入高电平时,输出三态门打开,转换结果的数字量输出到数据总线上。
硬件原理图:程序流程图:仿真图:制作实物图:AD转换模块:最小系统及显示:整体效果:调试:调试最多的是数码管显示问题扫描太慢显示会太暗和有闪烁问题,通过不断改变延迟来调整达到最佳状态。
心得体会:通过这次的实验设计特别是前期的电路设计,和芯片选择以及后期的实物焊接。
对我们专业的电路认识了很多,学到了很多。
做一个东西要选择你要的芯片的,你必须要先了解一些大体的东西当你选择好后你更要全面了解它的性能。
对于单片机硬件来说要了解芯片,你要如何去驱动他来满足你的要求。
这对于编程和看懂芯片的时序有着高要求。
毕竟现在硬件更新换代太快,必须要学习怎么去设计去编写你要的程序来控制它。
这是我这次实验最深刻的理解。
这次实验也培养了我团队合作能力积极主动沟通,遇到问题一起解决。
对于现在的我们即将走出校门的人来说意义重大。
同时这次实验也大大拓宽了我的视野我还有很多东西要去理解去学习。
原程序:#include <reg51.h> // 引用标准库的头文件#include <intrins.h>#include <stdio.h>#define uchar unsigned char#define uint unsigned intuint temp=0;sbit ST=P3^6; //启动信号sbit EOC=P3^3; //转换结束信号,连到外部中断1口,转换结束后进入外部中断sbit OE=P3^7; //输出使能//sbit ls=P2^7;sbit dig_hc595_sh_dr=P1^7; //数码管的74HC595程序sbit dig_hc595_st_dr=P1^6;sbit dig_hc595_ds_dr=P1^5;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_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的显示码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_table[Tp / 1000];ucDigShow2 = dig_table[Tp % 1000 / 100] | 0x80;ucDigShow3 = dig_table[Tp % 100 / 10] ;ucDigShow4 = dig_table[Tp % 10 / 1];}void display_drive()//显示电压值{uchar i=1;for(i=1;i<5;i++){ switch(i){case 1: //显示第1位ucDigShowTemp=ucDigShow1;dig_hc595_drive(ucDigShowTemp,0xfe);break;case 2: //显示第2位ucDigShowTemp=ucDigShow2;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;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<8;i++){if(ucTempData>=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=ucTempData<<1;}ucTempData=ucDigStatusTemp08_01; //再先送低8位for(i=0;i<8;i++){if(ucTempData>=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=ucTempData<<1;}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;i<uiDelayShort;i++){;}void delay_long(unsigned int uiDelayLong) {unsigned int i;unsigned int j;for(i=0;i<uiDelayLong;i++){for(j=0;j<500;j++){;}}}void initial_myself(){P0=0xff;P1=0xff;P2=0xff;P3=0xff;TMOD=0x02;//T1工作模式2TH0=0x14;TL0=0x00;void initial_peripheral() //初始化外围{IE=0x82; //IE.7位为1表示CPU开放中断,IE.1位也为1,表示允许定时器T0溢出中断TR0=1; //使能定时器P0=0xff; //选择ADC0809的通道7(111)(P1.0~P1.2)//ls=0;ST=0;OE=0;IT1=1; //下降沿触发EX1=1; //使能外部中断1EA=1; //允许全局中断}void counter1(void) interrupt 2 using 2{EX1=0;temp=P0;//temp=0xfe;EX1=1;}。
51单片机ad转换程序解析
51单片机ad转换程序解析1.引言1.1 概述概述部分旨在介绍本篇文章的主题——51单片机AD转换程序,并对文章的结构和目的进行简要说明。
51单片机是指Intel公司推出的一种单片机芯片,它广泛应用于嵌入式系统中。
而AD转换则是模拟信号转换为数字信号的过程,是嵌入式系统中的重要功能之一。
本文将详细解析51单片机中的AD转换程序。
文章结构分为引言、正文和结论三个部分。
引言部分将给读者介绍本篇文章的内容和结构安排,正文部分将详细讲解51单片机AD转换程序的相关要点,而结论部分将总结正文中各个要点的内容,以便读者能够更好地理解和掌握51单片机AD转换程序的实现原理。
本文的目的在于向读者提供一份对51单片机AD转换程序的详细解析,使读者能够了解51单片机的AD转换功能以及如何在程序中进行相应的设置和操作。
通过本文的学习,读者将掌握如何使用51单片机进行模拟信号的采集和处理,为后续的嵌入式系统设计和开发提供基础。
在下一节中,我们将开始介绍文章的第一个要点,详细讲解51单片机AD转换程序中的相关知识和技巧。
敬请期待!1.2 文章结构文章结构部分主要是对整篇文章的框架和内容进行介绍和归纳,以帮助读者更好地理解文章的组织和内容安排。
本文以"51单片机AD转换程序解析"为主题,结构分为引言、正文和结论三个部分。
引言部分主要包括概述、文章结构和目的三个方面。
首先,通过对单片机AD转换程序的解析,来讲解其实现原理和功能。
其次,介绍文章的结构,帮助读者明确整篇文章的主要内容和组织方式。
再次,阐明文章的目的,即为读者提供关于51单片机AD转换程序的详尽解析和指导,帮助读者深入了解该技术并进行实际应用。
正文部分则分为两个要点,即第一个要点和第二个要点。
第一个要点可以从AD转换的基本概念入手,介绍51单片机AD转换的原理和流程。
包括输入电压的采样、AD转换器的工作原理、ADC的配置和控制等方面的内容。
在此基础上,深入解析51单片机AD转换程序的编写和调用方法,包括编程语言、寄存器的配置、数据的获取和处理等。
基于51单片机实现ADC0808数模转换与显示课程设计
综合课程设计题目基于51单片机实现ADC0808数模转换与显示毕业设计(论文)原创性声明和使用授权说明原创性声明本人郑重承诺:所呈交的毕业设计(论文),是我个人在指导教师的指导下进行的研究工作及取得的成果。
尽我所知,除文中特别加以标注和致谢的地方外,不包含其他人或组织已经发表或公布过的研究成果,也不包含我为获得及其它教育机构的学位或学历而使用过的材料。
对本研究提供过帮助和做出过贡献的个人或集体,均已在文中作了明确的说明并表示了谢意。
作者签名:日期:指导教师签名:日期:使用授权说明本人完全了解大学关于收集、保存、使用毕业设计(论文)的规定,即:按照学校要求提交毕业设计(论文)的印刷本和电子版本;学校有权保存毕业设计(论文)的印刷本和电子版,并提供目录检索与阅览服务;学校可以采用影印、缩印、数字化或其它复制手段保存论文;在不以赢利为目的前提下,学校可以公布论文的部分或全部内容。
作者签名:日期:学位论文原创性声明本人郑重声明:所呈交的论文是本人在导师的指导下独立进行研究所取得的研究成果。
除了文中特别加以标注引用的内容外,本论文不包含任何其他个人或集体已经发表或撰写的成果作品。
对本文的研究做出重要贡献的个人和集体,均已在文中以明确方式标明。
本人完全意识到本声明的法律后果由本人承担。
作者签名:日期:年月日学位论文版权使用授权书本学位论文作者完全了解学校有关保留、使用学位论文的规定,同意学校保留并向国家有关部门或机构送交论文的复印件和电子版,允许论文被查阅和借阅。
本人授权大学可以将本学位论文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本学位论文。
涉密论文按学校规定处理。
作者签名:日期:年月日导师签名:日期:年月日注意事项1.设计(论文)的内容包括:1)封面(按教务处制定的标准封面格式制作)2)原创性声明3)中文摘要(300字左右)、关键词4)外文摘要、关键词5)目次页(附件不统一编入)6)论文主体部分:引言(或绪论)、正文、结论7)参考文献8)致谢9)附录(对论文支持必要时)2.论文字数要求:理工类设计(论文)正文字数不少于1万字(不包括图纸、程序清单等),文科类论文正文字数不少于1.2万字。
串行模数数模转换实验报告
串行模数/数模转换实验报告一.实验目的:1、掌握 TLC549同步串行接口的ADC模块的特性、编程原理,了解TLC5620的4种时序图以及产生波形幅度的计算方法。
2、能实现TLC549、TLC5620与MCS-51单片机的连接,分别进行数据采集和波形观测。
3、能采用Proteus ISIS软件进行串行模数转换的电路设计。
4、能运用MCS-51单片机汇编语言进行串行模数/数模转换实验的软件设计。
二.实验要求:1、将TLC549 与MCS-51单片机进行连接,利用汇编语言编写出数据采集程序,将转换的模拟电压以二进制的形式通过单片机的P0口输出显示。
1)将单片机的P0口与LED1~LED8连接起来,作为输出显示。
由于LED采用灌电流方式驱动,所以要将数据取反后再输出显示,以获得“正逻辑”效果2)利用P1口与TLC549的控制信号进行连接,TLC549的基准电压REF+端与基准电压+5V相连,将电位器的上端连接VCC、下端连接GND,抽头与TLC549的模拟输入ANIN连接。
在运行程序时,不断地调节电位器,使其抽头电压连续变化,通过LED1~LED8的状态观察ADC转换的结果。
3)运用Proteus ISIS软件完成串行模数转换实验的硬件电路设计。
4)实现KeilC与Proteus软件的联调。
2、设计软件程序,用单片机的I/O口控制TLC5620实现D/A转换,使其通道1产生一个三角波,而通道2产生一个和通道1周期、幅度均相同的方波。
1)短接B7区的电源供给跳线JP16,调节B7区的电位器W3,使其输出接线柱Verf的电压为2.6V。
2)将A2区P16、P17、T0、T1分别连接到B9区的CLK、DAT、LDAC、LOAD,将B7区Verf连接到B9区REF接线柱,短接B9区电源跳线JP13。
3)运行光盘中的相应程序,用双踪示波器的两个探头观察DACA、DACB输出的波形。
三.流水灯硬件电路图四.软件程序1. 串行模数实验程序流程图2.程序清单 1) 串行模数:SDO BIT P1.0 ;数据输出CS BIT P1.1 ;片选SCLK BIT P1.2 ;时钟ORG 8000HAJMP MAINORG 8100HMAIN: MOV SP,#60HLOOP: ACALL TLC549_ADCCPL A ;累加器A取反MOV P0,A ;数据给P0口ACALL DELAYSJMP MAINTLC549_ADC: PUSH 07HCLR A ;清零CLR SCLKMOV R6,#08H ;计数器赋初值CLR CS ;选中TLC549LOOP1:SETB SCLK ;SCLK置位,数据输出NOPNOPMOV C,SDORLC A ;累加器A循环左移CLR SCLK ;SDO=0,为读出下一位数据作准备 NOPDJNZ R6,LOOP1 ;R6-1→R6,判断R6=0SETB CS ;禁止TLC549,再次启动AD转换 SETB SCLKPOP 07HRETDELAY: PUSH 00HMOV R0,#00HDJNZ R0,$POP 00HRETEND2)串行数模:SCLA BIT P1.6SDAA BIT P1.7LOAD BIT P3.5LDAC BIT P3.4VOUTA DATA 30HVOUTB DATA 31HORG 8000HAJMP MAINORG 8100HMAIN:MOV SP,#60HNOPCLR SCLACLR SDAASETB LOADSETB LDACMOV R3,#0A2HMOV R4,#00HMOV VOUTA,#00HMOV R5,#0A2HMOV R6,#00HMOV VOUTB,#00HDACHANG:MOV R1,#01HMOV R2,VOUTALCALL DAC5620DJNZ R3,CONTINUEAMOV R3,#0A2HMOV A,R4CPL AMOV R4,ACONTINUEA:CJNE R4,#OFFH,CONTINUEB DEC R2SJMP CONTINUEC CONTINUEB:INC R2CONTINUEC:MOV VOUTA,R2MOV R1,#03HMOV R2,VOUTBLCALL DAC5620DJNC R5,CONTINUEDMOV R5,#042HMOV A,R6CPL AMOV R6,A CONTINUED:CJNE R6,#0FFH,CONTINUEE MOV R2,#OA2HSJMP CONTINUEF CONTINUEE:MOV R2,#00H CONTINUEF:MOV VOUTB,R2LJMP DACHANG DAC5620:MOV A,R1CLR SCLAMOV R7,#08HLCALL SENDBYTEMOV A,R2CLR SCLAMOV R7,#08HLCALL SENDBYTECLR LOADSETB LOADCLR LDACSETB LDACRETSENDBYTE:SETB SCLARLC AMOV SDAA,CCLR SCLADJNZ R7,SENDBYTE RETEND五.实验结果观察实验结果,可知道通过调节电位器,数字量在对应的发生改变。
51单片机综合学习系统——AD模数转换实验篇
51单片机综合学习系统——AD模数转换实验篇
庄建清;徐玮
【期刊名称】《电子制作》
【年(卷),期】2008(000)008
【摘要】大家好,通过以前的学习,我们已经对51单片机综合学习系统的使用方法及学习方式有所了解与熟悉,学会了使用SPI总线的基本知识,体会到了综合学习系统的易用性与易学性,这一期我们将一起学习AD模数转换的基本原理与应用实例。
【总页数】4页(P21-24)
【作者】庄建清;徐玮
【作者单位】无
【正文语种】中文
【中图分类】TP273.22
【相关文献】
1.51单片机综合学习系统—1602字符型液晶显示篇 [J], 徐玮
2.51单片机综合学习系统——12864点阵型液晶显示篇 [J], 孙鹏
3.51单片机综合学习系统——红外线遥控篇 [J], 徐玮
4.51单片机综合学习系统——DS18B20温度实验篇 [J], 徐玮
5.8051单片机与AD7706型A/D组成的模数转换系统 [J], 李明贵
因版权原因,仅展示原文概要,查看原文内容请购买。
51系列单片机与外围接口芯片的实验和技巧
51系列单片机与外围接口芯片的实验和技巧51系列单片机是一种常用的微控制器,具有广泛的应用领域。
为了提高单片机的功能和扩展其外围接口,常常需要使用外围接口芯片。
本文将介绍一些与51系列单片机配合使用的外围接口芯片的实验和技巧。
一、LCD液晶显示屏LCD液晶显示屏是一种常见的外围接口设备,可以用来显示各种信息。
与51系列单片机配合使用时,需要通过IO口进行数据和控制信号的交互。
在使用LCD液晶显示屏时,需要注意以下几点:1. 配置IO口的工作模式:将IO口设置为输出模式,以便向液晶显示屏发送控制信号和数据。
2. 使用延时函数:由于LCD液晶显示屏的响应速度较慢,需要在发送完数据后进行适当的延时,以确保数据能够被正确接收和显示。
3. 熟悉液晶显示屏的命令和数据格式:LCD液晶显示屏有自己的一套命令和数据格式,需要根据具体型号的要求进行设置。
二、ADC模数转换芯片ADC模数转换芯片可以将模拟信号转换为数字信号,常用于采集和处理模拟信号。
与51系列单片机配合使用时,需要注意以下几点:1. 配置IO口的工作模式:将IO口设置为输入模式,以便接收来自ADC芯片的模拟信号。
2. 设置ADC模数转换的精度:根据需要,可以调整ADC芯片的工作精度,以获得更高的准确性或更快的转换速度。
3. 调用ADC转换函数:通过调用相应的函数,可以启动ADC芯片进行模数转换,并获取转换结果。
三、DAC数模转换芯片DAC数模转换芯片可以将数字信号转换为模拟信号,常用于控制模拟设备的输出。
与51系列单片机配合使用时,需要注意以下几点:1. 配置IO口的工作模式:将IO口设置为输出模式,以便向DAC芯片发送数字信号。
2. 设置DAC数模转换的精度:根据需要,可以调整DAC芯片的工作精度,以获得更高的准确性或更大的输出范围。
3. 调用DAC转换函数:通过调用相应的函数,可以向DAC芯片发送数字信号,并控制其输出模拟信号的大小。
四、串口通信芯片串口通信芯片可以实现与其他设备的串口通信,常用于数据传输和远程控制。
51单片机AD和DA转换汇编程序
四、实验说明1、D/A 转换是把数字量转换成模拟量的变换,实验台上D /A 电路输出的是模拟电压信号。
要实现实验要求,比较简单的方法是产生三个波形的表格,然后通过查表来实现波形显示。
2、产生锯齿波和三角波的表格只需由数字量的增减来控制,同时要注意三角波要分段来产生。
要产生正弦波,较简单的方法是造一张正弦数字量表。
即查函数表得到的值转换成十六进制数填表。
D/A 转换取值范围为一个周期,采样点越多,精度越高些。
本例采用的采样点为256点/周期。
3、8位D/A 转换器的输入数据与输出电压的关系为U(0∽-5V)=Uref/256×N U(-5V ∽+5V)=2·Uref/256×N-5V (这里 Uref 为+5V)五、实验框图六、参考程序xdata unsig n ed char CS 0832 _at_ 0xa000;void Write 0832(unsig n ed char b){CS0832 = b;}void main(){Write 0832(0);Write 0832(0x80);Write 0832(0xff);开始否 是置计数器初值 查表读波形数据 启动D/A 改变计数器及表指针 转换完毕while(1);}/*========================================================== =*/CS0832 equ 0a000hmov dptr, #CS0832mov a, #00hmovx @dptr, amov a, #40hmovx @dptr, amov a, #80hmovx @dptr, amov a, #0c0hmovx @dptr, amov a, #0ffhmovx @dptr, aljmp $end硬件实验十三 A/D 模数转换实验一、实验要求利用实验板上的ADC 0809做A /D 转换器,实验板上的电位器提供模拟量输入,编制程序,将模拟量转换成二进制数字量,用8255的PA 口输出到发光二极管显示。
51单片机ad转换流程
51单片机ad转换流程51单片机是一种广泛应用于嵌入式系统中的微控制器。
与其他单片机相比,51单片机的特点之一是其模拟到数字转换功能(AD转换),它允许将模拟信号转换为数字量,以便进行数字信号处理和控制。
在本文中,我们将以“51单片机AD转换流程”为主题,详细介绍AD转换的步骤和相关概念。
第一步:了解AD转换的基本概念模拟到数字转换(AD转换)是电子系统中一种常见的操作。
它涉及将连续的模拟信号转换为离散的数字信号,以便进行数字信号处理。
AD转换的结果通常以二进制形式表示,可以被计算机或其他数字处理设备使用。
在AD转换过程中,最重要的参数是分辨率和采样率。
分辨率是指AD转换器能够分辨的最小信号变化量,通常以比特数表示。
例如,8位AD转换器的分辨率为2^8,即256个离散的信号水平。
采样率是指AD转换器每秒钟进行的样本数量,通常以赫兹(Hz)表示。
第二步:准备硬件连接在进行AD转换之前,需要连接电源、待转换的模拟信号源和51单片机上的AD输入引脚。
具体的硬件连接方式可以根据具体的应用需求和开发板设计进行调整。
通常情况下,待转换的模拟信号将通过电阻网络与AD输入引脚相连接。
这个电阻网络起到电压分压的作用,将输入信号的幅度限制在AD转换器可接受的范围内。
开发板上的AD输入引脚通常还具有可选的电容网络,用于去除输入信号中的高频噪声。
第三步:配置AD转换器参数在开始AD转换之前,需要通过编程设置51单片机上的AD转换器参数。
这些参数包括分辨率、输入通道选择、参考电压选择和采样率等。
这些参数的设置是通过对寄存器的操作来实现的。
通过写入相应的寄存器值,我们可以选择转换的分辨率。
51单片机上的AD转换器可以支持不同的分辨率,如8位、10位或12位。
选择转换的输入通道也是一个重要的步骤。
通常情况下,AD转换器具有多个输入信道,可以同时转换多个信号。
需要根据具体的信号源,选择合适的输入通道。
参考电压的选择也要根据具体的应用需求来确定。
单片机AD转换
单⽚机AD转换摘要AD转换器是⼀种能把输⼊模拟电电压或电电流变成与它成正⽐的数数字量,即能把被控对对象的各种模拟信息变成计计算机可以识别的数字信息。
本电路由AD转换器,8255,单⽚机组成,其中AD转换器器由ADC0809集成芯⽚组成。
AD转换器要将时间和幅值都连续的模拟量,转换为时间、幅值都离散的数字量,⼀般要经过取样、保持和量化、编码⼏个过程。
本设计与市场同类产品设计相⽐,具有电路简单、结构合理、制作⽅便、⼯作可靠、功能齐全等优势。
关键词:AD转换器单⽚机 8255⽬录⼀、课程设计⽬的-----------------------------------------1⼆、课程设计内容与要求--------------------------------2三、芯⽚简介-----------------------------------------------3(⼀) A/D转换芯⽚0809引脚图与功能简介(⼆)8051单⽚机引脚图与引脚功能简介(三)8255引脚图及功能描述四、设计⽅案----------------------------------------------10五、程序设计及硬件电路-------------------------------11(⼀)原程序(⼆)修改后程序(三)硬件电路图六、课程设计总结-----------------------------------------14七、参考书⽬---------------------------------------------- 15⼀、课程设计⽬的单⽚机课程设计的⽬的就是要锻炼学⽣的实际动⼿能⼒。
在理论学习的基础上,通过完成⼀个具有综合功能的⼩系统,使学⽣将课堂上学到的理论知识与实际应⽤结合起来,对电⼦电路、电⼦元器件等⽅⾯的知识进⼀步加深认识,同时在软件编程、调试、相关仪器设备的使⽤技能等⽅⾯得到较全⾯的锻炼和提⾼,为今后能够独⽴设计单⽚机应⽤系统的开发设计⼯作打下⼀定的基础。
基于51单片机的模数转换(AD)实验设计
HEFEI UNIVERSITY单片机课程综述报告主题基于51单片机的模数转换(A/D)实验设计姓名郭丽丽专业通信工程学号**********班级11级通信(1)班指导老师汪济洲2014 年 6 月 2 日目录1.实验目的与要求 (1)1.1实验目的 (1)1.2实验要求 (1)2.实验原理 (1)2.1电路原理图 (1)2.2 Proteus7.4 软件简介 (2)3、实验步骤 (5)4、源程序代码 (5)5. 实验结果分析 (10)6.总结 (10)1.实验目的与要求1.1实验目的1.掌握A/D转换与单片机的接口方法2.了解A/D芯片ADC0809转换性能及编程方法3.通过实验了解单片机如何进行数据采集1.2实验要求1.采用查询法或中断法编程进行A/D采集;2.采集0~5V范围的电压信号(以电位器模拟被测信号),使用4位串行数码管显示0~5V数值,小数点保留三位,实现简易电压表功能。
2.实验原理2.1电路原理图熟悉8051的输入输出端口的使用方法, 本实验的电路连接如图1所示。
图1 连接电路2.2 Proteus7.4 软件简介Proteus是英国Labcenter公司开发的电路分析与实物仿真软件。
它运行于Windows操作系统上,可以仿真、分析(SPICE)各种模拟器件和集成电路,该软件的特点是:①实现了单片机仿真和SPICE电路仿真相结合。
具有模拟电路仿真、数字电路仿真、单片机及其外围电路组成的系统的仿真、RS232动态仿真、I2C调试器、SPI调试器、键盘和LCD系统仿真的功能;有各种虚拟仪器,如示波器、逻辑分析仪、信号发生器等。
②支持主流单片机系统的仿真。
目前支持的单片机类型有:ARM7(LPC21xx)、8051/52系列、AVR系列、PIC10/12/16/18系列、HC11系列以及多种外围芯片。
③提供软件调试功能。
在硬件仿真系统中具有全速、单步、设置断点等调试功能,同时可以观察各个变量、寄存器等的当前状态,因此在该软件仿真系统中,也必须具有这些功能;同时支持第三方的软件编译和调试环境,如Keil C51 uVision2、MPLAB等软件。
51单片机课程设计--AD转换
51-单片机课程设计题目:用PCF8591P芯片对电位器上的电压进行AD采样,将采到的数据用1602LCD进行显示。
姓名: 学号:学院:专业: 指导教师:目录1、PCF8591概述 (3)2、芯片介绍 (3)3、PCF8591的A/D 转换 (4)4、A/D转换程序设计流程 (5)5、1602LCD主要技术参数 (7)6、Proteus仿真原理图 (10)7、程序代码 (10)8、结语 (17)9、参考文献 (17)1、PCF8591 概述PCF8591 是一种具有 I2C 总线接口的 8 位 A/D D/A 转换芯片,在与 CPU 的信息传输过程中仅靠时钟线 SCL 和数据线 SDA 就可以实现。
I2C 总线是Philips (飞利浦)公司推出的串行总线,它与传统的通信方式相比具有读写方便,结构简单,可维护性好,易实现系统扩展,易实现模块化标准化设计,可靠性高等优点。
2、芯片介绍2.1内部结构及引脚功能描述PCF8591 为单一电源供电(2.5 6 V)典型值为 5 V,CMOS 工艺 PCF8591 有 4 路 8 位 A/D 输入,属逐次比较型,内含采样保持电路; 1 路 8 位 D/A 输出,内含有 DAC的数据寄存器 A/D D/A 的最大转换速率约为 11 kHz,但是转换的基准电源需由外部提供 PCF8591 的引脚功能如图1所示图1 PCF8591引脚功能2.2片内可编程功能设置在 PCF8591 内部的可编程功能控制字有两个,一个为地址选择字,另一个为转换控制字 PCF8591 采用典型的I2C总线接口的器件寻址方法,即总线地址由器件地址引脚地址和方向位组成 Philips (飞利浦)公司规定 A/D器件高四位地址为 1001,低三位地址为引脚地址A0A1A2,由硬件电路决定,地址选择字格式具体描述如表 2 所示因此 I2C 系统中最多可接 23=8 个具有总线接口的A/D 器件地址的最后一位为方向位 R/W,当主控器对 A/D 器件进行读操作时为1,进行写操作时为 0 总线。
基于51单片机和ADC0809多通道模数转换的设计与实现
基于51单片机和ADC0809多通道模数转换的设计与实现一、硬件结构
本文采用51单片机作为控制器,ADC0809多通道模数转换芯片作为
输入,用LED显示检测到的数据,通过串口(UART)与电脑端(PC)连接,软件编程实现数据采集和转换。
1.ADC0809芯片
ADC0809是一款8位8通道模拟采样数据转换器,采用多重码轮结构,具有数据校正、自动零点抑制(AZC)和同步数据转换的特点。
多重码轮
结构可提供8位分辨率,给定的数据可在10个微秒内完成转换。
2.51单片机
51单片机是一种8位元的定时器/计算机结构,包括单指令,双指令,程序可编程I/O芯片,具有模拟/数字转换、无线电和控制功能,并具有
多重定时器/计数器,多个PWM管脚和多个外部中断管脚。
它具有低功耗,非常适合多功能控制和自动测试的应用场合。
3.串口
串口(UART)是一种通信接口,它可以将一定的数据传输到电脑端(PC),从而实现两设备之间的通信。
4.LED显示
LED可以将检测到的数据呈现在外观上,以便更好地使用和管理检测
到的数据。
二、实现原理
本文采用51单片机对ADC0809多通道模数转换的四个外部模拟输入采集,经过多通道模数转换。
51单片机ad转换代码及仿真
51单片机AD转换代码及仿真1. 任务概述本文主要探讨51单片机模拟信号的AD(模数转换)过程以及相关代码的编写和仿真。
通过本文,读者将了解到51单片机的AD转换原理、AD转换的流程、具体代码实现方法以及如何使用仿真软件进行验证和调试。
2. 51单片机的AD转换原理[为了实现模拟信号到数字信号的转换,51单片机内置了一部分模拟数字转换器(ADC)。
ADC是一种电子元器件,它可以将模拟信号转换成数字信号。
模拟信号是连续的,而数字信号是离散的。
模拟信号转换成数字信号的过程叫做AD(模数转换),其原理可以简单描述如下:]1.首先,模拟信号通过模拟输入引脚进入51单片机中的ADC模块。
2.ADC模块将模拟信号进行采样,即对信号进行离散化处理,将离散化后的采样值存储在一个寄存器中。
3.采样值随后会经过数字化处理,变成具有一定精度的数字量。
4.数字量经过处理后,嵌入系统可以根据其数值进行分析、判断和控制。
3. 51单片机的AD转换流程[51单片机的AD转换流程可以分为以下几个步骤:]3.1 设置ADC模块在使用51单片机进行AD转换之前,需要先设置ADC模块的相关参数,如引脚选择、参考电压选择、时钟频率等。
这些设置可通过写入ADC相关的寄存器来完成。
3.2 启动转换设置完成后,可以通过设置一个特定的位来启动AD转换。
一旦AD转换开始,51单片机将根据设置的参数自动进行转换操作。
3.3 等待转换完成在启动AD转换后,需要等待转换完成。
此时,可以通过查询ADC模块的状态位来判断转换是否完成。
3.4 读取转换结果转换完成后,可以通过读取ADC寄存器的值来获取AD转换结果。
这个值将会代表输入模拟信号的数字化数值。
4. 51单片机AD转换的代码实现[以下给出一个简单的51单片机AD转换的代码示例。
本示例假设选用了P1口作为ADC的输入引脚,使用AVCC作为参考电压,时钟频率为12MHz。
]#include <reg52.h>// 引入51单片机的头文件sbit ADC_IN = P1^0; // 定义P1.0为ADC输入引脚void ADC_Init() {// 设置ADC参考电压为AVCCADMUX = (1<<REFS0);// 设置ADC输入通道为ADC0(P1.0)ADMUX |= (1<<MUX0);// 启用ADC模块,设置ADC时钟频率为F_CPU/8ADCSRA = (1<<ADEN) | (1<<ADPS1) | (1<<ADPS0);}unsigned int ADC_Read() {unsigned int adc_value = 0;// 设置ADC转换开始位ADCSRA |= (1<<ADSC);// 等待转换完成while (ADCSRA & (1<<ADSC));// 读取ADC寄存器的值adc_value = ADCL;adc_value |= (ADCH<<8);return adc_value;}void main() {unsigned int adc_result = 0;ADC_Init(); // 初始化ADC模块while (1) {adc_result = ADC_Read(); // 读取ADC转换结果// 在此处对结果进行处理或输出}}在以上示例代码中,首先通过ADC_Init()函数对ADC进行初始化设置。
8位数模转换器ADC0809实验报告
4、在Text中编写自己的程序,我们需要把51单片机的头文件添加上去,这个是#include<reg51.h>,写好之后把它保存再添加到工程里,这里需要我们注意,是点project的source group里面的Add Files to…… 。
Vcc:电源,单一+5V。
GND:地。
主要特性:
(1)8路输入通道,8位A/D转换器,即分辨率为8位。
(2)具有转换起停控制端。
(3)转换时间为100μs(时钟为640KHz时),130μs(时钟为500KHz时)。
(4)单个+5V电源供电。
(5)模拟输入电压范围0~+5V,不需零点和满刻度校准。
(6)工作温度范围为-40~+85摄氏度。
(7)低功耗,约15mW。
3、晶振电路
本设计系统采用内部时钟方式,利用单片机内部的高增益反相放大器,外部电路简,只需要一个晶振和 2个电容即可,如下图所示。
晶Hale Waihona Puke 电路电路中的器件选择可以通过计算和实验确定,也可以参考一些典型电路。参数,电路中,电容器C1和C2对震荡频率有微调作用,通常的取值范围是30±10pF,在这个系统中选择了22pF;石英晶振选择范围最高可选24MHz,它决定了单片机电路产生的时钟信号震荡频率,在本系统中选择的是12MHz,因而时钟信号的震荡频率为12MHz。
/PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。
/EA/VPP:当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。
单片机AD模数转换实验报告
一、实验目的和要求1、掌握单片机与ADC0809的接口设计方法。
2、掌握Proteus软件与Keil软件的使用方法。
二、设计要求。
1、用Proteus软件画出电路原理图,在单片机的外部扩展片外三总线,并通过片外三总线与0809接口。
2、在0809的某一模拟量输入通道上接外部模拟量。
3、在单片机的外部扩展数码管显示器。
4、分别采用延时和查询的方法编写A/D转换程序。
5、启动A/D转换,将输入模拟量的转换结果在显示器上显示。
三、电路原理图。
图1、电路仿真图四、实验程序流程框图和程序清单。
1、 查询法:ORG 0000H START: LJMP MAIN ORG 0100H MAIN: MOV SP, #2FH NT: MOV DPTR, #0FF78H MOVX @DPTR, A LOOP: JB P3.3, LOOP MOVX A, @DPTR MOV B, #51 DIV AB MOV R0, A MOV A, B MOV B, #5 DIV AB MOV R1, A MOV R2, B LCALL DIR SJMP NT DIR: MOV R7, #0 SJMP LOOP1 BH: MOV A, R1 MOV R2, A LOOP1: MOV DPTR, #WK MOV A, R7 MOVC A, @A+DPTR MOV P2, A MOV DPTR, #DK MOV A, R2 MOVC A, @A+DPTR MOV P1, A LCALL DELAY INC R7 CJNE R7, #2, BH MOV DPTR, #WK MOV A, R7 MOVC A, @A+DPTR MOV P2, A MOV DPTR, #DK MOV A, R0 MOVC A, @A+DPTR ANL A, #7FH MOV P1, A LCALL DELAY RETDELAY: MOV R5, #01HDL1: MOV R4, #8EH DL0: MOV R3, #02H DJNZ R3, $DJNZ R4, DL0DJNZ R5, DL1 RET WK: DB 10H DB 20H DB 40H DK: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90Hdisplay 送百分位字符代码送位选信号延时1ms 送十分位字符代码送位选信号延时1ms 送个位及小数点字符代码送位选信号延时1ms 熄灭第四位数码管延时1ms 返回display送百分位字符代码送位选信号延时1ms送十分位字符代码送位选信号延时1ms 送个位及小数点字符代码送位选信号延时1ms熄灭第四位数码管延时1ms返回END2、延时法:ORG 0000HSTART: LJMP MAINORG 0100HMAIN: MOV SP, #2FHLOOP: MOV DPTR, #0FF78HMOVX @DPTR, ALCALL DELAYMOVX A, @DPTRMOV B, #51DIV ABMOV R0, AMOV A, BMOV B, #5DIV ABMOV R1, AMOV R2, BLCALL DIRSJMP LOOPDIR: MOV R7, #0SJMP LOOP1BH: MOV A, R1MOV R2, ALOOP1: MOV DPTR, #WKMOV A, R7MOVC A, @A+DPTRMOV P2, AMOV DPTR, #DKMOV A, R2MOVC A, @A+DPTRMOV P1, ALCALL DELAYINC R7CJNE R7, #2, BHMOV DPTR, #WKMOV A, R7MOVC A, @A+DPTRMOV P2, AMOV DPTR, #DKMOV A, R0MOVC A, @A+DPTRANL A, #7FHMOV P1, ALCALL DELAYRETDELAY: MOV R5, #01HDL1: MOV R4, #8EHDL0: MOV R3, #02HDJNZ R3, $DJNZ R4, DL0DJNZ R5, DL1RETWK: DB 10HDB 20HDB 40H开始启动AD延时从AD中取数据数据处理结束调显示子函数DK: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90HEND五、实验结果。
实验5:A∕D转换和D∕A转换实验
A/D转换实验一、实验目的1.学习理解模/数信号转换的基本原理。
2.掌握模/数转换芯片ADC0809的使用方法。
3.掌握模/数转换芯片ADC0809的接口扩展、程序设计及调试方法。
二、实验设备PC机一台,TD-NMC+教学实验系统一台,万用表一只。
三、实验内容编写实验程序,将ADC单元中提供的0V~5V信号源作为ADC0809的模拟输入量,进行A/D转换,转换结果通过寄存器或变量进行显示。
四、实验原理ADC0809包括一个8位的逐次逼近型的ADC部分,并提供一个8通道的模拟多路开关和联合寻址逻辑。
用它可直接输入8个单端的模拟信号,分时进行A/D转换,在多点巡回检测、过程控制等应用领域中使用非常广泛。
ADC0809的主要技术指标为:·分辨率:8位·单电源:+5V·总的不可调误差:±1LSB·转换时间:取决于时钟频率当时钟频率CLOCK=640kHz时,转换时间为100µs当时钟频率CLOCK=500kHz时,转换时间为128µs·模拟输入范围:单极性0~5V·时钟频率范围:10KHz~1280KHzADC0809的外部管脚如图3-2-1所示,地址信号与选中通道的关系如表3-2-1所示。
图3-2-1 ADC0809外部引脚图表3-2-1地址信号与选中通道的关系A/D转换单元原理图如图3-2-2所示。
图3-2-2 A/D转换单元原理图五、实验步骤1.按图3-2-3连接实验线路,AD的时钟线需要与实验平台中的系统总线单元的CLK 相连;2.编写实验程序,经编译、链接无误后装入系统,启动调试;3.在AD模拟信号采集程序调用语句之后设置断点,使用万用表测量ADJ端的电压值,计算对应的采样值,然后运行程序;4.程序运行到断点处停止运行,查看寄存器窗口中R0的值,与计算的理论值进行比较,看是否一致(可能稍有误差,相差不大);5.调节电位器,改变输入电压,继续执行程序,程序再次运行到断点处停止运行,比较此时R0的值与理论计算值;6.反复进行步骤5的操作,验证程序功能,制表并记录结果。
ad模数转换51单片机程序流程
ad模数转换51单片机程序流程下载提示:该文档是本店铺精心编制而成的,希望大家下载后,能够帮助大家解决实际问题。
文档下载后可定制修改,请根据实际需要进行调整和使用,谢谢!本店铺为大家提供各种类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by this editor. I hope that after you download it, it can help you solve practical problems. The document can be customized and modified after downloading, please adjust and use it according to actual needs, thank you! In addition, this shop provides you with various types of practical materials, such as educational essays, diary appreciation, sentence excerpts, ancient poems, classic articles, topic composition, work summary, word parsing, copy excerpts, other materials and so on, want to know different data formats and writing methods, please pay attention!引言AD模数转换是数字系统设计与嵌入式系统开发中常常遇到的问题,其原理和应用十分重要。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
HEFEI UNIVERSITY单片机课程综述报告主题基于51单片机的模数转换(A/D)实验设计姓名郭丽丽专业通信工程学号班级11级通信(1)班指导老师汪济洲2014 年 6 月 2 日目录1.实验目的与要求 (1)1.1实验目的 (1)1.2实验要求 (1)2.实验原理 (1)2.1电路原理图 (1)2.2 Proteus7.4 软件简介 (2)3、实验步骤 (6)4、源程序代码 (7)5. 实验结果分析 (12)6.总结 (13)1.实验目的与要求1.1实验目的1.掌握A/D转换与单片机的接口方法2.了解A/D芯片ADC0809转换性能及编程方法3.通过实验了解单片机如何进行数据采集1.2实验要求1.采用查询法或中断法编程进行A/D采集;2.采集0~5V围的电压信号(以电位器模拟被测信号),使用4位串行数码管显示0~5V数值,小数点保留三位,实现简易电压表功能。
2.实验原理2.1电路原理图熟悉8051的输入输出端口的使用方法, 本实验的电路连接如图1所示。
图1 连接电路2.2 Proteus7.4 软件简介Proteus是英国Labcenter公司开发的电路分析与实物仿真软件。
它运行于Windows操作系统上,可以仿真、分析(SPICE)各种模拟器件和集成电路,该软件的特点是:①实现了单片机仿真和SPICE电路仿真相结合。
具有模拟电路仿真、数字电路仿真、单片机及其外围电路组成的系统的仿真、RS232动态仿真、I2C调试器、SPI调试器、键盘和LCD系统仿真的功能;有各种虚拟仪器,如示波器、逻辑分析仪、信号发生器等。
②支持主流单片机系统的仿真。
目前支持的单片机类型有:ARM7(LPC21xx)、8051/52系列、AVR系列、PIC10/12/16/18系列、HC11系列以及多种外围芯片。
③提供软件调试功能。
在硬件仿真系统中具有全速、单步、设置断点等调试功能,同时可以观察各个变量、寄存器等的当前状态,因此在该软件仿真系统中,也必须具有这些功能;同时支持第三方的软件编译和调试环境,如Keil C51 uVision2、MPLAB等软件。
④具有强大的原理图绘制功能。
总之,该软件是一款集单片机和SPICE分析于一身的仿真软件,功能极其强大。
其操作界面如下图所示:图2 Proteus操作页面2.模数转换(A/D)实验设计ADC0809简介ADC0809是带有8位A/D转换器、8路多路开关以及微处理机兼容的控制逻辑的CMOS组件。
它是逐次逼近式A/D转换器,可以和单片机直接接口。
图3 ADC0809的部逻辑结构图4 ADC0809芯片ADC0809由一个8路模拟开关、一个地址锁存与译码器、一个A/D转换器和一个三态输出锁存器组成。
多路开关可选通8个模拟通道,允许8路模拟量分时输入,共用A/D转换器进行转换。
三态输出锁器用于锁存A/D转换完的数字量,当OE端为高电平时,才可以从三态输出锁存器取走转换完的数据。
ADC0809的部逻辑结构:由下图可知,ADC0809由一个8路模拟开关、一个地址锁存与译码器、一个A/D转换器和一个三态输出锁存器组成。
多路开关可选通8个模拟通道,允许8路模拟量分时输入,共用A/D转换器进行转换。
三态输出锁器用于锁存A/D 转换完的数字量,当OE端为高电平时,才可以从三态输出锁存器取走转换完的数据。
图5 ADC0809的部逻辑结构ADC0809各脚功能如下:D7-D0:8位数字量输出引脚。
IN0-IN7:8位模拟量输入引脚。
VCC:+5V工作电压。
GND:地。
REF(+):参考电压正端。
REF(-):参考电压负端。
START:A/D转换启动信号输入端。
ALE:地址锁存允许信号输入端。
(以上两种信号用于启动A/D转换)EOC:转换结束信号输出引脚,开始转换时为低电平,当转换结束时为高电平。
OE:输出允许控制端,用以打开三态数据输出锁存器。
CLK:时钟信号输入端(一般为500KHz)。
A、B、C:地址输入线。
3、实验步骤1.Proteus软件中绘制单片机实验电路;2.在Keil C软件中编制汇编或C程序,软件调试;3.在Proteus中加载实验程序,观察并记录实验结果。
4、源程序代码#include <reg52.h>//*******************引脚定义********************//sbit dis_ab=P3^0;sbit dis_clk=P3^1;sbit CLK=P3^4;sbit ST=P3^5;sbit EOC=P3^6;sbit OE=P3^7;//*****************7SEG-LED段码表****************//Unsigned char codeLedTab[21]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x76,0x73,0x3e,0x00, 0x40};//************************************************//unsigned char data num_1; //存储十六进制转化为两个单十六进制数的值unsigned char data num_2;unsigned char data num_3;unsigned char data num_4;void Delay(unsigned int x);void DispClk(void);void DisplaySerial(unsigned char x);void ClearLed(unsigned char x);void HexToDec(unsigned int x);void main(){unsigned long num;ST=0;OE=0;while(1){ST=1; //发高脉冲启动采样信号ST=0;do{CLK=!CLK;}//提供采样时钟信号,直到采样结束为止while(!EOC);OE=1;num=P1; //读取采样值num=5000*num/255; //将0~#FFH采样值转化为0~5V数值(0~5000)HexToDec(num); //将16进制数据,转换为10进制数据,以便于数码管显示ClearLed(4);DisplaySerial(num_4); //依次从高位到低为显示采样电压值DisplaySerial(num_3);DisplaySerial(num_2);DisplaySerial(num_1);Delay(30000); //采样延时间隔,决定采样频率}}//********************延时子程序********************//void Delay(unsigned int x){unsigned int j;for(j=0;j<x;j++){};}//********************************//功能:串行模拟时钟注意事项:用到delay.h中的延时子程序形参:无//********************************//void DispClk(void){dis_clk=1;Delay(1);dis_clk=0;Delay(1);}//********************************//功能:发送一个数字到串行LED上形参:unsigned char x:0-20//********************************//void DisplaySerial(unsigned char x){unsigned char i;unsigned char num_serial=LedTab[x];for(i=0;i<8;i++){dis_ab=(bit)(num_serial&0x80);num_serial<<=1;DispClk();}}//********************************//功能:清串行LED显示形参:unsigned char x = 需要清显示的LED数//********************************//void ClearLed(unsigned char x){unsigned char i;for(i=0;i<(x<<3);i++){DispClk();dis_ab=0;}}void HexToDec(unsigned int x) //十六进制转十进制{num_1=x%10; //个位x=x/10;num_2=x%10; //十位x=x/10;num_3=x%10;x=x/10;num_4=x%10;}5.实验结果分析通过改变POT-LIN原件滑片的位置即可调整输入的物理模拟量,可以发现输出的数字信号即观察LED的显示效果的不同。
通过实验,会发现:(1)当POT-LIN原件上的滑片位置位于参考图的上方时,LED会全亮;(2)当POT-LIN原件上的滑片位于最下方时,LED全暗;(3)当POT-LIN原件上的滑片位于上下之间的位置时,则会有其对应的LED显示效果。
LED显示效果如下图示:图6 LED效果图6.总结通过此次实验,让我学习了A/D 转换与单片机的接口方法。
对A/D 芯片ADC0809 转换性能及编程方法有了深入的了解,通过实验了解单片机如何进行数据采集,锻炼了编程能力。
总的来说,经过这几个星期的单片机课程的学习,使我们对单片机有了一定的了解,老师只是引导我们入门,要想深入学习还得课下花时间自己钻研。