单片机一般采用中断方式接受数据,这样便于及时处理
#include "reg51.h"
#include "myheader.h"
#define uchar unsigned char
int szc[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
int bufferc[6]={0};
int sza[6]={0x01,0x02,0x04,0x08,0x10,0x20};
void display()
{uchar i=0;uchar num=0;for(i=0;i<6;i++){num=bufferc[i];P2=szc[num];P1=sza[i];sleep(100);P2=0xff;}
}void main()
{TMOD=0x20;TH1=0XF4;//根据波特率计算公式这里需要设置为这么多才能够在串行数据传输模式1的状况下实现波特率2400B/STL1=0XF4;TR1=1;SCON=0x40;//串口工作与方式1,定义了传送数据的格式EA=1;ES=1; //串口中断开关打开REN=1;while(1){display();}
}void int_4() interrupt 4
{static uchar i=0;EA=0;bufferc[i]=SBUF;i++;if(i==6)i=0;RI=0;EA=1;
}void sleep(long int a)
{uchar i=0;for(i=0;i<a;i++){;}
}
#include "reg51.h"
#include "myheader.h"
#define uchar unsigned char
long int sleep_i=0;
long int main_i=0;
void main()
{uchar sendx[6]={2,0,2,3,8,1};sleep(2000);TMOD=0x20;TH1=0XF4;//根据波特率计算公式这里需要设置为这么多才能够在串行数据传输模式1的状况下实现波特率2400B/STL1=0XF4;TR1=1;SCON=0X40;for(main_i=0;main_i<6;main_i++){SBUF=sendx[main_i];while(TI==0);//这个是清除发送的中断,不是清除闹钟中断TI=0;}while(1);
}void sleep(long int a)
{for(sleep_i=0;sleep_i<a;sleep_i++){;}
}
其中发送数据段采用的是查询方式,接收端采用了中断方式,
要注意的地方有:
在中断处理函数int_0()内,处理数据前要先关闭中断,否则中断可能会不断传过来,
EA=0;
然后退出中断处理函数前恢复中断处理能力:
EA=1;
另外再main函数内比较查询方式要添加:
EA=1;
ES=1;
因为既然使用中断,一定要把中断中开关和serial通讯开关打开