波特率9600 无效验位 停止位1位 数据8位
功能:串口通信发送:每次4个字节,格式如:55A1D1XX
8位LED根据XX的值来显示(比如计算机发送55A1D155,接受后LED偶数位亮)
单片机接受成功后并返回OK到计算机
#include<reg52.h>
unsigned char flag,i; // flag为标志位
unsigned char code table[3]={0x55,0xA1,0XD1};
unsigned char idata str[4];
void main()
{
/*串口初始化*/
TMOD=0x20; // 设置定时器1为工作方式2
TH1=0xfd; //装初值,设定波特率为9600
TL1=0xfd;
TR1=1; //启动T1定时器
REN=1; //允许串口接收数据,REN、SM0、SM1这三句亦可以只写一个SCON=0x50
SM0=0; //串口工作方式设置为方式1, SM1=1;
EA=1; //开总中断
ES=1; //开串口中断
P1=0x77;
while(1)
{
if ( flag == 1 )
{
ES=0;
flag=0;
SBUF='O';
while(!TI);
TI=0;
SBUF='K';
while(!TI);
TI=0;
ES=1;
}
}
}
void ser() interrupt 4
{
while(RI)
{
for(i=0;i<4;i++)
{
str
=SBUF;
RI=0;
if(str==table)
continue; //准备接收下一位
else
break; //跳出循环
i++;
if(i==4)
{
P1=str[3];
i=0;
flag=1;
}
}
}
}
因没有做实验的条件,大家看看这个程序写的行不行,有什么地方要改正的,谢谢了。
此帖出自小平头技术问答
你把那个if(str==table) continue; else break; 换成
if(str!=table) break;
因为continue是结束本次循环,那么之后的就不会执行,别的就没什么了吧
void ser() interrupt 4
{
if(RI)
{
str[ i ]=SBUF;
RI=0;
i++;
if(i=4)
{
if(str[0]==table[0]&&str[1]==table[1]&&str[2]==table[2])
{
P1=str[3];
i=0;
flag=1;
}
}
}
}
[ 本帖最后由 孤獨の快樂 于 2011-10-25 11:30 编辑 ]一周热门 更多>