STC单片机自带AD代码问题

STC单片机自带AD代码问题,第1张

同学,你的问题有问题

你是想问STC系列单片机的AD问题还是串口问题

你上面这段程序是51单片机串口初始化程序而不是AD程序。

51单片机串口初始化为

void COM_Init(void)

{

SCON = 0x50;

TMOD &= 0x0F;

TMOD |= 0x20;

PCON |= 0x80;

TH1 = 0xFD;

ES=1;EA=1;

TR1 = 1;

TI = 1;

}

AD转换程序

//定义与ADC有关的特殊功能寄存器

sfr ADC_CONTR =0xC5;

sfr ADC_DATA =0xC6;

sfr ADC_LOW2 =0xBE;

sfr P1M0 =0x91;

sfr P1M1 =0x92;

sbit p20 =P2^0;

void STC90CxxAD_delay(int timer) //延时函数

{

while(timer--);

}

int Ad_Change(char channel) //AD转换

{

int AD_Result_Temp = 0 ;

P1 = 0xff; //将P1口置高,为A/D转换作准备

ADC_CONTR = ADC_CONTR|0x80; //1000,0000打开A/D转换电源

P1M0 = 0x03; //0000,0011用于A/D转换的P1x口,先设为开漏

P1M1 = 0x03; //0000,0011P10--P11先设为开漏。断开内部上拉电阻

STC90CxxAD_delay(20); //20

ADC_CONTR = ADC_CONTR&0xE0; //1110,0000 清ADC_FLAG,ADC_START位和低3位

ADC_CONTR = ADC_CONTR|(channel); //设置当前通道号

STC90CxxAD_delay(1); //延时使输入电压达到稳定

ADC_DATA = 0; //清A/D转换结果寄存器

ADC_LOW2 = 0;

ADC_CONTR = ADC_CONTR|0x08; //0000,1000ADCS = 1,启动转换

do { ; }

while((ADC_CONTR & 0x10)==0); //0001,0000等待A/D转换结束

ADC_CONTR = ADC_CONTR&0xE7; //1110,0111清ADC_FLAG位,停止A/D转换

AD_Result_Temp = ((AD_Result_Temp|ADC_DATA)<<2)|(ADC_LOW2&0x03);

//保存返回AD转换的 结果

STC90CxxAD_delay(1); //

return AD_Result_Temp;

}

已调试通过,望对你有用

简单点,建立32位变量A,每采样一次就加到A,采样完8次再除以8就好了,

u16 ADC_ZKB(u8 Channel)

{

u32 value1=0;

u16 value;

u8 i;

for(i=0;i<8;i++)

{

ADC_CSR = Channel & 0x0F; // 选择AD转换通道

ADC_CR1 |= 0x01; // 启动AD转换

while(!(ADC_CSR & 0x80)); // 等待AD转换完成

value = ADC_DRL;

value |=((ADC_DRH<<8)&0X0300);

value1+=value;

ADC_CSR = 0x00;

}

return (value1/8);

}

大概这意思,怎么定义32位数,这个自己去查,因为AD采样时间比较久,估计这样FOR可能不合适,自己可以改改。

ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch ;//开始转换

这是用STC单片机内部A/D转换电路进行A/D转换时,要给A/D控制寄存器ADC_CONTR写启动转换命令,ADC_CONTR是ADC控制寄存器,其中的每一位的作用见下图,而这行语句前面肯定要有定义每一位状态的语句,或用#define宏定义了各位的值。

我只能给你提供个思路,10脚似乎有电压检测功能,用12C5410AD的有

开启电压变化检测-->当电压变化,开启A/D采样-->根据采样值的范围查表跳转到相应的功能

兄弟:不知道你玩不玩32 ,有个32 的在工程上用过,直接刷程序,串口连接电脑就可以输出AD 转换的结果。如果不玩32 的话。

首先第一步排查: 排查单片机能不能正确显示 你测试到的 AD 信号,显示正确不?

比如给他 3V 电压 ,用数码管显示出来。

第二: 串口发送,找个能正确发送数据的代码 ,直接把 ,你检查的数值给这个变量,让串口发送,

一步一步找问题,你绝对能解决的。我把AD0809 的代码给你用数码管测试

#include <reg52h>

#define uint unsigned int

#define uchar unsigned char

uchar code LEDData[]=

{

0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f

};

sbit OE = P1^0;

sbit EOC = P1^1;

sbit ST = P1^2;

sbit CLK = P1^3;

void DelayMS(uint ms)

{

uchar i;

while(ms--)

{

for(i=0;i<120;i++);

}

}

void Display_Result(uchar d)

{

P2 = 0xf7;

P0 = LEDData[d%10];

DelayMS(5);

P2 = 0xfb;

P0 = LEDData[d%100/10];

DelayMS(5);

P2 = 0xfd;

P0 = LEDData[d/100];

DelayMS(5);

}

void main()

{

TMOD = 0x02;

TH0 = 0x14;

TL0 = 0x00;

IE = 0x82;

TR0 = 1;

P1 = 0x3f;

while(1)

{

ST = 0;

ST = 1;

ST = 0;

while(EOC == 0);

OE = 1;

Display_Result(P3);

OE = 0;

}

}

void Timer0_INT() interrupt 1

{

CLK = !CLK;

}

以上就是关于STC单片机自带AD代码问题全部的内容,包括:STC单片机自带AD代码问题、求修改单片机AD口多次采样求平均值的程序、单片机AD转换用的这段程序意思是什么等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/10175318.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-06
下一篇2023-05-06

发表评论

登录后才能评论

评论列表(0条)

    保存