找回密码
 立即注册

QQ登录

只需一步,快速开始

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

这个单片机程序为什么每一次定时器会让LED增加?

[复制链接]
跳转到指定楼层
楼主
ID:665608 发表于 2020-2-23 11:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. #include<reg51.h>
  2. #include<intrins.h>
  3. #define led P2

  4. sbit k1=P3^2;
  5. sbit lsa=P2^2;
  6. sbit lsb=P2^3;
  7. sbit lsc=P2^4;
  8. sbit beep=P1^5;

  9. typedef unsigned int u16;
  10. typedef unsigned char u8;

  11. u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,                  
  12.                                         0x08,0x37,0x08,0x37};

  13. void delay(u16 i)
  14. {
  15.         while(i-- );
  16. }

  17. void Int0Init()
  18. {
  19.         IT0=1;
  20.         EA=1;
  21.         EX0=1;
  22. }

  23. void Timer0Init()
  24. {
  25.         TMOD|=0X01;
  26.         TH0=0XFA;
  27.         TL0=0X00;
  28.         ET0=1;
  29.         EA=1;
  30.         TR0=1;
  31. }

  32. void yu()
  33. {
  34.         u8 i;
  35.         led=0xfe;
  36.         while(1)
  37.         {
  38.                 for(i=0;i<7;i++)
  39.                 {
  40.                         led=_crol_(led,1);
  41.                         delay(50000);
  42.                 }
  43.                 for(i=0;i<7;i++)
  44.                 {
  45.                         led=_cror_(led,1);
  46.                         delay(50000);
  47.                 }
  48.         }
  49. }

  50. void main()
  51. {
  52.         while(1)
  53.         {        
  54.                 Int0Init();
  55.                 Timer0Init();
  56.                 yu();
  57.         }        
  58. }

  59. void Int0() interrupt 0
  60. {
  61.         delay(1000);
  62.         if(k1==0)
  63.         {
  64.                  u8 p;
  65.                 for(p=0;p<10;p++)
  66.                 {
  67.                         lsa=1;lsb=1;lsc=1;
  68.                         P0=smgduan[p];
  69.                         delay(10000);
  70.                         P0=0x00;
  71.                 }
  72.         }
  73. }

  74. void Timer0() interrupt 1
  75. {
  76.         static u16 i;
  77.         TH0=0XFA;
  78.         TL0=0X00;
  79.         i++;
  80.         if(i==1000)
  81.         {
  82.                 i=0;
  83.                 for(i=0;i<10;i++)
  84.                 {
  85.                         lsa=1;lsb=1;lsc=0;
  86.                         P0=smgduan[i];
  87.                         delay(10000);
  88.                         P0=0x00;
  89.                 }
  90.         }
  91. }
复制代码
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:94031 发表于 2020-2-23 13:15 | 只看该作者
这一段程序使数码管从0显示到9:
for(i=0;i<10;i++)
                {
                        lsa=1;lsb=1;lsc=0;
                        P0=smgduan[i];
                        delay(10000);
                        P0=0x00;
                }
回复

使用道具 举报

板凳
ID:665608 发表于 2020-2-23 14:23 | 只看该作者
xuyaqi 发表于 2020-2-23 13:15
这一段程序使数码管从0显示到9:
for(i=0;i

但是他执行后,有一颗LED自动进入主函数了,
回复

使用道具 举报

地板
ID:94031 发表于 2020-2-23 14:41 | 只看该作者
中断执行完后肯定重新返回主程序。“有一颗LED自动进入主函数了”这句我不明白。
回复

使用道具 举报

5#
ID:665608 发表于 2020-2-23 15:47 | 只看该作者
xuyaqi 发表于 2020-2-23 14:41
中断执行完后肯定重新返回主程序。“有一颗LED自动进入主函数了”这句我不明白。

就是回到主函数后,他会由原来的只亮一颗LED灯,增加至俩颗
回复

使用道具 举报

6#
ID:213173 发表于 2020-2-24 09:53 | 只看该作者
楼主把P2的3个端口作数码管位驱动在中断里运行,又把P2的8个端口作流水灯在主程序中运行,又没有按端口复用来编程,不乱套才怪呢?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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