找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2635|回复: 0
收起左侧

单片机流水灯 含Proteus仿真原理图及代码

[复制链接]
ID:1012245 发表于 2022-3-22 16:37 | 显示全部楼层 |阅读模式
之前学单片机做的一个,以下是可实现的功能:
1. K1 为“启动键”,首次按压 K1 可产生“自下向上” 的
流水灯运动;
2. K2 为“停止键”,按压 K2 可终止流水灯的运动;
3. K3 和 K4 为“方向键”,分别产生 “自上向下”和 “自
下向上” 运动。
4. K5 为“闪烁键”,按压 K5 可以使 4 个灯同时闪烁。

有很多不足,请多多指教。

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
1.png 2.png

单片机源程序如下:
  1. #include<reg51.h>
  2. char led1[]={0xfe,0xfd,0xfb,0xf7};              //LED亮灯控制字
  3. char led2[]={0xf0,0xff};                        //LED闪烁控制字

  4. bit dir=0,run=0,tao=0;                          //全局变量

  5. unsigned char ms=0,i=0,j=3,k=0;                //全局变量

  6. unsigned char set;                             //全局变量

  7. timer() interrupt 1                            //T0方式延时延时函数
  8. {
  9.         TH0=0x3c;
  10.         TL0=0xb0;                                    //该初值为延时50ms,运行10次后再进行变量加一或减一即可实现延时500ms
  11.         ms++;
  12.          if(ms==10)
  13.          {
  14.                 ms=0;
  15.                 switch(set)
  16.                  {
  17.                          case 1:i++;break;
  18.                          case 2:j--;break;
  19.                          case 3:k++;break;
  20.      }
  21.    }
  22. }

  23. key() interrupt 0                             //键控中断函数
  24. {
  25.         switch(P0&0x0f)                             //修改标志位状态
  26.         {
  27.                 case 0x0e:run=1;break;
  28.                 case 0x0d:run=0,dir=0;break;
  29.                 case 0x0b:dir=1;tao=0;break;
  30.                 case 0x07:dir=0;tao=0;break;
  31.                 case 0x0f:tao=1;break;
  32.   }
  33. }

  34. void main()
  35. {
  36.         TMOD = 0x01;                             //初始化T0,工作方式为工作方式1
  37.         TH0 = 0x3C;
  38.         TL0 = 0xB0;
  39.         ET0 = 1;
  40.         TR0 = 1;                                 
  41.        
  42.         IT0=1;EX0=1;                             //初始化外部中断INT0
  43.        
  44.         EA=1;                                    //开总中断
  45.         PX0=0;PT0=1;                             //设置中断优先级
  46.         while(1)
  47.         {
  48.                 if(run==1)
  49.                 {
  50.                         if(tao==1)                            //若run=1,tao=1,闪烁                     
  51.                         {
  52.                                 set=3;
  53.                                 if(k==2)
  54.                                 {
  55.                                         k=0;
  56.         }
  57.                                 P2=led2[k];
  58.                         }
  59.                         else
  60.                         {
  61.                                 if(dir==1)                          //若run=dir=1,自上向下流动
  62.                                 {
  63.                                         set=1;
  64.                                         if(i==4)
  65.                                         {
  66.                                                 i=0;
  67.           }
  68.                                                 P2=led1[i];
  69.         }
  70.                                 else                                //若run=1;dir=0,自下向上流动
  71.                           {
  72.                                   set=2;
  73.                                   if(j==-1)
  74.                                   {
  75.                                           j=3;
  76.           }
  77.                                   P2=led1[j];
  78.         }
  79.                   }
  80.     }
  81.                 else
  82.                 {
  83.                         P2=0xff;                       //灯全灭
  84.     }
  85.         }
  86. }
复制代码

Keil代码与Proteus仿真下载:
流水灯.zip (60.29 KB, 下载次数: 22)

评分

参与人数 1黑币 +20 收起 理由
admin + 20 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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