第十三届蓝桥杯单片机组程序题第一批

以后会写一个比赛要点专题。

程序部分
system.h
#include <system.H>  // 包含系统头文件
#include <ds18b20.h>  // 包含 DS18B20 温度传感器的头文件

// 定义全局变量
unsigned char  viewflag = 0, mode = 0, longkeyflag = 0, value = 0, mode1 = 0, ledflag = 0, comtemflag = 0;  // 显示内容切换, 模式切换, 长按, 键值, 参数
unsigned int t1, t2;
char config = 23;
bit tempflag = 0, comtflag = 0;

// 控制 P2 和 P0 端口的输出
void P0andP2(unsigned char p2, unsigned char p0)
{
    P0 = p0;  // 设置 P0 端口的输出
    P2 = P2 & 0x1F;  // 保留 P2 端口的低 5 位
    P2 = P2 | p2;  // 设置 P2 端口的值
    P2 = P2 & 0x1F;  // 再次保留 P2 端口的低 5 位
}

// Timer0 的中断服务例程
void Timer0_Isr(void) interrupt 1
{
    static unsigned int t0 = 0, t1 = 0, t2 = 0, t3 = 0, t4 = 0, t5 = 0;  // 定义静态计数器

    t0++; t1++; t2++; t3++; t4++; t5++;  // 每次中断时递增计数器

    if (t0 > 1)
    {
        smg_scan();  // 刷新显示
        t0 = 0;  // 重置计数器 t0
    }

    if (t1 > 20)
    {
        key_scan();  // 检测按键
        t1 = 0;  // 重置计数器 t1
    }

    if (t2 > 900)  // 温度扫描间隔
    {
        t2 = 0;  // 重置计数器 t2
        tempflag = 1;  // 设置温度测量标志
    }

    if (t5 > 100)  // LED 状态切换间隔
    {
        ledflag++;  // 切换 LED 状态标志
        ledflag = ledflag % 2;  // 限制 ledflag 为 0 或 1
    }
}

// 定时器0的初始化
void Timer0_Init(void)  // 1毫秒@12.000MHz
{
    AUXR &= 0x7F;  // 设置定时器时钟为 12T 模式
    TMOD &= 0xF0;  // 清除 TMOD 寄存器中的无关位
    TL0 = 0x18;    // 设置定时器0的低8位初值
    TH0 = 0xFC;    // 设置定时器0的高8位初值
    TF0 = 0;       // 清除定时器0的中断标志
    TR0 = 1;       // 开始定时器0
    ET0 = 1;       // 使能定时器0中断
    EA = 1;        // 使能全局中断
}

// 时间比较函数
void comparetime()  // 时间比较
{
    if (time3[0] == 0 && time3[1] == 0)  // 检查时间是否为 0:00
    {
        led.b.b0 = 0;  // 关闭 LED 的 b0 位
        P0andP2(0x80, led.hex);  // 更新 P2 和 P0 端口
        if (mode1 == 1)  // 如果是模式 1
        {
            buzz.b.b4 = 1;  // 开启蜂鸣器
            P0andP2(0xA0, buzz.hex);  // 更新 P2 和 P0 端口
            comtemflag = 1;  // 设置比较时间标志
        }
    }

    if (time3[0] == 5 && time3[1] == 0)  // 检查时间是否为 5:00
    {
        led.b.b0 = 1;  // 开启 LED 的 b0 位
        P0andP2(0x80, led.hex);  // 更新 P2 和 P0 端口
        if (mode1 == 1)  // 如果是模式 1
        {
            buzz.b.b4 = 0;  // 关闭蜂鸣器
            P0andP2(0xA0, buzz.hex);  // 更新 P2 和 P0 端口
            comtemflag = 0;  // 清除比较时间标志
        }
    }
}

// 读取温度的函数
void tempurature()
{
    float t;  // 定义温度变量

    ds18b20_convert();  // 触发 DS18B20 温度转换
    t = ds18b20_read();  // 读取温度值
    t1 = (unsigned int)t;  // 整数部分
    t2 = (unsigned long)(t * 10000) % 10000;  // 小数部分转换为整数
}

// 更新显示内容的函数
void view()
{
    switch (mode)  // 根据不同的模式更新显示内容
    {
        case 0:  // 温度显示
        {
            smg_set(0, 18);  // 设置显示位置 0
            smg_set(1, 1);  // 设置显示位置 1
            smg_set(2, 17);  // 设置显示位置 2
            smg_set(3, 17);  // 设置显示位置 3
            smg_set(4, 17);  // 设置显示位置 4
            smg_set(5, t1 / 10);  // 设置显示位置 5
            smg_set(6, (t1 % 10) + 20);  // 设置显示位置 6
            smg_set(7, t2 / 1000);  // 设置显示位置 7
            break;
        }

        case 1:  // 时间显示
        {
            smg_set(0, 18);  // 设置显示位置 0
            smg_set(1, 2);  // 设置显示位置 1
            smg_set(2, 17);  // 设置显示位置 2
            smg_set(3, value =
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值