找回密码
 立即注册

QQ登录

只需一步,快速开始

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

第十一届蓝桥杯单片机代码

[复制链接]
跳转到指定楼层
楼主
ID:909832 发表于 2021-4-28 21:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include "stc15f2k60s2.h"
#include "iic.h"
#include "ds18b20.h"

                                                         //0    1    2    3    4   5   6     7    8    9   熄灭   C    P   
code unsigned char tab[] = { 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xc6,0x8C};


unsigned char dspbuf[8] = {10,10,10,10,10,10,10,10};  //显示缓冲区
unsigned char dspcom=0;//数码管码段

unsigned char yi=10,er=10,san=10,si=10,wu=10,liu=10,qi=10,ba=10;

unsigned char key_temp;
unsigned char key_num;//键值
bit key_flag;//按键扫描标记位 10ms
unsigned char key_press;//消抖的标记变量
unsigned char key_value=0xff;
unsigned char key_re;
unsigned char intr;

bit s4_cnt=0;//按键s4切换状态
bit s5_cnt=0;//按键s5切换状态
bit flag_set=1;//进入设置状态标记位

unsigned char T_min=20;//温度下限值
unsigned char T_max=30;//温度上限值
unsigned char Tmin;
unsigned char Tmax;
unsigned char temper=25;//实时温度

unsigned char p_flag=0xff;
unsigned char t_cnt=0;

//上电初始化
void power_init()
{
        P2=0XA0;P0=0X00;
        P2=0X80;P0=0XFF;
        P2=0XC0;P0=0XFF;
        P2=0XE0;P0=0XFF;
}


void display()//数码管显示
{
        dspbuf[0]=yi;
        dspbuf[1]=er;
        dspbuf[2]=san;
        dspbuf[3]=si;
        dspbuf[4]=wu;
        dspbuf[5]=liu;
        dspbuf[6]=qi;
        dspbuf[7]=ba;

        P2=0x00;
        P0=0xff; //消隐
        P2=(0xE0|(P2&0x1f));
        P2&=0x1f;

        P0=0x01<<dspcom;
        P2=(0xC0|(P2&0x1f));
        P2&=0x1f;

        P0=tab[dspbuf[dspcom]];
        P2=(0xE0|(P2&0x1f));
        P2&=0x1f;

        if(++dspcom>=8)
        {
           dspcom=0;
        }
}

unsigned char read_keyboard(void)  //独立按键
{
    static unsigned char col;

        P3 = 0xff;

    if((P3&0x0f)!=0x0f) //有按键按下 或者抖动
        key_press++;
        else
                key_press = 0;  

    if(key_press == 3)
    {
                key_press = 0;
                key_re = 1;
               
                if((P3 & 0x01) == 0)        col = 1;
                if((P3 & 0x02) == 0)        col = 2;
                if((P3 & 0x04) == 0)        col = 3;
                if((P3 & 0x08) == 0)        col = 4;
    }

        //连续三次检测到按键被按下,并且该按键已经释放
        P3 = 0xff;
        
    if(((key_re == 1) && ((P3&0x0f)==0x0f)))
    {
        key_re = 0;
                key_value=col;
        return key_value;
    }

    return 0xff;  //无按键按下或被按下的按键未被释放
}


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



void timer0(void) interrupt 1        //定时器0的中断处理函数          1ms
{
        display();//数码管显示

           if(++intr>=10)
        {
           intr=0;
           key_flag=1;
        }

        t_cnt++;
        if(s4_cnt==0)
        {
                yi=11,er=10,san=10,si=10,wu=10,liu=10,qi=temper/10,ba=temper%10;
        }
        else
        {
           yi=12,er=10,san=10,si=T_max/10,wu=T_max%10,liu=10,qi=T_min/10,ba=T_min%10;
        }

        if(s4_cnt==0&&flag_set==1)
        {
                flag_set=0;
                if(T_max<T_min)
                {         
                        T_max=Tmax;
                        T_min=Tmin;
                        p_flag=0xf7;
                }
                else
                {
                        Tmax=T_max;Tmin=T_min;
                        p_flag=0xff;
                }
        }
        else if(s4_cnt==1&&flag_set==0)
        {
                flag_set=1;
                Tmax=T_max;Tmin=T_min;
        }
        
}



void main()
{
        //上电初始化
        power_init();
        Timer0Init();
        
        while(1)
        {
                if(t_cnt>=200)
                {
                         t_cnt=0;
                        temper=rd_temperature();         //获取温度值

                        if(temper>Tmax)
                        {
                                 SetDACOut(204);
                                 P2=0X00;P0=0XFF;P2=0X80;P0=0XFE&p_flag;
                        }
                        else if(temper>=Tmin)
                        {
                                  SetDACOut(153);
                                  P2=0X00;P0=0XFF;P2=0X80;P0=0XFD&p_flag;
                        }
                        else
                        {
                                  SetDACOut(102);
                                  P2=0X00;P0=0XFF;P2=0X80;P0=0XFB&p_flag;
                        }
                }



                 if(key_flag)//按键标记10ms进来一次
                 {
                        key_flag=0;
                        key_temp=read_keyboard();
                        if(key_temp!=0xff) //有效按键
                        {
                                key_num=key_temp;
                                switch(key_num)
                                {
                                        case 1:           //s7                   -
                                                if(s4_cnt==1)
                                                {
                                                         if(s5_cnt==0)
                                                        {
                                                                if(T_min--<=0)
                                                                        T_min=0;
                                                        }
                                                        else
                                                        {
                                                                if(T_max--<=0)
                                                                        T_max=0;                                                        
                                                        }
                                                }
                                                break;
                                        case  2://s6                 +
                                                if(s4_cnt==1)
                                                {
                                                         if(s5_cnt==0)
                                                        {
                                                                if(++T_min>=100)
                                                                        T_min=99;
                                                        }
                                                        else
                                                        {
                                                                if(++T_max>=100)
                                                                        T_max=99;                                                        
                                                        }
                                                }
                                                break;
                                        case  3://s5
                                                s5_cnt=~s5_cnt;
                                                break;
                                        case  4://s4        界面切换
                                                 s4_cnt=~s4_cnt;
                                                break;
                                }
                        }
                }
        }
}
        




评分

参与人数 1黑币 +10 收起 理由
haokey + 10 和我的代码风格一样,在定时器里计数++,按.

查看全部评分

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

使用道具 举报

沙发
ID:569384 发表于 2021-5-5 10:54 | 只看该作者
可以直接去公司上班了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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