找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机键控淘气彩灯控制源码与proteus仿真

[复制链接]
ID:307014 发表于 2018-4-12 22:58 | 显示全部楼层 |阅读模式
51单片机彩灯控制系统
有4种闪烁方式
能自动手动切换

淘气彩灯仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0.png 0.jpg

单片机淘气彩灯源程序如下:
  1. #include<reg52.h>
  2. #include<intrins.h>
  3. sbit Key1=P3^2; //切换状态按钮(外部中断0)
  4. sbit Key2=P3^3;
  5. sbit Key3=P3^4;//暂停按钮(外部中断1)
  6. sbit p1=P1^5;///蜂鸣器控制端口
  7. unsigned char state=1; //状态标志
  8. unsigned int aut=1;        //改变手动自动模式
  9. char F; //定义F为外部变量
  10. unsigned char NUM1[4]={0x7e,0xbd,0xdb,0xe7}; //第3种亮灯方式(向内)
  11. unsigned char NUM2[4]={0xe7,0xdb,0xbd,0x7e}; //第3种亮灯方式(向外)
  12. unsigned char a[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //第4种亮灯方式
  13. void Delay(unsigned int t) //延时函数
  14. {
  15.   unsigned int i,j;
  16.   for(i=0;i<t;i++) //用for循环嵌套来实现延时
  17.   for(j=0;j<200;j++);
  18. }
  19. void Int_Init() //外部中断初始化
  20. {  
  21.   IT0=1; //外部中断0,边沿触发
  22.   EX0=1; //允许中断
  23.   IT1=1; //外部中断1,边沿触发
  24.   EX1=1; //允许中断
  25.   TMOD=0x06;
  26.   TH0=0xff;
  27.   TL0=0xff;
  28.   ET0=1;
  29.   TR0=1;

  30.   EA=1; //开总中断
  31. }
  32. void first()
  33. {
  34. unsigned char n;
  35. for(n=0;n<35;n++)
  36. {
  37.   P0=0x6d;        
  38.   P2=0x6d;
  39.   Delay(30);
  40.   if(F== 1) break; //如果按下外部中断按钮,立即跳出效果,执行中断的内容

  41. }
  42.    F = 0; //把外部变量清0
  43. }
  44. void second()
  45. {
  46. unsigned char m,n;
  47. for(m=0;m<4;m++)
  48. {
  49.     P0=0xf0;
  50.     P2=0x0f;
  51.     Delay(100);
  52.     P0=0xff;
  53.     P2=0xff;
  54.     Delay(100);
  55.     if(F == 1 ) break; //如果按下外部中断按钮,立即跳出效果,执行中断的内容
  56. }
  57.   for(n=0;n<4;n++)
  58.    {
  59.     P0=0x0f;
  60.     P2=0xf0;
  61.     Delay(100);
  62.     P0=0xff;
  63.         P2=0xff;
  64.         Delay(100);
  65.     if(F == 1 ) break; //如果按下外部中断按钮,立即跳出效果,执行中断的内容
  66.    }
  67.             
  68.     F = 0;        //把外部变量清0
  69. }
  70. void third()
  71. {  
  72. unsigned char n;
  73. for(n=0;n<4;n++)
  74. {
  75.    P0=NUM1[n];
  76.    P2=NUM2[n];
  77.    Delay(100);
  78.    if(F == 1 ) break; //如果按下外部中断按钮,立即跳出效果,执行中
  79.    
  80. }

  81.    F = 0; //把外部变量清0
  82. }
  83. void four()
  84. {
  85.   unsigned char n;
  86.   for(n=0;n<8;n++)
  87.   {
  88.    P0=a[n];
  89.    P2=a[n];
  90.    Delay(100);
  91.    if(F == 1 ) break; //如果按下外部中断按钮,立即跳出效果,执行中断的内容
  92.    
  93.   }
  94.    
  95.    F = 0; //把外部变量清0
  96. }

  97. void five()
  98. {
  99.   
  100. while(aut==0)
  101.   {       
  102.      first();
  103.          if(aut==1)break;
  104.          second();
  105.           if(aut==1)break;
  106.           third();
  107.           if(aut==1)break;
  108.          four();
  109.          if(aut==1)break;
  110.          Delay(10);
  111.          if(F==1) break;
  112.          }
  113.           
  114.            F = 0; //把外部变量清0
  115. }

  116. /**************主函数*******************/
  117. void main()
  118. {
  119.   Int_Init(); //外部中断初始化
  120.   while(1)
  121.   {  if(!(aut && state)){
  122.              five();       
  123.                   }
  124.   else{
  125.      if(state==1) first(); //扫描状态标志,为1时,第一种效果
  126.         else if(state==2) second(); //扫描状态标志,为2时,第二种效果
  127.         else if(state==3) third(); //扫描状态标志,为3时,第三种效果
  128.     else if(state==4) four(); //扫描状态标志,为4时,第四种效果
  129.         else  
  130.     {P0=0x00; P2=0x00;} //其他状态,八盏灯全亮,即暂停
  131.   }
  132.   }       
  133.   //蜂鸣器程序
  134.   while(1){
  135.    p1=0;
  136.    Delay(200);
  137.    p1=1;
  138.    Delay(500);                 
  139. }
  140. }
  141. /************外部中断0********************/
  142. void INT_0() interrupt 0
  143. {
  144.   Delay(100);//消抖
  145.    if(Key1 == 0)
  146.   {
  147.    F = 1;
  148.    state++; //外部变量置1,即立即跳出效果 //按一次按钮,状态标志加1
  149.    if(state>4)  state=1;
  150.    while(Key1 == 0); //松手检测
  151.   }
  152. }
  153. /************外部中断1********************/
  154. void INT_1() interrupt 2
  155. {
  156.    Delay(100);//消抖
  157.    if(Key2 == 0)
  158.     {
  159.          F=1; //外部变量置1,即立即跳出效果
  160.          state=~state; //取反状态标志,按一次可暂停,使八盏灯全亮,再按一次,继续执行之前的操作
  161.      while(Key2 == 0); //松手检测
  162.     }

  163. }
  164. ……………………

  165. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:

淘气的彩灯.rar (56.93 KB, 下载次数: 33)
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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