1、利用51单片机的串行接口与上位机建立传输信道进行数据的收发。采用8位的UART模式,即模式1,波特率为9600BPS。数据发送采用查询方式,数据接收采用中断方式。
系统上电初始化之后,单片机向上位机发送两个字节:0X5A和0XA5,然后等待接收上位机的数据,每接收到一个字节后,在该字节的基础上加1然后返回给上位机。
#include<reg52.h>
sfr AUXR=0X8E;
unsigned char urdat;
void SendByte(unsigned char dat);
void InitUart()//串口初始化函数
{
TMOD=0X20; //定时器1工作模式
TH1=0XFD; //设置波特率为9600
TL1=0XFD; //11.0592M或12M的12分频
TR1=1; //启动定时器1
SCON = 0X50; //串口参数为模式1和允许接收
AUXR = 0X00; //bit=1:定时器1不分频,0则12分频
ES=1; //使能串口中断
EA=1;
}
void ServiceUart() interrupt 4 //接收数据中断服务函数
{
if(RI==1) //接受一个完整字节
{
RI=0; //清除接收完成标志
urdat=SBUF; //将数据读出来
SendByte(urdat+1);//将数据发送出去
}
}
void SendByte(unsigned char dat)//发送数据
{
SBUF=dat; //将数据放进SBUF缓存器
while(TI==0); //等待发送数据完成
TI=0; //清除发送完成标志
}
void main()
{
InitUart();
SendByte(0X5A);
SendByte(0XA5);
while(1)
{
}
}
2、 利用51单片机的串行接口与上位机建立数据传输信道。采用8位的UART模式,即模式1,波特率为9600BPS。数据发送采用查询方式,数据接收采用中断方式。
系统上电初始化之后,关闭蜂鸣器和继电器等无关设备,并向上位机发送字符串:"Welcome to XMF system!",回车换行。
上位机通过串口发送单字节命令可以控制下位机的8个LED灯开关。
上位机通过串口发送单字节命令可以读取下位机运行信息。
通信规约如下:
高四位 | 低四位 | 说明 | ||||
控制灯光 | A | L4 | L3 | L2 | L1 | 低4位每控制一个LED指示灯,0-关灯,1-开灯,如:0XA3,打开L1和L2,关闭L3和L4。 |
B | L8 | L7 | L6 | L5 | ||
读取信息 | C | 0 | 返回信息“The System is Running...”回车,换行。 |
#include<stc15.h>
void SelectHC573(unsigned char channel)
{
switch(channel)
{
case 4:
P2=(P2&0X1F)|0X80;
break;
case 5:
P2=(P2&0X1F)|0XA0; //蜂鸣器和继电器
break;
case 6:
P2=(P2&0X1F)|0XC0;
break;
case 7:
P2=(P2&0X1F)|0XE0;
break;
case 0:
P2=(P2&0X1F)|0X00; //关闭所有锁存器
break;
}
}
void InitSystem()
{
SelectHC573(5);
P0=0X00; //关闭蜂鸣器和继电器
SelectHC573(4);
P0=0XFF; //关闭灯
}
//=====串口相关函数====
void InitUart()
{
TMOD=0X20;
TH1=0XFD;
TL1=0XFD;
TR1=1;
SCON=0X50;
AUXR=0X00;
ES=1;
EA=1;
}
unsigned char command=0X00;
void ServiceUart() interrupt 4
{
if(RI==1)
{
command=SBUF;
RI=0;
}
}
void SendByte(unsigned char dat)
{
SBUF=dat;
while(TI==0); //数据发送过程中TI为0,数据发送完成TI=1
TI=0; //软件清零
}
void SendString(unsigned char *str)
{
while(*str!='\0')
{
SendByte(*str++); //将内容一个个发送到SBUF中
}
}
//=====================
void Working()
{
if(command!=0X00)
{
switch(command&0XF0) // XXXX 0000
{
case 0XA0:
P0=(P0|0X0F)&(~command|0XF0);
command=0X00;
break;
case 0XB0:
P0=(P0|0XF0)&((~command<<4)|0X0F);
command=0X00;
break;
case 0XC0:
SendString("The System is Running...\r\n");
command=0X00;
break;
}
}
}
void main()
{
InitSystem();
InitUart();
SendString("Welcome to XMF system!\r\n");
while(1)
{
Working();
}
}