基于51单片机的ADC0832的C语言程序

合集下载

空气质量检测程序51ADC0832

空气质量检测程序51ADC0832

#includereg51.h#includestring.h#includestdio.h#includeintrins.h#define uchar unsigned char#define uint unsigned intAD端口定义sbit CLK=P3^4;ADC0832时钟端sbit DIO=P3^3;ADC0832数据输入输出sbit AD_CS=P3^5;ADC0832片选端#define jiaquan_CH 1#define tianranqi_CH 0sbit beep=P1^5; 蜂鸣器端口12864液晶控制接口#define LCD12864_DataPort P0sbit LCD12864_EN=P2^1;sbit LCD12864_RW=P2^2;sbit LCD12864_RS=P2^3;sbit LCD12864_PSB=P2^5;按键sbit UP =P1^0;sbit DOWN =P1^1;sbit OK =P1^2;sbit CANCEL=P1^3;变量定义uint jiaquan_ADCdat;甲醛AD值uint tianranqi_ADCdat;天然气AD值char jiaquan_Disdat[3];显示甲醛数据char tianranqi_Disdat[3];显示天然气数据uint jiaquan_Threshold=100;甲醛报警值100 uint tianranqi_Threshold=100;天然气报警值100char code str1[]=开始测量;char code str2[]=确认;char code str3[]=取消;char code str4[]=测量结果;char code str5[]=甲醛:;char code str6[]=天然气:;char code str7[]=ppm;static char flag=0;void delay(uint time)延时函数延时Time ms {uint j,k;for(k=time;k0;k--)for(j=150;j0;j--);}AD转换函数参数:ch--通道选择,ch=0,0通道,ch=1,1通道uint ADC0832(char ch){uchar i = 0;uchar Value1 = 0;uchar Value2 = 0;AD_CS = 1;关掉AD;CLK = 0;DIO = 0;AD_CS = 0;开启芯片DIO = 1;开始位CLK = 0;CLK = 1;DIO = 1;并分单通首CLK =0;CLK = 1;DIO = ch;通道选择位CLK = 0;CLK = 1;DIO = 1;空闲位CLK = 0;CLK = 1;for(i = 0;i 8 ;i++) 读第一次数据{CLK = 1;CLK = 0;if(DIO){Value1 = 0x80 i;}}for(i = 0; i 8; i++) 读第二次数据{if(DIO){Value2 = 0x01 i;}CLK = 1;CLK = 0;}AD_CS = 1; 关掉芯片if(Value1 == Value2) 数据校难{return Value1;}else{return 0;}}LCD12864功能函数void LCD12864_delayms(unsigned int a){unsigned int x,y;for(x=a;x0;x--)for(y=110;y0;y--){;}}void LCD12864_write_cmd(unsigned char cmd)写命令{LCD12864_RS=0;LCD12864_RW=0;LCD12864_EN=1;LCD12864_DataPort=cmd;LCD12864_delayms(1);LCD12864_EN=0;LCD12864_delayms(1);}------------------------------------------------清屏------------------------------------------------void ClrScreen(){LCD12864_write_cmd(0x01);LCD12864_delayms(15);}void LCD12864_write_data(unsigned char dat) 写数据{LCD12864_RS=1;LCD12864_RW=0;LCD12864_EN=1;LCD12864_DataPort=dat;LCD12864_delayms(1);LCD12864_EN=0;LCD12864_delayms(1);}void LCD12864_write_String(unsigned char dat)写字符串,可写汉字{for(;dat!='0';dat++){LCD12864_write_data(dat);}}在固定的位置显示固定的数据unsigned char x 第几行显示,从0开始unsigned char y 第几个位置从0开始unsigned char dat 要显示的内容,可为汉字void LCD12864_write_String_pos(unsigned char x,unsigned char y,unsigned char dat) {if(x==0)第一行{LCD12864_write_cmd(0x80+y);LCD12864_write_String(dat);}if(x==1)第二行{LCD12864_write_cmd(0x90+y);LCD12864_write_String(dat);}if(x==2) 第三行{LCD12864_write_cmd(0x88+y);LCD12864_write_String(dat);}if(x==3)第四行{LCD12864_write_cmd(0x98+y);LCD12864_write_String(dat);}}void LCD12864_init(void)初始化{LCD12864_PSB=1;并行显示LCD12864_write_cmd(0x30);基本指令集LCD12864_write_cmd(0x0c);开显示,不显示光标LCD12864_Draw_Full(empty);写入一个空白的图形,防止数据干扰}=======================void start_display(){LCD12864_write_String_pos(0,0,开始测量);LCD12864_write_cmd(0x91);LCD12864_write_data(0xca);LCD12864_write_data(0xfd);LCD12864_write_String_pos(1,2,0);LCD12864_write_String_pos(2,0,开始测量);LCD12864_write_String_pos(3,0,0);}void ADCresult_display(){LCD12864_write_String_pos(0,0,测量结果);LCD12864_write_String_pos(1,2,甲醛:);LCD12864_write_cmd(0x90+3);LCD12864_write_data(jiaquan_Disdat[0]);LCD12864_write_data(jiaquan_Disdat[1]);LCD12864_write_data(jiaquan_Disdat[2]);LCD12864_write_data('p');LCD12864_write_data('p');LCD12864_write_data('m');LCD12864_write_String_pos(2,0,测量结果);LCD12864_write_String_pos(3,0,天然气:);LCD12864_write_cmd(0x98+4);LCD12864_write_data(tianranqi_Disdat[0]);LCD12864_write_data(tianranqi_Disdat[1]);LCD12864_write_data(tianranqi_Disdat[2]);LCD12864_write_data('p');LCD12864_write_data('p');LCD12864_write_data('m');}void beep_ON()蜂鸣器滴滴声{beep=0;delay(1000);beep=1;delay(500);}void keyscan()按键扫描函数{if(UP==0) 按键按下{delay(15);延时消除按键抖动if(UP==0)按键按下{while(!UP); 松手等待报警阈值增加10jiaquan_Threshold=jiaquan_Threshold+10;tianranqi_Threshold=tianranqi_Threshold+10;flag=1;}}if(DOWN==0) 按键按下{delay(15);延时消除按键抖动if(DOWN==0)按键按下{while(!DOWN); 松手等待报警阈值减少10jiaquan_Threshold=jiaquan_Threshold-10;tianranqi_Threshold=tianranqi_Threshold-10;flag=1;}}if(OK==0) 按键按下{delay(15);延时消除按键抖动if(OK==0)按键按下{while(!OK); 松手等待LCD12864_write_String_pos(0,0,开始测量);LCD12864_write_cmd(0x91);LCD12864_write_data(0xca);LCD12864_write_data(0xfd);LCD12864_write_String_pos(1,2,确认);LCD12864_write_String_pos(2,0,取消);flag=1;}}if(CANCEL==0) 按键按下{delay(15);延时消除按键抖动if(CANCEL==0)按键按下{while(!CANCEL); 松手等待LCD12864_write_String_pos(0,0,开始测量);LCD12864_write_cmd(0x91);LCD12864_write_data(0xca);LCD12864_write_data(0xfd);LCD12864_write_String_pos(1,2,0);LCD12864_write_String_pos(2,0,开始测量);LCD12864_write_String_pos(3,0,0);flag=0;}}}void jing_bao()警报{if(jiaquan_ADCdat jiaquan_Threshold){beep=0;打开报警delay(1000);beep=1;delay(500);}if(tianranqi_ADCdat tianranqi_Threshold){beep=0;打开报警delay(1000);beep=1;delay(500);}}主函数void main(void){flag=0;LCD12864_init();12864初始化start_display();while(1){keyscan();按键扫描函数jiaquan_ADCdat=ADC0832(jiaquan_CH);jiaquan_Disdat[0]=jiaquan_ADCdat100; 百位jiaquan_Disdat[1]=(jiaquan_ADCdat10)%10; 十位jiaquan_Disdat[2]=jiaquan_ADCdat%10; 个位delay(500);tianranqi_ADCdat=ADC0832(tianranqi_CH);tianranqi_Disdat[0]=tianranqi_ADCdat100; 百位tianranqi_Disdat[1]=(tianranqi_ADCdat10)%10; 十位tianranqi_Disdat[2]=tianranqi_ADCdat%10; 个位if(flag==1){ADCresult_display();jing_bao();}}}。

