基于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子程序。

单片机对串行A_D转换器ADC0832的C51编程

单片机对串行A_D转换器ADC0832的C51编程
[1 ] 蔡向 东. 单 片机 软件 模拟 SP I接 口的 解 决方 案 [ J ]. 信息 技术 , 2006 (6 ) : 134~135. [2 ] 王幸之 ,钟爱琴 ,王雷等. AT89系列单片机原理与 接口技术 [M ].
北京 :北京航空航天大学出版社 , 2004: 345 ~346.
3. 2 单片机串行口方式 0与 ADC0832 的接口 单片机串行工作方式时 , 串行口 是作为同步移 位寄存器使用 。这时以 RXD 端作为 数据移位的入 口和出口 ,而由 T XD 端提供移位时钟脉冲 。
图 3 STC89C51 串行口方式 0 时与 ADC 0832 的 接口
图 3 为单片机串 行口方式 0 与 ADC0832 的接 口 , 单片机 P1. 4 接 ADC0832的 CS, TXD (接 0832 的 CLK)作为时钟信号输出端 , RXD (接 0832 的 DO 和 D I) 作为启动位 、 配置位的发送端以及 A /D 转换后 输出数据的接收端 。由于 ADC0832 在 CS变低后的 前 3个周期内 , DO 端为高阻态 ; 转换开始后 , D I线禁 止 , 因此 , D I端和 DO 端可连接在一起 。 ADC0832的时钟频率最高为 400kHz, 单片机晶 振可选用 4M Hz, 在 TXD 的输出频率为 4MHz/ 12 = 333. 3kHz, 符合要求 。 ADC0832输出的串行数据共 15位 ,由两段 8 位 数据组成 , 前一段是最高 位在先 , 后一段是最 高在 后 , 两段数据的最低位共用 。只有在时钟的下降沿 , ADC0832的串行数据才移出一位 。由单片机控制时 钟信 号的 发送 , 并 由 TXD 发 出 , 以 达到 控 制 ADC 0832输出数据位的目的。为了得到一列完整的 8 位 数据 ,单片机分两次采集含有不同位的数据 , 再合成 一列完整的 8 位数据 。 (源程序略 ) 参考文献

单片机ADC0832液晶显示程序

单片机ADC0832液晶显示程序

