主頁 >  其他 > 藍橋杯

藍橋杯

2021-04-06 12:33:43 其他

第三屆藍橋杯單片機類溫度監控器

題目要求

要實作溫度監控可以將功能模塊化,

前期準備

頭檔案、管腳定義、全域變數定義、函式宣告

#include<STC15F2K60S2.H>
#include"Delay.h"
#include"SelectHC573.h"
#include"Disp_SMG.h"
#include"onewire.h"
#include "iic.h"

sbit S7=P3^0;//按鍵
sbit S6=P3^1;
sbit S5=P3^2;
sbit S4=P3^3;
sbit L1=P0^0;//LED
sbit L2=P0^2;
sbit J=P0^4;//繼電器
unsigned char SMG_DM[18]={
	0xc0,0xf9,0xa4,0xb0,0x99,0x92,
	0x82,0xf8,0x80,0x90,0x88,0x80,
	0xc6,0xc0,0x86,0x8e,0xbf,0x7f
};
unsigned int temp=0;//溫度
unsigned char max=30;//上限
unsigned char min=20;//下限
char a=1;//存盤資料控制位

void Dsip();
void All_Init();

鎖存器選擇函式

//=================================
//函 數 名:鎖存器選擇函式
//功	能:將選擇的鎖存器打開
//輸入引數:所選擇的鎖存器
//輸出引數:無
void SelectHC573(unsigned char n)
{
	switch(n)
	{
		case 0:P2=P2&0x1f;break;		//將打開的鎖存器關閉
		case 4:P2=P2&0x1f|0x80;break;	//打開LED相關的鎖存器
		case 5:P2=P2&0x1f|0xa0;break;	//蜂鳴器、繼電器相關的鎖存器
		case 6:P2=P2&0x1f|0xc0;break;	//數碼管位選
		case 7:P2=P2&0x1f|0xe0;break;	//數碼管段選
	}

}

外設關閉函式

//========================
//函式名:外設初始化函式
//功能:關閉外設
//輸入引數:無
//輸出引數:無
//========================
void All_Init()
{
	SelectHC573(4);
	P0=0xff;//熄滅LED資料
	SelectHC573(0);
	SelectHC573(5);
	P0=0x00;//熄滅蜂鳴器、繼電器資料
	SelectHC573(0);
}

延時函式

//======================
//函式名:延時函式
//功能:延時
//輸入引數:延時大小
//輸出引數:無
void Delay(unsigned char t)
{
	while(t--);
}

功能實作

功能一數碼管顯示

//======================
//函式名:數碼管顯示函式
//功能:傳入引數,讓數碼管顯示
//輸入引數:要顯示的資料,和要顯示的位置
//輸出引數:無
//========================
void Disp_SMG(unsigned char dat,unsigned char pos)
{
	SelectHC573(6);
	P0=0x01<<pos;//要顯示的位置
	SelectHC573(7);
	P0=dat;//要顯示的資料
}

下面這段代碼實作了題目中的要求

//========================
//函式名:顯示
//功能:將要顯示的資料放在一個函式中
//輸入引數:無
//輸出引數:無
//========================
void Dsip()
{
		Disp_SMG(SMG_DM[max/10],0);
		Delay(100);
		Disp_SMG(SMG_DM[max%10],1);
		Delay(100);
		Disp_SMG(SMG_DM[min/10],2);
		Delay(100);
		Disp_SMG(SMG_DM[min%10],3);
		Delay(100);
		Disp_SMG(0xff,4);
		Delay(100);
		Disp_SMG(0xff,5);
		Delay(100);
		Disp_SMG(SMG_DM[temp/10],6);
		Delay(100);
		Disp_SMG(SMG_DM[temp%10],7);
		Delay(100);
}

效果是這樣的

功能二溫度獲取


要實作此功能需要ds18b20數字芯片獲取,

#include "onewire.h"

//單總線延時函式
void Delay_OneWire(unsigned int t)
{
  while(t--);
}

//DS18B20初始化
bit Init_DS18B20(void)
{
	bit initflag = 0;
	DQ = 1;
	Delay_OneWire(144);
	DQ = 0;
	Delay_OneWire(960); 
	DQ = 1;
	Delay_OneWire(120); 
	initflag = DQ;    
	Delay_OneWire(60);
  
	return initflag;
}

//通過單總線寫一個位元組
void Write_DS18B20(unsigned char dat)
{
	unsigned char i;
	for(i=0;i<8;i++)
	{
		DQ = 0;
		DQ = dat&0x01;
		Delay_OneWire(60);
		DQ = 1;
		dat >>= 1;
	}
	Delay_OneWire(60);
}

//讀一個位元組
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(60);
	}
	return dat;
}

上述代碼考試當天會提供,我們只需要自己進行修改即可,(上面的代碼是修改過的)比賽所提供的檔案中onewire.h中沒有宣告函式,需要自己進行宣告
比賽當天提供的代碼是1Hz的,將onewire.c中所有延時函式擴大12倍即可成為12Hz的

溫度獲取

/*
//溫度獲取中的延時函式,
//作用是防止數碼管所顯示的溫度一位特別亮,一位特暗
*/
void Delay_wd(unsigned int t)
{
	while(t--)
	{
		Dsip();
	}
}
//========================
//函式名:溫度獲取函式
//功能:獲取溫度給全域變數temp
//輸入引數:無
//輸出引數:無
//========================
void Ds18B20_temp()
{
	
	unsigned int LSB,MSB;//溫度資料
	Init_DS18B20();//初始化
	Write_DS18B20(0xcc);//跳過ROM指令
	Write_DS18B20(0x44);//開始溫度轉換
	Delay_wd(1000);//稍微延時一下
	
	Init_DS18B20();//初始化
	Write_DS18B20(0xcc);//跳過ROM指令
	Write_DS18B20(0xbe);//讀取高速快取
	
	LSB=Read_DS18B20();//讀取低8位
	MSB=Read_DS18B20();//讀取高8位
	Init_DS18B20();//初始化
	temp=MSB;
	temp=(temp<<8)|LSB;//高8位左移,低四位賦給temp
	temp>>=4;//去掉小數位
}

