找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2266|回复: 8
收起左侧

这个单片机程序为什么按下key2按键,小灯不进行呼吸?

[复制链接]
ID:483535 发表于 2019-3-7 22:50 | 显示全部楼层 |阅读模式
5黑币
  1. #include<REG52.h>
  2. #define uchar unsigned char
  3. unsigned char PWM_COUNT;
  4. unsigned int HUXI_COUNT;
  5. unsigned char PWM_VLAUE;
  6. bit direc_flag;
  7. sbit led1=P0^0;
  8. sbit led2=P0^1;
  9. sbit led3=P0^2;
  10. sbit led4=P0^3;
  11. sbit led5=P0^4;
  12. sbit led6=P0^5;
  13. sbit led7=P0^6;
  14. sbit led8=P0^7;
  15. sbit w1=P2^4;
  16. sbit key1 = P2^0;
  17. sbit key2 = P2^1;
  18. unsigned char smg_date[]=
  19. {0xc0,0xf9,0xa4,0xb0,0x99,0x92,
  20. 0x82,0xf8,0x80,0x98,0x88,0x83,
  21. 0xa7,0xa1,0x86,0x8e};

  22. uchar an = 0;
  23. void keyscan();
  24. void delayms (uchar time)//???
  25. {
  26. for(time; time>0; time--)
  27. {
  28. TMOD = 0x01;
  29. TH0 = 0xfc;
  30. TL0 = 0x18;
  31. TR0 = 1; //?????????0
  32. while(TF0!=1);//???????
  33. EA=1;
  34. ET0 = 1;
  35. TR0 = 0;
  36. }
  37. }
  38. void scan_key (void)
  39. {
  40.    if (!key1)
  41. {
  42.    delayms (10);
  43.    if (!key1)
  44. {
  45.    delayms (5);
  46.    while (!key1);
  47.    an++;
  48.    if (an==9)
  49. {
  50.    an = 0;
  51. }
  52. }
  53. }
  54. }
  55. void main (void)
  56. {
  57. w1=0;
  58. while (1)
  59. {
  60. scan_key ();
  61. if (an==0)
  62.   {
  63.    
  64. led1 = 1;
  65. led2 = 1;
  66.     led3 = 1;
  67.     led4 = 1;
  68.     led5 = 1;
  69.     led6 = 1;
  70.     led7 = 1;
  71.     led8 = 1;
  72. P1=smg_date[0];
  73. an=0;
  74. }
  75. if (an==1)
  76.   {
  77.    
  78.     led1 = 0;
  79.     led2 = 1;
  80.     led3 = 1;
  81.     led4 = 1;
  82.     led5 = 1;
  83.     led6 = 1;
  84.     led7 = 1;
  85.     led8 = 1;
  86. P1=smg_date[1];
  87. an=1;
  88.   }
  89. if (an==2)
  90.   {
  91.    
  92.     led1 = 1;
  93.     led2 = 0;
  94.     led3 = 1;
  95.     led4 = 1;
  96.     led5 = 1;
  97.     led6 = 1;
  98.     led7 = 1;
  99.     led8 = 1;
  100. P1=smg_date[2];
  101. an=2;
  102.   }
  103. if (an==3)
  104.   {

  105.    led1 = 1;
  106.    led2 = 1;
  107.    led3 = 0;
  108.    led4 = 1;
  109.    led5 = 1;
  110.    led6 = 1;
  111.    led7 = 1;
  112.    led8 = 1;
  113.    P1=smg_date[3];
  114.    an=3;
  115.   }
  116. if (an==4)
  117.   {
  118.   
  119.    led1 = 1;
  120.    led2 = 1;
  121.    led3 = 1;
  122.    led4 = 0;
  123.    led5 = 1;
  124.    led6 = 1;
  125.    led7 = 1;
  126.    led8 = 1;
  127.    P1=smg_date[4];
  128.    an=4;
  129.   }
  130. if (an==5)
  131.   {

  132.    led1 = 1;
  133.    led2 = 1;
  134.    led3 = 1;
  135.    led4 = 1;
  136.    led5 = 0;
  137.    led6 = 1;
  138.    led7 = 1;
  139.    led8 = 1;
  140.    P1=smg_date[5];
  141.    an=5;
  142.   }
  143. if (an==6)
  144.   {
  145.    led1 = 1;
  146.    led2 = 1;
  147.    led3 = 1;
  148.    led4 = 1;
  149.    led5 = 1;
  150.    led6 = 0;
  151.    led7 = 1;
  152.    led8 = 1;
  153.    P1=smg_date[6];
  154.    an=6;
  155.   }
  156. if (an==7)
  157.   {
  158.   
  159.    led1 = 1;
  160.    led2 = 1;
  161.    led3 = 1;
  162.    led4 = 1;
  163.    led5 = 1;
  164.    led6 = 1;
  165.    led7 = 0;
  166.    led8 = 1;
  167.    P1=smg_date[7];
  168.    an=7;
  169.   }
  170. if (an==8)
  171.   {
  172.    
  173.    led1 = 1;
  174.    led2 = 1;
  175.    led3 = 1;
  176.    led4 = 1;
  177.    led5 = 1;
  178.    led6 = 1;
  179.    led7 = 1;
  180.    led8 = 0;
  181.    P1=smg_date[8];

  182.   }
  183. if (an==9)
  184.   {
  185.   
  186.    led1 = 1;
  187.    led2 = 1;
  188.    led3 = 1;
  189.    led4 = 1;
  190.    led5 = 1;
  191.    led6 = 1;
  192.    led7 = 1;
  193.    led8 = 1;
  194.    P1=smg_date[9];
  195.   }
  196.    if(key2==0)
  197. {
  198.   delayms(5);
  199.   if(key2==0)
  200.   {
  201.    while(!key2);
  202.    TR0=1;
  203.   }
  204. }
  205. }
  206.   
  207. switch(an)
  208. {
  209.    case 1:  if (PWM_COUNT==PWM_VLAUE)
  210.             {
  211.      led1=1;
  212.    }
  213.    if(PWM_COUNT==10)
  214.    {
  215.      led1=0;
  216.      PWM_COUNT=0;
  217.    }
  218.    break;
  219. case 2:  if (PWM_COUNT==PWM_VLAUE)
  220.             {
  221.      led2=1;
  222.    }
  223.    if(PWM_COUNT==10)
  224.    {
  225.      led2=0;
  226.      PWM_COUNT=0;
  227.    }
  228.    break;
  229.   case 3:  if (PWM_COUNT==PWM_VLAUE)
  230.             {
  231.      led3=1;
  232.    }
  233.    if(PWM_COUNT==10)
  234.    {
  235.      led3=0;
  236.      PWM_COUNT=0;
  237.    }
  238.    break;
  239.   case 4:  if (PWM_COUNT==PWM_VLAUE)
  240.             {
  241.      led4=1;
  242.    }
  243.    if(PWM_COUNT==10)
  244.    {
  245.      led4=0;
  246.      PWM_COUNT=0;
  247.    }
  248.    break;
  249.    case 5:  if (PWM_COUNT==PWM_VLAUE)
  250.             {
  251.      led5=1;
  252.    }
  253.    if(PWM_COUNT==10)
  254.    {
  255.      led5=0;
  256.      PWM_COUNT=0;
  257.    }
  258.    break;
  259.     case 6:  if (PWM_COUNT==PWM_VLAUE)
  260.             {
  261.      led6=1;
  262.    }
  263.    if(PWM_COUNT==10)
  264.    {
  265.      led6=0;
  266.      PWM_COUNT=0;
  267.    }
  268.    break;
  269.   case 7:  if (PWM_COUNT==PWM_VLAUE)
  270.             {
  271.      led7=1;
  272.    }
  273.    if(PWM_COUNT==10)
  274.    {
  275.      led7=0;
  276.      PWM_COUNT=0;
  277.    }
  278.    break;
  279.   case 8:  if (PWM_COUNT==PWM_VLAUE)
  280.             {
  281.      led8=1;
  282.    }
  283.    if(PWM_COUNT==10)
  284.    {
  285.      led8=0;
  286.      PWM_COUNT=0;
  287.    }
  288.    break;
  289.   }
  290. }

  291. void T0_timer()  interrupt  1   
  292. {
  293. PWM_COUNT++;
  294. HUXI_COUNT++;
  295. if((HUXI_COUNT==600)&&(direc_flag==1))
  296. {
  297.   HUXI_COUNT=0;
  298.   PWM_VLAUE--;
  299.   if(PWM_VLAUE==1)
  300.   direc_flag=0;
  301. }
  302. if((HUXI_COUNT==600)&&(direc_flag==0))
  303. {
  304.   HUXI_COUNT=0;
  305.   PWM_VLAUE++;
  306.   if(PWM_VLAUE==9)
  307.   direc_flag=1;
  308. }
  309.       
  310. }
