STC12C5201AD芯片應(yīng)用總結(jié)
1、 內(nèi)部含有8路AD轉(zhuǎn)換
2、 首先聲明與AD轉(zhuǎn)換有關(guān)的寄存器
Sfr ADC_CONTR =0XBC;//AD轉(zhuǎn)換控制寄存器的地址
Sfr ADC_RES=0XBD;//AD轉(zhuǎn)換結(jié)果存放寄存器
Sfr P1ASF=0x9d;//P1口模擬功能控制寄存器
//哪個(gè)位置1,P1.0-P1.7就設(shè)定為AD轉(zhuǎn)換功能
3、 為了使程序的更具靈活性,可以單獨(dú)設(shè)定ADC_CONTR的每一位。
#define ADC_POWER 0X80;//所有ADC電源控制為,第7位
#define ADC_FLAG 0X10;//AD轉(zhuǎn)換完成標(biāo)志位,第4位,
#define ADC_START 0X08;//AD轉(zhuǎn)換開始標(biāo)志位,第3位,
#define ADC_SPEEDLL 0X00;//AD轉(zhuǎn)換速度控制位,第5、6位
//420 clocks
#define ADC_SPEEDL 0x20;//280 clocks
#define ADC_SPEEDH 0x40;//140 clocks
#define ADC_SPEEDHH 0x60;//70 clocks
4、 初始化ADC
Void initADC(void)
{
P1ASF=0X01;//設(shè)置哪個(gè)P1口進(jìn)行ADC
//0X01 P1.0
//0X02 P1.1
//0X03 P1.0和P1.1
//0XFF 全部8個(gè)口
ADC_RES=0;//結(jié)果寄存器清零
ADC_CONTR=ADC_POWER|ADC_SPEEDLL//打開ADC電源并設(shè)置轉(zhuǎn)換速率
Delay(2);//軟件延時(shí)2ms
}
5、 讀取ADC的結(jié)果
Uchar getADCresult(uchar ch)//ch為要讀取的通道的值,0-7
{
ADC_CONTR=ADC_POWER|ADC_SPEEDLL |ADC_START|ch;
//設(shè)置ADC控制寄存器,打開電源,設(shè)置轉(zhuǎn)換速率、打開開始,設(shè)置轉(zhuǎn)//換通道
_nop_();//設(shè)置ADC_CONTR控制寄存器的語句執(zhí)行后,要經(jīng)過4個(gè)CPU時(shí)鐘的延時(shí),
//其值才能夠保證設(shè)置進(jìn)ADC_CONTR控制寄存器
_nop_();
_nop_();
_nop_();
while(!(ADC_CONTR & ADC_FLAG));//wait complete flag
ADC_CONTR&=~ADC_FLAG;//close ADC
return ADC_RES;//return ADC result
}
AD轉(zhuǎn)換的結(jié)果為8位數(shù)據(jù),就存儲(chǔ)在ADC_RES寄存器中,
其值為:ADC_RES[0:7]=256 X Vin/Vcc
為了方便利用轉(zhuǎn)換的值編制其他的控制程序及調(diào)試,可以將轉(zhuǎn)換后的數(shù)據(jù)通過串口發(fā)送出來,然后利用串口調(diào)試工具進(jìn)行監(jiān)控。這就涉及到串口通信程序的編制。
串口通信程序的編制(只發(fā)不收):
1、 為提高程序的適應(yīng)性可以先對(duì)通信的波特率和晶振頻率進(jìn)行宏定義。
#define BAUD 9600//9600的波特率
#define FOSC 11059200L //11.0592M的晶振
2、 串口初始化
Void initUART()
{
SCON=0X5A;//8位數(shù)據(jù),無校驗(yàn)位
TMOD=0X20;//設(shè)置定時(shí)器1工作在8位自動(dòng)重裝的模式
TH1=TL1=-(FOSC/12/32/BAUD);//T1裝初值
TR1=1;//開定時(shí)器1
}
當(dāng)然這段程序也可以使用STC提供的波特率計(jì)算器來自動(dòng)生成,如下:
void UartInit(void) //9600bps@11.0592MHz
{
PCON &= 0x7f; //波特率不倍速
SCON = 0x50; //8位數(shù)據(jù),可變波特率
AUXR &= 0xbf; //定時(shí)器1時(shí)鐘為Fosc/12,即12T
AUXR &= 0xfe; //串口1選擇定時(shí)器1為波特率發(fā)生器
TMOD &= 0x0f; //清除定時(shí)器1模式位
TMOD |= 0x20; //設(shè)定定時(shí)器1為8位自動(dòng)重裝方式
TL1 = 0xFD; //設(shè)定定時(shí)初值
TH1 = 0xFD; //設(shè)定定時(shí)器重裝值
ET1 = 0; //禁止定時(shí)器1中斷
TR1 = 1; //啟動(dòng)定時(shí)器1
}
但要注意聲明特殊輔助寄存器AUXR
Sfr AUXR=0X8E;
3、 發(fā)送數(shù)據(jù)
Void senddata(uchar dat)
{
While(!TI);//等待前面的數(shù)據(jù)發(fā)送完畢
TI=0;//TI標(biāo)志清零
SBUF=dat;//發(fā)送當(dāng)前的數(shù)據(jù)
}
這樣只要調(diào)用發(fā)送數(shù)據(jù)函數(shù)就可以在串口調(diào)試軟件中看到數(shù)據(jù)了。
當(dāng)然你也可以利用74HC595和數(shù)碼管做一個(gè)顯示電路來監(jiān)控,這個(gè)電路以后再總結(jié)。