第七届 蓝桥杯 省赛 模拟风扇控制系统

题目就不贴了,也没什么感想,就直接上代码了(PS:代码没有设置多个.c文件、头文件,都堆在一起了,不过逻辑较简单)

 

//ds18b20,数码管,独立按键(跳线帽连接右边两个) ,LED灯,定时器
#include
#include

#define uchar unsigned char 
#define uint unsigned int    
    
sbit DQ=P1^4;
 //1100 0110                                                                //12
uchar code tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0XBF,0XFF,0xc6};
uchar yi,er,san,si,wu ,liu,qi,ba;
uchar mode=1,pwm;
uchar wendu;
uint rest_time=60;
bit s7=0,s6=0;

void delayms(int ms);
void delaypp(int ms);
void allinit();
void keyscan();
//void rel(uchar dong);
void display1(uchar yi,uchar er);
void display2(uchar san,uchar si);
void display3(uchar wu,uchar liu);
void display4(uchar qi,uchar ba);
void datapro();
uchar temget();
uchar readw();
void dsinitw();
void writew(uchar dat);
void Delay100us();
void Delay500us();
void ledmokuai();

void Timer0Init(void)        //100微秒@11.0592MHz
{
    AUXR |= 0x80;        //定时器时钟1T模式
    TMOD &= 0xF0;        //设置定时器模式
    TL0 = 0xAE;        //设置定时初值
    TH0 = 0xFB;        //设置定时初值
    TF0 = 0;        //清除TF0标志
    TR0 = 1;        //定时器0开始计时
    EA=1;
    ET0=1;
}

void main()
{
    allinit();
    P34=1;
  Timer0Init();
    //while(1)上面定义

    while(1)
    {
        wendu=temget();
        keyscan();
        datapro();
        ledmokuai();
        display1(yi,er);
        display2(san,si);
        display3(wu,liu);
        display4(qi,ba);
    }
}

void timer0() interrupt 1
{
    static uchar count;
    static uint yimiao;
    if(rest_time!=0)
    {
        yimiao++;
            if(yimiao==10000)
            {
                yimiao=0;
                rest_time--;
            }
        if(rest_time!=0)
        {
            count++;
            if(count==pwm)
            {
                P34=~P34;
            }
            if(count==10)
            {
                count=0;
                P34=~P34;
            }
        }
    }
    
}

void ledmokuai()
{
    if(mode==1)
    {
        P2=0X80;
        P0=0XFF;
        P0=0XFE;
    }
    else if(mode==2)
    {
        P2=0X80;
        P0=0XFF;
        P0=0XFd;
    }
    else if(mode==3)
    {
        P2=0X80;
        P0=0XFF;
        P0=0XFb;
    }
    if((s6==1)||(rest_time==0))
    {
        P2=0X80;
        P0=0XFF;
    }
}

/*************ds18b20****************/

uchar temget()
{
    uchar tempure;
    uchar low,high;
    
    dsinitw();
    writew(0xcc);
    writew(0x44);
    Delay500us();    Delay500us();    

    dsinitw();
    writew(0xcc);
    writew(0xbe);
    
    low=readw();
    high=readw();
    
    tempure=high<<4;//0000 0101  =0101 0000
    tempure |= (low>>4); //  1010 0110   0000 0110 | 0101 0000=0101 0110
    
    return tempure;
}
//以下考试会给出
uchar readw()
{
    uchar i;
    uchar dat;
    
    for(i=0;i<8;i++)
    {
        DQ=0;
        _nop_();
        dat>>=1;
        DQ=1;
        if(DQ==1)
        {
            dat |= 0x80;// dat=dat|0x80;   0000 0000 | 1000 0000 =1000 0000
        }
        Delay100us();
    }
    return dat;
}

void writew(uchar dat)
{
    uchar i;
    for(i=0;i<8;i++)
    {
        DQ=0;
        DQ=dat&0x01;//0100 0100 & 0000 0001 // 0000 0001
        Delay100us();
        DQ=1;
        dat>>=1;//dat=dat>>1;//1001 0000//0010 0001
    }
}

void dsinitw()
{
    DQ=0;
    Delay500us();
    DQ=1;
    Delay500us();
}

void Delay100us()        //@11.0592MHz
{
    unsigned char i, j;

    _nop_();
    _nop_();
    i = 2;
    j = 15;
    do
    {
        while (--j);
    } while (--i);
}