基于51单片机的ADC0832数字电压表(仿真+程序)

基于51单片机的ADC0832数字电压表(仿真+程序)

仿真图:/*********************************包含头文件********************************/ #include <reg52.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位的值,如果不相同舍去。

ADC0832程序

ADC0832程序

xianshi(); }
}
////////////////////////////////////////////////////////////////////////////// void delay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } void write_com(uchar com) { P37=0; P0=com;
#include<reg52.h> #define uint unsigned int #define uchar unsigned char sbit P10=P1^0; sbit P11=P1^1; sbit P12=P1^2; sbit P13=P1^3; sbit P14=P1^4; sbit P15=P1^5; sbit P16=P1^6; sbit P17=P1^7; sbit CS=P3^1; sbit DO=P3^2; sbit DI=P3^3; sbit CLK=P3^4; sbit P36=P3^6;//P36=1 时允许写数据;P36=0 时不允许写数据 sbit P37=P3^7;//P37=1 时写数据;P37=0 时写地址 sbit P24=P2^4; uchar num; uchar table[]=" . V"; void delay_10us(void) { unsigned char a,b; for(b=1;b>0;b--) for(a=2;a>ay(5); P36=1; delay(5); P36=0; } void write_data(uchar date) { P37=1; P0=date; delay(5); P36=1; delay(5); P36=0; } void init() { //P2=0x0000; P36=0; write_com(0x38);//显示模式设置 write_com(0x0c);//光标设置 0x0c 时不显示光标;0x0e 时显示光标但光标不闪烁 0x0f 显 示光标且光标闪烁 write_com(0x06);//屏幕位移 write_com(0x01);//清屏 write_com(0x80+0x00);//定光标的位置 }

