標(biāo)題: PIC16F684單片機(jī)定時(shí)中斷跑馬燈 有詳細(xì)代碼注釋 [打印本頁(yè)]

作者: xiaxikong    時(shí)間: 2018-3-7 13:55
標(biāo)題: PIC16F684單片機(jī)定時(shí)中斷跑馬燈 有詳細(xì)代碼注釋
初學(xué)PIC,寫(xiě)了一個(gè)定時(shí)跑馬燈程序,以供新手學(xué)習(xí)PIC提供子資料,文中給出了詳細(xì)代碼和注釋,對(duì)照手冊(cè),新手完全可以看懂,便于理解和后期開(kāi)發(fā),給予新手打開(kāi)PIC的大門(mén)鑰匙。

1、開(kāi)發(fā)環(huán)境:我選擇的是 MPLAB x IDE
2、芯片型號(hào):8位單片機(jī),PIC16F684
3、程序功能:

(1)RC3、RC4接兩個(gè)LED燈,低電平點(diǎn)亮
(2)時(shí)鐘選用內(nèi)部時(shí)鐘8MHZ
(3)定時(shí)時(shí)間為1ms進(jìn)一次中斷
(4)計(jì)時(shí)500ms,小燈500ms亮,500ms滅

  1. /*********************************************/
  2. /***
  3.         芯片型號(hào):PIC16F684
  4. 1、RC3、RC4接兩個(gè)LED燈,低電平點(diǎn)亮
  5. 2、時(shí)鐘選用內(nèi)部時(shí)鐘8MHZ
  6. 3、定時(shí)時(shí)間為1ms進(jìn)一次中斷
  7. 4、小燈500ms亮,500ms滅
  8. *************************/

  9. 4、程序代碼

  10. /*
  11. * File: main.c
  12. * Author: 夏夕空
  13. * Created on 2018年02月06日
  14. * Version: V1.0 beta0
  15. * 系統(tǒng)時(shí)鐘選用內(nèi)部8M晶振
  16. */
  17. #include <htc.h>
  18. // PIC16F684 Configuration Bit Settings
  19. // 'C' source line config statements
  20. __CONFIG(FOSC_INTOSCIO & WDTE_OFF & PWRTE_ON &MCLRE_OFF &
  21.         CP_OFF & CPD_OFF & BOREN_OFF & IESO_ON & FCMEN_ON);
  22. #define uchar unsigned char
  23. #define uint unsigned int
  24. #define ulong unsigned long
  25. #define  Time_base 1 //定時(shí)1ms
  26. #define FOSC 8000        //時(shí)鐘頻率8MHZ
  27. #define LED TRISC                // LEDI/O口

  28. void delay_ms(uint xms);        //非精確延時(shí),有誤差
  29. void Timer0_Init(void);         //定時(shí)器0初始化

  30. /***************************************
  31. * 名    稱:delay_ms()
  32. * 功    能:非精確延時(shí)
  33. * 輸入?yún)?shù):無(wú)
  34. * 返回參數(shù):無(wú)
  35. ***************************************/
  36. void delay_ms(uint xms)
  37. {
  38. uint x,y;
  39. for(x=xms; x>0;x--)
  40.      for(y=2000;y>0;y--);
  41. }
  42. /***************************************
  43. * 名    稱:Timer0_Init()
  44. * 功    能:初始化定時(shí)器0
  45. * 輸入?yún)?shù):無(wú)
  46. * 返回參數(shù):無(wú)
  47. ***************************************/
  48. volatile uchar temp =0;             //temp為初始值緩存
  49. void Timer0_Init(void)
  50. {
  51.     T0CS = 0;       //選擇定時(shí)器模式,T0CS =1為計(jì)數(shù)器模式,T0CS =0為定時(shí)器模式
  52.     T0SE = 0;       //定時(shí)器上升沿遞增,T0SE =0為上升沿遞增,T0SE =1為下降沿遞增
  53.     PSA = 0;        //預(yù)分頻器分給定時(shí)器
  54. /***三種方式都可以****/
  55.     OPTION_REG &= 0xF8;  //1B 1111 1000     32分頻
  56.     OPTION_REG |= 0x04;  //1B 0000 0100
  57.     /*
  58.     PS2 = 1;        //1B 0000 0100     32分頻
  59.     PS1 = 0;
  60.     PS0 = 0;
  61.     */
  62. //  OPTION_REG = 0x04; //1B 0000 0100     32分頻
  63.     T0IF = 0;       //定時(shí)器0溢出標(biāo)志位
  64.     GIE = 1;        //總中斷允許位,GIE =1為允許所有未屏蔽中斷,GIE =0禁止中斷
  65.     T0IE = 1;       //定時(shí)器0溢出中斷允許,T0IE =1,允許溢出時(shí)中斷,T0IE =0不允許中斷
  66.     temp = 256-((Time_base*FOSC)/4/32);  //定時(shí)1ms
  67.     TMR0 = temp;      //重載初始值
  68. }
  69. /*全局靜態(tài)變量count*/
  70. static uint count = 0;
  71. /***************************************
  72. * 名    稱:main()
  73. * 功    能:根據(jù)協(xié)議處理數(shù)據(jù)
  74. * 輸入?yún)?shù):無(wú)
  75. * 返回參數(shù):無(wú)
  76. ***************************************/
  77. void main(void)
  78. {
  79.     delay_ms(5);        //等待時(shí)鐘穩(wěn)定
  80.     PORTC &=0xE7;       //RC3,RC4選擇為輸出模式
  81.     Timer0_Init();      //定時(shí)器0初始化
  82.     LED &= 0xF7; //1B1111 0111選擇小燈初始狀態(tài) RC3亮
  83.     LED |=0x10;  //1B0001 0000                 RC4滅
  84.     while(1)
  85.     {
  86.         if(count == 500)       //500ms時(shí)間到
  87.         {
  88.             count = 0;         //清零計(jì)數(shù)
  89.             LED = ~LED;         //小燈翻轉(zhuǎn)
  90.         }
  91.         else            //時(shí)間沒(méi)到,空等待
  92.         {
  93.         }
  94.     }
  95. }
  96. /***************************************
  97. * 名    稱:Timer0_Isr()
  98. * 功    能:產(chǎn)生1ms時(shí)基
  99. * 輸入?yún)?shù):無(wú)
  100. * 返回參數(shù):無(wú)
  101. ***************************************/
  102. void interrupt Timer0_Isr(void)
  103. {
  104.     if(T0IF == 1)          //如果溢出中斷
  105.     {     
  106.         T0IF = 0;         //標(biāo)志位清0
  107.         temp = 256-((Time_base*FOSC)/4/32);
  108.         TMR0 = temp;      //重載初始值
  109.         count++;          //計(jì)數(shù)++
  110.     }
  111. }
復(fù)制代碼



作者: caixionglue    時(shí)間: 2019-2-27 20:54
連TRISC和PORT都沒(méi)分清楚,呵呵




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1