当前位置: 首页 > article >正文

蓝桥杯单片机第七届省赛

前言

这套题不难,相对于第六套题这一套比较简单了,但是还是有些小细节要抓

题目

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

OK,以上就是全部的题目了,这套题目相对来说逻辑比较简单,四个按键,S4控制pwm占空比,S5控制计时时间,S6控制开关,S7控制界面的切换,用到了定时器,按键,数码管,led(代码中未体现),DS18B20温度采集,逻辑相对简单,下面看看代码

代码

main.c

#include <REGX52.H>
#include "intrins.h"
#include <onewire.h>
sbit S7 = P3^0;
sbit S6 = P3^1;
sbit S5 = P3^2;
sbit S4 = P3^3;

unsigned char code SMG_duanma[18]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
	0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,
	0xbf,0xff};

void Chushi()//初始化
{
	P2 = 0XA0;P0 = 0X00;
	P2 = 0X80;P0 = 0XFF;
	P2 = 0XC0;P0 = 0XFF;
	P2 = 0XFF;P0 = 0XFF;
}

void HC138(unsigned char n)//138译码器
{
	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;
	}
}

void display(unsigned int pos,m)//数码管基础显示
{
	HC138(6);
	P0 = 0X01 << pos;
	HC138(7);
	P0 = SMG_duanma[m];
}

void delay(unsigned int t)//延时1ms
{
	unsigned char data i, j;
	while(t--)
	{
		_nop_();
		_nop_();
		_nop_();
		i = 11;
		j = 190;
		do
		{
			while (--j);
		} while (--i);		
	}

}
unsigned int temp;
void wendu()//温度采集
{
	int LSB,MSB;
	Init_DS18B20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0x44);
	delay(100);
	Init_DS18B20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0xbe);
	LSB=Read_DS18B20();
	MSB=Read_DS18B20();
	Init_DS18B20();
	temp=MSB;
	temp=(temp<<8)|LSB;
	if((temp&0xf800)==0x0000)
	{
		temp>>=4;
		temp=temp+(LSB&0x0f)*0.0625;
	}
}

unsigned int count_pwm,count_time;
unsigned int K4 = 1,K5 = 1,K7;unsigned int pwm,time = 60;
void key()//按键控制
{
	if(S7 == 0)
	{
		delay(20);
		if(S7 == 0)
		{
			K7++;
			
		}
		while(!S7);
	}
	if(S6 == 0)
	{
		delay(20);
		if(S6 == 0)
		{
			time = 0;
			K5 = 1;
		}
		while(!S6);
	}
		if(S5 == 0)
	{
		delay(20);
		if(S5 == 0)
		{
			K5++;
				switch(K5)
	{
		case 1:time = 60;break;
		case 2:time = 120;break;
		case 3:time = 0;break;
		case 4:K5 = 1;break;
	}	
		}
		while(!S5);
	}
		if(S4 == 0)
	{
		delay(20);
		if(S4 == 0)
		{
			K4++;
		}
		while(!S4);
	}
	switch(K4)
	{
		case 1:pwm = 20;break;
		case 2:pwm = 30;break;
		case 3:pwm = 70;break;
		case 4:K4 = 1;break;
}
}

void Timer0_Init(void)		//5毫秒@11.0592MHz
{
	TMOD &= 0xF0;		//设置定时器模式
	TMOD |= 0x01;			//设置定时器模式
	TL0 = 10240/256;		//设置定时初始值
	TH0 = 10240%256;		//设置定时初始值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
	ET0=1;
	EA=1;
}

void Timer0_Isr(void) interrupt 1
{
	TL0 = 10240/256;		//设置定时初始值
	TH0 = 10240%256;		//设置定时初始值
	count_time++;count_pwm++;
	if(time != 0)
	{
		if(count_time >= 20)
		{
			time--;
			count_time = 0;
		}
		else 
		{
			if(count_pwm < pwm)P3_4 = 1;
			else if(count_pwm>=pwm&&count_pwm <100)P3_4 = 0;
			else if(count_pwm >= 100)count_pwm = 0;
		}
	}
	else if(time == 0)
	{
		P3_4 = 0;
	}
}
void display_f()//显示模块1 
{
	display(0,16);delay(1);
	display(1,K4);delay(1);
	display(2,16);delay(1);
	display(3,17);delay(1);
	display(4,0);delay(1);
	display(5,time/100);delay(1);
	display(6,time%100/10);delay(1);
	display(7,time%10);delay(1);
}