51-单片机和DAC0832输出方波、矩形波和正弦波由液晶1602显示的C语言程序

51-单片机和DAC0832输出方波、矩形波和正弦波由液晶1602显示的C语言程序

显示频率,幅度可调,可产生四种波形,正弦波,方波,锯齿波,三角波,希望你能喜欢,给你发了一张效果图,喜欢的话别忘了采纳我的回答啊#include<reg52.h>#define uchar unsigned char#define uint unsigned int#define DAdata P0 //DA数据端口sbit DA_S1= P2^0; // 控制DAC0832的8位输入寄存器,仅当都为0时,可以输出数据(处于直通状态),否则,输出将被锁存sbit DA_S2= P2^1; // 控制DAC0832的8位DAC寄存器,仅当都为0时,可以输出数据(处于直通状态),否则,输出将被锁存sbit key= P3^2;uchar wavecount; //'抽点'计数uchar THtemp,TLtemp;//传递频率的中间变量uchar judge=1; //在方波输出函数中用于简单判别作用uchar waveform; //当其为0、1、2时,分别代表三种波uchar code freq_unit[3]={10,50,200}; //三种波的频率单位uchar idata wavefreq[3]={1,1,1}; //给每种波定义一个数组单元,用于存放单位频率的个数uchar code lcd_hang1[]={"Sine Wave " "Triangle Wave " "Square Wave " "Select Wave: " "press No.1 key! "};uchar idata lcd_hang2[16]={"f= Hz "};uchar code waveTH[]={0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xec,0xf6,0xf9,0xfb,0xfc,0xfc,0xfd,0xfd,0xfd,0xfe};uchar code waveTL[]={0x06,0x8a,0x10,0x4e,0x78,0x93,0xa8,0xb3,0xbe,0xc6, //正弦波频率调整中间值0xac,0xde,0x48,0x7a,0x99,0xaf,0xbb,0xc8,0xd0,0xde, //三角波频率调整中间值0x88,0x50,0x90,0x32,0x34,0xbe,0x4a,0xa3,0xe5,0x2c};/**************************************************************************************** *********/uchar code triangle_tab[]={ //每隔数字8,采取一次0x00,0x08,0x10,0x18,0x20,0x28,0x30,0x38,0x40,0x48,0x50,0x58,0x 60,0x68,0x70,0x78,0x80,0x88,0x90,0x98,0xa0,0xa8,0xb0,0xb8,0xc0,0xc8,0xd0,0xd8,0x e0,0xe8,0xf0,0xf8,0xff,0xf8,0xf0,0xe8,0xe0,0xd8,0xd0,0xc8,0xc0,0xb8,0xb0,0xa8,0xa0,0x9 8,0x90,0x88,0x80,0x78,0x70,0x68,0x60,0x58,0x50,0x48,0x40,0x38,0x30,0x28,0x20,0x 18,0x10,0x08,0x00};uchar code sine_tab[256]={//输出电压从0到最大值(正弦波1/4部分)0x80,0x83,0x86,0x89,0x8d,0x90,0x93,0x96,0x99,0x9c,0x9f,0xa2,0xa 5,0xa8,0xab,0xae,0xb1,0xb4,0xb7,0xba,0xbc,0xbf,0xc2,0xc5,0xc7,0xca,0xcc,0xcf,0xd1,0xd4,0xd6,0xd8,0xda,0xdd ,0xdf,0xe1,0xe3,0xe5,0xe7,0xe9,0xea,0xec,0xee,0xef,0xf1,0xf2,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd, 0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,//输出电压从最大值到0(正弦波1/4部分)0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfd,0xfd,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7 ,0xf6,0xf5,0xf4,0xf2,0xf1,0xef,0xee,0xec,0xea,0xe9,0xe7,0xe5,0xe3,0xe1,0xde,0xdd,0xda,0xd8,0x d6,0xd4,0xd1,0xcf,0xcc,0xca,0xc7,0xc5,0xc2,0xbf,0xbc,0xba,0xb7,0xb4,0xb1,0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9 c,0x99 ,0x96,0x93,0x90,0x8d,0x89,0x86,0x83,0x80,//输出电压从0到最小值(正弦波1/4部分)0x80,0x7c,0x79,0x76,0x72,0x6f,0x6c,0x69,0x66,0x63,0x60,0x5d,0x5 a,0x57,0x55,0x51,0x4e,0x4c,0x48,0x45,0x43,0x40,0x3d,0x3a,0x38,0x35,0x33,0x30,0x2e,0x2b,0x29,0x27,0x25,0x 22,0x20,0x1e,0x1c,0x1a,0x18,0x16 ,0x15,0x13,0x11,0x10,0x0e,0x0d,0x0b,0x0a,0x09,0x08,0x07,0x06,0x05,0x04,0x 03,0x02,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00,//输出电压从最小值到0(正弦波1/4部分)0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02 ,0x02,0x03,0x04,0x05,0x 06,0x07,0x08,0x09,0x0a,0x0b,0x0d,0x0e,0x10,0x11,0x13,0x15 ,0x16,0x18,0x1a,0x1c,0x1e,0x20,0x22,0x25,0x27,0x 29,0x2b,0x2e,0x30,0x33,0x35,0x38,0x3a,0x3d,0x40,0x43,0x45,0x48,0x4c,0x4e,0x51,0x55,0x57,0x5a,0x5d,0x60,0x 63,0x66 ,0x69,0x6c,0x6f,0x72,0x76,0x79,0x7c,0x80};void delay(uchar z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void triangle_out() //三角波输出{DAdata=triangle_tab[wavecount++];if(wavecount>64) wavecount=0;DA_S1=0; //打开8位输入寄存器DA_S1=1; //关闭8位输入寄存器void sine_out() //正弦波输出{DAdata=sine_tab[wavecount++];DA_S1=0; //打开8位输入寄存器DA_S1=1; //关闭8位输入寄存器}void square_out() //方波输出{judge=~judge;if(judge==1) DAdata=0xff;else DAdata=0x00;DA_S1=0; //打开8位输入寄存器DA_S1=1; //关闭8位输入寄存器}/************1602液晶的相关函数*************/#define lcd_ports P1sbit rs=P2^2;sbit rw=P2^3;sbit lcden=P2^4;void write_com(uchar com){rs=0; //置零,表示写指令lcden=0;lcd_ports=com;delay(5);lcden=1;delay(5);lcden=0;}void write_date(uchar date){rs=1; //置1,表示写数据(在指令所指的地方写数据)lcden=0;lcd_ports=date;delay(5);lcden=1;delay(5);lcden=0;void disp_lcd(uchar addr,uchar *temp1){uchar num;write_com(addr);delay(1); //延时一会儿???for(num=0;num<16;num++){write_date(temp1[num]);//或者这样写write_date(*(temp1+num));delay(1);}}void init_lcd(){//uchar num;lcden=0; //可有可无???rw=0; //初始化一定要设置为零,表示写数据write_com(0x38); //使液晶显示点阵,为下面做准备write_com(0x0c); //初始设置write_com(0x06); //初始设置write_com(0x01); //清零write_com(0x80); //使指针指向第一行第一格disp_lcd(0x80,&lcd_hang1[3*16]); //在第一行显示disp_lcd(0xc0,&lcd_hang1[4*16]); //在第二行显示}/********************1602液晶函数声明结束*********************/ void main(){uchar i=0;DA_S2=0; //使DAC寄存器处于直通状态DAdata=0;DA_S1=1; //关闭8位输入寄存器init_lcd();waveform=0;TMOD=0x01; //设置定时器0为16位工作方式IT0=1; //设置外部中断0为下降沿触发ET0=1; //开定时器中断EX0=1;EA=1;while(1){//DAout(0xff); //可输出TTL波形//DAout(0x80);//T_temp=32;}}void timer0() interrupt 1{TH0=THtemp;TL0=TLtemp;if(waveform==0) sine_out();else if(waveform==1) triangle_out();else if(waveform==2) square_out();}void key_int0() interrupt 0{uchar keytemp;uint total_freq; //总频率EA=0; TR0=0; //关总中断与定时器delay(5); //延时够吗???if(key==0) //确实有按键按下而引发中断{keytemp=P3&0xf0; //获取P3口高四位的值switch(keytemp){case 0xe0: //选择波形waveform++;if(waveform>2) waveform=0;break;case 0xd0: //频率按规定单位依次增加wavefreq[waveform]++;if(wavefreq[waveform]>10) wavefreq[waveform]=1; // /*这边要用“>10”,因为它比“=11”可靠break;case 0xb0: //频率按规定单位依次衰减wavefreq[waveform]--;if(wavefreq[waveform]<1) wavefreq[waveform]=10; //这边要用“<1”,因为它比“=0”可靠性更高break;case 0x70: //TTL输出DA_S2=1; //使DAC寄存器关闭break;}THtemp=waveTH[waveform*10+(wavefreq[waveform]-1)]; //方括号中选取第几个数后,并把该值赋给T_tempTLtemp=waveTL[waveform*10+(wavefreq[waveform]-1)];total_freq= wavefreq[waveform] * freq_unit[waveform]; //求输出频率(个数*单位)lcd_hang2[5]=total_freq%10+0x30; //在液晶中显示个位,(0x30 在液晶显示中表示数字0)total_freq/=10; lcd_hang2[4]=total_freq%10+0x30; //在液晶中显示时十位total_freq/=10; lcd_hang2[3]=total_freq%10+0x30; //在液晶中显示时百位total_freq/=10; lcd_hang2[2]=total_freq%10+0x30; //在液晶中显示时千位disp_lcd(0x80,&lcd_hang1[waveform*16]); //在第一行显示disp_lcd(0xc0,lcd_hang2); //在第二行显示}wavecount=0; //'抽点'计数清零while(!key);EA=1; TR0=1; //开启总中断与定时器}。

