PC机通过上层软件控制单片机LED的亮灭或者控制LED的闪烁及闪烁时间,上层软件用户名密码均为admin 注意PROTEUS串口仿真需要配合虚拟串口软件才能工作
上位机(包含源码)软件说明:
发送数据解析
字节1、2:0x55 0xaa 数据是否正确判断标志
字节3:
0x01 ------单个LED控制手动控制
0x02 ------单个LED控制自动闪烁
字节4
此字节从低位到高位依次控制LED0-LED7,例如0x01表示手动点亮LED0或者LED0自动闪烁;0x28表示手动点 亮LED3、LED5或者LED3、LED5自动闪烁
字节5、6:表示闪烁时间(6高8位 5低8位) 取值范围0-5000
程序源码预览:
#include
#define uint8 unsigned char
#define uint16 unsigned int
uint8 receive_buffer[6]; //存放接收到的数据
uint8 i,k;
void delay1ms(uint16 m) //1ms延时程序
{
uint8 j;
while(m--)
for(j=0;j<112;j++);
}
void main()
{
uint16 time;
P0 = 0xff; //初始化LED状态,熄灭
TMOD = 0x20; //定时器1工作在方式2
TH1 = 0xfd;
TL1 = 0xfd; //波特率9600
TR1 = 1; //启动定时器1
EA = 1; //开启总中断
SM0 = 0;
SM1 = 1; //串行口工作方式1
REN = 1; //允许串行接收
ES = 1; //开启串行口中断
while(1)
{
if((receive_buffer[0] == 0x55) && (receive_buffer[1] == 0xaa)) //如果接收到0x55 0xaa说明接收到的数据是正确的
{
time = ((uint16)receive_buffer[5] << 8) + (uint16)receive_buffer[4]; //闪烁时间
switch(receive_buffer[2])
{
case 0x01: //手动控制LED亮灭
P0 = ~receive_buffer[3];
break;
case 0x02: //LED自动闪烁
P0 = ~receive_buffer[3];
delay1ms(time);
P0 = 0xff;
delay1ms(time);
break;
default:
break;
}
}
}
}
void uart_int() interrupt 4
{
if(RI == 1)
{
RI = 0;
receive_buffer[i] = SBUF;
i++;
if(i == 6)
{
i = 0;
k = 0;
P0 = 0xff;
}
}
}
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』