找回密码
 立即注册

QQ登录

只需一步,快速开始

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

大佬,能帮我看看单片机闪烁函数为什么有问题吗,Mode3是闪烁函数

[复制链接]
跳转到指定楼层
楼主
ID:1102558 发表于 2023-12-4 19:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. #include <reg52.h>
  2. #include "Delay.h"
  3. sbit K1=P3^0;
  4. #define uint unsigned int
  5. #define uchar unsigned char
  6. bit Timer_1s,Timer_500ms;
  7. // 数码管段选信号
  8. uchar code duan[] = {
  9.     0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,        
  10.         //0   1     2    3                4                5                        6                7                        8                9                A
  11.         0x7c,0x39,0x5e,0x79,0x71,
  12.         //B                C                        D                E                        F
  13.         0x76,0x73,0x6e,0x38,0x3e, 0x31,0x50,0X37,0x01,0x40,0x08,0X00,
  14.         //H16 P17  Y18        L19  V20   T21         R22  N23 上—  中-        下-
  15. };
  16. uchar T0_Cnt=0;        
  17. // 数码管位选信号
  18. uchar code wei[] = {
  19.     0x1c,0x18,0x14,0x10,0x0c,0x08,0x04,0x00
  20. };
  21. uchar code SMGCONTENT[]={10,2,2,1,3,27,4,7,27,        //A2213 47
  22.                                                                                 16,10,17,17,18,24,25,26, 27,  //HAPPY_--
  23.                                                                                 18,14,23,11,6,6,6,27,                 //YENB666        
  24.                                                                                 18,14,23,11,6,6,6,27,                 //YENB666
  25.                                                                                 18,14,23,11,6,6,6,27        };        //YENB666
  26. uchar LEDBUFF[8];
  27. uchar LEDFLASHBUFF[8];
  28. uchar j,leftnum,Mode,i,flash,KeyVal=0;
  29. uint t;
  30. void Timer0Init( void )
  31. {
  32.         TMOD = 0x01;
  33.         TH0 = (65536-5000)/256;
  34.         TL0 = (65536-5000)%256;
  35.         ET0 = 1;
  36.         EA  = 1;
  37.         TR0 = 1;
  38. }
  39. void Timer1Init( void )
  40. {
  41.         TMOD = 0x01;
  42.         TH1 = (65536-5000)/256;
  43.         TL1 = (65536-5000)%256;
  44.         ET1 = 1;
  45.         EA  = 1;
  46.         TR1 = 1;
  47. }
  48. void display();
  49. void main()

  50. {
  51.         Timer0Init();
  52.         Timer1Init();
  53.     while (1)
  54.         {
  55.                 display();
  56.         }
  57.       
  58. }
  59. void display()
  60. {
  61.         
  62.         
  63.         if(Mode==0)
  64.         {
  65.                 for(j=0;j<8;j++)
  66.             {LEDBUFF[j]=SMGCONTENT[j];
  67.                 }
  68.         }

  69.         if(Mode==1)
  70.         {
  71.                 for(j=0;j<8;j++)
  72.             {LEDBUFF[j]=SMGCONTENT[j+9];}
  73.         }
  74.         
  75.         if(Mode==2)
  76.         {
  77.                 for(j=0;j<8;j++)
  78.             {LEDBUFF[j]=SMGCONTENT[j+18];}
  79.         }
  80.         
  81.         if(Mode==3)  //左移
  82.         {
  83.                 leftnum=0;
  84.                 do
  85.                 {
  86.                         for(j=0;j<8;j++)
  87.                         {
  88.                                 LEDBUFF[j]=SMGCONTENT[j+leftnum];
  89.                         }
  90.                     Delay(1000);
  91.                         
  92.                 }
  93.                 while(leftnum++<36);
  94.                 leftnum=0;
  95.                 Mode=0;
  96.         }
  97.         
  98.    
  99. }
  100. void Timer0_ISR(void) interrupt 1
  101. {
  102.         
  103.         TH0=(65536-5000)/256;
  104.         TL0=(65536-5000)%256;        
  105.         if(T0_Cnt==200) {T0_Cnt=0;Timer_1s=1;Mode++; }
  106.         T0_Cnt++;
  107.         P0=0x00;
  108.     P2=wei[i];
  109.         if(KeyVal!=0&&flash)
  110.                 P0=duan[LEDFLASHBUFF[i]];
  111.         else
  112.             P0=duan[LEDBUFF[i]];                                                               
  113.         i++;
  114.         if(i==8)  i=0;
  115.         
  116. }
  117. void Timer1_ISR(void) interrupt 3
  118. {
  119.         TH1=(65536-10000)/256;
  120.         TL1=(65536-10000)%256;
  121.         t++;
  122.         if(t==50)
  123.         { t=0;Timer_500ms=1;flash=~flash;}
  124.         if(K1==0)
  125.         {
  126.                 Delay(10);
  127.                 if(K1==0)
  128.                 {KeyVal++;
  129.                 while(K1==0);}
  130.         }
  131.     switch(KeyVal)
  132.         {
  133.                 case 1 :LEDFLASHBUFF[0]=27;LEDFLASHBUFF[1]=27;
  134.                         LEDFLASHBUFF[2]=LEDBUFF[2];LEDFLASHBUFF[3]=LEDBUFF[3];
  135.                         LEDFLASHBUFF[4]=LEDBUFF[4];LEDFLASHBUFF[5]=LEDBUFF[5];
  136.                         LEDFLASHBUFF[6]=LEDBUFF[6];LEDFLASHBUFF[7]=LEDBUFF[7];
  137.                 break;
  138.                 case 2 :LEDFLASHBUFF[0]=LEDBUFF[0];LEDFLASHBUFF[1]=LEDBUFF[1];
  139.                         LEDFLASHBUFF[2]=27;LEDFLASHBUFF[2]=27;
  140.                         LEDFLASHBUFF[4]=LEDBUFF[4];LEDFLASHBUFF[5]=LEDBUFF[5];
  141.                         LEDFLASHBUFF[6]=LEDBUFF[6];LEDFLASHBUFF[7]=LEDBUFF[7];
  142.                 break;
  143.                 case 3 :LEDFLASHBUFF[0]=LEDBUFF[0];LEDFLASHBUFF[1]=LEDBUFF[1];
  144.                         LEDFLASHBUFF[2]=LEDBUFF[2];LEDFLASHBUFF[3]=LEDBUFF[3];
  145.                         LEDFLASHBUFF[4]=27;LEDFLASHBUFF[5]=27;
  146.                         LEDFLASHBUFF[6]=LEDBUFF[6];LEDFLASHBUFF[7]=LEDBUFF[7];
  147.                 break;
  148.                 case 4 :LEDFLASHBUFF[0]=LEDBUFF[0];LEDFLASHBUFF[1]=LEDBUFF[1];
  149.                         LEDFLASHBUFF[2]=LEDBUFF[2];LEDFLASHBUFF[3]=LEDBUFF[3];
  150.                         LEDFLASHBUFF[4]=LEDBUFF[4];LEDFLASHBUFF[5]=LEDBUFF[5];
  151.                         LEDFLASHBUFF[6]=27;LEDFLASHBUFF[7]=27;
  152.                 break;
  153.                 default : LEDFLASHBUFF[0]=LEDBUFF[0];LEDFLASHBUFF[1]=LEDBUFF[1];
  154.                             LEDFLASHBUFF[2]=LEDBUFF[2];LEDFLASHBUFF[3]=LEDBUFF[3];
  155.                         LEDFLASHBUFF[4]=LEDBUFF[4];LEDFLASHBUFF[5]=LEDBUFF[5];
  156.                         LEDFLASHBUFF[6]=LEDBUFF[6];LEDFLASHBUFF[7]=LEDBUFF[7];
  157.                 break;
  158.         }
  159.                
  160.         
  161. }
复制代码
A2213_47_叶小宇_实验4.zip (89.34 KB, 下载次数: 4)
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1008290 发表于 2023-12-4 23:54 | 只看该作者
t=0;Timer_500ms=1;flash=~flash;这句话是什么作用
回复

使用道具 举报

板凳
ID:1012735 发表于 2023-12-5 00:02 | 只看该作者
粗看了下,似乎28行的Mode没有初始化,起始值也许不会在0~3,keyVal++可以大于4,没有区间限制了

从126行        if(K1==0) 开始往后的代码是可以放在主函数的while()里,中断函数里的代码越多越会影响定时器时间精度。
回复

使用道具 举报

地板
ID:275826 发表于 2023-12-5 08:40 | 只看该作者
中断函数里还有延时函数
回复

使用道具 举报

5#
ID:1102558 发表于 2023-12-5 18:42 | 只看该作者
hy47566398 发表于 2023-12-5 00:02
粗看了下,似乎28行的Mode没有初始化,起始值也许不会在0~3,keyVal++可以大于4,没有区间限制了

从126 ...

感谢大佬解答
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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