实验十adc0832数模转换的显示
单片机驱动ADC0832模数转换程序
单片机驱动ADC0832模数转换程序ADC0832是美国国家半导体公司生产的一种8位分辨率、双通道A/D转换芯片。
ADC0832具有以下特点:8位分辨率;双通道A/D转换;输入输出电平与TTL/CMOS相兼容;5V电源供电时输入电压在0~5V之间;工作频率为250KHZ,转换时间为32μS;一般功耗仅为15mW;8P、14P—DIP(双列直插)、PICC多种封装;商用级芯片温宽为0°C to +70°C?,工业级芯片温宽为40℃ to +85℃模数转换芯片是用来模拟信号转为数字信号以便电脑处理的,可以用来对传感器的数据进行收集分析。
本来想买ADC0809的,它可以对8个模拟量进行采集,假如是一个脚用三个压力传感器,那就正好够用了。
这个ADC0832是跟单片机开发板一个淘宝店买的,因为那个淘宝店没有ADC0809。
网上搜了个ADC0832的转换函数,拼了个程序在开发板的四位数码管上显示转换过来的数据,要注意的是那个显示函数是调一次只显示四位数码管的一位的,所以不能转换显示转换显示这样,要转换,显示一次二次三次四次,转换,显示一次二次三次四次这样。
ADC0832引脚及代码如下:(一晚没睡,等下准备回家过清明扫墓去。
归去来兮!问西楼禁烟何处好?绿野晴天道。
马穿杨柳嘶,人倚秋千笑,探莺花总教春醉倒。
)//头文件: #include ; #include ;//变量定义:unsigned char ly_dis[4];//定义显示缓冲区code unsigned chartable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, 0x80,0x90};//表:共阳数码管 0-9unsigned char l_posit=0; //显示位置//引脚定义:sbit SMG_q = P3^4; //定义数码管阳级控制脚(千位)sbit SMG_b = P3^5; //定义数码管阳级控制脚(百位)sbit SMG_s = P3^7; //定义数码管阳级控制脚(十位)sbit SMG_g = P3^6; //定义数码管阳级控制脚(个位) sbit CS= P0^5;sbit Clk = P0^6;sbit DATI = P0^4;sbit DATO = P0^4;unsigned char dat = 0x00;//AD值unsigned char count = 0x00;//定时器计数unsigned char CH;//通道变量//函数声明:void display(void);//显示函数,显示缓冲区内容void delay(void);//unsigned char GetValue0832(bit Channel); unsigned char adc0832(unsigned char CH);//主函数,C语言的入口函数:void main(){unsigned int i=0;int ltemp;while(1){if(i==100){ltemp=adc0832(1);//隔时取模数转换(0~255对应0.00-5.00的电压) ly_dis[0]=ltemp/100;//显示百位值ltemp=ltemp%100;ly_dis[1]=ltemp/10; //显示十位值ltemp=ltemp%10;ly_dis[2]=ltemp/1; //显示个位值ly_dis[3]=0; //显示小数点后一位0}i++;if(i==3000)i=0;display(); //调用显示调一次只显示一位轮流显示四位delay();}}//显示函数,参数为显示内容void display(){P0=0XFF;//switch(l_posit){case 0: //选择千位数码管,关闭其它位SMG_q=0;SMG_b=1;SMG_g=1;P0=table[ly_dis[0]]; //输出显示内容 break;case 1: //选择百位数码管,关闭其它位 SMG_q=1;SMG_b=0;SMG_s=1;SMG_g=1;P0=table[ly_dis[1]];break;case 2: //选择十位数码管,关闭其它位 SMG_q=1;SMG_b=1;SMG_s=0;SMG_g=1;P0=table[ly_dis[2]]&0x7f;break;case 3: //选择个位数码管,关闭其它位 SMG_q=1;SMG_b=1;SMG_s=1;P0=table[ly_dis[3]];break;}l_posit++; //每调用一次将轮流显示一位if(l_posit>;3)l_posit=0;}//延时子函数,短暂延时void delay(void){unsigned char i=10;while(i--);}/************************************************ ****************************函数功能:AD转换子程序入口参数:CH出口参数:dat************************************************* ***************************/unsigned char adc0832(unsigned char CH) {unsigned char i,test,adval;adval = 0x00;test = 0x00;Clk = 0;//初始化DATI = 1;_nop_();CS = 0;_nop_();Clk = 1;_nop_();if ( CH == 0x00 )//通道选择{Clk = 0;DATI = 1;//通道0的第一位_nop_();Clk = 1;_nop_();Clk = 0;DATI = 0;//通道0的第二位 _nop_();Clk = 1;_nop_();}else{Clk = 0;DATI = 1;//通道1的第一位 _nop_();Clk = 1;_nop_();Clk = 0;DATI = 1;//通道1的第二位_nop_();Clk = 1;_nop_();}Clk = 0;DATI = 1;for( i = 0;i ;>;= 1; if (DATO)test |= 0x80;elsetest |= 0x00;_nop_();Clk = 1;_nop_();Clk = 0;}if (adval == test)//比较前8位与后8位的值,如果不相同舍去。
0832 DA转换器实验
集美大学计算机工程学院实验报告课程名称微机系统与接口技术实验名称实验五0832 D/A转换器实验实验类型设计型姓名学号日期地点成绩教师1. 实验目的及内容1.1实验目的1.了解数模转换的原理及与8086的接口逻辑。
2.掌握使用DAC0832进行数模转换的技术。
1.2实验内容1)设计DAC0832与8086CPU的硬件连接图,分配DAC0832的基地址为0FF00H。
2)设计DAC0832的硬件连接,编写程序,实现让0832依次输出方波、负向锯齿波、三角波、正弦波、,并不断重复。
要求在示波器上可看到每个波形2个完整的波形。
产生正弦波的数据如下:7FH,8BH,96H,0A1H,0ABH,0B6H,0C0H,0C9H,0D2H0DAH,0E2H,0E8H0EEH,0F4H,0F8H,0FBH,0FEH,0FFH,0FFH,0FFH,0FEH,0FBH,0F8H,0F4H0EEH,0E8H,0E2H,0DAH,0D2H,0C9H,0C0H,0B6H,0ABH,0A1H,096H,08BH07FH74H,69H,5EH,54H,49H,40H,36H,2DH,25H,1DH,17H11H,0BH,7,4,2,0,0,0,2,4,7,0BH11H,17H,1DH,25H,2DH,36H,40H,49H,54H,5EH,69H,74H3)画出各种波形的示意图,并在示意图上标示出波形的最高、最低峰值和周期(根据示波器测量各种波形的最高、最低峰值与波形的周期)。
2. 实验环境星研电子软件,STAR系列实验仪一套、PC机一台、导线若干3. 实验方法DAC0832是双列直插式8位D/A转换器。
能完成数字量输入到模拟量(电流)输出的转换。
本次实验将形成各种波形的数字量送给DAC0832D/A转换器形成模拟电流量,再将模拟量送到示波器显示出来。
编程时用地址0FF00H的选通作为CS和WR的控制信号,DAC0832输入一个数字量,经过转换器转换后变成一个电压模拟量,输出到示波器并显示,编程时设置一个合适的延时来间隔每个数字量的输入,当向示波器输入一组完整的波形数据后,示波器上显示将显示对应的完整波形。
实验 ADC0809-0832模数转换实验
实验十三ADC0809模数转换实验一、实验目的1、掌握ADC0809模/数转换芯片与单片机的连接方法及ADC0809的典型应用。
2、掌握用查询方式、中断方式完成模/数转换程序的编写方法。
二、实验说明本实验使用ADC0809模数转换器,ADC0809是8通道8位CMOS逐次逼近式A/D转换芯片,片内有模拟量通道选择开关及相应的通道锁存、译码电路,A/D转换后的数据由三态锁存器输出,由于片内没有时钟需外接时钟信号。
下图为该芯片的引脚图。
各引脚功能如下:IN0~IN7:八路模拟信号输入端。
ADD-A、ADD-B、ADD-C:三位地址码输入端。
八路模拟信号转换选择由这三个端口控制。
CLOCK:外部时钟输入端(小于1MHz)。
D0~D7:数字量输出端。
OE:A/D转换结果输出允许控制端。
当OE为高电平时,允许A/D转换结果从D0~D7端输出。
ALE:地址锁存允许信号输入端。
八路模拟通道地址由A、B、C输入,在ALE信号有效时将该八路地址锁存。
START:启动A/D转换信号输入端。
当START端输入一个正脉冲时,将进行A/D转换。
EOC:A/D转换结束信号输出端。
当 A/D转换结束后,EOC输出高电平。
Vref(+)、Vref(-):正负基准电压输入端。
基准正电压的典型值为+5V。
V CC和GND:芯片的电源端和地端。
三、实验步骤1、单片机最小应用系统1的 P0口接A/D转换的D0~D7口,单片机最小应用系统1的Q0~Q7口接0809的A0~A7口,单片机最小应用系统1的WR、RD、P2.0、ALE、INT1分别接A/D转换的WR、RD、P2.0、CLOCK、INT1,A/D转换的IN接入+5V,单片机最小应用系统1的P1.0、P1.1连接到串行静态显示实验模块的DIN、CLK。
2、用串行数据通信线连接计算机与仿真器,把仿真器插到模块的锁紧插座中,请注意仿真器的方向:缺口朝上。
3、打开Keil uVision2仿真软件,首先建立本实验的项目文件,接着添加 AD转换.ASM源程序,进行编译,直到编译无误。
51单片机驱动ADC0832模数转换程序lcd1602显示
51单片机驱动ADC0832模数转换程序-lcd1602显示/*这个芯应用不多*/#include ;#define uchar unsigned char#define uint unsigned intuchar Chan0Value,Chan1Value;sbit RS=P1^0; //1602各控制脚sbit RW=P1^1;sbit EN=P1^2;sbit Cs0832= P2^0;//0832各控制脚sbit Clk0832= P3^6;sbit Di0832= P3^7;sbit Do0832= P3^7;void delay1ms(unsigned int ms)//延时1毫秒(不够精确的){int i,j;for(i=0;i;>;i;}for(i=0;i<8;i++)//从低到高取一次数{if(Do0832) Dat2|=0x01<<i;Clk0832=1; //下降沿有效Clk0832=0;}Cs0832=1;Di0832=1;Clk0832=1; //数据读取完成,释放所有数据线if(Dat1==Dat2)return Dat1; //校验两次数相等,输出}/*本程序与其他一般程序最大的不同就是要读两次一次从最高位到最低位,一次从最低位到最高位,两次所读值相等即为正常,可以输出*//******************************LCD1602*********** ***************************//*************************lcd1602程序**************************/void wr_com(unsigned char com)//写指令// { delay1ms(1);RS=0;RW=0;EN=0;P0=com;delay1ms(1);EN=1;delay1ms(1);EN=0;}void wr_dat(unsigned char dat)//写数据// { delay1ms(1);RS=1;RW=0;EN=0;P0=dat;delay1ms(1);EN=1;delay1ms(1);EN=0;}void lcd_init()//初始化设置//{delay1ms(15);wr_com(0x38);delay1ms(5);wr_com(0x80);delay1ms(5);wr_com(0x01);delay1ms(5);wr_com(0x06);delay1ms(5);wr_com(0x0c);delay1ms(5);}void writevalue(uchar add,uchar dat) {wr_com(0x80+add);wr_dat(dat);}void zifuchuan(uchar *ch){while(*ch!=0)wr_dat(*ch++);delay1ms(20);}void main(void){lcd_init();while(1){Chan0Value=GetValue0832(0);delay1ms(100);Chan1Value=GetValue0832(1);wr_com(0x80);zifuchuan("Chanal 0:");writevalue(10,Chan0Value/100+0x30);writevalue(11,Chan0Value%100/10+0x30);writevalue(12,Chan0Value%100%10+0x30);wr_com(0x80+0x40);zifuchuan("Chanal 1:");writevalue(0x40+10,Chan1Value/100+0x30);writevalue(0x40+11,Chan1Value%100/10+0x30); writevalue(0x40+12,Chan1Value%100%10+0x30); delay1ms(1000);}}/*此程序只为调通ADC0832,没有对电压值进行转换要想得到准确电压值,请把Chan0Value和Chan1Value 的值乘以5再除以255即可。
数模转换器DAC0832的应用
实训报告十一实训目的:通过DAC0832作为D/A转换器,在虚拟显示正弦波或三角波,从而了解DAC0832的工作方式,把数字量转化为模拟量,学会利用c语言编程实现输出正弦波、三角波等波形。
实训原理图:实训步骤:1.在ptoteus平台找出所需的元器件2.理解该实验的原理,按照原理图画出仿真图;3.根据实验要求写出如下程序:#include <reg51.H>#include<absacc.h>#define DAC0832 XBYTE[0X12ef]unsigned char sindot[64]={0x80,0x8c,0x98,0xa5,0xb0,0xbc,0xc7,0xd1,0xda,0xe2,0xea,0xf0,0xf6,0xfa,0xfd,0xff,0xff,0xff,0xfd,0xfa,0xf6,0xf0,0xea,0xe3,0xda,0xd1,0xc7,0xbc,0xb1,0xa5,0x99,0x8c,0x80,0x73,0x67,0x5b,0x4f,0x43,0x39,0x2e,0x25,0x1d,0x15,0xf,0x9,0x5,0x2,0x0,0x0,0x0,0x2,0x5,0x9,0xe,0x15,0x1c,0x25,0x2e,0x38,0x43,0x4e,0x5a,0x66,0x73};//正弦代码表sbit K1=P2^7;//控制开关,void delay(unsigned char m)//延时{ unsigned char i;for(i=0;i<m;i++);}void main(void){unsigned char k;while(1){ if (K1==0)//K1为1时,输出三角波,K1为0时,输出为正弦波{for(k=0;k<64;){ DAC0832=sindot[k];//取正弦代码并输出k++;delay(10);}}else{ for(k=0;k<255;){ DAC0832=k;k+=5;delay(1);}for(k=255;k>0;){ DAC0832=k;k-=5;delay(1);}}}}总结:经过此次的实验,通过DAC0832作为D/A转换器,在虚拟显示正弦波或三角波,深刻地理解了DAC0832的结构以及工作方式。
使用DAC0832的DA转换实验
实验一使用DAC0832的D/A转换实验一、实验目的熟悉DAC0832数模转换器的特性和接口方法,掌握D/A 输出程序的设计和调试方法。
1、DAC0832结构DAC0832是用先进的CMOS/Si-Cr工艺制成的双列直插式单片8位D/A转换器。
它可以直接和8088CPU相接口。
它采用二次缓冲方式(有两个写信号/WR1、/WR2),这样可以在输出的同时,采集下一个数字量,以提高转换速度。
而更重要的是能够在多个转换器同时工作时,有可能同时输出模拟量。
它的主要技术参数如下:分辨率为8 位,电流建立时间为1us,单一电源5V-15V直流供电,可双缓冲、单缓冲或直接数据输入。
DAC0832内部结构见图5-3 。
图5-3 DAC0832内部功能* /LE=“1”,Q输出跟随D输入,/LE=“0”,D端输入数据被锁存2、DAC0832引脚功能*DI0~DI7:数据输入线,TTL电平,有效时间应大于90ns(否则锁存的数据会出错);*ILE:数据锁存允许控制信号输入线,高电平有效;*/CS:选片信号输入线,低电平有效;*/WR1:输入锁存器写选通输入线,负脉冲有效(脉宽应大于500ns)。
当/CS为“0”、ILE 为“1”、/WR1为“0”时,DI0~DI7状态被锁存到输入锁存器。
*/XFER:数据传输控制信号输入线,低电平有效;*/WR2:DAC寄存器写选通输入线,负脉冲(宽于500ns)有效.当/XFER为“0”且/WR2有效时,输入锁存器的状态被传送到DAC寄存器中;*Iout1:电流输出线,当输入为全1时Iout1最大;*Iout2:电流输出线,其值和Iout1值之和为一常数;*Rfb:反馈信号输入线,改变Rfb端外接电容器值可调整转换满量程精度;*Vcc:电源电压线,Vcc范围为+5V~+15V;*VREF:基准电压输入线,VREF范围为-10V~+10V;*AGND:模拟地;*DGND:数字地。
2、DAC0832工作方式根据对DAC0832的输入锁存器和DAC寄存器的不同的控制方法,DAC0832 有如下三种工作方式:(1) 单缓冲方式此方式适用于只有一路模拟量输出或几路模拟量非同步输出的情形。
黄杰-实验三十一、集成DAC0832数模转换实验
实验三十一、集成DAC0832数模转换实验一、实验目的:1、了解D/A转换的基本原理和基本结构、掌握大规模集成D/A转换器的功能及典型应用二、要求:1、学习D/A和转换的工作原理2、熟悉DAC0832引脚功能、使用方法3、会好完整的实践线路和所需的实验记录表格4、拟定实验内容的具体实验方案三、试验设备及器件:1、+5V、15V直流电源2、双踪示波器3、计数脉冲源4、逻辑电平开关5、逻辑电平显示器6、直流数字电压表实验原理集成DAC0832转换器为CMOS型8位数模转换器,它内部具有双数据锁存器,且输入电平与TTL电平兼容,所以能与8080、8085、Z-80及其他微处理器直接对接,也可以按设计要求添加必要的集成电路块而构成一个能独立工作的数模转换器,其引脚功能及其使用如下:(1)片选信号输入端,低电平有效。
(2)ILE输入寄存器允许信号输入端,高电平有效。
(3)1输入寄存器与信号输入端,低电平有效。
该信号用于控制将外部数据写入输入寄存器中。
(4)XEFR允许传送控制信号的输入端,低电平有效。
(5)2、寄存器写信号输入端,低电平有效。
该信号用于控制将输入寄存器的输出数据写入DAC寄存器中。
(6)D0~D7 8位数据输入端。
(7)Iout1、DAC电流流出1,在构成电压输出DAC时此线应外接运算放大器的反相输入端。
(8)Iout2、DAC电流输出2,在构成电压输出DAC时此线应接运算放大器的同相输入端一起接模拟地。
(9)Rfb反馈电阻引出端,在构成电压输出DAC时此端应接运算放大器的输出端。
(10)UREF基准电压输入端,通过该外引线将外部的高精度电压源与片内的R—2R电阻网络相连。
其电压范围为-10V~+10V。
(11)Vcc、DAC0832的电源输入端,电源电压范围为+5V~+15V。
(12)AGND模地、整个电路的模拟地必须与数字地相连。
(13)DGND数字地。
DAC0832是8位的电流输出型数/模转换器,为了把电流输出变成电压输出,可在数/模转换器的输出端接一运算放大器(LM324),输出电压Uo的大小有反馈电阻Rf决定,整个线路见图10—2。
ADC0832模数转换与显示.详述
符串 • Set_Disp_Pos(0x46);
置显示位置 • i=0; • while(Display_Buffer[i]!='\0') • LCD_Write_Data(Display_Buffer[i++]) ;
•
• while(1)
•{
• //获取AD转换值,最大值255对应于最高电压5.00v
• //本例中设计为显示三个数位,故使用500
• d=Get_AD_Result()*500.0/255;
//设置显示位置
//将AD转换后得到数据分解为三个数位 • Display_Buffer[0]=d/100+'0'; • Display_Buffer[2]=d/10%10+'0'; • Display_Buffer[3]=d%10+'0'; • Set_Disp_Pos(0x01);
程序总流程图
2、A/D转换子程序
A/D转换子程序用来控制对输入模块电压信号 的采集测量,并将对应的数值存入相应的 内存单元。
A/D转换子程序流程图
3、LCD显示子程序
LCD显示程序的设计一般先要确定LCD的初 始化、光标定位、确定显示字符。
实物图
总结
• 本次设计即基于A/D转换器原理,通过一个A/D( ADC0832模拟数字转换)芯片采集外界信息后, 将外侧电压信号转换成数字型号,再由AT89C51 单片机分析并进行处理信号,最终输出信号,由 1602液晶曲线显示。
实验ADC0832数模转换的显示
硬件连接
将ADC0832的VCC和GND连接 到数字电源和地线
将ADC0832的OUT引脚连接到微 控制器的模拟输入引脚
将ADC0832的 S TA R T / C O N V S T 和 C / D 连 接 到 微 控 制 器 的 S TA R T / C O N V S T 和 C/D引脚
实验ADC0832数模转换 的显示
XX,a click to unlimited possibilities
汇报人:XX
目录
01 添 加 目 录 项 标 题 03 实 验 操 作 步 骤
02 A D C 0 8 3 2 数 模 转 换器介绍
04 实 验 结 果 分 析
05 A D C 0 8 3 2 的 优 缺 点
实验结果:通 过显示器观察 到数字信号转 换为模拟信号 的过程,以及 模拟信号的波
形
结果分析:分 析实验结果, 验证数模转换 的正确性和精
度
实验结论:得 出实验结论, 总结数模转换 在现实应用中 的意义和价值
Part Four
实验结果分析
实验数据展示
输入信号的频率和幅度
数模转换器的分辨率和精 度
集成更多的功能和接口
Part Six
数模转换器的发展 趋势
数模转换器技术发展历程
早期数模转换器: 精度低,速度慢, 应用范围有限
8位数模转换器: 精度提高,速度 加快,广泛应用 于消费电子产品
高精度数模转换 器:12位、16位 甚至更高精度, 满足高精度测量 和控制系统需求
高速数模转换器: 高采样率,低失 真,适用于宽带 信号处理和雷达 系统等
Part Five
ADC0832的优缺 点
模数转换ADC0832的应用
下面,我们看看这部分程序该怎么写。
图四 这个是读取数值的子函数,二通道独立读取,入口参数是通道值(0 或 1),出口参 数则是读取的结果,里面对两次读取的值进行判断,实际应用中,可以灵活处理,要不要判 断、如果数值不一致要不要返回标志。 应用时,只要写成 变量名=GetValue0832(通道值); 即可返回转换值。 由于 ADC0832 是 8 位分辨率,返回的数值在 0~255 之间,对应模拟数值为 0~5V, 因此每一档对应的电压值约为 0.0196V。大家可以在通道输入端引入模拟信号(0~5V)进 行测试,比如可以在通道脚和地之间接入电池来测试电池电压值。
unsigned int i; for(;ucDelay > 0;ucDelay--)
for(i = 112;i > 0;i--); }
- 专业电子技术交流社区 电子工程师网上家园 -
电子
第 9页
模数转换 ADC0832 的应用
电子园
1、 电子园网站简介
}
unsigned char GetValue0832(bit Channel)
{
unsigned char i,data1=0,data2=0;
clk=0;
dodi=1; cs=0;//cs=0 时 ADC0832 有效
clk=1; clk=0;//第一个脉冲,开始位
dodi=1;
clk=1; clk=0;//第二个脉冲,模式选择 dodi=Channel;//通道选择
模数转换DAC0832的应用实验
模数转换DAC0832的应用实验[实验任务] 用两个按键通过单片机控制DAC0832 的输出,使OUT 端可以输出0—5V 的幅值,频率为1KHZ 的锯齿波和三角波两种波形。
通上电源后;按下INT1 则输出三角波,在按下INT0 输出锯齿波。
[实验原理] ADC0804 是8 位全MOS 中速D/A 转换器,采用R—2RT 形电阻解码网络,转换结果为一对差动电流输出,转换时间大约为1us。
使用单电源+5V―+15V供电。
参考电压为-10V-+10V。
在此我们直接选择+5V 作为参考电压。
DAC0832 有三种工作方式:直通方式,单缓冲方式,双缓冲方式;在此我们选择直通的工作方式,将XFER WR 1WR2 CS 管脚全部接数字地。
管脚8接参考电压,在此我们接的参考电压是+5V。
那么经过第一级运放后,输出电压将是-5V-0V,在经过第二级运放反相放大1 倍以后将可以输出0V—5V 了。
我们在控制P1 口输出数据有规律的变化将可以产生三角波,锯齿波,梯型波等波形了。
[C 语言源程序]#include AT89X51.H unsigned char keycnt=0; unsigned char tcnt=0; //键值判断bit sjz=0; //产生三角波时用到的标志void delayl() //延时子程序{ unsigned char i,j; for(i=20;i0;i--) for(j=248;j0;j--); }void KEY() //按键扫描程序{if(P3_2==0) { delayl(); //延时跳过按下时的抖动if(P3_2==0) { keycnt=0; //定时器产生锯齿波标志TR0=0; //暂时停止波形输出TH0=0x256-40;//对TH0 TL0 赋值TL0=0x256-40; TR0=1; //开始定时,产生锯齿波while(P3_2==0); //如果一直按着键,则等待松键开delayl(); //延时跳过松开后的抖动} } if(P3_3==0) { delayl(); //延时跳过按下时的抖动if(P3_3==0) { keycnt=1; //定时器产生三角波标志TR0=0; //暂时停止波形输出TH0=0x256-40;//对TH0 TL0 赋值TL0=0x256-40; TR0=1; //开始定时产生三角波}。
实验十 ADC0832数模转换的显示
char code tablewe[]={ 0xfd,0xfb,0xf7,0xef,0xdf,0xfe };
/****************************************************************************
现象:调节AD1,使AD1顺时针转动,LED1上的电压不断减小;
调节AD0,使ADO顺时针转动,LED2上的电压不断减小。
作为单通道模拟信号输入时ADC0832的输入电压是0—5V且8位分辨率时的电压精度为19.53mV,即(5/256)V。如果作为由IN+与IN-输入的输入时,可是将电压值设定在某一个较大范围之内,从而提高转换的宽度。但值得注意的是,在进行IN+与IN-的输入时,如果IN-的电压大于IN+的电压则转换后的数据结果始终为00H。
通道地址
通道
工作方式说明
SGL/DIF
ODD/SIGN
0
1
0
0
+
-
差分方式
0
1
-
+
1
0
+
单端输入方式
1
1
+
表1:通道地址设置表
如表1所示,当此两位数据为“1”、“0”时,只对CH0 进行单通道转换。当2位数据为“1”、“1”时,只对CH1进行单通道转换。当两位数据为“0”、“0”时,将CH0作为正输入端IN+,CH1作为负输入端IN-进行输入。当两位数据为“0”、“1”时,将CH0作为负输入端IN-,CH1 作为正输入端IN+进行输入。到第三个脉冲的下降之后DI端的输入电平就失去输入作用,此后DO/DI端则开始利用数据输出DO进行转换数据的读取。从第4个脉冲下降沿开始由DO端输出转换数据最高位Data7,随后每一个脉冲的下降沿DO端输出下一位数据。直到第11个脉冲时发出最低位数据Data0,一个字节的数据输出完成。也正是从此位开始输出下一个相反字节的数据,即从第11个字节的下降沿输出Data0。随后输出8位数据,到第19 个脉冲时数据输出完成,也标志着一次A/D转换的结束。最后将CS置高电平禁用芯片,直接将转换后的数据进行处理就可以了。时序说明请参照图4。
51单片机 液晶显示 串行模数转换ADC0832
#include<reg52.h>#include <intrins.h>#define uint unsigned int#define uchar unsigned char//#define LCD_DATA P0;sbit DI = P3^4;//定义ADC各口数据;sbit D0 =P3^4;sbit CLK = P3^5;sbit CS = P3^6;sbit LCD_RS= P2^0;//定义LCD引脚sbit LCD_RW= P2^1;sbit LCD_E= P2^2;uchar code DIS[]={"ADC0832-----TEST"};//ADC832 测试;uchar code dsptab[]={'0','1','2','3','4','5','6','7','8','9'};//字符代表码;/*----------------------------------------------------------------------------------延时子程序----------------------------------*/void delay(uint a){ uint b;for(b=0;b<a;b++);}void delay400ms(void)////400ms延时{ uchar a = 5;uint b;while(a--){ b=7269;while(b--);}}/*-----------------------------------------------------------------------------------读状态----------------------------------------*///读状态子程序;有返回值;返回值类型为CHAR型;//读回的状态通过RETURN返回;uchar read_estate(void) //定义有返回值的函数;{ P0=0Xff; //把LCD端口全置1方便读取信号; LCD_RS=0; //RS置0;LCD_RW=1; //RW置1;LCD_E=0; //E端置0;delay(10); //短延时;LCD_E=1; //E端置1;以锁存数据; while(P0&0x80); //检测忙,则一直循环;return(P0); //返回读取的信号;}/*------------------------------------------------------------------------------------ 写数据------------------------------------------*///写数据子程序;无返回值;输入变量I;//I为要写入LCD中的数据;//数据类型CHAR形;void write_data(uchar i) //定义输入变量值I;{read_estate(); //检测忙信号;P0=i; //把I中数据送到LCD数据端;LCD_RS=1; //RS置1;LCD_RW=0; //RW置0;LCD_E=0; //E置0;delay(10); //短延时;LCD_E=1; //E置1;以锁存数据;}/*--------------------------------------------------------------------------------------- 写指令--------------------------------------------*///写指令子程序;无返回值;输入二个变量I和J.//I为要写入LCD的指令;J为判断要不要检测忙.//如果J为0则不判断检测忙;//如果J为1则判断检测忙;void write_dictate(uchar i,j) //定义二个变量;{if(j)read_estate(); //根据需要检测忙;P0=i; //把要写入的数据送到LCD数据端; LCD_RS=0; //RS置0;LCD_RW=0; //RW置0;LCD_E =1; //E端置0;delay(10); //延时;LCD_E =0; //E端置1;以锁存数据;}/*----------------------------------------------------------------------------------读数据--------------------------------------*///读数据子程序;有返回值,返回值类型为CHAR型;/*uchar read_data(void) //定义有返回值的子函数;{LCD_DATA=0Xff; //LCD数据端口置1;LCD_RS=1; //RS置1;LCD_RW=1; //RW置1;LCD_E=0; //E置0;delay(10); //短延时;LCD_E=1; //E置1;以锁存数据;return(LCD_DATA); //返回读取的值;}/*--------------------------------------------------------------------------------------- LCD初始化-----------------------------------------*///LCD初始化程序;主要作用初始化LCD,对LCD进行复位以及设置;void initialization(void) //定义函数;{delay(50); //延时5MS;write_dictate(0x38,0); //写指令38H;不检测忙;delay(50); //延时5MS;write_dictate(0x38,0); //写指令38H;不检测忙;delay(50); //延时5MS;write_dictate(0x38,0); //写指令38H;不检测忙;delay(50);write_dictate(0x38,1); //显示模式设置;检测忙;write_dictate(0x08,1); //关闭显示;检测忙;write_dictate(0x01,1); //显示清屏;检测忙;write_dictate(0x06,1); //显示光标移动设置;检测忙;write_dictate(0x0C,1); //显示开及光标设置;检测忙;}/*----------------------------------------------------------------------------------在指定位置显示一个字符----------------------*/void displayonechar(uchar x, y,ddata){y &= 0x01;x &= 0x0f; //限制X不能大于15,Y不能大于1 if (y) x+= 0x40; //当要显示第二行时地址码+0x40;x+= 0x80; //算出指令码write_dictate(x,0); //这里不检测忙信号,发送地址码write_data(ddata);}/*----------------------------------------------------------------------------------在指定位置显示一串字符----------------------*/void displaylistchar(uchar x,y,uchar code *ddata){uchar a=0;y&=0x01;x&=0xf;while(ddata[a]>0x20){ if(x<=0xff){displayonechar(x, y,ddata[a]);a++;x++;}}}/*----------------------------------------------------------------------------------读ADC0832的数据----------------------------------*/ unsigned char readadc(void){ unsigned char dat,i;CLK=0; //芯片复位CS=1;_nop_();CS=0;_nop_();DI=1; //启动位CLK=1;_nop_();CLK=0;DI=1; //配置位1CLK=1;_nop_();CLK=0;DI=0; //配置位2CLK=1;_nop_();CLK=0; //空闲位_nop_();CLK=1;DI=1;for(i=0;i<=8;i++){ //读出8字节数据dat=dat<<1;_nop_();CLK=1;//这里要先1后0...如果是先0后1则输出结果错误...if(DI){dat|=0x01;}_nop_();CLK=0;}CS=1;//关闭芯片return(dat);//返回数据}void main(){ uint dat;delay400ms();//延时400MSinitialization();//LCD复位;displaylistchar(0,0,DIS);//显示ADC832 测试;displayonechar(0,1,'O'); //在LCD是显示OUT:_.___Vdisplayonechar(1,1,'U');displayonechar(2,1,'T');displayonechar(3,1,':');displayonechar(5,1,'.');displayonechar(8,1,'V');while(1)//无限循环...一直读出电压值显示在LCD上;{ displayonechar(13,1,dsptab[readadc()/100]);displayonechar(14,1,dsptab[(readadc()%100)/10]);displayonechar(15,1,dsptab[readadc()%10]);//在LCD最右边显示255中的某一个数据;dat=readadc()/0.542;//0.542是255除以基准电压也就是ADC0832的VCC...得出来了...这个值可能每个人不同.displayonechar(4,1,dsptab[dat/100]);//下面三行显示电压...displayonechar(6,1,dsptab[(dat%100)/10]);displayonechar(7,1,dsptab[dat%10]);delay400ms();//延时400MS}}。
160128液晶曲线显示ADC0832两路模数转换设计
160128液晶曲线显示ADC0832两路模数转换设计摘要:本文介绍了以单片机最小系统、电压调节模块、ADC0832模数转换模块和LCD显示模块组成的模数转换显示系统,该系统以AT89C51为核心控制元件,其它外围电路辅助。
通过采集电压调节电路中电压输入,将输入信号转变为数字信号,再由单片机分析处理信号,最终输出信号,由160128液晶曲线显示。
同时介绍了该系统的硬件设计方法、系统的构成以及软件的设计,并详细的说明了系统的构成以及工作原理。
关键词:ADC0832;LCD显示;模数转换1引言模-数(AD)和数-模(DA)转换是模拟电路和数字电路进行沟通的渠道,在数字电路里,电平只有高和低两种状态,比如5V和0V,对应着1和0;模拟电路中,电平理论上有无数个状态,比如0V、0.1V、0.2V…等等。
如何将模拟电平值在数字电路里表达出来呢?这就需要AD转换过程。
ADC0832是美国国家半导体公司生产的一种8位分辨率、双通道A/D转换芯片。
由于它体积小,兼容性强,性价比高而深受单片机爱好者及企业欢迎,并且目前已经有很高的普及率。
学习并使用ADC0832可以使我们了解A/D转换器的原理,有助于我们单片机技术水平的提高。
2总体设计及工作原理2.1设计原理及方案A/D转换器能把输入的模拟电压或直流电流转变为与它成正比的数字量,既能把被控对象的各种模拟信息变成计算机可以识别的数字信息。
而本次设计即基于A/D转换器的原理,通过一个A/D(ADC0832模拟数字转换)芯片采集外界信息后,将外测电压信号转换成数字信号,再由AT89C51单片机分析并处理信号,最终输出信号,由160128液晶曲线显示两路电压。
2.2总体设计本设计从各个角度分析了由单片机组成的数字电压表的设计过程及各部分电路的组成及其原理,并且分析了如何驱动单片机进而使系统运行起来的原理和方法。
框图如图1:图1 总体设计框图3芯片介绍3.1AT89C51单片机AT89C51是一种低功耗、高性能CMOS8位微控制器,具有4K 在系统可编程Flash 存储器。
模数转换电路分析(ADC0832)18页
PSEN ALE EA
CH1 作为RV正2 输入端RINV1+进行输入。
96% 100%
10k
10k
1 2 3 4
CS CH0 CH1 GND
VCC CLK
DI DO
8 7 5 6
U2 ADC0832
+88.8
Volts
+88.8
Volts
1 2 3 4 5 6 7 8
P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7
(1)当要进行A/D转换时,须先将CS使能端置于 低电平并且保持低电平直到转换完全结束。此时 芯片开始转换工作;
(2)同时由处理器向芯片时钟输入端CLK 输入时 钟脉冲,DO/DI端则使用DI端输入通道功能;
(3)在第1 个时钟脉冲的下沉之前DI端必须是高 电平,表示启始信号。在第2、3个脉冲下沉之前 DI端应输入2 位数据用于选择通道功能;
模数转换(ADC0832)应用
一、 ADC0832介绍 二、C语言程序设计 三、实训
一、 ADC0832介绍
1、Feature
8-Bit Resolution; Easy Microprocessor interface or Stand-Alone Operation; Operates Ratiometrically or With 5-V Reference; Single Channel or Multiplexed Twin Channels With Single-Ended or Differential Input Options; Input Range 0 to 5 V With Single 5-V Supply; Inputs and Outputs Are Compatible With TTL and MOS Conversion Time of 32 ms at CLK = 250 kHz; Designed to Be interchangeable With National Semiconductor ADC0831 and ADC0832
51单片机 数码管显示 串行模数转换ADC0832
#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int//#define disdata P0 //显示数据段码输出口#define channel_0 0x02 //单通道0输入选择#define channel_1 0x03 //单通道1输入选择sbit ADC_DI = P3^4; //数据输入输出复用sbit ADC_DO = P3^4; //DI和DO端都接在P1.0sbit ADC_CLK= P3^5; //时钟端sbit ADC_CS = P3^6; //片选端sbit ACC0=ACC^0; //通道与输入方式控制字sbit ACC1=ACC^1; //通道与输入方式控制字sbit DISX=P0^7; //LED小数点uchar code disply[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};// 0 1 2 3 4 5 6 7 8 9 关闭//uchar code dis_scan[3]={0x00,0x01,0x02}; //列扫描控制字uint data dis[4]={0x00,0x00,0x00,0x00}; //定义3个显示数据单元和一个数据存储单元/********************************************************************//* *//* 延时函数*//* *//********************************************************************/delay(int ms){int i;while(ms--){for(i = 0; i< 250; i++){_nop_();_nop_();_nop_();_nop_();}}}/********************************************************************//* *//* 启动ADC转换*//* *//********************************************************************/ADC_start(){ADC_CS=1; //一个转换周期开始_nop_();ADC_CLK=0;_nop_();ADC_CS=0; //CS置0,片选有效_nop_();ADC_DI=1; //DI置1,起始位_nop_();ADC_CLK=1; //第一个脉冲_nop_();ADC_DI=0; //在负跳变之前加一个DI反转操作_nop_();ADC_CLK=0;_nop_();}/********************************************************************//* *//*AD转换函数*//*选择输入通道,输入信号的模式《单端输入,或差分输入》*//* *//********************************************************************/ADC_read(uchar mode){uchar i;ADC_start(); //启动转换开始ACC=mode;ADC_DI=ACC1; //输出控制位1,DI=1,单通道输入,DI=0,差分输入。
DAC0832数模转换实验报告131219x
实验报告基于DAC0832的数模转换一、实验目的1.学习单片机控制技术----用单片机控制外部数模转换设备,实现D/A 转换;2.熟悉DAC0832芯片的内部结构、引脚功能、各种工作方式下的工作时序;3.熟悉并掌握51单片机系统硬件电路的基本工作原理,并学习硬件电路设计;4.学习C51单片机编程、调试方法。
二、实验任务利用51单片机控制DAC0832生成正弦波电压输出。
三、实验器材C51单片机 一块DAC0832 一块 LM324 一块 单孔板 一块 导线 若干 直流稳压电源 一台 示波器 一台四、实验原理1. 系统方案确立 1)硬件电路工作原理图4-1 信号发生器的硬件框图MCU 作为单片机微处理系统,通过Keyboard 输入可以产生正弦波数字信号的程序,使MCU 输出正弦波数字信号,通过DAC0832数模转换,变成正弦波的模拟信号,用示波器显示出来。
如图4-1所示。
DisplayMCU KeyboardDAC08322)程序工作流程图4-2 信号发生器的程序流程图2. 硬件电路设计1)单片机最小系统的组成单片机最小系统是指用最小元件组成的单片机工作系统。
对MCS-51系列单片机来说,其内部已经包含了一定数量的程序存储器和数据存储器,在外部只要增加时钟电路和复位电路即可构成单片机最小系统。
下图所示便是MCS-51系列单片机最小系统电路,由单片机芯片和典型的时钟电路和复位电路构成。
图4-3典型的时钟电路大多采用内部时钟方式,晶振一般在1.2~12MHz 之间,甚至可达到24MHz 或更高,频率越高,单片机处理速度越快,但功耗也就越大,一般采用11.0592MHz 的石英晶振。
与晶振相位复0D/A 芯片初始化Y相位>=2π?Ni++相幅转换 YN幅度D/A 转换输出定时器初始化 time 0=0 置定时到标志T0重赋值返回并联的两个电容1C 、2C 通常为30pF 左右,对频率有微调作用。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验报告十实验名称:ADC0832数模转换的显示目的:ADC0832是8脚双列直插式双通道A/D转换器,能分别对两路模拟信号实现模—数转换,可以用在单端输入方式和差分方式下工作。
ADC0832采用串行通信方式,通过DI 数据输入端进行通道选择、数据采集及数据传送。
8位的分辨率(最高分辨可达256级),可以适应一般的模拟量转换要求。
其内部电源输入与参考电压的复用,使得芯片的模拟电压输入在0~5V之间。
具有双数据输出可作为数据校验,以减少数据误差,转换速度快且稳定性能强。
独立的芯片使能输入,使多器件挂接和处理器控制变的更加方便。
ADC0832的工作原理:正常情况下ADC0832 与单片机的接口应为4条数据线,分别是CS、CLK、DO、DI。
但由于DO端与DI端在通信时并未同时使用并与单片机的接口是双向的,所以在I/O口资源紧张时可以将DO和DI并联在一根数据线上使用。
当ADC0832未工作时其CS输入端应为高电平,此时芯片禁用,CLK 和DO/DI 的电平可任意。
当要进行A/D转换时,须先将CS使能端置于低电平并且保持低电平直到转换完全结束。
此时芯片开始转换工作,同时由处理器向芯片时钟(CLK)输入端输入时钟脉冲,DO/DI端则使用DI端输入通道功能选择的数据信号。
在第一个时钟脉冲的下沉之前DI端必须是高电平,表示启始信号。
在第二、三个脉冲下沉之前DI端应输入两位数据用于选择通道功能。
通道地址通道工作方式说明SGL/DIF ODD/SIGN 0 10 0 + -差分方式0 1 - +1 0 +单端输入方式1 1 +表1:通道地址设置表如表1所示,当此两位数据为“1”、“0”时,只对CH0 进行单通道转换。
当2位数据为“1”、“1”时,只对CH1进行单通道转换。
当两位数据为“0”、“0”时,将CH0作为正输入端IN+,CH1作为负输入端IN-进行输入。
当两位数据为“0”、“1”时,将CH0作为负输入端IN-,CH1 作为正输入端IN+进行输入。
到第三个脉冲的下降之后DI端的输入电平就失去输入作用,此后DO/DI端则开始利用数据输出DO进行转换数据的读取。
从第4个脉冲下降沿开始由DO端输出转换数据最高位Data7,随后每一个脉冲的下降沿DO端输出下一位数据。
直到第11个脉冲时发出最低位数据Data0,一个字节的数据输出完成。
也正是从此位开始输出下一个相反字节的数据,即从第11个字节的下降沿输出Data0。
随后输出8位数据,到第19 个脉冲时数据输出完成,也标志着一次A/D转换的结束。
最后将CS置高电平禁用芯片,直接将转换后的数据进行处理就可以了。
时序说明请参照图4。
作为单通道模拟信号输入时ADC0832的输入电压是0—5V且8位分辨率时的电压精度为19.53mV,即(5/256)V。
如果作为由IN+与IN-输入的输入时,可是将电压值设定在某一个较大范围之内,从而提高转换的宽度。
但值得注意的是,在进行IN+与IN-的输入时,如果IN-的电压大于IN+的电压则转换后的数据结果始终为00H。
硬件原理图:仿真图:程序如下所示:/*********************************包含头文件********************************/ #include <reg51.h>#include <intrins.h>/*********************************端口定义**********************************/ sbit CS = P3^5;sbit Clk = P3^3;sbit DATI = P3^4;sbit DATO = P3^4;sbit P20=P2^0 ;/*******************************定义全局变量********************************/ unsigned char dat = 0x00; //AD值unsigned char count = 0x00; //定时器计数unsigned char CH; //通道变量unsigned char dis[] = {0x00, 0x00, 0x00}; //显示数值/*******************************共阳LED段码表*******************************/unsigned char code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; char code tablewe[]={ 0xfd,0xfb,0xf7,0xef,0xdf,0xfe };/****************************************************************************函数功能:AD转换子程序入口参数:CH出口参数:dat****************************************************************************/ unsigned char adc0832(unsigned char CH){unsigned char i,test,adval;adval = 0x00;test = 0x00;Clk = 0; //初始化DATI = 1;_nop_();CS = 0;_nop_();Clk = 1;_nop_();if ( CH == 0x00 ) //通道选择{Clk = 0;DATI = 1; //通道0的第一位_nop_();Clk = 1;_nop_();Clk = 0;DATI = 0; //通道0的第二位_nop_();Clk = 1;_nop_();}else{Clk = 0;DATI = 1; //通道1的第一位_nop_();Clk = 1;_nop_();Clk = 0;DATI = 1; //通道1的第二位_nop_();Clk = 1;_nop_();}Clk = 0;DATI = 1;for( i = 0;i < 8;i++ ) //读取前8位的值{_nop_();adval <<= 1;Clk = 1;_nop_();Clk = 0;if (DATO)adval |= 0x01;elseadval |= 0x00;}for (i = 0; i < 8; i++) //读取后8位的值{test >>= 1;if (DATO)test |= 0x80;elsetest |= 0x00;_nop_();Clk = 1;_nop_();Clk = 0;}if (adval == test) //比较前8位与后8位的值,如果不相同舍去。
若一直出现显示为零,请将该行去掉dat = test;_nop_();CS = 1; //释放ADC0832DATO = 1;Clk = 1;return dat;}/****************************************************************************函数功能:延时子程序入口参数:出口参数:****************************************************************************/void delay(void){int k;for(k=10;k<500;k++);}/****************************************************************************函数功能:将0-255级换算成0.00-5.00的电压数值入口参数:i出口参数:****************************************************************************/ void convdata(unsigned char i){dis[0] = i/51; //个位dis[1] = (i%51)*10/51*2; //小数点后第一位dis[2] = ((i%51)*10%51)*10/51*2; //小数点后第二位}/**************************************************************************** 函数功能:数码管显示子程序入口参数:出口参数:****************************************************************************/ void display(void){P2=0xff;P0=tab[dis[0]] & 0x7f; //显示个位和小数点delay();P2=0xfd;P2=0xff;P0=tab[dis[1]]; //显示小数点后第一位delay();P2=0xfb;P2=0xff;P0=tab[dis[2]]; //显示小数点后第二位delay();P2=0xf7;P2=0xff;P0=0xff; //显示小数点后第二位delay();P2=0xfe;}/****************************************************************************函数功能:主程序入口参数:出口参数:****************************************************************************/void main(void){P2=0xff; //端口初始化P0=0xff;delay();CH = 0x00; //在这里选择通道0x00或0x01TMOD = 0x01; //设置中断TH0=(65536-50000)/256;//定时器1初值定时50msTL0=(65536-50000)%256;IE = 0x82;TR0 = 1;while(1) //主循环{ dat = adc0832(CH);convdata(dat); //数据转换display(); //显示数值}}/****************************************************************************函数功能:定时器中断延时程序这一段的作用时隔一段时间抽样一次否侧显示的最后一位会不稳定入口参数:出口参数:****************************************************************************/ void timer0(void) interrupt 1{TMOD = 0x01;TH0=(65536-50000)/256;//定时器1初值定时50msTL0=(65536-50000)%256;IE = 0x82;TR0 = 1;count++;if (count == 0x01){count = 0x00;dat = adc0832(CH);}}程序流程图:.现象:调节AD1,使AD1顺时针转动,LED1上的电压不断减小;调节AD0,使ADO顺时针转动,LED2上的电压不断减小。