51单片机驱动ADC0832模数转换程序lcd1602显示

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(&quot;Chanal 0:&quot;);writevalue(10,Chan0Value/100+0x30);writevalue(11,Chan0Value%100/10+0x30);writevalue(12,Chan0Value%100%10+0x30);wr_com(0x80+0x40);zifuchuan(&quot;Chanal 1:&quot;);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即可。

ADC0832中文资料及汇编程序

ADC0832中文资料及汇编程序

;拉低 CLK 端,形成下降沿 3
R7,#8 C,ADDO ACC.0,C A ADCLK
;准备送下后 8 个时钟脉冲 ;接收数据 ;左移一次
ADCLK
;形成一次时钟脉冲
R7,AD_1 C,ADDO ACC.0,C B,A R7,#8 C,ADDO ACC.0,C
;循环 8 次 ;接收数据
;接收数据
作为单通道模拟信号输入时 ADC0832 的输入电压是 0~5V 且 8 位分辨率时的电压精度 为 19.53mV。如果作为由 IN+与 IN-输入的输入时,可是将电压值设定在某一个较大范围之 内,从而提高转换的宽度。但值得注意的是,在进行 IN+与 IN-的输入时,如果 IN-的电压 大于 IN+的电压则转换后的数据结果始终为 00H。 ADC0832 芯片接口程序的编写: 为了高速有效的实现通信,我们采用汇编语言编写接口程序。由于 ADC0832 的数据转 换时间仅为 32μS,所以 A/D 转换的数据采样频率可以很快,从而也保证的某些场合对 A/D 转换数据实时性的要求。数据读取程序以子程序调用的形式出现,方便了程序的移植。 程 序占用资源有累加器 A,工作寄存器 R7,通用寄存器 B 和特殊寄存器 CY。通道功能寄 存器和转换值共用寄存器 B。在使用转换子程序之前必须确定通道功能寄存器 B 的值,其 赋值语句为“MOV B,#data”(00H~03H) 。运行转换子程序后的转换数据值被放入 B 中。 子程序退出后即可以对 B 中数据处理。 ADC0832 芯片接口程序[汇编]: ;以下接口定义根据硬件连线更改 ADCS BIT P3.5 ;使能接口 ADCLK BIT P3.4 ;时钟接口 ADDO BIT P3.3 ;数据输出接口(复用) ADDI BIT P3.3 ;数据输入接口 ;以下语句在调用转换程序前设定 MOV B,#00H ;装入通道功能选择数据值 ;以下为 ADC0832 读取数据子程序 ;==== ADC0832 读数据子程序==== ADCONV: SETB ADDI ;初始化通道选择 NOP NOP CLR ADCS ;拉低/CS 端 NOP NOP

