《蓝桥杯真题》:2017年单片机省赛(第八届)(内附两种代码实现风格)

本文介绍了一种基于STC15F2K60S2单片机的解决方案,涉及温度传感器DS18B20读取、按键控制的PWM电机速度调整及时间显示。核心代码包括主函数、LED显示、温度读取、延时函数和单总线通信。

有关题目

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

实现代码

注意:①注意修改驱动代码时要留意一下onewire.c中单总线延时函数,是STC89C52RC,还是15系列的,15系列的单片机速度比51快8~12倍,需要修改对应的延时函数。②实现pwm控制电机实现不同的转动速度,通过调占空比实现的。需要结合点击转动的频率。③剩余时间为零时,需要停止pwm信号的输出。

onewire.c中具体修改如下

//单总线延时函数
void Delay_OneWire(unsigned int t) 
{
   
   
	while(t--)
	{
   
   
		signed char i = 0;
			for (i = 0; i < 12; i++);
	}
}

实现风格①main.c

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

#define uchar unsigned char
#define uint unsigned int

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

sbit S7 = P3^0;
sbit S6 = P3^1;
sbit S5 = P3^2;
sbit S4 = P3^3;

uchar temp;//实时温度
uchar time;//倒计时时间
uchar mod = 1;//模式
code uchar tab[] = {
   
   0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf, 0xc6}; 
//-, C  11 12

uchar pwm_val, pwm_cnt = 0;

bit flag_s7 = 0;//初始化0为显示剩余工作时间

void sys_init();//系统初始化
uchar rd_temp();
void key_handle();
void led();

//显示模块
void dsp_smg_bit(uchar pos, val);//位显示数码管
void display();
void dsp_time();
void dsp_temp();
void delay_k(uchar t);
void Delay1ms();		//@12.000MHz


void main()
{
   
   
	sys_init();
	while(1)
	{
   
   
		temp = rd_temp();//实时读取温度
		key_handle();//按键处理
		display();//界面显示
		if (!time)
		{
   
   
			ET1 = 0;
			P34 = 0;
		}
		else 
		{
   
   
			ET1 = 1;
		}
		led();//led显示
	}

}

void led()
{
   
   
	if (time > 0)
	{
   
   
		if (mod == 1)
		{
   
   
			P2 = (P2 & 0x1f) | 0x80;
			L1 = 0;
		}
		else if (mod == 2)
		{
   
   
			P2 = (P2 & 0x1f) | 0x80;
			L2 = 0;
		}
		else if (mod == 3)
		{
   
   
			P2 = (P2 & 0x1f) | 0x80;
			L3 = 0;
		}
	}
	else 
	{
   
   
		P2 = (P2 & 0x1f) | 0x80;
		P0 = 0xff;
	}
	
}


void display()
{
   
   
	if (!flag_s7)
	{
   
   
		dsp_time();
	}
	else 
	{
   
   
		dsp_temp();
	}
}


void dsp_time()
{
   
   
	dsp_smg_bit(1, 11);
	dsp_smg_bit(2, mod);
	dsp_smg_bit(3, 11);
	dsp_smg_bit(4, 10);
	
	dsp_smg_bit(5, 0);
	dsp_smg_bit(6, time / 100);
	dsp_smg_bit(7, time / 10 % 10);
	dsp_smg_bit(8, time % 10);
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值