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