#include "stc15.h"
#include "intrins.h"
#include "config.h"
#define CYCLE 0x1000L //定义PWM周期(最大值为32767)
unsigned char DUTY = 20L; //定义占空比为10%
void Delay30ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 2;
j = 67;
k = 183;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void UartInit(void) //9600bps@11.0592MHz
{
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
AUXR &= 0xBF; //定时器1时钟为Fosc/12,即12T
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TL1 = 0xFD; //设定定时初值
TH1 = 0xFD; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
}
void SndData(unsigned char dat)
{
SBUF = dat;
while(!TI);
TI = 0;
}
unsigned char TmpData;
void main()
{
UartInit();
P2M0 = 0x00;
P2M1 = 0x00;
P3M0 = 0x00;
P3M1 = 0x00;
P_SW2 |= 0x80; //使能访问XSFR
PWMCFG = 0x00; //配置PWM的输出初始电平为低电平
PWMCKS = 0x00; //选择PWM的时钟为Fosc/(0+1)
PWMC = CYCLE; //设置PWM周期
PWM2T1 = 0x0000; //设置PWM2第1次反转的PWM计数
PWM2T2 = CYCLE * DUTY / 100; //设置PWM2第2次反转的PWM计数
PWM3T1 = 0x0000; //设置PWM2第1次反转的PWM计数
PWM3T2 = CYCLE * 20 / 100; //设置PWM2第2次反转的PWM计数
PWM4T1 = 0x0000; //设置PWM2第1次反转的PWM计数
PWM4T2 = CYCLE * 20 / 100; //设置PWM2第2次反转的PWM计数
//占空比为(PWM2T2-PWM2T1)/PWMC
PWM2CR = 0x00; //选择PWM2输出到P3.7,不使能PWM2中断
PWM3CR = 0x00; //选择PWM3输出到P3.7,不使能PWM2中断
PWM4CR = 0x00; //选择PWM4输出到P3.7,不使能PWM2中断
PWMCR = 0x07; //使能PWM信号输出
PWMCR |= 0x80; //使能PWM模块
P_SW2 &= ~0x80;
Lun1Set1Xiang(2);
Lun1Set2Xiang(1);
Lun1Set3Xiang(2);
SndData(DUTY);
while (1)
{
SetSpeed1(40);
SetSpeed2(10);
SetSpeed3(10);
/* if(!P17)
{
Delay30ms();
if(!P17)
{
while(P17 == 0 );
DUTY += 10L ;
SndData(DUTY);
if(DUTY >= 100) DUTY =0;
SetSpeed2(DUTY);
}
} */
}
}
//tmpcycle范围0~100
void SetSpeed1(unsigned char tmpcycle)
{
P_SW2 |= 0x80; //使能访问XSFR
PWM2T1 = 0x0000; //设置PWM2第1次反转的PWM计数
PWM2T2 = CYCLE * tmpcycle / 100; //设置PWM2第2次反转的PWM计数
P_SW2 &= ~0x80;
}
//tmpcycle范围0~100
void SetSpeed2(unsigned char tmpcycle)
{
P_SW2 |= 0x80; //使能访问XSFR
PWM3T1 = 0x0000; //设置PWM2第1次反转的PWM计数
PWM3T2 = CYCLE * tmpcycle / 100; //设置PWM2第2次反转的PWM计数
P_SW2 &= ~0x80;
}
//tmpcycle范围0~100
void SetSpeed3(unsigned char tmpcycle)
{
P_SW2 |= 0x80; //使能访问XSFR
PWM4T1 = 0x0000; //设置PWM2第1次反转的PWM计数
PWM4T2 = CYCLE * tmpcycle / 100; //设置PWM2第2次反转的PWM计数
P_SW2 &= ~0x80;
}
void Lun1Set1Xiang(unsigned char fangdat)
{
if(fangdat == 1) {P04 = 1; P05 = 0;}
else if(fangdat == 2) {P04 = 0; P05 = 1;}
else {P04 = 1; P05 = 1;}
}
void Lun1Set2Xiang(unsigned char fangdat)
{
if(fangdat == 1) {P00 = 1; P01 = 0;}
else if(fangdat == 2) {P00 = 0; P01 = 1;}
else {P00 = 1; P01 = 1;}
}
void Lun1Set3Xiang(unsigned char fangdat)
{
if(fangdat == 1) {P02 = 1; P03 = 0;}
else if(fangdat == 2) {P02 = 0; P03 = 1;}
else {P02 = 1; P03 = 1;}
}
|