智能车制作

标题: 求高手写一个基于定时中断的单片机流水灯代码 [打印本页]

作者: 茅草屋    时间: 2010-7-13 19:27
标题: 求高手写一个基于定时中断的单片机流水灯代码
实现定时的流水灯。让开发板上的八个LED,每个灯亮一秒,直到最后一个,再从最后一个开始亮到第一个
作者: 茅草屋    时间: 2010-7-14 13:43
怎么一个回复的也没有?
作者: GhostStalker    时间: 2010-7-14 16:46
用PIT?
作者: shineamnys    时间: 2010-7-14 20:20
本帖最后由 shineamnys 于 2010-7-14 20:23 编辑

回复 1# 茅草屋


   
  1. #include <hidef.h> /* common defines and macros */
  2. #include <MC9S12XS128.h> /* derivative information */
  3. #pragma LINK_INFO DERIVATIVE "mc9s12xs128"



  4. //==================================================
  5. //定时中断函数
  6. //定时中断 0实现 500MS定时
  7. //==================================================
  8. #define PITTIME 5000//设定为 50MS定时
  9. unsigned int vTmpPIT=0;


  10. void pllclk(void)//24MHz,外部时钟为 16MHz
  11. {
  12. CLKSEL=0X00;
  13. PLLCTL=0xe1;
  14. SYNR=2;//PLLCLK=2*OSCCLK*(SYNR +1)/(REFDV +1)
  15. REFDV=1;
  16. PLLCTL=0X60;
  17. asm NOP;
  18. asm NOP;
  19. asm NOP;
  20. while((CRGFLG&0X08)==0);//时钟校正同步
  21. CLKSEL=0X80;
  22. }


  23. void initIOBoutput(void)//IO口初始化,B口为输出
  24. {
  25. DDRB=0XFF;
  26. PORTB=0XFF;
  27. }


  28. void initPIT(void)//定时中断初始化函数 50MS定时中断设置
  29. {
  30. PITCFLMT_PITE=0;//定时中断通道0关
  31. PITCE_PCE0=1;//定时器通道 0使能
  32. PITMTLD0=240-1;//8位定时器初值设定。240分频,在 24MHzBusClock下,为 0.1MHz。即 10us.
  33. PITLD0=PITTIME-1;//16位定时器初值设定。PITTIME*0.01MS
  34. PITINTE_PINTE0=1;//定时器中断通道 0中断使能
  35. PITCFLMT_PITE=1;//定时器通道0使能
  36. }


  37. void main(void)
  38. {
  39. pllclk();
  40. initIOBoutput();
  41. initPIT();
  42. EnableInterrupts;
  43. for(;;){}/*wait forever*/
  44. /*please make sure thatyou neverleave this function */
  45. }


  46. #pragma CODE_SEG __NEAR_SEG NON_BANKED
  47. void interrupt 66 PIT0(void)
  48. {
  49. vTmpPIT++;
  50. if(vTmpPIT==20)
  51. {
  52. PORTB=0B11111110;
  53. }
  54. else if(vTmpPIT==40)
  55. {
  56. PORTB=0B11111101;
  57. }
  58. else if(vTmpPIT==60) {
  59. PORTB=0B11111011;
  60. }
  61. else if(vTmpPIT==80) {
  62. PORTB=0B11110111;
  63. }
  64. else if(vTmpPIT==100) {
  65. PORTB=0B11101111;
  66. }
  67. else if(vTmpPIT==120) {
  68. PORTB=0B11011111;
  69. }
  70. else if(vTmpPIT==140) {
  71. PORTB=0B10111111;
  72. }
  73. else if(vTmpPIT==160) {
  74. PORTB=0B01111111;
  75. vTmpPIT=0;
  76. }

  77. PITTF_PTF0=1;//清中断标志位
  78. }
复制代码

今天恰好在研究PIT模块,结合别人的资料自己稍微修改了一下~
作者: 茅草屋    时间: 2010-7-17 14:23
恩恩 非常谢谢
作者: shineamnys    时间: 2010-7-17 16:18
回复 5# 茅草屋


    帮个小忙而已~
作者: lqpm999    时间: 2010-11-21 11:10
不错
作者: zhangjiarui    时间: 2010-11-29 10:12
在PIT里写了SWITCH 语句,因为有BREAK  貌似不可以
作者: hehai07    时间: 2010-12-23 21:24
看看
作者: LYL0707    时间: 2011-1-13 15:00
果真高手,如此标准,令人叹服!顶!
作者: suaibinhan    时间: 2011-2-1 22:46
顶了
作者: lhw1128    时间: 2011-2-14 18:09
谢谢啦
作者: CCGOGO    时间: 2011-4-1 20:34
哇塞  学习了
作者: pio    时间: 2011-4-7 14:58
谢谢分享
作者: dashier    时间: 2011-11-26 14:45
学习中
作者: awesss    时间: 2011-12-4 18:56
在中断中用移位指令更好,避免程序冗余!
作者: 栗子kary    时间: 2012-5-16 19:53

作者: 板正的    时间: 2014-4-16 20:47
shineamnys 发表于 2010-7-14 20:20
回复 1# 茅草屋







欢迎光临 智能车制作 (http://www.znczz.com/) Powered by Discuz! X3.2