⑴ 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 官網看看。