/********************************************************
功能 :用电位器通过STC8AD片内AD和PWM控制电机转速
单片机;STC8AD
晶振 :12M
作者 :张骏杰
时间 :2019-11-4
********************************************************/
#include<STC8.H>
#include <intrins.h>
#include <string.h>
#define uchar unsigned char
#define uint unsigned int
#define uint16 unsigned int
#define uint8 unsigned int
uint M;
/**************************************
功能描述:延时函数
入口参数:uint16 x ,该值为1时,延时1ms
返回值:无
***************************************/
void delay_ms(uint16 x)
{
uint16 j,i;
for(j=0;j<x;j++)
{
for(i=0;i<1100;i++);
}
}
void PCAInit(void)
{
P_SW1 &= 0xCF;
CMOD=0x04; //设置PCA定时器
CCON=0x00;
AUXR|=0x80;
TMOD&=0xF0;
TL0=0x10;
TH0=0xff;
//定时器0开始计时
CL=0;
CH=0;
CCAPM0=0x42; //PWM0设置PCA工作方式为PWM方式(0100 0010)
CCAP0L=0x00; //设置PWM0初始值与CCAP0H相同
CCAP0H=0x00; // PWM0初始时为0
PCA_PWM0 &= 0x3F; //PCA模块0工作于8位PWM功能
CR=1; //启动PCA定时器
}
/**************************************
功能描述:ADC口初始化
入口参数:无
返回值:无
***************************************/
void ADC_config(void)
{
ADC_CONTR|=0x80; //开AD转换电源
delay_ms(10); //适当延时等待AD转换供电稳定
ADC_CONTR|=0x0E; //选择P0.6作为模拟功能AD使用
ADC_CONTR&=0xFE; //选择P0.6作为模拟功能AD使用
ADCCFG&=0xFC; //AD转换速度为96个时钟周期转换一次
ADCCFG|=0x0C; //AD转换速度为96个时钟周期转换一次
ADC_CONTR&=0xDF; //清AD转换完成标志
EADC=0; //禁止ADC转换中断
ADCCFG|=0x20; //ADC转换结果ADC_RES存高4位,ADC_RESL存低8位
ADC_CONTR|=0x40; //启动AD转换,ADC_START=1
}
/**************************************
功能描述:ADC口检测AD转换值函数
入口参数:无
返回值:ADC 12位数据
***************************************/
uint16 Get_ADC12bitResult(void)
{
uint16 AD_Dat=0;
ADC_CONTR&=0xDF; // 将ADC_FLAG清0
ADC_CONTR&=0xBF; //关闭AD转换,ADC_START=0
//12位AD结果的高4位放ADC_RES的低4位,低8位在ADC_RESL
AD_Dat = ADC_RES; //将ADC_RES低4位移到应在的第9位至第12位
AD_Dat <<= 8;
AD_Dat|= ADC_RESL; //将ADC_RESL的8位移到应在的低8位
ADC_CONTR|=0x40; //启动AD转换,ADC_START=1
return AD_Dat;
}
void PWM0_set(unsigned char a)
{
if(a==0XFF)
{
PCA_PWM0=0X03;
}
else
{
PCA_PWM0=0x00;
CCAP0L=a;
CCAP0H=a;
}
}
void main (void)
{
ADC_config();
PCAInit(); //PWM初始化
while(1)
{
M=Get_ADC12bitResult ;
PWM0_set(M); //转换结果为PWM0赋值 输出占空比 ·
}
}
|