注意:不要將高位和低位弄反了,不然讀出來的資料是錯誤的

功能三按鍵實作


這個功能很好實作,定義兩個全域變數max\min為上下限溫度,當按鍵按下時數值改變,并且將數值保存在AT24C02中,

void Key()
{
	if(S7==0)
	{
		Delay(10);
		if(S7==0)
		{
			min--;
			a=0;//全域變數,為實作功能四而設定
		}
	}
	if(S6==0)
	{
		Delay(10);
		if(S6==0)
		{
			max--;
			a=0;
		}
	}
	if(S5==0)
	{
		Delay(10);
		if(S5==0)
		{
			min++;
			a=0;
		}
	}
	if(S4==0)
	{
		Delay(10);
		if(S4==0)
		{
			max++;
			a=0;
		}
	}
	if(a==0)//功能四的部分實作
	{
		Write_24c02(0x00,max);//向e2prom寫入溫度上限
		Delay(2000);
		Write_24c02(0x01,min);//寫入溫度下限
		a=2;
	}
}

功能四將資料保存在AT24C02中

#include "iic.h"
void IIC_Start(void)
{
	SDA = 1;
	SCL = 1;
	somenop;
	SDA = 0;
	somenop;
	SCL = 0;	
}
void IIC_Stop(void)
{
	SDA = 0;
	SCL = 1;
	somenop;
	SDA = 1;
}
void IIC_Ack(unsigned char ackbit)
{
	if(ackbit) 
	{	
		SDA = 0;
	}
	else 
	{
		SDA = 1;
	}
	somenop;
	SCL = 1;
	somenop;
	SCL = 0;
	SDA = 1; 
	somenop;
}
bit IIC_WaitAck(void)
{
	SDA = 1;
	somenop;
	SCL = 1;
	somenop;
	if(SDA)    
	{   
		SCL = 0;
		IIC_Stop();
		return 0;
	}
	else  
	{ 
		SCL = 0;
		return 1;
	}
}

void IIC_SendByte(unsigned char byt)
{
	unsigned char i;
	for(i=0;i<8;i++)
	{   
		if(byt&0x80) 
		{	
			SDA = 1;
		}
		else 
		{
			SDA = 0;
		}
		somenop;
		SCL = 1;
		byt <<= 1;
		somenop;
		SCL = 0;
	}
}

unsigned char IIC_RecByte(void)
{
	unsigned char da;
	unsigned char i;
	
	for(i=0;i<8;i++)
	{   
		SCL = 1;
		somenop;
		da <<= 1;
		if(SDA) 
		da |= 0x01;
		SCL = 0;
		somenop;
	}
	return da;
}

這些代碼比賽當天都會提供,需要自己看手冊來實作功能就行,我們要寫的代碼是下面的部分

void Write_24c02(unsigned char seat,unsigned char dat)
{
	IIC_Start();
	IIC_SendByte(0xa0);
	IIC_WaitAck();
	IIC_SendByte(seat);
	IIC_WaitAck();
	IIC_SendByte(dat);
	IIC_WaitAck();
	IIC_Stop();
}
//========================

//========================

void EEPROM_Read(unsigned char* pucBuf,unsigned char addr,
											unsigned char num)
{
IIC_Start();
IIC_SendByte(0xa0);
IIC_WaitAck();
IIC_SendByte(addr);
IIC_WaitAck();
IIC_Start();
IIC_SendByte(0xa1);
IIC_WaitAck();
while(num--)
{
*pucBuf++ = IIC_RecByte();
if(num) 
	IIC_Ack(0);
else IIC_Ack(0);
}
IIC_Stop();
}


其實本質就是時序圖,大概總結了一下,寫入資料的如下
啟動總線-----發送設備地址+寫-----等待應答-----發送資料的儲存地址(0x00-0xFF,256個位元組)-----等待應答-----發送資料-----等待應答-----停止總線
讀入資料如下
啟動總線-----發送設備地址+寫-----等待應答-----發送資料存盤地址-----等待應答-----發送設備地址+讀-----等待應答-----讀取資料-----主機發送是否應答……

功能五、六


自己現在沒有一個直流電機,就用L1、L2d代替超過上限時作業和不作業

void Elect()
{
		if(temp<min)
		{
				All_Init();
				SelectHC573(5);
				J=1;
		}
		else 
		{
				All_Init();
				SelectHC573(5);
				J=0;
		}
		if(temp>max)
		{
			SelectHC573(4);
			P0=0xfd;
		}
		else
		{
			SelectHC573(4);
			P0=0xfe;
		}
}

主函式

void main()
{
	All_Init();

	EEPROM_Read(&max,0x00,1);//讀取溫度上下限
	EEPROM_Read(&min,0x01,1);
	while(1)
	{
		Elect();
		Key();
		Dsip();
		Ds18B20_temp();
	}
}

具體檔案

鏈接:https://pan.baidu.com/s/1pRPqaDrWomakjsXBSTjPgA
提取碼:qwer

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/272955.html

標籤:其他

上一篇:Robomaster裁判系統自定義圖形界面略述

下一篇:【2021-04-05】二進制中的原碼反碼補碼與二進制數的左移右移

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more