经常会有这样的产品,它的运行受控于上位机,以下称其为设备。设备通过串口或是USB与上位机相连,通信指令格式为:
head
|
addr
|
length
|
cmd
|
data
|
check
|
0x02
|
0x00
|
n+1Byte
|
1Byte
|
nByte
|
1Byte
|
假设head固定为0x02,addr为0x00, length=cmd长度+data的长度。设备上有两个LED灯,一个是LED_RED,另一个是LED_GREEN,现在有这样的要求,用三个参数来实现对两个LED的控制,分别是:
data[0]:Select LED//选择LED
0x01 - Red LED.//data[0]为0x01时,代表指令是控制红色LED
0x02 - Green LED。//data[0]为0x02时,代表指令是控制绿色LED
0x03 - Both Red & Green LED//data[0]为0x03时,代表指令是控制绿色LED和红色LED
data[1]: Units of on time.Each unit is 100ms.//data[1]代表开启的时间
data[2]:Number of cycles to turn on/off the LED.The cycle time si one second.0xff will toggle the LED continually//data[2]代表开启LED的次数,开启周期是1秒,如果为0xff,则代表让选定的LED一直亮灭亮灭的闪烁。
下面来讲一下实现方法:
定义一个结构体
typedef struct
{
u8 Count; //如果Count等于0xff,表示要一直闪烁
u8 TimeON;//单位是100ms
u8 TimeOFF;//单位是100ms
}LED_STATUS;
为两个LED各定义一个结构变量用来标记每个LED的运行状态。
LED_STATUS LedRed;
LED_STATUS LedGreen;
开一个10ms的定时器,在定时器里放入对这个两个结构状态判断的函数,通过LED的状态来对其进行控制。下面直接看代码,这样更直观:
此程序适用于所有单片机,只需要更改一下开关LED的那几个语句。
-
#ifndef __LED_H
-
#define __LED_H
-
-
//#include "MPC89x5x.H"
-
#include <reg52.H>
-
#include "TypeRedefine.h"
-
-
#define LED_RED 0x01 //工作LEN,LED 1
-
#define LED_GREEN 0x02 //电源LED, LED 2
-
-
sbit LED_RED_CTR = P1^6;
-
sbit LED_GREEN_CTR = P1^5;
-
-
#define LED_ALL (LED_RED|LED_GREEN)
-
#define CONTINUE 0xFF //continue
-
-
-
typedef struct
-
{
-
u8 Count; //如果Count等于0xff,表示要一直闪烁
-
u8 TimeON;//单位是100ms
-
u8 TimeOFF;//单位是100ms
-
}LED_STATUS;
-
-
extern LED_STATUS LedRed;
-
extern LED_STATUS LedGreen;
-
-
typedef struct
-
{
-
u8 select;
-
u8 time;
-
u8 count;
-
} LEDCMD;
-
-
void LED_int(void);
-
void LED_ON(u8 led);
-
void LED_OFF(u8 led);
-
-
extern u16 IdleCount;
-
extern u8 LED_Control(u8 *LED_Cmd,u8 CmdType);//接收指令的函数
-
extern void LEDControl(void);//放在10ms定时中断中队LED进行的函数
-
-
#endif
-
//22.1184MHz delay 10ms
-
void init_trmer0()
-
{
-
/////////10ms
-
AUXR &= 0x7F; //定时器时钟12T模式
-
TMOD &= 0xF0; //设置定时器模式
-
TMOD |= 0x01; //设置定时器模式
-
TL0 = 0x00; //设置定时初值
-
TH0 = 0xB8; //设置定时初值
-
TF0 = 0; //清除TF0标志
-
TR0 = 1; //定时器0开始计时
-
ET0 = 1; // enable Timer0 interrupt
-
EA = 1;
-
-
}
-
-
//// 10ms
-
void Timer0(void) interrupt 1 //using 1
-
{
-
TF0 = 0; //清除TF0标志
-
TL0 = 0x00; //设置定时初值
-
TH0 = 0xB8; //设置定时初值
-
-
LEDControl();
-
}
阅读(850) | 评论(0) | 转发(0) |