小弟悬赏有限,请谅解,权当解难题
使用芯片stc15w408as
定时器0计数,定时器2为波特率9600
遇到问题,当串口接收数据时候,定时器0不工作,使用按键可以继续控制定时器。把波特率里面ES去掉,定时器正常工作,此时通信不能使用(或者去掉f++)
/*-----------------------------------------------------------------------------
* 实 验 名 : RS232串口试验
* 实验说明 : 单片机串口接收数据控制灯亮灭
* 连接方式 :
* 注 意 : 该试验使用的晶振是11.0592
*******************************************************************************/
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
bit flag; //定义一个标志位
bit flag1; //要完成无意义的改动还真是麻烦,思想有点乱,因为进一次中断只能接受一字符
code uchar PuZh0 [4] = "1000";
code uchar PuZh1 [4] = "1001";
code uchar PuZh2 [4] = "1002";
code uchar PuZh3 [4] = "1003";
code uchar PuZh4 [4] = "1004";
code uchar PuZh5 [4] = "1005";
code uchar PuZh6 [4] = "1006";
code uchar PuZh7 [4] = "1007";
code uchar PuZh8 [4] = "1008";
code uchar PuZh9 [4] = "1009";
code uchar PuZh10[4] = "1010";
code uchar PuZh11[4] = "1011";
code uchar PuZh12[4] = "1012";
code uchar PuZh13[4] = "1013";
code uchar PuZh14[4] = "1014";
code uchar PuZh15[4] = "1015";
code uchar PuZh16[4] = "1016";
code uchar PuZh17[4] = "1017";
code uchar PuZh18[4] = "1018";
code uchar PuZh19[4] = "1019";
code uchar PuZh20[4] = "1020";
uchar fs[4]; //从串口接收的数据
uchar f=0; //指示串口接收个数
int ss=0,xx=0;
uchar aa=0,bb=0,cc=0;
//--定义使用的IO--//
sbit LED0=P1^3;
sbit LED1=P1^4;
sbit LED2=P1^5;
sbit k2=P1^6;
sbit k3=P1^7;
sbit k7=P3^7;
//--声明全局函数--//
void UsartConfiguration();
void ykcsh();
void Delay_1ms(uint i);
void time0() interrupt 1 //定义定时器0
{
char k;
//IRtime++; //检测脉宽,1次为278us
ss++;
if(ss==3600) //大约1秒
{
xx++;
ss=0;
}
if(xx==1&&bb==1)
{
LED0=~LED0;
for(k=0; k<4; k++)
{
SBUF = PuZh0[k]; //将要发送的数据放入到发送寄存器
while(!TI); //等待发送数据完成
TI=0; //清除发送完成标志位
Delay_1ms(1);
}
xx=0;
} //xx=5大约5秒
if(xx==3&&bb==2)
{
LED0=~LED0;
for(k=0; k<4; k++)
{
SBUF = PuZh1[k]; //将要发送的数据放入到发送寄存器
while(!TI); //等待发送数据完成
TI=0; //清除发送完成标志位
Delay_1ms(1);
}
xx=0;
} //xx=5大约5秒
if(xx==6&&bb==3)
{
LED0=~LED0;
for(k=0; k<4; k++)
{
SBUF = PuZh2[k]; //将要发送的数据放入到发送寄存器
while(!TI); //等待发送数据完成
TI=0; //清除发送完成标志位
Delay_1ms(1);
}
xx=0;
} //xx=5大约5秒
}
/********************************************************************
* 名称 : Com_Int()
* 功能 : 串口中断子函数
* 输入 : 无 * 输出 : 无
***********************************************************************/
void Com_Int(void) interrupt 4
{
// static uchar i = 7; //定义为静态变量,当重新进入这个子函数时 i 的值不会发生改变
EA = 0;
if(RI == 1) //当硬件接收到一个数据时,RI会置位
{
RI = 0;
fs[f] = SBUF; //这里减去48是因为从电脑中发送过来的数据是ASCII码。
f++;
}
EA = 1;
}
/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void main()
{
uchar k,old=0;
UsartConfiguration();//初始化串口
ykcsh();
while(1)
{
if(old!=f){old=f;}
Delay_1ms(30);//一段时间之后仍然相等,表示上位机发来的一串数据结束
if(old==f){if(f) break;}
if(fs[0]=='1'&&fs[1]=='0'&&fs[2]=='0'&&fs[3]=='0' )
{
LED0=~LED0;
for(k=0; k<4; k++)
{
SBUF = PuZh0[k]; //将要发送的数据放入到发送寄存器
while(!TI); //等待发送数据完成
TI=0; //清除发送完成标志位
Delay_1ms(1);
}
break;
}
if(fs[0]=='1'&&fs[1]=='0'&&fs[2]=='0'&&fs[3]=='1' )
{
LED1=~LED1;
for(k=0; k<4; k++)
{
SBUF = PuZh1[k]; //将要发送的数据放入到发送寄存器
while(!TI); //等待发送数据完成
TI=0; //清除发送完成标志位
Delay_1ms(1);
}
break;
}
if(fs[0]=='1'&&fs[1]=='0'&&fs[2]=='0'&&fs[3]=='2' )
{
LED2=~LED2;
if(LED2==0)
{ LED0=~LED0;}
for(k=0; k<4; k++)
{
SBUF = PuZh2[k]; //将要发送的数据放入到发送寄存器
while(!TI); //等待发送数据完成
TI=0; //清除发送完成标志位
Delay_1ms(1);
}
Delay_1ms(250);
break;
}
if(fs[0]=='1'&&fs[1]=='0'&&fs[2]=='0'&&fs[3]=='3' )
{
LED0=1;
for(k=0; k<4; k++)
{
SBUF = PuZh3[k]; //将要发送的数据放入到发送寄存器
while(!TI); //等待发送数据完成
TI=0; //清除发送完成标志位
Delay_1ms(1);
}
break;
}
if(fs[0]=='1'&&fs[1]=='0'&&fs[2]=='0'&&fs[3]=='4' )
{
LED0=0;
for(k=0; k<4; k++)
{
SBUF = PuZh4[k]; //将要发送的数据放入到发送寄存器
while(!TI); //等待发送数据完成
TI=0; //清除发送完成标志位
Delay_1ms(1);
}
break;
}
if(fs[0]=='1'&&fs[1]=='0'&&fs[2]=='0'&&fs[3]=='5' )
{
LED0=~LED0;
if(LED2==0)
{ LED0=~LED0;}
for(k=0; k<4; k++)
{
SBUF = PuZh5[k]; //将要发送的数据放入到发送寄存器
while(!TI); //等待发送数据完成
TI=0; //清除发送完成标志位
Delay_1ms(1);
}
Delay_1ms(250);
break;
}
if(k2==0)
{
Delay_1ms(100);
if(k2==0)
{ //EA = 0;
LED0=~LED0;
for(k=0; k<4; k++)
{
SBUF = PuZh0[k]; //将要发送的数据放入到发送寄存器
while(!TI); //等待发送数据完成
TI=0; //清除发送完成标志位
Delay_1ms(1);
}
//EA = 1;
}
while(!k2);
}
if(k3==0)
{
Delay_1ms(100);
if(k3==0)
{
++bb;
if(bb==1)
{
for(k=0; k<2; k++)
{
LED0=~LED0;
Delay_1ms(50);
}
LED0=1;
xx=0;
}
if(bb==2)
{
for(k=0; k<6; k++)
{
LED0=~LED0;
Delay_1ms(200);
Delay_1ms(200);
}
LED0=1;
xx=0;
}
if(bb==3)
{
for(k=0; k<12; k++)
{
LED0=~LED0;
Delay_1ms(200);
Delay_1ms(200);
}
LED0=1;
xx=0;
}
if(bb==4)
{
for(k=0; k<6; k++)
{
LED0=~LED0;
Delay_1ms(50);
}
LED0=1;
bb=0,xx=0;
}
//EA = 1;//总中断允许
}
while(!k3);
}
if(k7==0)
{
// EA = 0;
LED2=~LED2;
if(LED2==0)
{ LED0=~LED0;}
for(k=0; k<4; k++)
{
SBUF = PuZh2[k]; //将要发送的数据放入到发送寄存器
while(!TI); //等待发送数据完成
TI=0; //清除发送完成标志位
Delay_1ms(1);
}
// EA = 1;
}
}
}
/*******************************************************************************
* 函 数 名 : UsartConfiguration()
* 函数功能 : 设置串口
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void UsartConfiguration()
{
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x01; //串口1选择定时器2为波特率发生器
AUXR |= 0x04; //定时器2时钟为Fosc,即1T
T2L = 0xE0; //设定定时初值
T2H = 0xFE; //设定定时初值
AUXR |= 0x10; //启动定时器2
ES = 1; //开串口中断
EA = 1; //开总中断
}
void ykcsh() //红外遥控初始化
{
TMOD |= 0x02; //定时器0工作方式2,8位自动重装
TH0 = 0x00; //高8位装入0那么定时器溢出一次的时间是256个机器周期
TL0 = 0x00;
ET0 = 1; //定时器0中断
TR0 = 1; //启动定时器0
IT0 = 1; //设置外部中断0为跳沿触发方式,来一个下降沿触发一次
EX0 = 1; //启动外部中断0
EA = 1;//总中断允许
}
/********************************************************************
* 名称 : Delay_1ms()
* 功能 : 延时子程序,延时时间为 1ms
* x * 输入 : x (延时一毫秒的个数)
* 输出 : 无
***********************************************************************/
void Delay_1ms(uint i)//1ms延时
{
uchar x,j;
for(j=0;j<i;j++)
for(x=0;x<=148;x++);
}
|