找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4912|回复: 1
打印 上一主题 下一主题
收起左侧

PIC16F684单片机定时中断跑马灯 有详细代码注释

[复制链接]
跳转到指定楼层
楼主
ID:204276 发表于 2018-3-7 13:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
初学PIC,写了一个定时跑马灯程序,以供新手学习PIC提供子资料,文中给出了详细代码和注释,对照手册,新手完全可以看懂,便于理解和后期开发,给予新手打开PIC的大门钥匙。

1、开发环境:我选择的是 MPLAB x IDE
2、芯片型号:8位单片机,PIC16F684
3、程序功能:

(1)RC3、RC4接两个LED灯,低电平点亮
(2)时钟选用内部时钟8MHZ
(3)定时时间为1ms进一次中断
(4)计时500ms,小灯500ms亮,500ms灭

  1. /*********************************************/
  2. /***
  3.         芯片型号:PIC16F684
  4. 1、RC3、RC4接两个LED灯,低电平点亮
  5. 2、时钟选用内部时钟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. * 系统时钟选用内部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. * 输入参数:无
  34. * 返回参数:无
  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. * 输入参数:无
  46. * 返回参数:无
  47. ***************************************/
  48. volatile uchar temp =0;             //temp为初始值缓存
  49. void Timer0_Init(void)
  50. {
  51.     T0CS = 0;       //选择定时器模式,T0CS =1为计数器模式,T0CS =0为定时器模式
  52.     T0SE = 0;       //定时器上升沿递增,T0SE =0为上升沿递增,T0SE =1为下降沿递增
  53.     PSA = 0;        //预分频器分给定时器
  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溢出标志位
  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. /*全局静态变量count*/
  70. static uint count = 0;
  71. /***************************************
  72. * 名    称:main()
  73. * 功    能:根据协议处理数据
  74. * 输入参数:无
  75. * 返回参数:无
  76. ***************************************/
  77. void main(void)
  78. {
  79.     delay_ms(5);        //等待时钟稳定
  80.     PORTC &=0xE7;       //RC3,RC4选择为输出模式
  81.     Timer0_Init();      //定时器0初始化
  82.     LED &= 0xF7; //1B1111 0111选择小灯初始状态 RC3亮
  83.     LED |=0x10;  //1B0001 0000                 RC4灭
  84.     while(1)
  85.     {
  86.         if(count == 500)       //500ms时间到
  87.         {
  88.             count = 0;         //清零计数
  89.             LED = ~LED;         //小灯翻转
  90.         }
  91.         else            //时间没到,空等待
  92.         {
  93.         }
  94.     }
  95. }
  96. /***************************************
  97. * 名    称:Timer0_Isr()
  98. * 功    能:产生1ms时基
  99. * 输入参数:无
  100. * 返回参数:无
  101. ***************************************/
  102. void interrupt Timer0_Isr(void)
  103. {
  104.     if(T0IF == 1)          //如果溢出中断
  105.     {     
  106.         T0IF = 0;         //标志位清0
  107.         temp = 256-((Time_base*FOSC)/4/32);
  108.         TMR0 = temp;      //重载初始值
  109.         count++;          //计数++
  110.     }
  111. }
复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:69381 发表于 2019-2-27 20:54 | 只看该作者
连TRISC和PORT都没分清楚,呵呵
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表