找回密码
 立即注册

QQ登录

只需一步,快速开始

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

用单片机定时器中断来做数码管扫描

[复制链接]
跳转到指定楼层
楼主
ID:404210 发表于 2018-10-28 16:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
5黑币
  1. 频率计,利用delay函数进行数码管扫描,但老师要求我用定时器(T2)中断来做数码管扫描,该怎么写呢?求大神指点。
复制代码

  1. #include <reg52.h>
  2. #include<stdio.h>
  3. #include<ctype.h>
  4. #define uint unsigned int
  5. unsigned char num=0;
  6. sbit k1=P3^7;
  7. sbit k3=P3^6;
  8. code unsigned char TAB[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
  9. unsigned long x;        
  10. char str[19];
  11. int i=0;        
  12. unsigned char timecount;
  13. unsigned int T0count;
  14. void inial();
  15. void anjian();
  16. void printf_1();
  17. void delay();
  18. int printf_time;
  19. void inial()
  20. {
  21.         TMOD |= 0x05;//计数器T0
  22.         TH0 = 0;
  23.         TL0 = 0;
  24.         EA = 1;
  25.         ET0 = 1;
  26.         TR0 = 1;
  27.                
  28.         RCAP2H=0x0B;//定时器T2
  29.   RCAP2L=0xDC;
  30.         
  31.         ET2=1;
  32.         TR2=1;
  33.         
  34.         TMOD|=0x20;//串口配置
  35.         TH1=0xf3;
  36.         TL1=0xf3;
  37.         TR1=1;
  38.         PCON|=0x80;
  39.         SCON=0X50;
  40.         ES=1;
  41. }
  42. void delay( )
  43. {
  44.         int y=300;
  45.         while(y--);
  46. }


  47. void display()
  48.         {   
  49.         unsigned char ge,shi,bai,qian,wan,shiwan;//定义各个位
  50.   shiwan=x/100000;//十万
  51.         wan=x%100000/10000;//万位
  52.         qian=x%10000/1000;//千位
  53.         bai=x%1000/100;//百位
  54.         shi=x%100/10;//十位
  55.         ge=x%10;//个位
  56.                
  57.         
复制代码


  1. for(i=0;i<6;i++) //显示
  2. {
  3.         switch(i)
  4.         {
  5.                 case 0:P2=0xFE,P0=TAB[ge];break;
  6.                 case 1:P2=0xFd,P0=TAB[shi];break;
  7.                 case 2:P2=0xFb,P0=TAB[bai];break;
  8.                 case 3:P2=0xF7,P0=TAB[qian];break;
  9.                 case 4:P2=0xeF,P0=TAB[wan];break;
  10.                 case 5:P2=0xdf,P0=TAB[shiwan];break;
  11.                
  12.         }
  13.         delay();
  14.         P0=0x00;
  15. }

  16. }
  17.         
  18. void anjian()
  19. {
  20.      if(k1==0)
  21.          {
  22.            delay();
  23.            if(k1==0)
  24.            {
  25.             display();
  26.                                                 
  27.            }
  28.          }
  29. }

  30. void main()
  31. {   
  32.          inial();
  33.         
  34.     while(1)
  35.   {
  36.                
  37.                 anjian();
  38.                 printf_1();
  39.                
  40.                         }        
  41.         

  42.         }

  43. void t0(void) interrupt 1
  44. {

  45.           T0count++;
  46. }
  47. void t2(void)interrupt 5
  48. {
  49.         TF2=0;
  50.         timecount++;
  51.         
  52.         printf_time++;
  53.          if(timecount>=16)//定时1S
  54.          {
  55.                 x=T0count*65536+TH0*256+TL0;
  56.                
  57.           timecount=0;         
  58.                 T0count=0;
  59.     TH0 = 0;
  60.           TL0 = 0;
  61.                 TR0 = 1;
  62.           }               
  63.                   
  64. }
  65. void ser() interrupt 4
  66. {
  67.     RI=0;
  68.         
  69. }

  70. void printf_1()//串口输出
  71. {
  72.         if(printf_time>=48)
  73.         {
  74.          sprintf(str,"%06fHz\n",x);               

  75.    for(i=0;i<9;i++)
  76.          {         
  77.                 SBUF=str[i];
  78.                  while(!TI);
  79.                  TI=0;               
  80.          }         
  81.          printf_time=0;
  82. }
  83. }
复制代码




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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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