|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
PC机通过上层软件控制单片机LED的亮灭或者控制LED的闪烁及闪烁时间,上层软件用户名密码均为admin 注意PROTEUS串口仿真需要配合虚拟串口软件才能工作。2 ~- W# Z- J( p; W& b/ `1 K* a
$ N1 w7 M" N$ y6 [' f& d2 I
& P: B! \9 _8 ]/ F0 h9 K
) F, s v, B% p" R1 i( J8 S' X- c6 a9 p
3 o7 F! P" ~2 h
" R- P5 e) y$ ]上位机(包含源码)软件说明:
- m: K6 t5 p+ f1 _1 f发送数据解析+ z( r" r! a6 n: S/ E; l
字节1、2:0x55 0xaa 数据是否正确判断标志& O! z+ i: D2 P; t
字节3:
& u. s+ h7 ^2 m( t8 K 0x01 ------单个LED控制手动控制
7 {- I, H. z' w, x! w, G 0x02 ------单个LED控制自动闪烁
% R( } V4 E% U& _1 H
1 B: g4 S* c8 P z8 @字节4 ' k+ @! V4 L) D: N
此字节从低位到高位依次控制LED0-LED7,例如0x01表示手动点亮LED0或者LED0自动闪烁;0x28表示手动点 亮LED3、LED5或者LED3、LED5自动闪烁
. H0 c3 P+ B! W( w( G$ n. C' ?9 J6 r. D4 ^, |# O. q$ N1 W
字节5、6:表示闪烁时间(6高8位 5低8位) 取值范围0-5000
, D$ M3 `2 }. s! _
( ~% o$ w. a0 L0 r程序源码预览:
: Z( H* D# C5 H' w0 Y/ s- ~9 u- #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;
- }
- }
- }' E/ u N5 \& g4 `
& [: L/ p% c8 Y5 U
4 t, B) Q; x7 r' u9 B4 m0 b( i0 z1 {* E, C" e
|
|