#include <reg51.h>
#include <intrins.h>
// 端口口线定义
sbit P20 = P2^0;
sfr16 Timer1 = 0x8A;
#define FOSC 12000000l
#define INSCYCLE (FOSC/12)
// 理论值,在测试软件上可能会不适用
//#define T_50ms (65536-50000)
// 实测值
#define T_50ms 65000 // 实际值
#define T_1S 20
// LED宏定义
#define isLEDON() ~P20
#define LEDON() P20=0
#define LEDOFF() P20=1
#define LEDSHINE() P20=~P20
unsigned char t_1s = T_1S;
// 系统运行时间
unsigned long sysruntime = 0;
// LED1控制
unsigned char t_led_pw = 0; // led脉宽
char t_led_st = 0; // led闪烁次数
// >0 为闪烁次数
// <0 为一直闪烁
// =0 为关闭
unsigned char t_led_onpw = 0; // led亮灯脉宽
unsigned char t_led_offpw = 0; // led灭灯脉宽
// 功能:LED闪烁方案设置
// 参数:n: unsigned char类型,LED灯闪烁的次数
// n>0: 闪烁次数
// n<0: 一直闪烁
// t0: unsigned char类型,LED灭的时间
// t1: unsgined char类型,LED亮的时间
// 返回:无
// 备注:时间分辨率为50ms
void setLedShinePlane(unsigned char n, unsigned char t0, unsigned char t1)
{
unsigned i = 65000;
LEDOFF();
t_led_st = n;
t_led_offpw = t0;
t_led_onpw = t1;
while(i--) _nop_();
}
// 功能:延时
// 参数:d: unsigned类型,延时长度
// 返回:无
// 备注:
void delay(unsigned d)
{
unsigned char i;
while(d--)
{
for(i=0;i<200;i++);
}
}
main(void)
{
bit isChangeToBusy = 0; // 系统变为忙
bit isChangeToIdle = 1; // 系统变为闲
TMOD = 0x10;
Timer1 = T_50ms;
ET1 = 1;
EA = 1;
TR1 = 1;
setLedShinePlane(3,6,1); // 启动闪烁3次
delay(5000); // 延时器将系统启动与运行用一段大概的时间分隔
// 系统运行中...
while(1)
{
if(_testbit_(isChangeToBusy))
{ // 系统变为忙时修改闪灯方案
setLedShinePlane(-1,3,1);
}
if(_testbit_(isChangeToIdle))
{ // 系统变为闲时修改闪灯方案
setLedShinePlane(-1,100,1);
}
}
}
void T1_TimerBase(void) interrupt 3 using 0
{
Timer1 = T_50ms;
if(t_1s) // 这里实现系统按秒计时任务
{
t_1s--;
if(!t_1s)
{ // 1s到时
t_1s = T_1S;
sysruntime++;
}
}
if(t_led_st) // 这里实现闪灯的各种方案任务
{
if(t_led_pw)
{
t_led_pw--;
}
else
{
LEDSHINE();
if(isLEDON())
{
t_led_pw = t_led_onpw;
}
else
{
t_led_pw = t_led_offpw;
if(t_led_st>0) t_led_st--;
}
}
}
}
|