复制代码


回复

使用道具 举报

ID:164602 发表于 2019-3-8 08:37 | 显示全部楼层
一般的高手都不会看你的程序的,我嘛,看看了。
问题一:为什么不呼吸?因为你的switch部分,全部在主循环外,根本没有执行到嘛。
问题二:就是把它放入主循环了,也要等好一会,灯才会闪,注意,是闪,亮一个很短时间就灭了,不是呼吸。说明呼吸这部分程序是有问题的。看不懂你的呼吸程序,你这个呼吸程序好像太复杂了。

建议:你先做一个只让灯呼吸起来的程序吧,单一功能看能不能实现。
回复

使用道具 举报

ID:432823 发表于 2019-3-8 08:54 | 显示全部楼层
可能有二个问题:定时器定时值中断后未重装,主程序在执行过程时间长,可能判断值过程起不到作用。如果定时器只是为延时,不好用空操作作为延时。
回复

使用道具 举报

ID:10947 发表于 2019-3-8 10:16 | 显示全部楼层
应该是按下按键后,程序就进入到void scan_key里面出不来了,程序在等你放开按键;
检测按键的函数改一下
回复

使用道具 举报

ID:459047 发表于 2019-3-8 10:58 | 显示全部楼层
程序有大问题,慢慢找吧啊
回复

使用道具 举报

ID:477932 发表于 2019-3-8 11:35 | 显示全部楼层
本帖最后由 static 于 2019-3-22 10:04 编辑

程式逻辑没理
回复

使用道具 举报

ID:477932 发表于 2019-3-8 11:37 | 显示全部楼层
本帖最后由 static 于 2019-3-22 10:03 编辑

这经里有别人处理按键与被执行事物处理的例子

评分

参与人数 1黑币 +10 收起 理由
嘉立创AAA + 10

查看全部评分

回复

使用道具 举报

ID:10947 发表于 2019-3-8 11:48 | 显示全部楼层
应该是 while(!key2); 这句的问题?
回复

使用道具 举报

ID:478236 发表于 2019-3-8 22:39 | 显示全部楼层
以后加点注释,才有人愿意看,不然看得难受
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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