不用写那么多,就把STC的ADC和PWM官方示例整合一下就行。以下程序只是提供编程思路,不代表可以直接使用。
#include <STC8.H>
#include "intrins.h"
void delay100ms(void)
{
unsigned char a,b,c;
for(c=254;c>0;c--)
for(b=229;b>0;b--)
for(a=8;a>0;a--);
_nop_();
_nop_();
}
void main()
{
//初始化PWM
CCON = 0x00;
CMOD = 0x08; //PCA时钟为系统时钟
CL = 0x00;
CH = 0x00;
CCAPM0 = 0x42; //PCA模块0为PWM工作模式
PCA_PWM0 = 0x00; //PCA模块0输出8位PWM
CCAP0L = 0xff; //PWM占空比为0%
CCAP0H = 0xff;
CR = 1; //启动PCA计时器
//初始化ADC
P1M0 = 0x00; //设置P1.0为ADC口
P1M1 = 0x01;
ADCCFG = 0x0f; //设置ADC时钟为系统时钟/2/16/16
ADC_CONTR = 0x80; //使能ADC模块
while (1)
{
ADC_CONTR |= 0x40; //启动AD转换
_nop_();
_nop_();
while (!(ADC_CONTR & 0x20)); //查询ADC完成标志
ADC_CONTR &= ~0x20; //清完成标志
CCAP0H = ADC_RES; //读取ADC结果控制PWM,默认P0.0输出
// CCAP0H = ~ADC_RES; //读取ADC结果取反控制PWM
delay100ms();
}
} |