【结贴啦!】【问题已解决】真正的问题原因,芯片不稳定 ,8路PWM同时翻转导致单片机崩溃,因此串口也不能用了;解决方法:把每一路的翻转值(PWMnT1和PWMnT2,n=0,1,2....,7)调为不同(相差1即可),单片机就可正常工作。附调试好的代码
#include <STC8.h>
#include <intrins.h>
#define FOSC 24000000UL
#define BRT (65536 - FOSC / 115200 / 4)
#define PWM_T 0x1000 // PWM计数器,设置PWM周期为0x1000,即4096
#define PWMnT1 0x0000 //PWM的0通道T1计数值为0
#define PWMnT2 0x0028 //PWM的0通道T2计数值为0x28
#define PWMnCR 0x85
bit busy,p=0;
char wptr,adjust_flag;
char rptr;
char buffer[4];
void UartIsr() interrupt 4 using 1
{
if (TI)
{
TI = 0;
busy = 0;
}
if (RI)
{
RI = 0;
buffer[wptr++] = SBUF;
wptr &= 0x03;
while(!RI);
RI = 0;
buffer[wptr++] = SBUF;
wptr &= 0x03;
while(!RI);
RI = 0;
buffer[wptr++] = SBUF;
wptr &= 0x03;
wptr = 0x00;
p=1;
}
}
void PWM_Isr() interrupt 22 using 3
{
unsigned char i;
i = P_SW2;
P_SW2 |= 0x80;
if (PWMCFG & 0x80)
PWMCFG &= ~0x80;
if (PWMIF & 0x80)
{
PWMIF &= ~0x80;
if(adjust_flag & 0x80)
{
adjust_flag &= ~0x80;
}
}
if (PWMIF & 0x40)
{
PWMIF &= ~0x40;
if(adjust_flag & 0x40)
{
adjust_flag &= ~0x40;
}
}
if (PWMIF & 0x20)
{
PWMIF &= ~0x20;
if(adjust_flag & 0x20)
{
adjust_flag &= ~0x20;
}
}
if (PWMIF & 0x10)
{
PWMIF &= ~0x10;
if(adjust_flag & 0x10)
{
adjust_flag &= ~0x10;
}
}
if (PWMIF & 0x08)
{
PWMIF &= ~0x08;
if(adjust_flag & 0x08)
{
adjust_flag &= ~0x08;
}
}
if (PWMIF & 0x04)
{
PWMIF &= ~0x04;
if(adjust_flag & 0x04)
{
adjust_flag &= ~0x04;
}
}
if (PWMIF & 0x02)
{
PWMIF &= ~0x02;
if(adjust_flag & 0x02)
{
adjust_flag &= ~0x02;
}
}
if (PWMIF & 0x01)
{
PWMIF &= ~0x01;
if(adjust_flag & 0x01)
{
adjust_flag &= ~0x01;
}
}
P_SW2 = i;
}
void UartInit()
{
P_SW1 &= ~0xc0;
/*P3.0是RXD,receive,接收,属于输入模式,所以不能设为强推挽输出*/
P3M0 |= 0x02;
P3M0 &= ~0x01;
P3M1 &= ~0x03;//强推挽输出
SCON = 0x50;
T2L = BRT;
T2H = BRT >> 8;
AUXR = 0x15;
wptr = 0x00;
rptr = 0x00;
TI = 0;
}
void UartSend(char dat)
{
while (busy);
busy = 1;
SBUF = dat;
}
//void UartSendStr(char *p)
//{
// while (*p)
// {
// UartSend(*p++);
// }
//}
void main()
{
unsigned int auto_adjust[8];
unsigned char i,adjust_flag=0x00;
UartInit();
ES = 1;
EA = 1;
/************************************以下是PWM的初始化********************************/
i = P_SW2;
P_SW2 |= 0x80;
PWMCKS = 0x01;// PWM时钟选择,系统时钟2分频:12MHz,但实际测得的输出是 约2.93kHz
PWMC = PWM_T; // PWM计数器,设置PWM周期为0x1000,即4096
PWM0T1 = PWMnT1;
PWM0T2 = PWMnT2+1;
PWM0CR = PWMnCR;
PWM1T1 = PWMnT1+2;
PWM1T2 = PWMnT2+3;
PWM1CR = PWMnCR;
PWM2T1 = PWMnT1+4;
PWM2T2 = PWMnT2+5;
PWM2CR = PWMnCR;
PWM3T1 = PWMnT1+6;
PWM3T2 = PWMnT2+7;
PWM3CR = PWMnCR;
PWM4T1 = PWMnT1+8;
PWM4T2 = PWMnT2+9;
PWM4CR = PWMnCR;
PWM5T1 = PWMnT1+10;
PWM5T2 = PWMnT2+11;
PWM5CR = PWMnCR;
PWM6T1 = PWMnT1+12;
PWM6T2 = PWMnT2+13;
PWM6CR = PWMnCR;
PWM7T1 = PWMnT1+14;
PWM7T2 = PWMnT2+15;
PWM7CR = PWMnCR;
PWMIF = 0x00;
PWMCFG &= ~0xc0;
P_SW2 = i;
PWMCR = 0x80; /*PWM0的控制寄存器,PWM输出使能,初始电平=0,
P2脚作为PWM功能脚,使能中断,使能T1翻转点中断*/
/************************************以上是PWM的初始化********************************/
while (1)
{
if (p)
{
p=0;
auto_adjust[buffer[0]] = buffer[1];
auto_adjust[buffer[0]] = (auto_adjust[buffer[0]]<<8) + buffer[2];
adjust_flag |= 1<<buffer[0];
UartSend(buffer[0]);
UartSend((auto_adjust[buffer[0]]>>8));
UartSend(((auto_adjust[buffer[0]]<<8)>>8));
}
}
}
|