找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5693|回復(fù): 1
收起左側(cè)

PIC16F684單片機定時中斷跑馬燈 有詳細(xì)代碼注釋

[復(fù)制鏈接]
ID:204276 發(fā)表于 2018-3-7 13:55 | 顯示全部樓層 |閱讀模式
初學(xué)PIC,寫了一個定時跑馬燈程序,以供新手學(xué)習(xí)PIC提供子資料,文中給出了詳細(xì)代碼和注釋,對照手冊,新手完全可以看懂,便于理解和后期開發(fā),給予新手打開PIC的大門鑰匙。

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

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

  1. /*********************************************/
  2. /***
  3.         芯片型號:PIC16F684
  4. 1、RC3、RC4接兩個LED燈,低電平點亮
  5. 2、時鐘選用內(nèi)部時鐘8MHZ
  6. 3、定時時間為1ms進一次中斷
  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)時鐘選用內(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 //定時1ms
  26. #define FOSC 8000        //時鐘頻率8MHZ
  27. #define LED TRISC                // LEDI/O口

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

  30. /***************************************
  31. * 名    稱:delay_ms()
  32. * 功    能:非精確延時
  33. * 輸入?yún)?shù):無
  34. * 返回參數(shù):無
  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. * 功    能:初始化定時器0
  45. * 輸入?yún)?shù):無
  46. * 返回參數(shù):無
  47. ***************************************/
  48. volatile uchar temp =0;             //temp為初始值緩存
  49. void Timer0_Init(void)
  50. {
  51.     T0CS = 0;       //選擇定時器模式,T0CS =1為計數(shù)器模式,T0CS =0為定時器模式
  52.     T0SE = 0;       //定時器上升沿遞增,T0SE =0為上升沿遞增,T0SE =1為下降沿遞增
  53.     PSA = 0;        //預(yù)分頻器分給定時器
  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;       //定時器0溢出標(biāo)志位
  64.     GIE = 1;        //總中斷允許位,GIE =1為允許所有未屏蔽中斷,GIE =0禁止中斷
  65.     T0IE = 1;       //定時器0溢出中斷允許,T0IE =1,允許溢出時中斷,T0IE =0不允許中斷
  66.     temp = 256-((Time_base*FOSC)/4/32);  //定時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ù):無
  75. * 返回參數(shù):無
  76. ***************************************/
  77. void main(void)
  78. {
  79.     delay_ms(5);        //等待時鐘穩(wěn)定
  80.     PORTC &=0xE7;       //RC3,RC4選擇為輸出模式
  81.     Timer0_Init();      //定時器0初始化
  82.     LED &= 0xF7; //1B1111 0111選擇小燈初始狀態(tài) RC3亮
  83.     LED |=0x10;  //1B0001 0000                 RC4滅
  84.     while(1)
  85.     {
  86.         if(count == 500)       //500ms時間到
  87.         {
  88.             count = 0;         //清零計數(shù)
  89.             LED = ~LED;         //小燈翻轉(zhuǎn)
  90.         }
  91.         else            //時間沒到,空等待
  92.         {
  93.         }
  94.     }
  95. }
  96. /***************************************
  97. * 名    稱:Timer0_Isr()
  98. * 功    能:產(chǎn)生1ms時基
  99. * 輸入?yún)?shù):無
  100. * 返回參數(shù):無
  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++;          //計數(shù)++
  110.     }
  111. }
復(fù)制代碼


回復(fù)

使用道具 舉報

ID:69381 發(fā)表于 2019-2-27 20:54 | 顯示全部樓層
連TRISC和PORT都沒分清楚,呵呵
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表