void display_wd()//温度显示模块
{		
	display(0,16);delay(1);
	display(1,4);delay(1);
	display(2,16);delay(1);
	display(3,17);delay(1);
	display(4,17);delay(1);
	display(5,temp/10);delay(1);
	display(6,temp%10);delay(1);
	display(7,12);delay(1);
}

void main()	
{
	Chushi();
	Timer0_Init();
	while(1)
	{	
		key();
		wendu();
		switch(K7)
		{
			case 0:display_f();break;
			case 1:display_wd();break;
			case 2:K7 = 0;break;
		}
	}
}

onewire.h

#ifndef _ONEWIRE_H
#define _ONEWIRE_H

#include "regx52.h"

#define OW_SKIP_ROM 0xcc
#define DS18B20_CONVERT 0x44
#define DS18B20_READ 0xbe

//IC引脚定义
sbit DQ = P1^4;

//函数声明
void Delay_OneWire(unsigned int t);
void Write_DS18B20(unsigned char dat);
bit Init_DS18B20(void);
unsigned char Read_DS18B20(void);

#endif

onewire.c



#include "onewire.h"

//单总线延时函数
void Delay_OneWire(unsigned int t)
{
  while(t--);
}

//DS18B20芯片初始化
bit Init_DS18B20(void)
{
	bit initflag = 0;
	DQ = 1;
	Delay_OneWire(120);
	DQ = 0;
	Delay_OneWire(800); 
	DQ = 1;
	Delay_OneWire(100); 
	initflag = DQ;    
	Delay_OneWire(50);
  
	return initflag;
}

//通过单总线向DS18B20写一个字节
void Write_DS18B20(unsigned char dat)
{
	unsigned char i;
	for(i=0;i<8;i++)
	{
		DQ = 0;
		DQ = dat&0x01;
		Delay_OneWire(50);
		DQ = 1;
		dat >>= 1;
	}
	Delay_OneWire(50);
}

//从DS18B20读取一个字节
unsigned char Read_DS18B20(void)
{
	unsigned char i;
	unsigned char dat;
  
	for(i=0;i<8;i++)
	{
		DQ = 0;
		dat >>= 1;
		DQ = 1;
		if(DQ)
		{
			dat |= 0x80;
		}	    
		Delay_OneWire(50);
	}
	return dat;
}

这道题以上的代码有点bug,大家可以烧写到自己的板子上面看一下,视频不太好上传

这一套题的难度不算很大,但是博主水平有限,大家先凑合着看,如果对大家有什么帮助那是最好的以上所有代码均为自己编写,肯定会有更好的解法,肯定会有,本人水平有限,如果有哪里出错或者有更好的解法可以与我私信或在评论区里进行讨论

上一题:蓝桥杯单片机第六届省赛


http://www.kler.cn/a/530531.html

相关文章:

  • Android 开发:新的一年,新的征程
  • 【小白学AI系列】NLP 核心知识点(六)Softmax函数介绍
  • 计算机毕业设计Python动漫推荐系统 漫画推荐系统 动漫视频推荐系统 机器学习 bilibili动漫爬虫 数据可视化 数据分析 大数据毕业设计
  • gesp(C++六级)(10)洛谷:P10722:[GESP202406 六级] 二叉树
  • MySQL5.5升级到MySQL5.7
  • Kafka SASL/SCRAM介绍
  • MySQL大表优化方案
  • GEE | 计算Sentinel-2的改进型土壤调整植被指数MSAVI
  • Maven全解析:Maven 进阶
  • C++游戏开发实战:从引擎架构到物理碰撞
  • Hot100之矩阵
  • JAVA安全—反射机制攻击链类对象成员变量方法构造方法
  • 第十三章 I 开头的术语
  • 【FreeRTOS 教程 六】二进制信号量与计数信号量
  • 【llm对话系统】大模型 Llama 源码分析之归一化方法 RMS Norm
  • 【C++】类和对象(4) —— 类的默认成员函数(下)
  • 基于python的Kimi AI 聊天应用
  • HTML5 Canvas 与 SVG:让网页图形与动画活跃起来
  • 计算机网络 应用层 笔记1(C/S模型,P2P模型,FTP协议)
  • 搜索功能多模块展示如何实现
  • 谭浩强C语言程序设计(3) 7章
  • 第三百五十八节 JavaFX教程 - JavaFX滑块
  • Maven jar 包下载失败问题处理
  • 四、GPIO中断实现按键功能
  • dup函数和dup2函数复制文件描述符区别
  • 小程序设计和开发:如何研究同类型小程序的优点和不足。