《蓝桥杯真题》:2022年单片机省赛(第十三 / 13届第一场)

此篇博客详细介绍了在2022年单片机省赛中,如何使用STC15F2K60S2单片机配合onewire和ds1302库实现BCD码转换、时间读取与显示,以及温度传感器DS18B20的通信。重点涉及代码修改、数据处理和底层驱动的调整以适应15系列单片机。

有关题目

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

实现代码

注意:
数据处理方面:由于ds1302芯片存储的数据是BCD码,所以我们要进行BCD码与十进制之间的转换,例如0x16 的BCD码为16,十进制为1 * 16 + 6 = 32。
源文件修改方面:官方给onewire.h,ds1302.h中使用的时C51的头件"reg52.h",我们需修改为对应的15系列头文件"STC15F2K60S2.h",这样才可以使用一些特殊位寄存器。

底层代码:需修改驱动代码onewire.c中单总线延时函数,官方给我们是STC89C52RC系列,15系列的单片机速度比51快8~12倍,需要修改对应的延时函数。修改如下
void Delay_OneWire(unsigned int t)
{
char i;
while(t–)
for (i = 0; i < 12; i++);
}

main.c

#include "STC15F2K60S2.h"
#include "onewire.h"
#include "ds1302.h"

#define uchar unsigned char
#define uint unsigned int

sbit L1 = P0^0;
sbit L2 = P0^1;
sbit L3 = P0^2;

uchar jm = 0;//界面初始化温度界面
code uchar tab[] = {
   
   0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff, 0xc1, 0xbf}; 
//U -  11 12

uchar init_time[3] = {
   
   0x40, 0x59, 0x23};//初始化时间秒 分 时
uchar time[3] = {
   
    0 };//秒 分 时

bit mod_flag;//0为温度控制模式
bit rel_flag;//继电器是否闭合标志,为0未闭合
bit flag_5s;
bit led10_flag;//初始化0为led10熄灭
bit L1_flag;//初始化0为L1熄灭
bit L3_flag;//初始化0为L3熄灭

float curr_temp;
uchar para_temp = 23;

void sys_init();
void key_handle();
float rd_temperature();
void rd_time();
void rel_handle();
void led();

void dsp_smg_bit(uchar pos, val);
void display();//显示功能,分四个大块
void dsp_temp();
void dsp_time();
void dsp_para();
void dsp_min_sec();//长按S17显示分秒

void delay_k(uchar t);//延时t * 10us
void Delay1ms();		//1ms@12.000MHz,延时1ms用于给足数码管足够显示时间

void main()
{
   
   
	sys_init();
	while(1)
	{
   
   
		curr_temp = rd_temperature();
		rd_time();//实时读取时间
		key_handle();
		display();	
		rel_handle();//继电器处理
		led();
	}
}

void led()
{
   
   	
	if (time[0] == 0x00 && time[1] == 0x00)
	{
   
   
		L1_flag = 1;
	}					   
	if (L1_flag)
	{
   
   
		P2 = (P2 & 0x1f) | 0x80;
		L1 = 0;
	}
	else 
	{
   
   
		P2 = (P2 & 0x1f) | 0x80;
		L1 = 1;
	}
	
	if (!mod_flag)
	{
   
   
		P2 = (P2 & 0x1f) | 0x80;
		L2 = 0;
	}
	else 
	{
   
   
	 	P2 = (P2 & 0x1f) | 0x80;
		L2 = 1;
	}
	
	if (led10_flag)
	{
   
   
		//继电器吸附,间隔0.1sL3闪烁
		if (L3_flag)
		{
   
   
			P2 = (P2 & 0x1f) | 0x80;
			L3 = 0;
		}
		else 
			L3 = 1;
	}

	P0 |= 0xf8;
评论 24
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值