A02:AT89C51单片机实现的简单串口控制LED程序。 功能: 通过串口助手发送数据,单片机串口中断接受数据并控制LED亮灭,并由1602显示LED当前状态。 代码配有使用说明 [1]提供代码与protues仿真图。 [2]代码使用keil4编写,protues为8.15版本。 [3]联系即送protues8.15安装包、串口助手软件安、虚拟串口软件。
老铁们,今天带你们玩点实在的——用AT89C51搞个串口调光台灯。这玩意儿能通过电脑串口控制LED亮度,还能在1602液晶上实时显示状态。废话不多说,直接上硬货。
先看核心代码段:
void UART_Init() { SCON = 0x50; // 模式1,允许接收 TMOD |= 0x20; // 定时器1模式2 TH1 = 0xFD; // 9600波特率 TR1 = 1; // 启动定时器 ES = 1; // 开启串口中断 EA = 1; // 总中断开关 }这里配置串口的骚操作注意三点:波特率计算器要选11.0592MHz晶振才能精准出9600,中断开关得EA和ES双开才有效,TMOD寄存器记得用|=操作别把定时器0配置冲了。
收到数据后的处理才是精髓:
void UART_ISR() interrupt 4 { if(RI) { RI = 0; cmd = SBUF; // 捕获串口指令 P2 = cmd; // 直接输出到LED update_lcd(cmd);// 刷新液晶显示 } }这个中断服务函数够暴力——直接把接收缓存器的数据怼到P2口,老司机都懂这种直来直去的写法最不容易翻车。不过要注意静电防护,别问我怎么知道的...
液晶显示部分有个坑:
void lcd_write_str(unsigned char y, char *str) { lcd_pos(y); // 定位光标 while(*str) { lcd_wdat(*str++);// 逐个写入字符 delay(5); // 关键延时! } }那个5ms的延时可不是摆设,1602这老古董的响应速度比树懒还慢,不插这个延时绝对花屏。曾经有位壮士不信邪,删了延时后液晶显示乱码得像喝醉的蚂蚁在跳舞。
Proteus仿真要特别注意虚拟串口的设置:在COMPIM元件里绑定Pair组,VSPD虚拟出的串口号要和设备管理器里一致。有次调试死活不通,最后发现是COM口数字被360安全卫士给劫持了,这剧情比谍战片还刺激。
最后给小白划重点:
- 烧录前确认Memory Model选Small模式
- 串口助手别开中文输入法的快捷键
- LED阳极接330Ω电阻别直连,除非你想看放烟花
需要Proteus8.15安装包和配套工具的,私信喊一嗓子就成。下期预告:用这板子驱动WS2812灯带,搞个声控彩虹跑马灯,保准让你的桌面变夜店!