打印
[STC单片机]

求教:使用中断计时,流水灯的流速问题

[复制链接]
1169|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
aidez1209|  楼主 | 2018-10-9 20:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 aidez1209 于 2018-10-9 21:56 编辑

今天在学习大神的教程(从单片机基础到程序框架):https://bbs.21ic.com/forum.php?mo ... &page=16#pid8700664第89节时,用第二种境界的延时方法获取流水灯效果,实际试验时发现,流水灯流速不均匀。并尝试将左移改为右移,
流水灯效果:两次流速较慢,一次流速较快。使用的STC90C516RD+单片机
附上修改后的源码:


#include "REG52.H"  

void T0_time();
void SystemInitial(void) ;
void Delay(unsigned long u32DelayTime) ;
void PeripheralInitial(void) ;
void LedTask(void);

#define  BLINK_TIME_1   500  

volatile unsigned char vGu8TimeFlag_1=0;  
volatile unsigned int vGu16TimeCnt_1=0;   

void main()
{
SystemInitial();            
Delay(10000);               
PeripheralInitial();        
    while(1)  
{  
LedTask();   
    }
}

void T0_time() interrupt 1     
{
if(1==vGu8TimeFlag_1&&vGu16TimeCnt_1>0) //软件定时器
{
vGu16TimeCnt_1--;  
}

TH0=0xfc;   
TL0=0x66;   
}


void SystemInitial(void)
{
TMOD=0x01;  
TH0=0xfc;   
TL0=0x66;   
EA=1;      
ET0=1;      
TR0=1;      
}

void Delay(unsigned long u32DelayTime)
{
    for(;u32DelayTime>0;u32DelayTime--);
}

void PeripheralInitial(void)
{

}

//跑马灯的任务程序   
void LedTask(void)
{
static unsigned char Su8Data=0x80; //加static修饰的局部变量,每次进来都会保留上一次值。
static unsigned char Su8Cnt=0;     //加static修饰的局部变量,每次进来都会保留上一次值。

      if(0==vGu16TimeCnt_1)     //时间到
      {
vGu8TimeFlag_1=0;  
vGu16TimeCnt_1=BLINK_TIME_1;  //重装定时的时间
vGu8TimeFlag_1=1;  

P0=Su8Data;   //Su8Data的8个位代表8个LED的状态,0为点亮,1为熄灭。
Su8Data=Su8Data>>1;  //右移一位
Su8Cnt++; //计数器累加1
if(Su8Cnt>=8) //移位大于等于8次后,重新赋初值
{
Su8Cnt=0;  
Su8Data=0x80;  //重新赋初值,继续下一次循环移动
}   
}
}






相关帖子

沙发
aidez1209|  楼主 | 2018-10-9 21:01 | 只看该作者
将跑马灯任务程序的代码又更改了一下,流速均匀了,但这是怎么个原因还是不知道:
void LedTask(void) 
{
static unsigned char Su8Data=0x80; //加static修饰的局部变量,每次进来都会保留上一次值。
static unsigned char Su8Cnt=0;     //加static修饰的局部变量,每次进来都会保留上一次值。

      if(0==vGu16TimeCnt_1)     //时间到
      {
vGu8TimeFlag_1=0;  
vGu16TimeCnt_1=BLINK_TIME_1;  //重装定时的时间
vGu8TimeFlag_1=1;  

P0=Su8Data;   //Su8Data的8个位代表8个LED的状态,0为点亮,1为熄灭。
Su8Data=0x80>>Su8Cnt;  //右移一位
Su8Cnt++; //计数器累加1
if(Su8Cnt>=8) //移位大于等于8次后,重新赋初值
{
Su8Cnt=0;  
//Su8Data=0x80;  //重新赋初值,继续下一次循环移动
}   
}
}




使用特权

评论回复
板凳
GroundWang| | 2020-10-5 19:08 | 只看该作者
现在学有所成了吗?

使用特权

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

本版积分规则

1

主题

5

帖子

1

粉丝