keil4,51单片机环境下做的一个程序 “可由串行口控制的可调led” 实际操作的时候不能用,求解
如题,程序可编译,但是实际操作时,上位机发送数据后单片机没有反应
自己找了一下发现可能是定时器1对定时器0有干扰,但是能力有限实在不知道怎么调整,求大神帮忙
程序如下
#include<reg52.h>//包含52系列头文件
#define uchar unsigned char//定义 无符号字符型
#define uint unsigned int//定义 无符号整型
#define DutyDeno10//定义 占空比分母 为:10
#define TRUE1//定义 逻辑真
#define FALSE0//定义 逻辑假
#define th00xfc//100Hz(10ms),占空比分母10,则其最小时间单位应该为10ms/10=1ms,故定时器T0定时时间为 1ms
#define tl00x18//1ms at 12HMz Fosc
sbit WaveOut=P1^0;//定义 方波输出 接口
sbit led=P1^2;
sbit Key1=P3^4;//定义 按键Key1 接口
uchar DutyNume=1;//定义 占空比分子 变量,并初始化为 1(即 占空比 为:1/10)
uchar buf;
void Time () interrupt 1//定时器T1 中断 函数
{
ES = 0; //关闭串行中断
RI = 0; //清除串行接受标志位
buf = SBUF; //从串口缓冲区取得数据
switch(buf)
{
case 0x31: DutyNume=1; break; //接受到1,亮度1
case 0x32: DutyNume=3; break; //接受到2,亮度2
case 0x33: DutyNume=5; break; //接受到3,亮度3
case 0x34: DutyNume=7; break; //接受到4,亮度4
case 0x35: DutyNume=9; break; //接受到5,亮度5
default: break; //接受到其它数据,蜂鸣器响
}
ES = 1; //允许串口中断
}
void Timer0() interrupt 3//定时器T0 中断 函数
{
static uchar duty_time=0;//定义静态变量,作为 占空比 输出时间的参考值(1ms)
TL0=tl0;
TH0=th0;//重赋定时器初值,1ms
duty_time=++duty_time%DutyDeno;//该句等效于:duty_time++;duty_time%=DutyDeno;
if(duty_time<DutyNume)
WaveOut=1;//若计时时间小于 占空比分子,则输出应为 高电平
else WaveOut=0;//若计时时间大于 占空比分子,则输出应为 低电平
}
void TimerInit()//定时器初始化 函数
{
SCON=0x50; //设定串口工作方式
PCON=0x00; //波特率不倍增
TMOD=0x21; //定时器1工作于8位自动重载模式, 用于产生波特率
EA=1;
ES=1; //允许串口中断
ET0=1;//允许T0中断
TL1=0xfd;
TH1=0xfd; //波特率9600
TH0=th0;
TL0=tl0;//1ms 初值
TR1=1;
TR0=1;
led=0;
WaveOut=0;
}
void KeyResp()//按键响应 函数
{
static bit KeyDownFlag,KeyReadyFlag;//定义 静态标志位,KeyDownFlag 按键按下标志,KeyReadyFlag 按键准备(响应)标志
if(!Key1)//若按键Key1 被按下
{
KeyDownFlag=TRUE;//按键按下标志 置位
KeyReadyFlag=TRUE;//按键准备标志 置位
}
else KeyDownFlag=FALSE;//若按键Key1 无按下,则清空 按键按下标志
if(!KeyDownFlag && KeyReadyFlag)//若 按键已准备,且按键无按下(即 松手状态)
{
DutyNume++;//占空比分子 加1
if(DutyNume==DutyDeno) DutyNume=1;//若 占空比分子=分母,则返回 1
KeyReadyFlag=FALSE;//按键处理完毕,清 按键准备标志
}
}
void main()//主函数
{
TimerInit();//调用 定时器初始化 函数
while(1)
{
KeyResp();
};
}
如题,程序可编译,但是实际操作时,上位机发送数据后单片机没有反应
自己找了一下发现可能是定时器1对定时器0有干扰,但是能力有限实在不知道怎么调整,求大神帮忙
程序如下
#include<reg52.h>//包含52系列头文件
#define uchar unsigned char//定义 无符号字符型
#define uint unsigned int//定义 无符号整型
#define DutyDeno10//定义 占空比分母 为:10
#define TRUE1//定义 逻辑真
#define FALSE0//定义 逻辑假
#define th00xfc//100Hz(10ms),占空比分母10,则其最小时间单位应该为10ms/10=1ms,故定时器T0定时时间为 1ms
#define tl00x18//1ms at 12HMz Fosc
sbit WaveOut=P1^0;//定义 方波输出 接口
sbit led=P1^2;
sbit Key1=P3^4;//定义 按键Key1 接口
uchar DutyNume=1;//定义 占空比分子 变量,并初始化为 1(即 占空比 为:1/10)
uchar buf;
void Time () interrupt 1//定时器T1 中断 函数
{
ES = 0; //关闭串行中断
RI = 0; //清除串行接受标志位
buf = SBUF; //从串口缓冲区取得数据
switch(buf)
{
case 0x31: DutyNume=1; break; //接受到1,亮度1
case 0x32: DutyNume=3; break; //接受到2,亮度2
case 0x33: DutyNume=5; break; //接受到3,亮度3
case 0x34: DutyNume=7; break; //接受到4,亮度4
case 0x35: DutyNume=9; break; //接受到5,亮度5
default: break; //接受到其它数据,蜂鸣器响
}
ES = 1; //允许串口中断
}
void Timer0() interrupt 3//定时器T0 中断 函数
{
static uchar duty_time=0;//定义静态变量,作为 占空比 输出时间的参考值(1ms)
TL0=tl0;
TH0=th0;//重赋定时器初值,1ms
duty_time=++duty_time%DutyDeno;//该句等效于:duty_time++;duty_time%=DutyDeno;
if(duty_time<DutyNume)
WaveOut=1;//若计时时间小于 占空比分子,则输出应为 高电平
else WaveOut=0;//若计时时间大于 占空比分子,则输出应为 低电平
}
void TimerInit()//定时器初始化 函数
{
SCON=0x50; //设定串口工作方式
PCON=0x00; //波特率不倍增
TMOD=0x21; //定时器1工作于8位自动重载模式, 用于产生波特率
EA=1;
ES=1; //允许串口中断
ET0=1;//允许T0中断
TL1=0xfd;
TH1=0xfd; //波特率9600
TH0=th0;
TL0=tl0;//1ms 初值
TR1=1;
TR0=1;
led=0;
WaveOut=0;
}
void KeyResp()//按键响应 函数
{
static bit KeyDownFlag,KeyReadyFlag;//定义 静态标志位,KeyDownFlag 按键按下标志,KeyReadyFlag 按键准备(响应)标志
if(!Key1)//若按键Key1 被按下
{
KeyDownFlag=TRUE;//按键按下标志 置位
KeyReadyFlag=TRUE;//按键准备标志 置位
}
else KeyDownFlag=FALSE;//若按键Key1 无按下,则清空 按键按下标志
if(!KeyDownFlag && KeyReadyFlag)//若 按键已准备,且按键无按下(即 松手状态)
{
DutyNume++;//占空比分子 加1
if(DutyNume==DutyDeno) DutyNume=1;//若 占空比分子=分母,则返回 1
KeyReadyFlag=FALSE;//按键处理完毕,清 按键准备标志
}
}
void main()//主函数
{
TimerInit();//调用 定时器初始化 函数
while(1)
{
KeyResp();
};
}