一、题目
历届的省赛和国赛的题目我已经在前面的文章(点击查看)里给大家分享了(网盘资源),需要的话,直接去下载,我在这里就不再赘述了。
二、hex文件
读者下载这个文件然后用烧录软件直接烧入单片机就可以用了!
链接:https://pan.baidu.com/s/1pnyxWPjcqpegZluauJEJyA
提取码:ulx3
三、主函数实现
提示:比赛过程中,仅仅主函数修改可能不够,有的时候需要注意,比赛官方给的各个驱动的代码是否写完整了,比如有时候,它的.h文件中就没有把这些写全,故意注释掉,你需要去对应的.c文件里找都需要一些什么函数,一个个都补全了才行。
另外,我的代码都是完全在一个文件中写完的,所以各位读者大大用起来就比较方便,可以直接拷贝我的.c文件也可以把内容复制粘贴走,放到你想要的地方去。
上代码:
# include "reg52.h"
# include "iic.h"
# include "onewire.h"
typedef unsigned char uchar;
typedef unsigned int uint;
sfr P4 = 0xc0;
sbit R1 = P3^0;
sbit R2 = P3^1;
sbit R3 = P3^2;
sbit R4 = P3^3;
sbit C1 = P4^4;
sbit C2 = P4^2;
sbit C3 = P3^5;
sbit C4 = P3^4;
uchar duanma[10] = {
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar duanmadot[10] = {
0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
uint f_dat = 0; //频率数据测量
uint f_c = 0; //频率的计数变量
uint temp = 0; //温度数据测量
uint t_dat = 0; //温度显示的变量
uchar u_dat = 0; //电压数据测量
uchar u_dat_yu = 20; //电压的阈值
uchar k4 = 0; //按键S4,默认为显示电压
uchar k8 = 0; //按键S8,默认为数据显示界面
uint count = 0; //定时器1的计数变量
uchar hu_dat = 0; //回显的电压数据
uint ht_dat = 0; //回显的温度数据
uint hf_dat = 0; //回显的频率数据
bit k9 = 0; //默认显示数据显示界面
uint s8_count[2] = {
0,0}; //记录按键S8的按下时间
uint count8 = 0; //s8的定时器计数变量
uchar light = 0; //控制灯的变量
bit l8f = 0; //L8闪烁标志位
void SelectHC573 (uchar n)
{
switch(n)
{
case 4:
P2 = (P2 & 0x1f) | 0x80;break;
case 5:
P2 = (P2 & 0x1f) | 0xa0;break;
case 6:
P2 = (P2 & 0x1f) | 0xc0;break;
case 7:
P2 = (P2 & 0x1f) | 0xe0;break;
case 0:
P2 = (P2 & 0x1f) | 0x00;break;
}
}
//初始化函数
void InitSystem ()
{
SelectHC573(4);
P0 = 0xff;
SelectHC573(5);
P0 = 0x00;
SelectHC573(0);
}
//简单延时函数
void Delay (uint t)
{
while (t--);
}
//温度读取函数
void ReadTemp ()
{
uchar LSB;
uchar MSB;
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0x44);
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0xbe);
LSB = Read_DS18B20();
MSB = Read_DS18B20();
temp = (MSB << 8) | LSB;
if ((temp & 0xf800) == 0x0000)
{
temp = temp >> 4;
temp = temp * 100;
temp = temp + ((LSB & 0x0f) * 0.0625 + 0.005) * 100;
}
t_dat = temp;
}
//电压测量
void ReadRb2 ()
{
uchar rb2 = 0;
IIC_Start();
IIC_SendByte(0x90