单片机RS232串口发送数据问题
虚心请教各位高手,为何串口调试助手收不到单片机发来的数据,是否是程序哪里出了问题?/************************串口初始化**************...
虚心请教各位高手,为何串口调试助手收不到单片机发来的数据,是否是程序哪里出了问题?
/************************串口初始化****************/
void chuankou_init()
{
TMOD=0X21;
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
TH1=0xfd;
TL1=0xfd;
ET0=1;
TR1=1;
SM1=1;
SM0=0;
REN=1;
EA=1;
ES=1;
}
/******************串口通信**********************/
void chuankou()
{
if(flag==1)
{
flag=0;
ES=0;
TI=1;
switch(flag_on)
{
case 0: puts("Start!\n"); TR0=1;break;
case 1: puts("End!\n"); TR0=0;break;
case 2: puts("Error!\n"); break;
}
while(!TI);
TI=0;
ES=1;
}
if(flag_time==1)
{
flag_time=0;
ES=0;
TI=1;
printf("Hum:%d.%d\n",H_temp/100,H_temp%100);
if(((H_temp/100)>h_h)||((H_temp/100)<h_l))
{
printf("Hem waring!!!\n");
}
printf("Tem:%d.%d\n",T_temp/100,T_temp%100);
if(((T_temp/100)>h_h)||((T_temp/100)<h_l))
{
printf("Tem waring!!!\n");
}
while(!TI);
TI=0;
ES=1;
}
}
/************主函数*******/
void main(void)
{
chuankou_init();
while(1)
{
chuankou();
}
}
/***********串口中断***************/
void ser() interrupt 4
{
RI=0;
a=SBUF;
flag=1;
if(a==1)
flag_on=0;
else
if(a==2) flag_on=1;
else flag_on=2;
} 展开
/************************串口初始化****************/
void chuankou_init()
{
TMOD=0X21;
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
TH1=0xfd;
TL1=0xfd;
ET0=1;
TR1=1;
SM1=1;
SM0=0;
REN=1;
EA=1;
ES=1;
}
/******************串口通信**********************/
void chuankou()
{
if(flag==1)
{
flag=0;
ES=0;
TI=1;
switch(flag_on)
{
case 0: puts("Start!\n"); TR0=1;break;
case 1: puts("End!\n"); TR0=0;break;
case 2: puts("Error!\n"); break;
}
while(!TI);
TI=0;
ES=1;
}
if(flag_time==1)
{
flag_time=0;
ES=0;
TI=1;
printf("Hum:%d.%d\n",H_temp/100,H_temp%100);
if(((H_temp/100)>h_h)||((H_temp/100)<h_l))
{
printf("Hem waring!!!\n");
}
printf("Tem:%d.%d\n",T_temp/100,T_temp%100);
if(((T_temp/100)>h_h)||((T_temp/100)<h_l))
{
printf("Tem waring!!!\n");
}
while(!TI);
TI=0;
ES=1;
}
}
/************主函数*******/
void main(void)
{
chuankou_init();
while(1)
{
chuankou();
}
}
/***********串口中断***************/
void ser() interrupt 4
{
RI=0;
a=SBUF;
flag=1;
if(a==1)
flag_on=0;
else
if(a==2) flag_on=1;
else flag_on=2;
} 展开
2个回答
展开全部
if(flag==1) 和 switch(flag_on) ,那么flag 和 flag_on在哪边清尺迅定义的,不能直接拿来判断啊,是不是还有串口中断程序没 贴上来答此困册呢。
追问
终于有人回答了,在这先感谢你抽出时间解惑!!串口中断的已附上麻烦你再看看,因为我主要是负责上位机部分,别人就只写了下位机程序,单片机连接上位机的就直接丢给我去解决了T_T好尴尬....
追答
你的串口初始化了串口1,2. 但是不完整。
void chuankou_init()
{
TMOD=0X21; //定时器1 为8位自动重装,定时器0为 16位
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
TH1=0xfd;
TL1=0xfd;
ET0=1; //允许定时器0 中断
TR1=1; //启动定时器1
SM1=1;
SM0=0;
REN=1;
EA=1;
ES=1;
}
你的定时器0允许中断,是什么用途。中断处理什么呢。
本题用定时器1就行了
修改为
void chuankou_init(void)
{
SCON = 0x50; //串口工作方式为1 , 串行允许接收
TMOD = 0x20; //定时器1 工作在方式2
TH1 = 0xfd;
TL1 = 0xfd;
ES = 1; //开串口中断
TR1 = 1; //允许定时器1工作
EA = 1; //开总中断
}
还有你串口函数中 的 flag_time 在哪里定义的,乱啊有点。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询