STC12C5410AD學習板---AD按鍵測試程序
/************ STC12C5410AD學習板 ******************/
/*功能描述:AD按鍵練習 */
/*作者:鄭 文 ClimberWin */
/*編寫時間:2008.8.15 */
/*功能:采集按鍵電壓;分配鍵值,并把鍵值傳給PC機 */
/*外部晶振22.1184 MHZ */
/*把波特率設置為51的12倍,現(xiàn)在波特率 115200 */
/*注意:需要測得實際電源電壓作為參考電壓 */
/*L7805穩(wěn)壓在4.88-4.98V之間,根據(jù)實際測量確定電壓 */
/**************************************************/
/*修改時間: */
/*修改內(nèi)容: 還需要添加按鍵去抖 */
#include
#include
#include
#include
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
sbit PWM0 = P3^7;//pwm口定義green
sbit PWM1 = P3^5;//pwm口定義blue
sbit PWM2 = P2^0;//pwm口定義
sbit PWM3 = P2^4;//pwm口定義red
sbit AD0 = P1^0; //電位器和外部電壓輸入共用同一AD口,用跳帽來選擇。
sbit AD1 = P1^1; //用做AD按鍵的輸出口。
sbit AD2 = P1^2; //溫度測量,測量熱敏電阻的參數(shù)。
void Delay1ms(unsigned int count);
void init_rs232(void); //串口初始化
void STC12C5410AD_int(void); //AD初始化
void Delay1ms(unsigned int count);
void init_rs232(void); //串口初始化
/***************************1秒延時子程序start***************************/
void Delay1ms(unsigned int count)
{
unsigned int i,j;
for(i=0;i
}
/***************************1秒延時子程序end***************************/
/* 串口通信初始化設置 */
void init_rs232(void)
{
AUXR=74; //設置波特率是普通51的12倍 ,允許AD中斷
SCON=0x50;
PCON=0x00;
TH1=0xFA; //波特率 115200 22.1184MHZ 時候(F4 4800 FA 9600 FDH 9600)*12
TL1=0XFA;
TMOD=0X20;
TR1=1;
}
/*STC12C5410AD的AD初始化程序*/
// ADC_CONTR=[ADC_POWER] [SPEED1] [SPEED0] [ADC_FLAG] [ADC_START] [CHS2] [CHS1][CHS0]
// ADC_DA
void STC12C5410AD_int(void)
{
ADC_CONTR=0x80 ; //開轉(zhuǎn)換電源設置轉(zhuǎn)換速度為1080個時鐘周期轉(zhuǎn)換一次,選擇AD0通道
Delay1ms(20); //稍做延時,大于1ms就可以
/*I/O口作為AD使用,設置漏極開路模式*/
P1M0=1;
P1M1=1;
}
/*******************************************/
/*****************主程序************************/
main()
{ //main start
//uchar w;
uint ad_temp; //AD數(shù)據(jù)保存的地址
float f; //存放AD采集過來的數(shù)據(jù),格式00.000,總共5位
Delay1ms(5000);
init_rs232(); //串口初始化
TI=1;
printf("STC12C5410AD學習板 AD按鍵練習n");
printf("ClimberWin 2008.8.15nn");
Delay1ms(5000);
printf("串口初始化成功nn");
Delay1ms(5000);
/*************************************************/
STC12C5410AD_int(); //AD初始化
printf("A/D初始化成功n");
ADC_CONTR|=0x01; //選擇AD1通道 ,AD按鍵
printf("選擇通道AD1nn");
printf("按鍵測試開始:nn");
while(1)
{
ADC_CONTR|=0x08; //開始AD轉(zhuǎn)換(ADC_START=1)
while(!(ADC_CONTR & 0x10));//判斷AD是否轉(zhuǎn)換結(jié)束
ADC_CONTR&=0xef;//轉(zhuǎn)換結(jié)束后標志位ADC_FLAG清零
//AD采集進來的數(shù)據(jù)進行轉(zhuǎn)化
ad_temp=ADC_LOW2;
ad_temp=ad_temp+ ((uint)ADC_DA
f=(4.961*ad_temp)/1024;//基準電壓調(diào)整,用7805做穩(wěn)壓需要測得實際電源電壓
//通過串口打印AD采集進來的數(shù)據(jù)
// printf("%.3f ",f); //串口傳輸AD采集數(shù)據(jù)
Delay1ms(1000);
/**************鍵值判斷*******************************/
if (f>4.590&f<4.650)
{ printf("K1按下nn");}
else if (f>4.500&f<4.550)
{ printf("K2按下nn");}
else if (f>4.400&f<4.490)
{ printf("K3按下nn");}
else if (f>4.200&f<4.350)
{ printf("K4按下nn");}
else if (f>3.700&f<4.100)
{ printf("K5按下nn");}
else if (f>3.000&f<3.500)
{ printf("K6按下nn");}
else
{;}
Delay1ms(1000);
/*******************************************************/
}
} //mian end
評論