打印

求教3.13状态指示灯

[复制链接]
902|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
armxu|  楼主 | 2015-1-20 13:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
keer_zu| | 2015-1-20 16:50 | 只看该作者
给的信息不全吧,有点断章取义了

使用特权

评论回复
板凳
armxu|  楼主 | 2015-1-20 21:30 | 只看该作者
#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--;
                        }
                }
        }
}

使用特权

评论回复
地板
armxu|  楼主 | 2015-1-20 21:34 | 只看该作者
谢谢百忙之中指点,有点理解了!t_led_pw应该在赋值之后才有具体意义。

使用特权

评论回复
5
armxu|  楼主 | 2015-1-20 22:12 | 只看该作者
// 功能: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_();
}
请问 unsigned i=65000;有什么作用?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

25

主题

105

帖子

1

粉丝