找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机:按动按键,运行不同的程序

[复制链接]
跳转到指定楼层
楼主
ID:103513 发表于 2016-1-17 01:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
//实现了:按下RD按键运行流水灯,按下WR运行数码管静态显示,按下TD运行计时(当加到99时蜂鸣器响),按下TD运行温度传感器显示当前温度

#include<reg52.h>
#include <intrins.h>     //因为要用到corol这一关键字
#define uint unsigned int
#define uchar unsigned char
const unsigned char table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};
//------------------位定义
sbit d1=P1^0;   //LED灯
sbit d2=P1^1;
sbit d3=P1^2;
sbit d4=P1^4;
sbit FM=P2^3;
sbit dula=P2^5;  //数码管
sbit wela=P2^6;
sbit pled=P3^7;     //按键
sbit psmg=P3^6;
sbit pjishi=P3^5;
//sbit pweibolu=P3^4;
//------------------------变量
uint XX=0,tt=0;
uchar temp,a,temp2;
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
  for(y=110;y>0;y--);
}
void didi(uchar u)
{
uchar j;
for(j=u;j>0;j--)
{
  FM=0;delay(100);
  FM=1;delay(110);
}
}
//-------------------------函数声明
void init();
void ledinit();
void smginit();
void jishiinit();
//void weiboluinit();
void jianche();
void led();
void smg();
void disp(uchar shi,uchar ge);
void dodo();
auto jishi();
//-----调试开关-------------1
#define led1
#define smg1
#define jishi1
void jianche()   //检测按键
{
  if(pled==0)  {delay(5);if(pled==0)  while(!pled);  didi(1);XX=1;}
if(psmg==0)  {delay(5);if(psmg==0)  while(!psmg);  didi(1);XX=2;}
if(pjishi==0) {delay(5);if(pjishi==0)  while(!pjishi);  didi(1);XX=3;tt=0;temp2=0;} //加上temp2=0清空,从0开始计,否则会记忆自动继续
// if(pweibolu==0) {delay(5);if(pweibolu==0) while(!pweibolu); didi(1);XX=4;}
}
//-----------------------------主函数
void main()
{
init();
while(1)
{
  jianche();
/*
if(XX==1)led();
if(XX==2)smg();
if(XX==3)jishi();
if(XX==4)weibolu();
*/
switch(XX)
  {
   case 1:led();break;
   case 2:smg();break;
   case 3:jishi();break;
  }
}
}




//-----------------------初始化
void init()
{
EA=1;      //开总中断
EX0=1;     //开外部中断0 INT0   
EX1=1;     //开外部中断1 INT1  手动去中断即外部中断只有2个。T0和T1是定时器的中断
TCON=0x01;     //设为跳变沿触发方式,即IT0=1;
#ifdef jishi1
TMOD=0x01;   
TH0=(65536-50000)/256;  
TL0=(65536-50000)%256;
EA=1;      
ET0=1;   
TR0=1;
#endif
}
//----------------------
#ifdef led1
void led()
{
//uchar temp,a;
#endif
temp=0xfe;
  for (a=8;a>0;a--)     //循环8次
     {         
      P1=temp;
      temp=_crol_(temp,1);  //移动
      delay(100);
   jianche();
   if(XX!=1)break;
     }
temp=0x7f;               //注意这一句,如果没有这一句,下面的语句循环是循环了,却没东西出来
    for (a=8;a>0;a--)    //循环8次,即流水灯8个循环8次即可点亮8个
   {
     P1=temp;
     temp=_crol_(temp,-1); //移动
     delay(100);
  jianche();
  if(XX!=1)break;
   }
}
#endif
#ifdef smg1
void smg()
{
uchar num;
wela=1;      
P0=0xea;   //11101010    只要1、3、5数码管亮
wela=0;
  for(num=0;num<16;num++)
   {
  if(XX!=2)break;  //增加按键检测灵敏度
    dula=1;
    P0=table[num];
  if(XX!=2)break;
    dula=0;
    delay(350);
jianche();
  if(XX!=2)break;
    delay(350);
   }
}
#endif

#ifdef jishi1
void disp(uchar shi,uchar ge)
{
  dula=1;
  P0=table[shi];
  dula=0;
  wela=1;
  P0=0x4;
  wela=0;
  delay(1);

  dula=1;
  P0=table[ge];
  dula=0;
  wela=1;
  P0=0x08;
  wela=0;
  delay(1);
}
void dodo()
{
  uchar shi,ge;
  if(tt==20)     
     {
    tt=0;   
    temp2++;
    shi=temp2/10;
    ge=temp2%10;
    }                      //带参数bai,shi,ge给调用函数
  disp(shi,ge);    //这句放在上面的括号内会出现只显法个位,十位百位均显不出耿
  if(temp2==99){delay(50);didi(1);temp2=0; }
}
auto jishi()
{
// if(INT1==0)TR0=1;  //51的很奇怪,程序是对的??,可运行会出错;中断出错
//  if(INT0==0)TR0=0;
dodo();
}
#endif
#ifdef weibolu1
void weiboluinit()
{
}
#endif
//-----------------中断---------------------------------------------
void tming0() interrupt 1
{
TH0=(65536-50000)/256;  
TL0=(65536-50000)%256;
tt++;   
}



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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