找回密码
 立即注册

QQ登录

只需一步,快速开始

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

pic16F877A单片机,不知道怎样写倒计时,请大神指点学习方法

[复制链接]
跳转到指定楼层
楼主
ID:956815 发表于 2021-7-27 14:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如题
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:123289 发表于 2021-7-27 17:05 | 只看该作者
敢问一下,正计时会吗?
回复

使用道具 举报

板凳
ID:155507 发表于 2021-7-27 17:39 | 只看该作者
我给你来个程序试试




  1. #include <pic.h>           //调用PIC16F87XA单片机的头文件

  2. //根据选项,配置字应该如下所示:
  3. //__CONFIG(HS&WRTEN&WDTDIS&BOREN&PWRTDIS&UNPROTECT&DUNPROT&DEBUGDIS&LVPDIS);

  4. //实际使用中,这样太麻烦,对于默认选项,我们将其忽略掉:
  5. __CONFIG(HS&WDTDIS&LVPDIS);

  6. //---------------------------------------
  7. //数码管字形表,供显示时查询
  8. const unsigned char LED[10]=
  9. {                          //定义表格一定要使用const,这样会做到程序存储区中
  10.     0B00111111,            //"0"的字形表,0x3F
  11.     0B00000110,            //"1"的字形表,0x06
  12.     0B01011011,            //"2"的字形表,0x5B
  13.     0B01001111,            //"3"的字形表,0x4F
  14.     0B01100110,            //"4"的字形表,0x66
  15.     0B01101101,            //"5"的字形表,0x6D
  16.     0B01111101,            //"6"的字形表,0x7D
  17.     0B00000111,            //"7"的字形表,0x07
  18.     0B01111111,            //"8"的字形表,0x7F
  19.     0B01101111,            //"9"的字形表,0x6F
  20. };

  21. //---------------------------------------
  22. //4位数码管相关I/O设置
  23. #define U5A  RB0           //4位数码管单元的U5(74HC138)的A脚接在RB0口上
  24. #define U5B  RB1           //4位数码管单元的U5(74HC138)的B脚接在RB1口上
  25. #define U5C  RB2           //4位数码管单元的U5(74HC138)的C脚接在RB2口上
  26. //---------------------------------------


  27. void main(void)            //主函数,单片机开机后就是从这个函数开始运行
  28. {

  29.     unsigned char c=0;     //定义一个char型变量,做延时用
  30.     unsigned char d=0;     //定义一个char型变量,控制显示位置
  31.     unsigned char e=0;     //定义一个char型变量,做延时用
  32.     unsigned int  f=9999;     //定义一个int型变量,显示内容用,显示内容0-9999

  33.     TRISB=0B11111000;      //初始化RB7-RB0的输入输出方向
  34.     TRISD=0B00000000;      //初始化RD7-RD0的输入输出方向
  35.     PORTB=0B00000000;      //初始化RB7-RB0的数值
  36.     PORTD=0B00000000;      //初始化RD7-RD0的数值

  37.     while(1)               //死循环,单片机初始化后,将一直运行这个死循环
  38.     {

  39.         for(c=0;c<250;c++);//做一个0-250的循环,不执行其他操作,只为延时
  40.         if(++e>200)        //做一个延时,时间到将显示内容加1
  41.         {
  42.             e=0;           //清零,为下一次延时做准备
  43.             if(--f<=0) f=9999;//显示内容加1,因为只有4位显示,超过9999后归零
  44.         }
  45.         PORTD=0;           //关一次显示,以免显示出鬼影
  46.         if(++d>3) d=0;     //先将d加1,然后判断是否大于3,大于3归零
  47.         if(d==0)           //如果d=0,显示千位
  48.         {
  49.             U5A=0;         //U5A=0,U5B=0,U5C=0,选通数码管的千位进行显示
  50.             U5B=0;         //U5A=0,U5B=0,U5C=0,选通数码管的千位进行显示
  51.             U5C=0;         //U5A=0,U5B=0,U5C=0,选通数码管的千位进行显示
  52.             PORTD=LED[f/1000];       //将要显示的f的千位提取出来查表后送显示
  53.         }
  54.         else if(d==1)      //如果d=1,显示百位
  55.         {
  56.             U5A=1;         //U5A=1,U5B=0,U5C=0,选通数码管的百位进行显示
  57.             U5B=0;         //U5A=1,U5B=0,U5C=0,选通数码管的百位进行显示
  58.             U5C=0;         //U5A=1,U5B=0,U5C=0,选通数码管的百位进行显示
  59.             PORTD=LED[(f%1000)/100]; //将要显示的f的百位提取出来查表后送显示
  60.         }
  61.         else if(d==2)      //如果d=2,显示十位
  62.         {
  63.             U5A=0;         //U5A=0,U5B=1,U5C=0,选通数码管的十位进行显示
  64.             U5B=1;         //U5A=0,U5B=1,U5C=0,选通数码管的十位进行显示
  65.             U5C=0;         //U5A=0,U5B=1,U5C=0,选通数码管的十位进行显示
  66.             PORTD=LED[(f%100)/10];   //将要显示的f的十位提取出来查表后送显示
  67.         }
  68.         else if(d==3)      //如果d=3,显示个位
  69.         {
  70.             U5A=1;         //U5A=1,U5B=1,U5C=0,选通数码管的个位进行显示
  71.             U5B=1;         //U5A=1,U5B=1,U5C=0,选通数码管的个位进行显示
  72.             U5C=0;         //U5A=1,U5B=1,U5C=0,选通数码管的个位进行显示
  73.             PORTD=LED[f%10];         //将要显示的f的个位提取出来查表后送显示
  74.         }
  75.     }
  76. }
复制代码
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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