//第三个脉冲
for(i=0;i<8;i++) {
clk=1; clk=0; if(dout) {
dat1|=0x80>>i; } } /* for(i=0;i<8;i++) {
clk=1; clk=0; if(dout) {
dat2|=0x01<<i; } } */ cs=1; din=1; clk=0; // if(dat1==dat2) // { return dat1; // }
if(*p=='\0') break; lcd_writedata(*p); p++; } }
//lcd 从第(行,列,字符)开始写
uchar adc0832(uchar channel) { /* uchar i=0;
uchar dat=0;
if(channel==0)channel=2; if(channel==1)channel=3; din=0;cs=1;clk=0; din=1;cs=0;clk=1;
}
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int /*.......引脚的定义得根据自己具体的板子原理图......*/ sbit cs =P1^2; //adc0832 使能端引脚定义 sbit din=P3^3; //adc0832 输入端定义
sbit dout=P3^2;
//adc0832 输出端定义
sbit clk=P1^1; //时钟引脚

51单片机 数码管显示 串行模数转换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,差分输入。

基于51单片机和DAC0832的信号源(proteus电路图加程序)

基于51单片机和DAC0832的信号源(proteus电路图加程序)

基于51单⽚机和DAC0832的信号源(proteus电路图加程序)班级学号⾃动测试实验报告学院机电⼯程学院专业测控技术与仪器导师姓名吕晓洲学⽣姓名学号摘要本⽂介绍了以8051和DAC0832为核⼼的信号源,可以通过按键选择正弦波、⽅波、三⾓波、锯齿波和梯形波,也可以通过按键选择798.6Hz、266.2Hz、88.7Hz、29.6Hz、9.85Hz、3.3Hz、1.1Hz共九档频率。

波形和频率通过软件改变,幅值通过硬件放⼤的放⼤器改变。

本信号源具有结构简单、功能丰富、使⽤⽅便另外价格实惠等特点。

【关键词】单⽚机,8051,DAC0832,信号源,频率,波形⼀.实验要求以及⽅案选择1.实验要求:设计⼀个信号源,能产⽣正弦波、三⾓波、锯齿波、⽅波等简单的波形,能够⽅便改变波形和频率。

2.⽅案选择:⽅案⼀:完全由硬件电路制作,使⽤传统的锁相频率合成⽅法。

通过芯⽚IC145152,压控振荡器搭接的锁相环电路输出稳定性极好的正弦波,再利⽤过零⽐较器转换成⽅波,积分电路转换成三⾓波。

此⽅案,电路复杂,⼲扰因素多,不易实现。

⽅案⼆:直接利⽤波形产⽣芯⽚,例如,利⽤MAX038芯⽚组成的电路输出波形。

MAX038是精密⾼频波形产⽣电路,能够产⽣准确的锯齿波、三⾓波、⽅波和正弦波四种周期性波形。

但此⽅案成本⾼,程序复杂度⾼。

⽅案三:通过单⽚机控制DAC,输出五种波形。

此⽅案输出的波形分辨率不够⾼,频率有限。

但此⽅案电路简单、成本低,波1.80C51单⽚机80C51单⽚机属于MCS-51系列单⽚机,由Intel公司开发,其结构是8048的延伸,改进了8048的缺点,增加了如乘(MUL)、除(DIV)、减(SUBB)、⽐较(CMP)、16位数据指针、布尔代数运算等指令,以及串⾏通信能⼒和5个中断源。

采⽤40引脚双列直插式DIP(Dual In Line Package),内有128个RAM单元及4K的ROM。

它把构成计算机的中央处理器CPU、存储器、寄存器、I/O接⼝制作在⼀块集成电路芯⽚中,从⽽构成较为完整的计算机、⽽且其价格便宜。

51单片机 ADC0832c代码 针对五伏电压的转化

51单片机 ADC0832c代码 针对五伏电压的转化

/************************************//* 针对五伏电压的转化//************************************/#include<reg52.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intsbit P07=P0^7;//控制小数点的显示sbit cs=P1^0;sbit d0=P1^2;sbit clk=P1^1;uchar NumTab[10]={ //段选码值共阳极的代码0xC0,/*0*/0xF9,/*1*/0xA4,/*2*/0xB0,/*3*/0x99,/*4*/0x92,/*5*/0x82,/*6*/0xF8,/*7*/0x80,/*8*/0x90/*9*/};uchar SectTab[9]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xff,0xff,0xff}; uchar dat0[3];//uchar dat1[8];int xianshi[8];void delay(uchar z) //延时函数{uchar x,y;for(x=0;x<110;x++)for(y=z;y>0;y--);}void process() //数据处理函数{uchar data0=0;//uchar data1=0;double shuzi0; //用于存放读回来转化的电压值uchar i;for(i=0;i<8;i++) //对前八位数据进行处理{data0+=dat0[i]<<i;}shuzi0=data0*5/255.0; //转化为电压值xianshi[0]=(int)(shuzi0); //个位xianshi[1]=(int)(shuzi0*10)%10; //十分位xianshi[2]=(int)(shuzi0*100)%10;//百分位/*for(i=0;i<8;i++) //对后八位数据处理{data1+=dat1[i]<<i;}shuzi1=data1*5/255.0; //转化为电压值xianshi[3]=(int)(shuzi1); //个位xianshi[4]=(int)(shuzi1*10)%10; //十分位xianshi[5]=(int)(shuzi1*100)%10;//百分位*/}void display() //数码管动态扫描显示函数{uchar i;for(i=0;i<3;i++){P3=SectTab[i];P0=NumTab[xianshi[i]];if(i==0||i==3) //显示小数点{P07=0;delay(1);P07=1;}delay(2);}}void select() //选通函数{cs=1;clk=0;d0=1;cs=0;d0=1; //起始信号clk=1; //第一个下降沿clk=0;d0=1;clk=1; //第二个下降沿clk=0;d0=0;clk=1; //第三个下降沿clk=0;}void main(){uchar i;while(1){select();d0=1; //释放数据线for(i=0;i<8;i++){clk=1;clk=0;dat0[7-i]=d0;}/* for(i=0;i<7;i++){clk=1;clk=0;dat1[i+1]=d0;}dat1[0]=dat0[7];*/ //因为前八位和后八共了最低位cs=1;process();display();}}。

ADC0832——C程序

ADC0832——C程序

//******************adc0832****************************// sbit CS=P1^0; //使能。

sbit CLK=P1^1;//时钟sbit Do=P1^2; // 数据输出sbit Di=P1^2;//数据输入unsigned char CH=0x02;//通道的选择:0x02就是单通道0;0x03就是单通道1;//0x00就是双通道ch0=“+”;ch0=“-”//0x01就是双通道ch0=“-”;ch0=“+”//*****************************************************// unsigned char ADconv(void){unsigned char i;unsigned int data_f=0,data_c=0;Di=1;CS=1;_nop_();CS=0;Di=1; ;//芯片使能之前的初始化。

第一个下降沿CLK=1;_nop_();_nop_();/****************************************/CLK=0; // 确定通道模式、第2个下降沿_nop_();_nop_();CLK=1;Di=(bit)(0x02&CH); //设定通道初始化_nop_();CLK=0;_nop_();_nop_();CLK=1;Di=(bit)(0x01&CH); //设定通道初始化 .第3个下降沿_nop_();_nop_();CLK=0; //AD转化的初始化完成。

Di=1;CLK=1;_nop_();_nop_();CLK=0;_nop_();CLK=1;for(i=8;i>0;i--)//得到一个正常排序的8位数据{data_f|=Do;data_f<<=1;CLK=1;_nop_();_nop_();CLK=0;_nop_();}for(i=8;i>0;i--)//得到一个反序排列的8位数据{data_c<<=1;data_c|=Do;_nop_();CLK=1;_nop_();_nop_();CLK=0;_nop_();CLK=0;_nop_();_nop_();CLK=1;_nop_();_nop_();CLK=0;_nop_();_nop_();CLK=1;_nop_();CS=1;_nop_();_nop_();return data_f;}void main(void){ unsigned int data_temp=0; while(1){ data_temp=ADconv();xs_int(196*data_temp,1);}}//***********************led.h*******************************************// //******************led1602**********/#include<intrins.h>#include<math.h>#define DD P2sbit Rs=P3^0;sbit Rw=P3^1;sbit E=P3^2;sbit busy_p=ACC^7;//********************************//void delay_1ms(unsigned char i) //最小延时1ms{ unsigned char j;while(i--)for(j=0;j<125; j++);}void delay_10ns(unsigned char i) //最小延时10ns{ unsigned char j;for(j=0;j<10; j++);}/*void rd_busy(void) //读忙。

adc0832程序

adc0832程序
while(1){
if(i==0){
tmp=ad0832read(1,0); //循环255个周期读取一次0832,因CPU运行比较快,没必要每次循环都去读取,选择通过CH0输入
l_tmpdate[0]=tmp/100; //得到百位
tmp=tmp%100;
{
unsigned char i=0,tmp=0,tmp2=0;
SCL=0;_nop_();_nop_();
SDA=1;_nop_();_nop_();
CS=0;_nop_();_nop_(); //开始
SCL=1;_nop_();_nop_(); //第一个上升沿
P2=0; //清0端口,准备显示下位
if(i==7) //检测显示完8位否,完成直接退出,不让P1口再加1,否则进位影响到P13数据
break;
P1++; //下一位数码管
}
}
////////////////延时子函数 /////////////////////////////////
SCL=1;_nop_();_nop_();
SCL=0;_nop_();_nop_();
}
CS=1;_nop_();_nop_(); //结束
SCL=1;
if(tmp==tmp2) //与校验数据比较,正确就返回数据,否则返回0
return tmp;
void display(unsigned char *lp,unsigned char lc);//显示函数
void delay(unsigned int timer); //延时子函数
unsigned char ad0832read(bit SGL,bit ODD); //读模数转换ADC0832的数据,参数为通道选择

ADC0832简单应用c程序

ADC0832简单应用c程序

#include <reg52.h>#include <intrins.h>#include <absacc.h>#define uchar unsigned char#define uint unsigned int#define led_wei 0xefff#define led_duan 0xf7ffsbit ADCLK =P1^6; //时钟接口sbit ADDO =P3^5; //数据输出接口sbit ADDI =P1^7; //数据输入接口sbit ADCS =P1^5; //使能接口uchar buff[] = {0};uint data i;uchar code seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82, 0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x 8e};void disp(uchar n){uchar dis0,dis1;dis0=n&0x0f;dis1=(n&0xf0)>>4;XBYTE[led_duan]=seg[dis0];XBYTE[led_wei]=0xfe;//for(i=0;i<60000;i++){_nop_();}XBYTE[led_wei]=0xfc;XBYTE[led_duan]=seg[dis1];XBYTE[led_wei]=0xfd;//for(i=0;i<60000;i++){_nop_();}XBYTE[led_wei]=0xfc;}/************************************* *********程序名称:ADC0832子程序作者:liuanggh时间:2006.12.30************************************* *********//************************************* *******************函数名称:void AD_init(uchar i)函数作用:初始化ADC0832参数说明:i=2,表示通道0,i=3,表示通道1 ************************************* *******************/void AD_init(uchar i){ADDI = 1; /*在第1 个时钟脉冲的下沉之前DI端必须是高电平,表示启始信号*/_nop_();_nop_();ADCS = 0; //使能ADC0832_nop_();_nop_();ADCLK = 0;_nop_();_nop_();_nop_();ADCLK = 1; //形成上升降沿1_nop_();_nop_(); /*在第2、3个脉冲下沉之前DI端应输入2位数据用于选择通道功能*/_nop_();ADCLK = 0;_nop_();_nop_();ADDI = 1;_nop_();_nop_(); ADCLK = 1;//lock sgl _nop_();_nop_(); ADCLK = 0;_nop_();_nop_();if(i==0x02)ADDI = 0;if(i==0x03)ADDI = 1;_nop_();_nop_(); ADCLK = 1;_nop_();_nop_();ADCLK = 0;_nop_();_nop_();_nop_();_nop_();}/************************************* *******************函数名称:uchar AD_read()函数作用:读取ADC0832转换的数据参数说明:无函数返回:返回8位的数据************************************* *******************/uchar AD_read(){uchar temp = 0;uchar temp1 = 0;uchar temp2 = 0;uchar i = 0;uchar flag = 0;for(i = 0; i < 8; i++){ ADDO=1;ADCLK = 1;_nop_();_nop_();ADCLK = 0; //形成下降沿_nop_();_nop_();if(ADDO)temp1|=0x01;temp1 = temp1 << 1;}if(ADDO)temp2 |= 0x80;for(i = 0; i < 8; i++){temp2 = temp2 >> 1;ADCLK = 1;_nop_();_nop_();if(ADDO)temp2|=0x80;ADCLK = 0; //形成下降沿_nop_();_nop_();}//if(temp1 == temp2)return temp1;}unsigned int Adc0832(unsigned char channel) {uchar i=0;uchar j;uint dat=0;uchar ndat=0;if(channel==0)channel=2;if(channel==1)channel=3;ADDI=1;_nop_();_nop_();ADCS=0;//拉低CS端_nop_();_nop_();ADCLK=1;//拉高CLK端_nop_();_nop_();ADCLK=0;//拉低CLK端,形成下降沿1 _nop_();_nop_();ADCLK=1;//拉高CLK端ADDI=channel&0x1;_nop_();_nop_();ADCLK=0;//拉低CLK端,形成下降沿2 _nop_();_nop_();ADCLK=1;//拉高CLK端ADDI=(channel>>1)&0x1;_nop_();_nop_();ADCLK=0;//拉低CLK端,形成下降沿3 ADDI=1;//控制命令结束_nop_();_nop_();dat=0;for(i=0;i<8;i++){dat|=ADDO;//收数据ADCLK=1;_nop_();_nop_();ADCLK=0;//形成一次时钟脉冲_nop_();_nop_();dat<<=1;if(i==7)dat|=ADDO;}for(i=0;i<8;i++){j=0;j=j|ADDO;//收数据ADCLK=1;_nop_();_nop_();ADCLK=0;//形成一次时钟脉冲_nop_();_nop_();j=j<<7;ndat=ndat|j;if(i<7)ndat>>=1;}ADCS=1;//拉低CS端ADCLK=0;//拉低CLK端ADDO=1;//拉高数据端,回到初始状态dat<<=8;dat|=ndat;return(dat); //return ad data }main(){uchar n;uint i,m;while(1){m=Adc0832(1); disp(m);}}。

51单片机+串口中断+adc0832

51单片机+串口中断+adc0832

#include<reg52.h>#include<intrins.h>#include<stdio.h>#define uint unsigned int#define uchar unsigned charsbit CS=P1^0;sbit clk=P1^1;sbit DI=P1^2;sbit DO=P1^2;uchar data0;uchar flag,flagt0,a;char xianshi[8];uchar fault[26]="Please input the right key";void ADC_start(){//CS=1; // 片选拉高没有选通//_nop_();//clk=0;//_nop_(); //CS=0; //片选拉低,芯片选通_nop_();DI=1; //表示起始信号第一个时钟信号下沉之前使DI=1,表示起始信号;clk=1;_nop_();clk=0; //第一个时钟脉冲下沉DI=1;clk=1; //在第二个和第三个脉冲下沉之前对DI两次赋值,选择通道_nop_();clk=0; //第二个时钟脉冲下沉DI=0;clk=1;_nop_();clk=0; //通道选择完毕//第三个时钟脉冲下沉DI=1; //DI端失去输入作用,将其释放clk=1; //将时钟线释放}uchar ADC_date(){uchar i;uchar date;ADC_start();for(i=0;i<16;i++){date<<=1;clk=0; //第四个脉冲下沉开始输出数据date=date|DO;clk=1;}CS=1;clk=0;return date;}void main(){uchar i;uchar K,xianshi[5];float temp;TMOD=0x20;//确定定时器的工作方式TH1=0xfd;//置初值TL1=0xfd;SM0=0; //串行口工作方式1 SM1=1;REN=1;//允许穿行接受EA=1; //开总中断ES=1; //开串行口中断TR1=1;ADC_start();while(1){//process();if(flag==1){ES=0;if(a==0x01){K=ADC_date();temp=K*5/255.0; // ES=1;//再次打开中?xianshi[0]=(int)(temp)+48; //个位xianshi[1]=46; //.的ASCIIxianshi[2]=(int)(temp*10)%10+48; //十分位xianshi[3]=(int)(temp*100)%10+48;//百分位xianshi[4]=' ';for(i=0;i<5;i++){SBUF=xianshi[i];while(!TI); //judge wheather finishing transferTI=0;//软件清零ES=1;//再次打开中断}/* TI=1;printf("AD is %f\n",temp);while(!TI);TI=0;ES=1;*/}if(a!=0x01){for(i=0;i<26;i++){SBUF=fault[i];while(!TI); //judge wheather finishing transferTI=0;//软件清零}ES=1;//再次打开中断}flag=0;}}}void serial() interrupt 4{RI=0; //接收中断标志位有软件来清零a=SBUF; //把接收到得数据存取在sbufflag=1;}。

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