以后会写一个比赛要点专题。
程序部分
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 =

最低0.47元/天 解锁文章
2万+

被折叠的 条评论
为什么被折叠?



