[STC单片机] 求教:使用中断计时,流水灯的流速问题

[复制链接]
 楼主| aidez1209 发表于 2018-10-9 20:52 | 显示全部楼层 |阅读模式
本帖最后由 aidez1209 于 2018-10-9 21:56 编辑

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


  1. #include "REG52.H"  

  2. void T0_time();
  3. void SystemInitial(void) ;
  4. void Delay(unsigned long u32DelayTime) ;
  5. void PeripheralInitial(void) ;
  6. void LedTask(void);

  7. #define  BLINK_TIME_1   500  

  8. volatile unsigned char vGu8TimeFlag_1=0;  
  9. volatile unsigned int vGu16TimeCnt_1=0;   

  10. void main()
  11. {
  12. SystemInitial();            
  13. Delay(10000);               
  14. PeripheralInitial();        
  15.     while(1)  
  16. {  
  17. LedTask();   
  18.     }
  19. }

  20. void T0_time() interrupt 1     
  21. {
  22. if(1==vGu8TimeFlag_1&&vGu16TimeCnt_1>0) //软件定时器
  23. {
  24. vGu16TimeCnt_1--;  
  25. }

  26. TH0=0xfc;   
  27. TL0=0x66;   
  28. }


  29. void SystemInitial(void)
  30. {
  31. TMOD=0x01;  
  32. TH0=0xfc;   
  33. TL0=0x66;   
  34. EA=1;      
  35. ET0=1;      
  36. TR0=1;      
  37. }

  38. void Delay(unsigned long u32DelayTime)
  39. {
  40.     for(;u32DelayTime>0;u32DelayTime--);
  41. }

  42. void PeripheralInitial(void)
  43. {

  44. }

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

  50.       if(0==vGu16TimeCnt_1)     //时间到
  51.       {
  52. vGu8TimeFlag_1=0;  
  53. vGu16TimeCnt_1=BLINK_TIME_1;  //重装定时的时间
  54. vGu8TimeFlag_1=1;  

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






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

  5.       if(0==vGu16TimeCnt_1)     //时间到
  6.       {
  7. vGu8TimeFlag_1=0;  
  8. vGu16TimeCnt_1=BLINK_TIME_1;  //重装定时的时间
  9. vGu8TimeFlag_1=1;  

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




GroundWang 发表于 2020-10-5 19:08 | 显示全部楼层
现在学有所成了吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

5

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部