⑴ STC单片机芯片哪个型号自带8位AD
STC带AD的一般都是10位的
比如 stc12c5410AD(28脚)
STC89LE516 AD(40脚)
你可以到 宏晶科技 官方网址看一下
希望对你能有帮助
⑵ 请教stc自带ad的51单片机的使用方法
STC单项片机说明文档里有例子
下面是我的采集程序,采三次,求平均值:
void adchange()//AD采集程序,采集3路
{
uchar temp7,temp8,temp9,temp10,temp11,temp12;
uint tempa,tempb,tempc,tempd;
ADC_CONTR=ADC_CONTR|0X80; //10000000 开启转换电源
Delay1ms(1); //延时,等待内部电源稳定
//P1M0=P1M0|0X07; //设置p1.0 P1.1和 p1.3所在通道为开/漏模式
//P1M1=P1M1|0X07;
ADC_CONTR=0xe0; //11100000 开启P1.0通道开始转换
Delay25us(10); //延时一端时间,使输入电压达到稳定
ADC_DATA =0x00; //清A/D转换结果寄存器
ADC_LOW2 =0x00;
ADC_CONTR |= 0x08; //ADC_START=1,开始转换
while(!(ADC_CONTR&0x10)); //0001,0000 等待A/D转换结束
temp7=ADC_DATA; //读取转换结果
temp8=ADC_LOW2;
ADC_DATA =0x00; //清A/D转换结果寄存器
ADC_LOW2 =0x00;
ADC_CONTR=ADC_CONTR&0xe7; //将ADC_FLAG软件清零
Delay25us(1);
ADC_CONTR |= 0x08; //ADC_START=1,开始转换
while(!(ADC_CONTR&0x10)); //0001,0000 等待A/D转换结束
temp9=ADC_DATA; //读取转换结果
temp10=ADC_LOW2;
ADC_CONTR=ADC_CONTR&0xe7; //将ADC_FLAG软件清零
Delay25us(1);
ADC_DATA =0x00; //清A/D转换结果寄存器
ADC_LOW2 =0x00;
ADC_CONTR |= 0x08; //ADC_START=1,开始转换
while(!(ADC_CONTR&0x10)); //0001,0000 等待A/D转换结束
temp11=ADC_DATA; //读取转换结果
temp12=ADC_LOW2;
ADC_CONTR=ADC_CONTR&0xe7; //将ADC_FLAG软件清零
Delay25us(1);
ADC_DATA =0x00; //清A/D转换结果寄存器
ADC_LOW2 =0x00;
tempa=(temp7*4+temp8);//真烦人,但必须这么算,一次算会出错
tempb=(temp9*4+temp10);
tempc=(temp11*4+temp12);
tempd=tempa+tempb+tempc;
temp1=(tempd+1)/3;
。。。。。。其它两路略
//P1M0=P1M0&0X00; //设置P1口为普通I/O模式,以便用P1口显示数据。
//P1M1=P1M1&0X00;
}
⑶ STC单片机和51单片机的区别
1、种类不同:51系列单片机是指51内核,stc89c5X基本都是51内核的种类。
2、大小不同:最后一个数字表示E2prom的大小,E2prom=X*4K,c51就是4K,c52就是8k。
3、配件不同:52还多了一个定时器,所以可以说52是51(这个51是指stc89c51,不是51内核)的增强型。
如下图,可以很清晰的看出两者之间的差别:
向左转|向右转
(3)自带ad的stc单片机扩展阅读:
单片机(Microcontrollers)作为计算机发展的一个重要分支领域,根据发展情况,从不同角度,单片机大致可以分为通用型/专用型、总线型/非总线型及工控型/家电型。
通用型
这是按单片机(Microcontrollers)适用范围来区分的。例如,80C51式通用型单片机,它不是为某种专门用途设计的;专用型单片机是针对一类产品甚至某一个产品设计生产的,例如为了满足电子体温计的要求,在片内集成ADC接口等功能的温度测量控制电路。
⑷ STC单片机AD基准电压问题
这是一种聪明的解决办法,对于一些不提供基准输入引脚,只能以电源电压为基准的CPU。该方法消除了电源电压带来的误差。
具体是在多路AD的某一路连接一个高精度电压基准(例如1.25V)。测量时,先测量(用AD)该基准,得到该基准电压的对应测量值。例如0xc8,十进制是200。再去测量被测电压,比如得到0x190,十进制是400。则实际电压应该是1.25*400/200=2.5V。
⑸ STC单片机自带AD代码问题
同学,你的问题有问题
你是想问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转换的P1.x口,先设为开漏
P1M1 = 0x03; //0000,0011P1.0--P1.1先设为开漏。断开内部上拉电阻
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;
}
已调试通过,望对你有用
⑹ 请教stc自带ad的51单片机的使用方法
#include<reg52.h>#include<intrins.h>
#define uchar unsigned char#define uint unsigned int
sfr ADC_CONTR = 0xbc; //ADC控制寄存器
sfr ADC_RES = 0xbd; //ADC转换结果高八位寄存器
sfr ADC_LOW2 = 0xbe; //ADC转换结果低两位寄存器
sfr P1ASF = 0x9d; //P1口模拟功能控制寄存器
#define ADC_POWER 0x80 //ADC电源控制位
#define ADC_FLAG 0x10 //ADC结束标志位
#define ADC_START 0x08 //ADC启动标志位
#define ADC_SPEEDLL 0x00 //540个时钟周期
#define ADC_SPEEDL 0x20 //360个时钟周期
#define ADC_SPEEDH 0x40 //180个时钟周期
#define ADC_SPEEDHH 0x60 //90 个时钟周期
void InitUart();
void SendData(uchar);
void Delay(uint n);
void InitADC();
uchar ch=0; //ADC通道选择
void main()
{
InitUart(); //初始化串口
InitADC(); //初始化ADC
IE = 0xa0; //打开总中断
while(1);}
/*ADC中断函数*/
void ads_isr() interrupt 5 using 1
{
ADC_CONTR&=!ADC_FLAG; //将ADC结束标志位清零
SendData(ch); //将对应ADC通道号发送给电脑 SendData(ADC_RES); //将转换结果发送给电脑
if(++ch > 7)ch = 0; //下一个ADC通道 ADC_CONTR = ADC_POWER|ADC_SPEEDLL|ADC_START|ch; //打开ADC电源、转换时间540个时钟周期、开始转换、选择通道号
}
/*初始化ADC寄存器*/
void InitADC()
{
P1ASF = 0xff; //定义p1口为ADC转换口
ADC_RES = 0;
ADC_CONTR = ADC_POWER|ADC_SPEEDLL|ADC_START|ch; //打开ADC电源、转换时间540个时钟周期、开始转换、选择通道号
Delay(2); //等待ADC上电稳定然后开始ADC转换?应该是先开电源,等待后再START,可能STC官方程序有问题
}
/*初始化串口*/
void InitUart()
{
SCON = 0x5a;
TMOD = 0x20;
TH1 = 0xfd; //在11.0592MHZ晶振下,波特率为9600
TL1 = 0xfd;
TR1 = 1;
}
/*串口发送数据*/
void SendData(uchar dat)
{
while(!TI);
TI = 0;
SBUF = dat;
}
/*延时函数*/
void Delay(uint n)
{
uint x;
while(n--)
{
x=5000;
while(x--);
}
}
注释原创
⑺ STC的51单片机自带有AD转换,和PCF8591T AD芯片相比的话,哪个更好一些
用STC的51单片机自带有AD转换肯定更方便,因为是单片机内部集成,没有外围器件,只需要一根信号线,而且AD转换是10位的,精度更高,缺点就是占用单片机资源较多
用PCF8591T
AD芯片,还需要搭建外围检测电路,而且IIC两条线与单片机相连,因为有IIC协议,占用单片机资源也不少,AD转换是8位,精度较低
综合对比,用STC的51单片机自带有AD转换更好一些,PCF8591T
AD芯片是针对像AT89C51这样内部没有AD转换的单片机使用的
⑻ STC有没有自带AD/DA功能单片机我要处理来自传感器的模拟信号(电压)
STC系列单片机 多数型号 都 带有 AD 转换功能,及 PWM ( 即加电容滤波后为 DA ) 功能,
上 STC 官网看看。