1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > STC51单片机17——adc 8032

STC51单片机17——adc 8032

时间:2022-06-29 18:16:09

相关推荐

STC51单片机17——adc 8032

/*********************************包含头文件********************************/

#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};//零到九

unsigned 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;

else

adval |= 0x00;

}

for (i = 0; i < 8; i++) //读取后8位的值

{

test >>= 1;

if (DATO)

test |= 0x80;

else

test |= 0x00;

_nop_();

Clk = 1;

_nop_();

Clk = 0;

}

if (adval == test) //比较前8位与后8位的值,如果不相同舍去。若一直出现显示为零,请将该行去掉

dat = test;

_nop_();

CS = 1; //释放ADC0832

DATO = 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或0x01

TMOD = 0x01; //设置中断

TH0=(65536-50000)/256;//定时器1初值定时50ms

TL0=(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初值定时50ms

TL0=(65536-50000)%256;

IE = 0x82;

TR0 = 1;

count++;

if (count == 0x01)

{

count = 0x00;

dat = adc0832(CH);

}

}

完整资料打包(含仿真):

STC51单片机17-adc8032资源-单片机文档类资源-CSDN下载

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。