- 打卡等级:初来乍到
- 打卡总天数:4
- 最近打卡:2024-07-19 09:04:12
中级会员
- 积分
- 202
|
发表于 2024-7-10 10:56:16
|
显示全部楼层
#include "reg51.h"
#include "intrins.h"
sfr CCON = 0xd8;
sbit CF = CCON^7;
sbit CR = CCON^6;
sbit CCF2 = CCON^2;
sbit CCF1 = CCON^1;
sbit CCF0 = CCON^0;
sfr CMOD = 0xd9;
sfr CL = 0xe9;
sfr CH = 0xf9;
sfr CCAPM0 = 0xda;
sfr CCAP0L = 0xea;
sfr CCAP0H = 0xfa;
sfr PCA_PWM0 = 0xf2;
sfr CCAPM1 = 0xdb;
sfr CCAP1L = 0xeb;
sfr CCAP1H = 0xfb;
sfr PCA_PWM1 = 0xf3;
sfr CCAPM2 = 0xdc;
sfr CCAP2L = 0xec;
sfr CCAP2H = 0xfc;
sfr PCA_PWM2 = 0xf4;
sfr WDT_CONTR = 0xc1;
sfr AUXR = 0x8e;
sfr ADC_CONTR = 0xbc;
sfr ADC_RES = 0xbd;
sfr ADC_RESL = 0xbe;
sfr ADCCFG = 0xde;
sfr P5 = 0xC8;
sfr P_SW2 = 0xba;
sfr P_SW1 = 0xA2;
#define ADCTIM (*(unsigned char volatile xdata *)0xfea8)
sfr P3M1 = 0xb1;
sfr P3M0 = 0xb2;
sfr P5M1 = 0xc9;
sfr P5M0 = 0xca;
sbit P33 = P3^3;
sbit P32 = P3^2;
sbit P31 = P3^1;
sbit P30 = P3^0;
sbit P54 = P5^4;
sbit P55 = P5^5;
unsigned char dwq=0;
bit kg =0 ;
void Delay1ms() //@20.000MHz
{
unsigned char i, j;
i = 20;
j = 113;
do
{
while (--j);
} while (--i);
}
void pwm_init(){
CCON = 0x00;
CMOD = 0x0A; //PCA时钟为系统时钟
CL = 0x00;
CH = 0x00;
CCAPM0 = 0x42; //PCA模块2为PWM工作模式
PCA_PWM0 = 0x00; //PCA模块2输出8位PWM
CCAP0L = 0xff; //PWM占空比为0%[(100H-20H)/100H]
CCAP0H = 0xff;
CR=1;
}
void main()
{
P54=1;
P55=0;
P33=1;
P32=0;
P31=1;
P30=1;
P3M0 = 0x0C;
P3M1 = 0x00;
P33=1;
P32=0;
P31=1;
P30=1;
P5M0 = 0x10;
P5M1 = 0x20;
//ADC
P_SW2 |= 0x80;
ADCTIM = 0x3f; //设置ADC内部时序
P_SW2 &= 0x7f;
ADCCFG = 0x0f; //设置ADC时钟为系统时钟/2/16
ADC_CONTR = 0x85; //使能ADC模块
WDT_CONTR = 0x24; //使能看门狗,溢出时间约为39-65
while (1){
WDT_CONTR = 0x34; //清看门狗,否则系统复位
Delay1ms();
ADC_CONTR |= 0x40; //启动AD转换
_nop_();
_nop_();
_nop_();
_nop_();
while (!(ADC_CONTR & 0x20)); //查询ADC完成标志
ADC_CONTR &= ~0x20; //清完成标志
dwq=(ADC_RES*10)/12;
if(255-dwq<250 && kg==0){
pwm_init();
kg=1;
}
if(kg==1){
if(255-dwq>=250){
PCA_PWM0 |= 0x3F;
CCAP0H=255;
}
if(255- dwq<CCAP0H &&255- dwq<250){
if(CCAP0H>250){
PCA_PWM0 = (PCA_PWM0 & ~0x32) |((dwq >> 4) & 0x30);
CCAP0H=255;
CCAP0H -=1 ;
Delay1ms();
CCAP0H -=1 ;
Delay1ms();
CCAP0H -=1 ;
Delay1ms();
CCAP0H -=1 ;
Delay1ms();
CCAP0H -=1 ;
Delay1ms();
}
CCAP0H -=1 ;
}
if(255- dwq>CCAP0H){
CCAP0H +=1 ;
}
if(CCAP0H>=250){
PCA_PWM0 |= 0x3F;
CCAP0H=255;
}
}
}
} |
|