标题:
stc片内A/D转换测试程序(ADC查询方式)
[打印本页]
作者:
liuqq
时间:
2015-5-21 17:01
标题:
stc片内A/D转换测试程序(ADC查询方式)
每过一天,我就会发现学习的难度越来越大,越来越蒙,可能是没基础学起来会很吃力。。。资料越来越来有限,像AVR吧,本来就不会,加上关于内部PWM的资料又找不到。。。。。哎-。-怎么搞的。。。。今天没进展啊。不过还是要打起精神,别逼我下载整套AVR来看 -。
/**A/D转换测试程序(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位结果寄存器
sfr ADC_LOW2 = 0xBE; //ADC low 2-bit result register
//ADC的低2位结果寄存器
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的完成标志
#define ADC_START 0x08 //ADC start control bit
//ADC启动控制位
#define ADC_SPEEDLL 0x00 //540 clocks //540时钟
#define ADC_SPEEDL 0x20 //360 clocks //360时钟
#define ADC_SPEEDH 0x40 //180 clocks //180时钟
#define ADC_SPEEDHH 0x60 //90 clocks //90时钟
/*Declare SFR associated with the PCA */ //SFR与PCA的相关声明
sfr CCON = 0xD8; //PCA control register //PCA的控制寄存器
sbit CCF0 = CCON^0; //PCA module-0 interrupt flag //PCA模块0中断标志位
sbit CCF1 = CCON^1; //PCA module-1 interrupt flag //PCA模块1中断标志
sbit CR = CCON^6; //PCA timer run control bit //PCA定时器的运行控制位
sbit CF = CCON^7; //PCA timer overflow flag //PCA定时器溢出标志
sfr CMOD = 0xD9; //PCA mode register //PCA的模式寄存器
sfr CL = 0xE9; //PCA base timer LOW //PCA的基础定时器的低位
sfr CH = 0xF9; //PCA base timer HIGH //PCA的基础定时器的高位
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捕获高字节
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模块捕获寄存器高字节
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; //电机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采集值存储数组
BYTE pwma=0x00; //电机a,pwm控制
BYTE pwmb=0x00; //电机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) //前进
{
if(p30==1)
{
a1=1;
a2=0;
b1=1;
b2=0;
pwma=0x00,pwmb=0x00;
CCAP0H = CCAP0L =pwma;
CCAP1H = CCAP1L =pwmb;
}
}
if(p30==1) //前进
{
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) //前左转
{
if(p32==1)
{
pwma=0x80,pwmb=0x00;
CCAP0H = CCAP0L =pwma;
CCAP1H = CCAP1L =pwmb;
}
}
if(p33==1) //前右转
{
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结果
----------------------------*/
BYTE GetADCResult(BYTE ch)
{
ADC_CONTR =ch;
_nop_(); //Must wait before inquiry
//必须等待调查
_nop_();
_nop_();
_nop_();
while (!(ADC_CONTR & ADC_FLAG)); //Wait complete flag
//等待完成标志
ADC_CONTR &= ~ADC_FLAG; //Close ADC
//关闭的ADC
return ADC_RES; //Return ADC result
//返回ADC结果
}
/***************电机控制***********************/
void control(void)
{
unsigned char turn_flag[5];
if( AD_value[0]>=AD_hei) //通道0采集值与预置数比较
turn_flag[0]=1; //产生标志位,LED做指示
else turn_flag[0]=0;
if( AD_value[1]>=AD_hei) //通道1采集值与预置数比较
turn_flag[1]=1;
else {turn_flag[1]=0;
if( AD_value[2]>=AD_hei) //通道2采集值与预置数比较
turn_flag[2]=1;
else turn_flag[2]=0;
if(AD_value[3]>=AD_hei) //通道5采集值与预置数比较
turn_flag[3]=1;
else turn_flag[3]=0;
if(AD_value[4]>=AD_hei) //通道6采集值与预置数比较
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定时器停止运行
//Clear CF flag //清除CF标志
//Clear all module interrupt flag //清除所有模块的中断标志
CL=0; //Reset PCA base timer //复位PCA的基定时器
CH = 0;
CMOD = 0x02; //Set PCA timer clock source as Fosc/2 //设置为fosc的PCA定时器/ 2的时钟源
//Disable PCA timer overflow interrupt //禁止PCA定时器溢出中断
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定时器开始运行
}
/*----------------------------
Initial ADC sfr //初步的ADC的SFR
----------------------------*/
void InitADC()
{
P1ASF = 0x67; //Open 8 channels ADC function
//打开8通道ADC功能
ADC_RES = 0; //Clear previous result
//清除以前的结果
ADC_CONTR = 0xc0;
Delay(2); //ADC power-on and delay
//ADC的功耗和延迟
}
/*----------------------------
Software delay function //软件延时功能
----------------------------*/
void Delay(WORD n)
{
WORD x;
while (n--)
{
x = 5000;
while (x--);
}
}
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1