|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
PC机通过上层软件控制单片机LED的亮灭或者控制LED的闪烁及闪烁时间,上层软件用户名密码均为admin 注意PROTEUS串口仿真需要配合虚拟串口软件才能工作。9 K6 E! E5 y6 d* V
" H) ? E0 O3 U1 R
, c# v. ^% U4 I' V/ n/ P% f
4 Q3 S# C( V. D9 U4 D9 z2 U' ~, `0 ?
& Q4 ^/ G `9 _4 u* h+ z; H; }
/ o8 S' Z( n; R$ I* n6 }上位机(包含源码)软件说明:
5 a( H' F% V( [- n- N& K/ F发送数据解析
7 c* ] X* @8 \7 S3 |字节1、2:0x55 0xaa 数据是否正确判断标志" b6 ]3 }+ f9 n; h
字节3:( S" J, j- y; z `
0x01 ------单个LED控制手动控制
r$ [" T2 V, X& K 0x02 ------单个LED控制自动闪烁
" u Z% {9 P- d' C% I/ i( D8 [: B0 v: F
: D0 r8 m* \' h2 z5 V: R9 \字节4 $ y4 |7 u, O8 P, E7 E7 o( x
此字节从低位到高位依次控制LED0-LED7,例如0x01表示手动点亮LED0或者LED0自动闪烁;0x28表示手动点 亮LED3、LED5或者LED3、LED5自动闪烁
7 `4 {5 x) ~0 H! i% z- T4 X% j' v, e0 c- t- @1 q
字节5、6:表示闪烁时间(6高8位 5低8位) 取值范围0-5000
# K0 s' @0 u7 x$ N6 U4 D, s- y: i) L
程序源码预览:0 P, l6 Q( d+ d8 U" t
- #include<reg52.h>
- #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 = SBUF;
- i++;
- if(i == 6)
- {
- i = 0;
- k = 0;
- P0 = 0xff;
- }
- }
- }" z1 H% f& a% d' E3 q
5 G* U' s+ M1 x7 C. K, @$ v, W
3 v) M5 A: f4 \' E, v+ \5 Z2 @
|
|