0
点赞
收藏
分享

微信扫一扫

C51炸弹小程序

木樨点点 2022-04-16 阅读 149
c语言

#include <reg52.h>
#include <intrins.h>
#define GPIO_KEY P3
typedef unsigned int u16;
typedef unsigned char u8;
u8 num;
sbit k1=P3^1;
sbit k2=P3^0;
sbit k3=P3^2;
sbit k4=P3^3; //使用独立按键
sbit lsa=P2^2;
sbit lsb=P2^3;
sbit lsc=P2^4;
sbit beep=P2^5;

void lnit1();        //初始化函数  定时器
void keyDown();
void key1();
void key2();
void key3();
void key4();
void UartInit();
void Showsmg2();
void Timer0();
void UartInit();
void uart_init(u8 baud);

void Delay(unsigned int xms)
{
    unsigned char i, j;
    while(xms)
    {
        i = 2;
        j = 239;
        do
        {
            while (--j);
        } 
        while (--i);
        xms--;
    }
}
u8 t0,num,mshi,sshi,mge,sge,flag,a;
void lnit1()        //初始化函数  定时器
{
     t0=0;
     num=60;
     mshi=0;
     sshi=0;
     mge=0;
     sge=0;
     flag=0;
     TMOD=0x01;        //01方式
     TH0=(65536-45872)/256;     //50ms
     TL0=(65536-45872)%256;
     EA=1;
     ET0=1;
     TR0=0;
     PT0=0;
}

void uart_init(u8 baud)
{
    TMOD|=0X20;    //设置计数器工作方式2
    SCON=0X50;    //设置为工作方式1
    PCON=0X80;    //波特率加倍
    TH1=baud;    //计数器初始值设置
    TL1=baud;
    ES=1;        //打开接收中断
    EA=1;        //打开总中断
    TR1=1;        //打开计数器        
}


void KeyDown(){       //按键检测
GPIO_KEY=0x0f;       //定义独立按键端口
if(GPIO_KEY!=0x0f){      //延时消抖
Delay(10);
if(GPIO_KEY!=0x0f){
GPIO_KEY=0x0f;
switch(GPIO_KEY){
  case 0x0d : key1(); 
        break;
  case 0x0e : key2();
        break;
  case 0x0b : key3();
        break;
  case 0x07 : key4();
        break;
  }
  }while(GPIO_KEY!=0x0f);  //松手检测
  }
}

void key1()
{
    flag=flag+10;
    if(flag>=60)
    {
        flag=60;
    }
}

void key2()
{
    flag=flag-10;
}

void key3()
{
    flag=flag+1;
}
void key4()
{
    TR0=~TR0;
}

u8 smgduan[]=
{
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f
}; //段选数组


void Showsmg(u8 mshi,u8 mge,u8 sshi,u8 sge)
{
lsa=1; lsb=1; lsc=1;//第一位smg  
P0=smgduan[mshi];      
Delay(1);
P0=0x00;

lsa=0;lsb=1;lsc=1;//第二位smg
P0=smgduan[mge];       
Delay(1);
P0=0x00;

lsa=1; lsb=0; lsc=1;//第三位smg
P0=smgduan[sshi];
Delay(1);
P0=0x00;

lsa=0; lsb=0; lsc=1;//第四位smg
P0=smgduan[sge];
Delay(1);
P0=0x00;
}

u8 s5,s6,s7,s8,m1,m2,m3,m4;
void Showsmg2(u8 m1,u8 m2,u8 m3,u8 m4)
{
lsa=1; lsb=1; lsc=0;//第一位smg  
P0=smgduan[m1];      
Delay(1);
P0=0x00;

lsa=0;lsb=1;lsc=0;//第二位smg
P0=smgduan[m2];       
Delay(1);
P0=0x00;

lsa=1; lsb=0; lsc=0;//第三位smg
P0=smgduan[m3];
Delay(1);
P0=0x00;

lsa=0; lsb=0; lsc=0;//第四位smg
P0=smgduan[m4];
Delay(1);
P0=0x00;
}

void main() //主函数
{          
    TR0=0;//定时器关闭 不使用定时器
    lnit1();
    uart_init(0xfa);

    while(1)
        {
              keyDown();
                mshi=flag/10;
                mge=flag%10;
                sshi=num/10;
                sge=num%10;
                Showsmg(mshi,mge,sshi,sge);
            
                Showsmg2(m1,m2,m3,m4);
                if(m1==1&&m2==2&&m3==3&&m4==4)
                {
                    TR0=0;
                }
                if(num==0&&flag==0)
                {
                    while(3000)
                    {
                    beep=!beep;
                    Delay(1);
                    }
                }
        }
}

void Timer0() interrupt 1
    {
   TH0=(65536-45872)/256;      //50ms
   TL0=(65536-45872)%256;
   t0++;
   if(t0==20)
     {         //循环二十次=1000ms
         t0=0;
         if(num==0&&flag!=0)
         {
                num=60;
                flag--;
         }
         if(flag<=0)
         {
                flag=0;
         }
         num--;
   }     
  }
void uart() interrupt 4 //串口通信中断函数
{
    u8 rec_data;

    RI = 0;            //清除接收中断标志位
    rec_data=SBUF;    //存储接收到的数据
    if(rec_data==1)
    {
        m1=1;
    }
    
        if(rec_data==2)
    {
        m2=2;
    }
    
    if(rec_data==3)
    {
        m3=3;
    }
    
    if(rec_data==4)
    {
        m4=4;
    }
    SBUF=rec_data;    //将接收到的数据放入到发送寄存器
    while(!TI);        //等待发送数据完成
    TI=0;            //清除发送完成标志位                
}

举报

相关推荐

0 条评论