×
单片机 > 单片机程序设计 > 详情

51单片机与PC上位机串口通信之LED控制

发布时间:2020-08-26 发布时间:
|

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;

                }

        }

}



关键字:51单片机  PC上位机  串口通信  LED控制 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
C51 特殊功能寄存器SFR的名称和地址