adc0832 C程序

adc0832 C程序
通道6+,(单端方式)
// =1100 通道1+, =1101
通道3+,(单端方式)
// =1110 通道5+, =1111
通道7+,(单端方式)
//引脚/SE可以接地,不使用其控制反响字节的输出延时功能!
chanel |=0x10; //附加起始位
for(i=0; i<5; i++)
uchar adc083x_do_one_change(uchar chanel)
{
uchar data ad_val;
uchar data i;
//转换前的初始化
SET_ADC083X_CS;
CLR_ADC083X_CLK;
SET_ADC083X_DO;
CLR_ADC083X_CS;
关键词:ADCADC0832 是美国国家半导体公司生产的一种8 位分辨率、双通道A/D转换
芯片。由于它体积小,兼容性强,性价比高而深受单片机爱好者及企业欢迎,
其目前已经有很高的普及率。学习并使用ADC0832 可是使我们了解A/D转换器
的原理,有助于我们单片机技术水平的提高。
adc0832 C程序
//功能:
// 读出AD数据字节
//输入:
// chanel 通道号以及单、双端设置选择,它的值被类型值限制!
// 即有效值是select分别取最低4、3、2位或不使用
// 具体的值参见pdf文档!
//输出:
// AD转换的结果字节
//********************************************************

基于51单片机和DAC0832的多路波形发生器(汇编语言编写)

基于51单片机和DAC0832的多路波形发生器(汇编语言编写)

以多种波形发生器为对象,选择单片机、独立按键及D/A转换器,设计相应的电路构成多种波形发生器。

功能要求:1.有4个功能键,分别用来选择输出:三角波、锯齿波、梯形拨、方波。

2.按下某个功能键,进入中断,在中断程序中查询、确定是哪个功能键,并输出对应的波形。

3.显示器2位,显示功能号01、02、03、04,代表输出三角波、锯齿波、梯形拨、方波。

设计任务:1、完成单片机最小系统电路设计。

2、完成按键电路设计。

3、完成D/A转换及接口电路的设计。

4、完成显示电路的设计。

电路图如下:(proteus仿真通过)其一仿真图:源程序如下:ORG 00HSTART:LJMP MAINORG 0003H;外部xxxxLJMP INSER;转到xx服务程序ORG 0030HMAIN:MOV DPTR,#7FFFH;DAC0832地址SETB EX0;允许xxSETB IT0;负边沿触发方式SETB EA;开xxHERE:JB 20H.0,ST;锯齿波处理JB 20H.1,TRI;三角波处理JB 20H.2,SQ;方波处理JB 20H.3,TXB;梯形波处理SJMP HERE;等待xxINSER:JNB P1.0, LL1;中断服务程序,查询按键SJMP L1LL1:MOV 20H,#00HSETB 20H.0;设置锯齿波标志SJMP RTL1:JNBP1.2, LL2SJMP L2LL2:MOV 20H,#00HSETB 20H.1;设三角梯波标志SJMP RTL2:JNB P1.4, LL3SJMP L3LL3:MOV 20H,#00HSETB 20H.2;设置方波标志SJMP RTL3:JNB P1.6, LL4SJMP RTLL4:MOV 20H,#00HSETB 20H.3;设置梯形波标志RT:RETI;xx返回ST:1.1;锯齿波CLR P1.3SETB P1.5CLR P1.7MOVA,#00HLOOPP:MOVX@DPTR,A;启动D/A转换INCAJB20H.0,LOOPP;连续输出波形LJMPHERETRI:CLR P1.1;三角波CLR P1.3CLR P1.51.7MOVA,#00HUP:MOVX@DPTR,A;启动D/A转换INCA;上升沿CJNEA,#0FFH,UPDOWN:MOVX@DPTR,A;启动D/A转换DECA;下降沿CJNEA,#00H,DOWNJB20H.1,UP;连续输出波形LJMPHERESQ:CLR P1.1;方波SETB P1.3CLR P1.5CLR P1.7MOVA,#00HMOVX@DPTR,A;DAC输出低电平ACALLDELAY;xx1MOVA,#0FFHMOVX@DPTR,A;DAC输出高电平ACALLDELAY;xx2JB20H.2, SQ;连续输出波形LJMPHERETXB:CLR P1.1;梯形波CLR P1.3SETB P1.5SETB P1.7MOV A,#00HMOVX @DPTR,AACALL DELAYLOOP:MOVX @DPTR,AINC ACJNE A,#0FFH,LOOP ACALL DELAY MOVX @DPTR,A LOOP1:DEC A MOVX @DPTR,A CJNE A,#00H,LOOP1 MOVX @DPTR,A ACALL DELAYJB 20H.3,LOOP DELAY:MOVR4,#0FHLOOP11:MOVR5,#10H LOOP22: NOPNOPNOPDJNZR5,LOOP22 DJNZR4,LOOP11 RETEND;xx子程序。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档