/********************************************************
功能 :用電位器通過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賦值 輸出占空比 ·
}
}
|