其实这是个51单片机串口通信的小例子,课堂上老师说你们可以去尝试弄一下,于是就去网上找一下资料,就做了这个实验。
先把一个作为主机,用来发送数据;另一个作为从机,用来接收数据。将两个程序各自烧录到对应的板子上去,并将主机的TX(P3.0)接到从机的RX(P3.1),主机的RX(P3.1)接到从机的TX(P3.1),便可以实现将主机的数据发送到从机上去,并在从机上实现功能,这时可以看到从机上流水灯的现象
主机发送代码
- #include<reg51.h>
- unsigned char code tab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //流水灯控制码
- void send(unsigned char dat) //数据发送程序
- {
- SBUF=dat; //将要发送的数据存入发送缓冲器中
- while(TI==0); //若发送中断标志位没有置1(正在发送数据),就等待
- TI=0; //若发送完成,TI自动置1,这里把它清零
- }
- void delay(void) //延时函数
- {
- unsigned char m,n;
- for(m=0;m<200;m++) //延时约50ms
- for(n=0;n<250;n++);
- }
- void main(void)
- {
- unsigned char i;
- TMOD=0x20; //定时器T1工作于方式2(可自动重装的8位定时器)
- SCON=0x40; //串口工作方式1,不允许接收
- PCON=0x00; //波特率不倍增
- TH1=0xf4; //波特率为2400b/s
- TL1=0xf4;
- TR1=1; //启动定时器T1(T1作波特率的发生器)
- while(1)
- {
- for(i=0;i<8;i++) //一共8位的流水灯控制码
- {
- send(tab[i]); //发送数据
- delay(); //每50ms发送一次数据
- }
- }
- }
- 从机接收代码
- #include<reg51.h>
- unsigned char receive(void) //数据接收函数
- {
- unsigned char dat;
-
- while(RI==0); //数据没有接收完毕时等待接收
- RI=0; //接收完毕时清零
- dat=SBUF; //将接收缓冲器中的数据存入dat
- return dat; //将接收到的数据返回
- }
- void main(void)
- {
- TMOD=0x20; //设置定时器T1工作于方式2
- SCON=0x50; //串口工作方式1,允许接收数据
- PCON=0x00; //波特率不倍增
- TH1=0xf4; //波特率为2400b/s
- TL1=0xf4;
- TR1=1; //启动定时器T1
- REN=1; //允许接收数据
- while(1)
- {
- P2=receive(); //将接收到的数据送到P1口显示
- }
- }
复制代码
|