標(biāo)題:
stc片內(nèi)A/D轉(zhuǎn)換測(cè)試程序(ADC查詢方式)
[打印本頁(yè)]
作者:
liuqq
時(shí)間:
2015-5-21 17:01
標(biāo)題:
stc片內(nèi)A/D轉(zhuǎn)換測(cè)試程序(ADC查詢方式)
每過(guò)一天,我就會(huì)發(fā)現(xiàn)學(xué)習(xí)的難度越來(lái)越大,越來(lái)越蒙,可能是沒基礎(chǔ)學(xué)起來(lái)會(huì)很吃力。。。資料越來(lái)越來(lái)有限,像AVR吧,本來(lái)就不會(huì),加上關(guān)于內(nèi)部PWM的資料又找不到。。。。。哎-。-怎么搞的。。。。今天沒進(jìn)展啊。不過(guò)還是要打起精神,別逼我下載整套AVR來(lái)看 -。
/**A/D轉(zhuǎn)換測(cè)試程序(ADC查詢方式)**/
#include <reg51.h>
#include <intrins.h>
typedef unsigned char BYTE;
typedef unsigned int WORD;
/*Declare SFR associated with the ADC */
sfr ADC_CONTR = 0xBC; //ADC control register
//ADC控制寄存器
sfr ADC_RES = 0xBD; //ADC high 8-bit result register
//ADC的高8位結(jié)果寄存器
sfr ADC_LOW2 = 0xBE; //ADC low 2-bit result register
//ADC的低2位結(jié)果寄存器
sfr P1ASF = 0x9D; //P1 secondary function control register
//P1的輔助功能控制寄存器
/*Define ADC operation const for ADC_CONTR*/ //定義常量ADC_CONTR ADC操作
#define ADC_POWER 0x80 //ADC power control bit
//ADC的功率控制位
#define ADC_FLAG 0x10 //ADC complete flag
//ADC的完成標(biāo)志
#define ADC_START 0x08 //ADC start control bit
//ADC啟動(dòng)控制位
#define ADC_SPEEDLL 0x00 //540 clocks //540時(shí)鐘
#define ADC_SPEEDL 0x20 //360 clocks //360時(shí)鐘
#define ADC_SPEEDH 0x40 //180 clocks //180時(shí)鐘
#define ADC_SPEEDHH 0x60 //90 clocks //90時(shí)鐘
/*Declare SFR associated with the PCA */ //SFR與PCA的相關(guān)聲明
sfr CCON = 0xD8; //PCA control register //PCA的控制寄存器
sbit CCF0 = CCON^0; //PCA module-0 interrupt flag //PCA模塊0中斷標(biāo)志位
sbit CCF1 = CCON^1; //PCA module-1 interrupt flag //PCA模塊1中斷標(biāo)志
sbit CR = CCON^6; //PCA timer run control bit //PCA定時(shí)器的運(yùn)行控制位
sbit CF = CCON^7; //PCA timer overflow flag //PCA定時(shí)器溢出標(biāo)志
sfr CMOD = 0xD9; //PCA mode register //PCA的模式寄存器
sfr CL = 0xE9; //PCA base timer LOW //PCA的基礎(chǔ)定時(shí)器的低位
sfr CH = 0xF9; //PCA base timer HIGH //PCA的基礎(chǔ)定時(shí)器的高位
sfr CCAPM0 = 0xDA; //PCA module-0 mode register //PCA模塊- 0模式寄存器
sfr CCAP0L = 0xEA; //PCA module-0 capture register LOW //PCA模塊0捕獲寄存器低
sfr CCAP0H = 0xFA; //PCA module-0 capture register HIGH //PCA模塊0捕獲高字節(jié)
sfr CCAPM1 = 0xDB; //PCA module- mode register //PCA模塊模式寄存器
sfr CCAP1L = 0xEB; //PCA module- capture register LOW //PCA模塊捕獲寄存器的低
sfr CCAP1H = 0xFB; //PCA module- capture register HIGH //PCA模塊捕獲寄存器高字節(jié)
sfr PCAPWM0 = 0xf2;
sfr PCAPWM1 = 0xf3;
void PWMInit(void);
void InitADC(void);
void allinit(void);
void AD_get(void);
void control(void);
void yk(void);
void Delay(WORD n);
BYTE GetADCResult(BYTE ch);
sbit p25=P2^5;
sbit p26=P2^6;
sbit a1=P2^0; //電機(jī)a,b的方向控制
sbit a2=P2^1;
sbit b1=P2^2;
sbit b2=P2^3;
sbit p30=P3^0;
sbit p33=P3^1;
sbit p32=P3^2;
sbit p31=P3^3;
sbit beep=P2^7;
WORD AD_hei=0x7f; //AD比較值
WORD AD_value[5]; //AD采集值存儲(chǔ)數(shù)組
BYTE pwma=0x00; //電機(jī)a,pwm控制
BYTE pwmb=0x00; //電機(jī)b,pwm控制
void main()
{
allinit();
P3=0xff;
while (1)
{
AD_get();
control();
yk();
}
}
/*********************************************/
void yk(void)
{
if(p30==1||p32==1||p33==1)
{ BYTE i=1;
beep=0;
Delay(10);
beep=1;
while(i)
{
if(p30==1) //前進(jìn)
{
if(p30==1)
{
a1=1;
a2=0;
b1=1;
b2=0;
pwma=0x00,pwmb=0x00;
CCAP0H = CCAP0L =pwma;
CCAP1H = CCAP1L =pwmb;
}
}
if(p30==1) //前進(jìn)
{
if(p30==1)
{
a1=1;
a2=0;
b1=1;
b2=0;
pwma=0x00,pwmb=0x00;
CCAP0H = CCAP0L =pwma;
CCAP1H = CCAP1L =pwmb;
}
}
if(p31==1) //后退
{
if(p31==1)
{
a1=0;
a2=1;
b1=0;
b2=1;
pwma=0x00,pwmb=0x00;
CCAP0H = CCAP0L =pwma;
CCAP1H = CCAP1L =pwmb;
}
}
if(p32==1) //前左轉(zhuǎn)
{
if(p32==1)
{
pwma=0x80,pwmb=0x00;
CCAP0H = CCAP0L =pwma;
CCAP1H = CCAP1L =pwmb;
}
}
if(p33==1) //前右轉(zhuǎn)
{
if(p33==1)
{
pwma=0x00,pwmb=0x80;
CCAP0H = CCAP0L =pwma;
CCAP1H = CCAP1L =pwmb;
}
}
if(p31==1) //推出按鍵控制模式
{ Delay(250);
if(p31==1)
i=0;
}
if(p30==1) //停止
{
Delay(230);
if(p30==1)
pwma=0xff,pwmb=0xff;
CCAP0H = CCAP0L =pwma;
CCAP1H = CCAP1L =pwmb;
}while(p30==1);
}
pwma=0xff,pwmb=0xff;
CCAP0H = CCAP0L =pwma;
CCAP1H = CCAP1L =pwmb;
beep=0;
Delay(10);
beep=1;
Delay(190);
a1=1;
a2=0;
b1=1;
b2=0;
}
}
/********************AD采集**********************/
void AD_get(void)
{
AD_value[0]=GetADCResult(0xc8); //Show Channel0 //顯示通道0
AD_value[1]=GetADCResult(0xc9); //Show Channel1 //顯示通道1
AD_value[2]=GetADCResult(0xca); //Show Channel2 //顯示通道2
AD_value[3]=GetADCResult(0xcd); //Show Channel3 //顯示通道3
AD_value[4]=GetADCResult(0xce); //Show Channel4 //顯示通道4
}
/*----------------------------
Get ADC result //獲取ADC結(jié)果
----------------------------*/
BYTE GetADCResult(BYTE ch)
{
ADC_CONTR =ch;
_nop_(); //Must wait before inquiry
//必須等待調(diào)查
_nop_();
_nop_();
_nop_();
while (!(ADC_CONTR & ADC_FLAG)); //Wait complete flag
//等待完成標(biāo)志
ADC_CONTR &= ~ADC_FLAG; //Close ADC
//關(guān)閉的ADC
return ADC_RES; //Return ADC result
//返回ADC結(jié)果
}
/***************電機(jī)控制***********************/
void control(void)
{
unsigned char turn_flag[5];
if( AD_value[0]>=AD_hei) //通道0采集值與預(yù)置數(shù)比較
turn_flag[0]=1; //產(chǎn)生標(biāo)志位,LED做指示
else turn_flag[0]=0;
if( AD_value[1]>=AD_hei) //通道1采集值與預(yù)置數(shù)比較
turn_flag[1]=1;
else {turn_flag[1]=0;
if( AD_value[2]>=AD_hei) //通道2采集值與預(yù)置數(shù)比較
turn_flag[2]=1;
else turn_flag[2]=0;
if(AD_value[3]>=AD_hei) //通道5采集值與預(yù)置數(shù)比較
turn_flag[3]=1;
else turn_flag[3]=0;
if(AD_value[4]>=AD_hei) //通道6采集值與預(yù)置數(shù)比較
turn_flag[4]=1;
else turn_flag[4]=0;}
if(turn_flag[4]==1)
if(turn_flag[0]==0)
if(turn_flag[1]==0)
if(turn_flag[2]==0)
if(turn_flag[3]==0)
pwma=0x00,pwmb=0x00;
if(turn_flag[0]==0)
if(turn_flag[1]==0)
if(turn_flag[2]==0)
if(turn_flag[3]==0)
if(turn_flag[4]==0)
pwma=0x00,pwmb=0x00;
if(turn_flag[0]==1) pwma=0x00,pwmb=0xff;
if(turn_flag[1]==1) pwma=0x00,pwmb=0xff;
if(turn_flag[2]==1) pwma=0xff,pwmb=0x00;
if(turn_flag[3]==1) pwma=0xff,pwmb=0x00;
if(turn_flag[0]==1)
if(turn_flag[4]==1)
pwma=0x00,pwmb=0x80;
if(turn_flag[2]==1)
if(turn_flag[4]==1)
pwma=0x80,pwmb=0x00;
if(turn_flag[1]==1)
if(turn_flag[3]==1)
pwma=0xff,pwmb=0xff;
CCAP0H = CCAP0L =pwma;
CCAP1H = CCAP1L =pwmb;
}
/****************所有的初始化**************/
void allinit()
{
p26=1;
P0=0x00;
p26=0;
p25=1;
a1=1;
a2=0;
b1=1;
b2=0;
beep=1;
PWMInit();
InitADC(); //Init ADC sfr //初始化的ADC的SFR
}
/*****************pwm口初始化***********************/
void PWMInit(void)
{
CCON=0; //Initial PCA control register //初始PCA的控制寄存器
//PCA timer stop running //PCA定時(shí)器停止運(yùn)行
//Clear CF flag //清除CF標(biāo)志
//Clear all module interrupt flag //清除所有模塊的中斷標(biāo)志
CL=0; //Reset PCA base timer //復(fù)位PCA的基定時(shí)器
CH = 0;
CMOD = 0x02; //Set PCA timer clock source as Fosc/2 //設(shè)置為fosc的PCA定時(shí)器/ 2的時(shí)鐘源
//Disable PCA timer overflow interrupt //禁止PCA定時(shí)器溢出中斷
CCAP0H = CCAP0L =pwma; //PWM0 port output 50% duty cycle square wave//PWM0的端口輸出50%占空比的方波
CCAPM0 = 0x42; //PCA module-0 work in 8-bit PWM mode //PCA模塊0的工作在8位PWM模式
//and no PCA interrupt //并沒有PCA中斷
CCAP1H = CCAP1L =pwmb; //PWM1 port output 0% duty cycle square wave//PWM1的端口輸出0%占空比的方波
// PCAPWM1 = 0x03;
CCAPM1 = 0x42; //PCA module- work in 8-bit PWM mode //PCA模塊,工作在8位PWM模式
//and no PCA interrupt //并沒有PCA中斷
CR =1; //PCA timer start run //PCA定時(shí)器開始運(yùn)行
}
/*----------------------------
Initial ADC sfr //初步的ADC的SFR
----------------------------*/
void InitADC()
{
P1ASF = 0x67; //Open 8 channels ADC function
//打開8通道ADC功能
ADC_RES = 0; //Clear previous result
//清除以前的結(jié)果
ADC_CONTR = 0xc0;
Delay(2); //ADC power-on and delay
//ADC的功耗和延遲
}
/*----------------------------
Software delay function //軟件延時(shí)功能
----------------------------*/
void Delay(WORD n)
{
WORD x;
while (n--)
{
x = 5000;
while (x--);
}
}
復(fù)制代碼
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1