/********************************************************
功能 :用電位器通過STC8AD片內AD和PWM控制電機轉速
單片機;STC8AD
晶振 :12M
作者 :駿杰
********************************************************/
#include<STC8.H>
#include <intrins.h>
#include <string.h>
#define uchar unsigned char
#define uint unsigned int
#define uint16 unsigned int
#define u8 unsigned uchar
/**************************************
功能描述:延時函數
入口參數: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=0x05; //定時器T0輸出溢出作為系統分頻數,Use timer0
CCON=0x00;
CL=0x00;
CH=0x00;
CCAPM0=0x42; //PWM0設置PCA工作方式為PWM方式(0100 0010)
PCA_PWM0 = 0x00; //PCA模塊0工作于8位PWM功能
CCAP0L=0xff; //PWM占空比為50%[(40H-20H)/40H]
CCAP0H=0xff;
CR = 1; //啟動PCA計時器
}
/**************************************
功能描述:ADC口初始化
入口參數:無
返回值:無
***************************************/
void ADC_config(void)
{
ADC_CONTR=0x80; //使能ADC模塊
ADCCFG=0x0f; //設置ADC時鐘為系統時鐘/2/16/16,ADC_RES高8位,ADC_RESL高四位
P1M0=0x00; //設置P1.0為ADC口
}
void Timer0Init(void)
{
TMOD|=0x02; //模式2,8位自動裝載模式
CLKDIV=0x00;//將主時鐘32分頻作為SYSclk
AUXR= 0x80; //工作在1T的模式下[SYSclk/(256-TH0)]/
TH0=0x00;
TR0=1;
ET0=1;
EA=1;
}
void main (void)
{
ADC_config();
PCAInit(); //PWM初始化
Timer0Init();
while(1)
{
ADC_CONTR |= 0x40; //啟動AD轉換
_nop_();
_nop_();
while (!(ADC_CONTR & 0x20));//查詢ADC完成標志
ADC_CONTR &= ~0x20; //清完成標志
TH0= ADC_RES; //調頻
}
}
|