TA的每日心情 | 奋斗 2023-12-15 09:52 |
---|
签到天数: 2 天 [LV.1]初来乍到
注册会员
- 积分
- 96
|
楼主 |
发表于 2023-11-30 11:25:12
|
显示全部楼层
代码如下
#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;
void TM0_Isr() interrupt 1
{
}
void Delay500us() //@20.000MHz
{
unsigned char i, j;
i = 10;
j = 183;
do
{
while (--j);
} while (--i);
}
void main()
{
P33=0;
P32=0;
P31=1;
P30=1;
P3M0 = 0x0C;
P3M1 = 0x00;
P33=0;
P32=0;
P31=1;
P30=1;
P5M0 = 0x00;
P5M1 = 0xFF;
AUXR |= 0x80; //定时器时钟1T模式
TMOD = 0x00; //模式0
TL0 = 0xF0; //设置定时初始值
TH0 = 0xD8; //设置定时初始值//20mhz
TR0 = 1; //启动定时器
ET0 = 1; //使能定时器中断
EA = 1;
//ADC
P_SW2 |= 0x80;
ADCTIM = 0x3f; //设置ADC内部时序
P_SW2 &= 0x7f;
ADCCFG = 0x0f; //设置ADC时钟为系统时钟/2/16
ADC_CONTR = 0x85; //使能ADC模块
//PWM
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 ;
WDT_CONTR = 0x24; //使能看门狗,溢出时间约为39-65
while (1){
WDT_CONTR = 0x34; //清看门狗,否则系统复位
CR=1;
ADC_CONTR |= 0x40; //启动AD转换
_nop_();
_nop_();
_nop_();
_nop_();
while (!(ADC_CONTR & 0x20)); //查询ADC完成标志
ADC_CONTR &= ~0x20; //清完成标志
dwq=(ADC_RES*10)/12;
if(255- dwq<CCAP0H &&255- dwq<251){
if(CCAP0H>251){
CCAP0H=251;
}
CCAP0H -=1 ;
}
if(255- dwq>CCAP0H){
CCAP0H +=1 ;
}
Delay500us();
if(CCAP0H>=251){
P33=0;
CR=1;
CCAP0H=255;
} else{
P33=1;
CR=1;
}
}
}
先把IO口置位低电平,再改为推挽输出 |
|