文章目录
- 一、上位机发送信号控制单片机
- 1、显示对应的流水灯
- 2、显示对应数码管
- 3、控制数码管显示的数字
- 二、两机收发信息
一、上位机发送信号控制单片机
1、显示对应的流水灯
实现现串口通信接收上位机的信息,控制流水灯的亮灭与亮的位置,发送流水灯控制信号,单片机接收信号并显示对应的流水灯。
#include <reg52.h>
#define
//sbit LED = P1^4;
uchar UART_buff;
bit Money = 0;
//----------------------------------------------
void main (void)
{
SCON = 0x50; //串口方式1, 8-n-1, 允许接收.
TMOD = 0x20; //T1方式2
TH1 = 0xFD; //[url=]//[email protected][/url]
TL1 = 0xFD;
TR1 = 1;
ES = 1; //开中断.
EA = 1;
while(Money==0); //等待中断触发,等着再次输入信号
}
//----------------------------------------------
void ser_int (void) interrupt 4 //一旦串口打开了,就执行该中断服务函数,中断号为4
{
if(RI == 1) //如果收到消息.
{
RI = 0; //清除标志.
UART_buff = SBUF; //将接收的数据变为uchar类型
P1 = UART_buff; //点亮对应的流水灯
if(UART_buff == '$') Money = 1; //中断返回,一旦有$符号,中断就永久触发了,不断循环收发消息
}
}
2、显示对应数码管
现串口通信接收上位机的信息,控制数码管显示的位置,发送数码管的位选信号,单片机接收信号并显示对应的数码管,显示数字为9。
#include <reg52.h>
#define
#define
Uartinit();
void delay(uint x);
sbit dula= P2^6;
sbit wela= P2^7;
uchar Uart_buff;
// 串口通信初始化
void UartInit(void) //[email protected]
{
SCON = 0x50; //8位数据,可变波特率
TMOD = 0x20; //设定定时器1为16位自动重装方式
TL1 = 0xFD; //设定定时初值
TH1 = 0xFD; //设定定时初值
ET1= 0; //禁止定时器1中断
TR1= 1; //启动定时器1
ES= 1; //串口中断
EA= 1; //总中断
}
void main()
{
Uartinit(); //执行初始化
while(1) ; //等待串口中断的触发
}
// 显示数码管
void display() interrupt 4
{
if(RI==1) //如果接收到消息
{
RI= 0; //手动清零接收位
Uart_buff= SBUF;
wela= 1;
P0= Uart_buff;
wela= 0;
dula= 1;
P0= 0x6F; //显示数字9
dula= 0;
delay(500);
}
}
void delay(uint x) //延时x毫秒的函数
{
uint i,j;
for(i=x; i>0; i--)
{
for(j=110; j>0; j--) ;
}
}
3、控制数码管显示的数字
#include <reg52.h>
#define
#define
void display_ISR(); //中断显示函数
void Uart_Init(); //中断初始化函数
void delay_ms(uint x);
void light();
uchar UART_buff;
sbit dula = P2^6;
sbit wela = P2^7;
void Uart_Init()
{
SCON = 0x50;
TMOD = 0x20; //方式2
TH1 = 0xFD; //定时器1重装初值
TL1 = 0xFD;
ET1 = 0; //关定时器1中断
TR1 = 1; //启动定时器1运行
ES = 1; //串口中断
EA = 1; //总中断
}
void main()
{
uchar temp = 0xFE;
Uart_Init();
P1 = temp;
delay_ms(500);
while(1) //等待中断触发
{
light(temp);
}
}
void light(temp)
{
if(temp != 0x00)
{
temp = temp << 1; //左移一位,不断循环不断左移
P1 = temp;
delay_ms(500);
}
else //如果全亮了
temp = 0xFF;
P1 = temp;
}
void display_ISR() interrupt 4
{
if(RI==1) //如果收到消息
{
UART_buff = SBUF;
RI = 0;
wela = 1;
P0 = 0xF0;
wela = 0;
dula = 1;
P0 = UART_buff;
dula = 0;
delay_ms(1500); //延时1500ms,1.5秒
}
}
void delay_ms(uint x)
{
uint i, j;
for(i=x; i>0; i--)
for(j=110; j>0; j--) ;
}
二、两机收发信息
#include <reg52.h>
#define
void Uart_Init(); //初始化函数
sbit LED= P1^4;
bit new=0, sended=1;
/*错误点:sended初始必须为1*/
uchar UART_buff;
void Uart_Init()
{
SCON= 0x50;
TMOD= 0x20;
TH1= 0xFD;
TL1= 0xFD;
ET1= 0;
TR1= 1;
ES = 1;
EA = 1;
}
void main()
{
Uart_Init();
while(1) //正常运行,并等待中断的触发
{
if((new==1) && (sended==1))
{
/*易错遗忘点*/
SBUF = UART_buff; //那就发送
new = 0;
sended = 0;
}
}
}
void ser_int (void) interrupt 4
{
if(RI == 1) //如果收到信息
{
RI = 0; //清除标志.
new= 1;
UART_buff = SBUF; //接收.
if(UART_buff == '1')
LED= 1; //启动一个LED灯
else if(UART_buff == '0')
LED= 0;
else
{
UART_buff = UART_buff + 2;
}
}
else
{ //如果送毕.
TI = 0; //清除标志.
sended = 1;
}
}