void Delay500us()        //@11.0592MHz
{
    unsigned char i, j;

    _nop_();
    _nop_();
    i = 6;
    j = 93;
    do
    {
        while (--j);
    } while (--i);
}

//数据处理
void datapro()
{
    if(s7==1)
    {
        yi=10;er=4;san=10;si=11;
        wu=11;        //9999/1000=9
        liu=wendu/10;  //  25/10=2
        qi=wendu%10;       //25%10=5
        ba=12;          //9999%10=9
    }
    else
    {
        if(mode==1)
        {
            pwm=2;
        }
        else if(mode==2)
        {
            pwm=3;
        }
        else if(mode==3)
        {
            pwm=7;
        }
        
        yi=10;er=mode;san=10;si=11;
        wu=rest_time/1000;        //9999/1000=9
        liu=rest_time%1000/100;  //9999%1000=999/100=9
        qi=rest_time%100/10;       //9999%100=99/10=9
        ba=rest_time%10;          //9999%10=9
    }
}

void keyscan()
{
    if(P30==0)//s7
    {
        delayms(5);
        if(P30==0)
        {
            s7=~s7;
        }
        while(!P30);
    }
    else if(P31==0)//s6
    {
        delayms(5);
        if(P31==0)
        {
            s6=1;
            rest_time=0;
        }
        while(!P31);
    }
    else if(P32==0)//s5
    {
        delayms(5);
        if(P32==0)
        {
            s6=0;
            rest_time+=60;
            if(rest_time>120)
            {
                rest_time=0;
            }
        }
        while(!P32);
    }
    else if(P33==0)//s4
    {
        delayms(5);
        if(P33==0)
        {
            ++mode;
            if(mode==4)
            {
                mode=1;
            }
        }
        while(!P33);
    }
}

//void rel(uchar dong)
//{
//    if(dong==0)
//    {
//        P2=0XA0;P0=0X00;//关闭蜂鸣器和继电器
//    }
//    else if(dong==1)
//    {
//        P2=0XA0;P0=0X40;//打开蜂鸣器
//    }
//    else if(dong==2)
//    {
//        P2=0XA0;P0=0X10;//打开继电器
//    }
//    else if(dong==3)
//    {
//        P2=0XA0;P0=0Xff;//打开蜂鸣器和继电器
//    }
//}


void delayms(int ms)
{
    int i,j;
    for(i=ms;i>0;i--)
        for(j=845;j>0;j--);
}
//如果数码管不亮,把这个延时换为上面的
//void delaypp(int ms)//数码管专用延时
//{
//    int i,j;
//    for(i=ms;i>0;i--)
//        for(j=80;j>0;j--);
//}

void allinit()
{
    P2=0XA0;
    P0=0X00;//关闭蜂鸣器,继电器
    
    P2=0X80;
    P0=0XFF;//关闭LED灯
    
    P2=0XC0;
    P0=0XFF;//选择所有数码管
    P2=0XFF;
    P0=0XFF;//关闭所有数码管
}

void display1(uchar yi,uchar er)
{
        P2=0XC0;//打开位选573   U8
        P0=0X01;//选择第一个数码管
        P2=0XFF;//打开段选573   U7
        P0=tab[yi];
        delayms(1);
        
        P2=0XC0;
        P0=0X02;
        P2=0XFF;
        P0=tab[er];
        delayms(1);
}    

void display2(uchar san,uchar si)
{
        P2=0XC0;
        P0=0X04;
        P2=0XFF;
        P0=tab[san];
        delayms(1);
        
        P2=0XC0;
        P0=0X08;
        P2=0XFF;
        P0=tab[si];
        delayms(1);
}

void display3(uchar wu,uchar liu)
{
        P2=0XC0;
        P0=0X10;
        P2=0XFF;
        P0=tab[wu];
        delayms(1);
        
        P2=0XC0;
        P0=0X20;
        P2=0XFF;
        P0=tab[liu];
        delayms(1);
}

void display4(uchar qi,uchar ba)
{
        P2=0XC0;
        P0=0X40;
        P2=0XFF;
        P0=tab[qi];
        delayms(1);
        
        P2=0XC0;
        P0=0X80;
        P2=0XFF;
        P0=tab[ba];
        delayms(1);
}

你可能感兴趣的:(51单片机,蓝桥杯第七届省赛)