第16屆藍橋杯單片機模擬試題Ⅲ

試題

代碼?

sys.h

#ifndef __SYS_H__
#define __SYS_H__#include <STC15F2K60S2.H>
//sys.c
extern unsigned char UI;					//界面標志(0濕度界面、1參數界面、2時間界面)
extern unsigned char time;				//時間間隔(1s~10S)
extern bit ssflag;								//啟動/停止標志(0啟動、1停止)
void init74hc138(unsigned char n);//譯碼器選通
void init();											//系統初始化
void relay(bit flag);							//繼電器吸合控制
void led(unsigned char n);				//LED控制
void led_if();										//led指示燈
//iic.c
extern unsigned char shidu;						//濕度值
extern unsigned char shidu_canshu;		//濕度參數(30%~90%)
extern bit flag_relay;								//繼電器狀態
unsigned char adc(unsigned char addr);//模數轉換選通
float get_Vrb2();											//獲取RB2電壓值
void get_shidu();											//RB2電壓值轉換為濕度數據
//seg_key.c
extern unsigned char Seg_Buff[8];//數碼管緩存
void Key_Loop();								 //按鍵掃描
void Seg_Loop();								 //數碼管刷新
void seg_ui();									 //界面選擇
#endif

main.c

#include "sys.h"
bit flag_seg=0;
bit flag_key=0;
bit flag_shidu=0;
bit flag_relay_con=0;
void Timer0_Init(void)		//100微秒@12.000MHz
{AUXR |= 0x80;			//定時器時鐘1T模式TMOD &= 0xF0;			//設置定時器模式TL0 = 0x50;				//設置定時初始值TH0 = 0xFB;				//設置定時初始值TF0 = 0;				//清除TF0標志TR0 = 1;				//定時器0開始計時ET0 = 1;				//使能定時器0中斷EA = 1;
}
void main(){init();Timer0_Init();get_shidu();while(1){if(flag_seg){flag_seg=0;Seg_Loop();}if(flag_key){flag_key=0;Key_Loop();seg_ui();}if(flag_shidu){flag_shidu=0;get_shidu();seg_ui();}if(flag_relay_con){flag_relay_con=0;flag_relay=0;relay(0);}led_if();}
}
void Timer0_Isr(void) interrupt 1
{static unsigned char count1=0;static unsigned char count2=0;static unsigned int count3=0;static unsigned int count4=0;count1++;count2++;count3++;if(count1==2){count1=0;flag_seg=1;}if(count2==50){count2=0;flag_key=1;}if(count3==1000){count3=0;flag_shidu=1;}if(flag_relay){count4++;if(count4==((unsigned int)time*10000)){count4=0;flag_relay_con=1;}}
}

sys.c

#include "sys.h"
unsigned char UI=0;
unsigned char time=3;
bit ssflag=1;
void init74hc138(unsigned char n){P2=(P2&0x1f)|(n<<5);P2&=0x1f;
}
void init(){P0=0x00;init74hc138(5);P0=0xff;init74hc138(4);
}
void relay(bit flag){if(flag) P0=0x10;else P0=0x00;init74hc138(5);
}
void led(unsigned char n){P0=~(0x01<<(n-1));init74hc138(4);
}
void led_if(){switch(UI){case 0:led(1);break;case 1:led(2);break;case 2:led(3);break;}if(!ssflag) led(8);
}

seg_key.c

#include "sys.h"
sbit COL1=P4^4;
sbit COL2=P4^2;
sbit ROW3=P3^2;
sbit ROW4=P3^3;
code unsigned char Seg_Table[]={0xc0,//00xf9,//10xa4,//20xb0,//30x99,//40x92,//50x82,//60xf8,//70x80,//80x90,//90xc6,//C 100x86,//E 11 0x89,//H 120xff	//熄滅 13
};
unsigned char Seg_Buff[8]={13,13,13,13,13,13,13,13};
unsigned char keyval,keyold,keyup,keydown;
unsigned char key_scan(){COL1=0;COL2=1;if(ROW4==0) return 4;if(ROW3==0) return 5;COL1=1;COL2=0;if(ROW4==0) return 8;if(ROW3==0) return 9;return 0;
}
void Key_Loop(){keyval=key_scan();keydown=keyval&(keyold^keyval);keyup=~keyval&(keyold^keyval);//s4為界面切換按鍵if(keyval==4&&keyold!=4){UI++;if(UI==3) UI=0;}//s5為啟動停止按鍵if(keyval==5&&keyold!=5){ssflag=!ssflag;}//s8為減按鍵if(keyval==8&&keyold!=8){if(UI==1){if(shidu_canshu>30)shidu_canshu-=5;elseshidu_canshu=90;}else if(UI==2){if(time>1)time--;elsetime=10;}}//s9為加按鍵if(keyval==9&&keyold!=9){if(UI==1){if(shidu_canshu<90)shidu_canshu+=5;elseshidu_canshu=30;}else if(UI==2){if(time<10)time++;elsetime=1;}}keyold=keyval;keyval=0;
}
void seg(unsigned char addr,num){P0=0xff;init74hc138(7);P0=0x01<<addr;init74hc138(6);P0=Seg_Table[num];init74hc138(7);
}
void Seg_Loop(){static unsigned char i=0;seg(i,Seg_Buff[i]);i++;if(i==8) i=0;
}
//濕度界面
void ui0(){Seg_Buff[7]=shidu%10;Seg_Buff[6]=shidu/10;Seg_Buff[5]=13;Seg_Buff[4]=13;Seg_Buff[3]=13;Seg_Buff[2]=13;Seg_Buff[1]=13;Seg_Buff[0]=10;//C
}
//參數界面
void ui1(){Seg_Buff[7]=shidu_canshu%10;Seg_Buff[6]=shidu_canshu/10;Seg_Buff[5]=13;Seg_Buff[4]=13;Seg_Buff[3]=13;Seg_Buff[2]=13;Seg_Buff[1]=13;Seg_Buff[0]=11;//E
}
//參數界面
void ui2(){Seg_Buff[7]=time%10;if(time<10)Seg_Buff[6]=13;elseSeg_Buff[6]=1;Seg_Buff[5]=13;Seg_Buff[4]=13;Seg_Buff[3]=13;Seg_Buff[2]=13;Seg_Buff[1]=13;Seg_Buff[0]=12;//H
}
void seg_ui(){switch(UI){case 0:ui0();break;case 1:ui1();break;case 2:ui2();break;}
}

ii.c

#include "sys.h"
#include "intrins.h"
#define DELAY_TIME	10
sbit scl=P2^0;
sbit sda=P2^1;
unsigned char shidu;
unsigned char shidu_canshu=50;
bit flag_relay=0;
static void I2C_Delay(unsigned char n)
{do{_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();		}while(n--);      	
}
void I2CStart(void)
{sda = 1;scl = 1;I2C_Delay(DELAY_TIME);sda = 0;I2C_Delay(DELAY_TIME);scl = 0;    
}
void I2CStop(void)
{sda = 0;scl = 1;I2C_Delay(DELAY_TIME);sda = 1;I2C_Delay(DELAY_TIME);
}
void I2CSendByte(unsigned char byt)
{unsigned char i;for(i=0; i<8; i++){scl = 0;I2C_Delay(DELAY_TIME);if(byt & 0x80){sda = 1;}else{sda = 0;}I2C_Delay(DELAY_TIME);scl = 1;byt <<= 1;I2C_Delay(DELAY_TIME);}scl = 0;  
}
unsigned char I2CReceiveByte(void)
{unsigned char da;unsigned char i;for(i=0;i<8;i++){   scl = 1;I2C_Delay(DELAY_TIME);da <<= 1;if(sda) da |= 0x01;scl = 0;I2C_Delay(DELAY_TIME);}return da;    
}
unsigned char I2CWaitAck(void)
{unsigned char ackbit;scl = 1;I2C_Delay(DELAY_TIME);ackbit = sda; scl = 0;I2C_Delay(DELAY_TIME);return ackbit;
}
void I2CSendAck(unsigned char ackbit)
{scl = 0;sda = ackbit; I2C_Delay(DELAY_TIME);scl = 1;I2C_Delay(DELAY_TIME);scl = 0; sda = 1;I2C_Delay(DELAY_TIME);
}
unsigned char adc(unsigned char addr){unsigned char temp;I2CStart();EA = 0;I2CSendByte(0x90);I2CWaitAck();I2CSendByte(addr);I2CWaitAck();I2CStart();I2CSendByte(0x91);I2CWaitAck();temp=I2CReceiveByte();I2CSendAck(1);I2CStop();EA = 1;return temp;
}
float get_Vrb2(){return (float)adc(3)/255.0*5.0;
}
void get_shidu(){ float temp;temp=get_Vrb2();if(temp<1.0){shidu=10;}else if(temp<=4){shidu=(unsigned char)(80.0/3.0*(temp-1)+10+0.5);}else{shidu=90;}if(ssflag){flag_relay=0;relay(0);}else{if(shidu<shidu_canshu&&!flag_relay){flag_relay=1;relay(1);}}
}

測評結果

尚待解決的問題

?最后一項測評一直不正確,在板子上顯示正常。感謝各位大佬們批評指導

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/75710.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/75710.shtml
英文地址,請注明出處:http://en.pswp.cn/web/75710.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Node.js中URL模塊詳解

Node.js 中 URL 模塊全部 API 詳解 1. URL 類 const { URL } require(url);// 1. 創建 URL 對象 const url new URL(https://www.example.com:8080/path?queryvalue#hash);// 2. URL 屬性 console.log(協議:, url.protocol); // https: console.log(主機名:, url.hos…

Java接口性能優化面試問題集錦:高頻考點與深度解析

1. 如何定位接口性能瓶頸&#xff1f;常用哪些工具&#xff1f; 考察點&#xff1a;性能分析工具的使用與問題定位能力。 核心答案&#xff1a; 工具&#xff1a;Arthas&#xff08;在線診斷&#xff09;、JProfiler&#xff08;內存與CPU分析&#xff09;、VisualVM、Prometh…

WheatA小麥芽:農業氣象大數據下載器

今天為大家介紹的軟件是WheatA小麥芽&#xff1a;專業純凈的農業氣象大數據系統。下面&#xff0c;我們將從軟件的主要功能、支持的系統、軟件官網等方面對其進行簡單的介紹。 主要內容來源于軟件官網&#xff1a;WheatA小麥芽的官方網站是http://www.wheata.cn/ &#xff0c;…

Python10天突擊--Day 2: 實現觀察者模式

以下是 Python 實現觀察者模式的完整方案&#xff0c;包含同步/異步支持、類型注解、線程安全等特性&#xff1a; 1. 經典觀察者模式實現 from abc import ABC, abstractmethod from typing import List, Anyclass Observer(ABC):"""觀察者抽象基類""…

CST1019.基于Spring Boot+Vue智能洗車管理系統

計算機/JAVA畢業設計 【CST1019.基于Spring BootVue智能洗車管理系統】 【項目介紹】 智能洗車管理系統&#xff0c;基于 Spring Boot Vue 實現&#xff0c;功能豐富、界面精美 【業務模塊】 系統共有三類用戶&#xff0c;分別是&#xff1a;管理員用戶、普通用戶、工人用戶&…

Windows上使用Qt搭建ARM開發環境

在 Windows 上使用 Qt 和 g++-arm-linux-gnueabihf 進行 ARM Linux 交叉編譯(例如針對樹莓派或嵌入式設備),需要配置 交叉編譯工具鏈 和 Qt for ARM Linux。以下是詳細步驟: 1. 安裝工具鏈 方法 1:使用 MSYS2(推薦) MSYS2 提供 mingw-w64 的 ARM Linux 交叉編譯工具鏈…

Python爬蟲教程011:scrapy爬取當當網數據開啟多條管道下載及下載多頁數據

文章目錄 3.6.4 開啟多條管道下載3.6.5 下載多頁數據3.6.6 完整項目下載3.6.4 開啟多條管道下載 在pipelines.py中新建管道類(用來下載圖書封面圖片): # 多條管道開啟 # 要在settings.py中開啟管道 class DangdangDownloadPipeline:def process_item(self, item, spider):…

Mysql -- 基礎

SQL SQL通用語法&#xff1a; SQL分類&#xff1a; DDL: 數據庫操作 查詢&#xff1a; SHOW DATABASES&#xff1b; 創建&#xff1a; CREATE DATABASE[IF NOT EXISTS] 數據庫名 [DEFAULT CHARSET字符集] [COLLATE 排序規則]&#xff1b; 刪除&#xff1a; DROP DATABA…

實操(環境變量)Linux

環境變量概念 我們用語言寫的文件編好后變成了程序&#xff0c;./ 運行的時候他就會變成一個進程被操作系統調度并運行&#xff0c;運行完畢進程相關資源被釋放&#xff0c;因為它是一個bash的子進程&#xff0c;所以它退出之后進入僵尸狀態&#xff0c;bash回收他的退出結果&…

torch.cat和torch.stack的區別

torch.cat 和 torch.stack 是 PyTorch 中用于組合張量的兩個常用函數&#xff0c;它們的核心區別在于輸入張量的維度和輸出張量的維度變化。以下是詳細對比&#xff1a; 1. torch.cat (Concatenate) 作用&#xff1a;沿現有維度拼接多個張量&#xff0c;不創建新維度 輸入要求…

深入解析@Validated注解:Spring 驗證機制的核心工具

一、注解出處與核心定位 1. 注解來源 ? 所屬框架&#xff1a;Validated 是 Spring Framework 提供的注解&#xff08;org.springframework.validation.annotation 包下&#xff09;。 ? 核心定位&#xff1a; 作為 Spring 對 JSR-380&#xff08;Bean Validation 2.0&#…

2025年認證杯數學建模競賽A題完整分析論文(含模型、可運行代碼)(共32頁)

2025年認證杯數學建模競賽A題完整分析論文 目錄 摘要 一、問題分析 二、問題重述 三、模型假設 四、 模型建立與求解 4.1問題1 4.1.1問題1解析 4.1.2問題1模型建立 4.1.3問題1樣例代碼&#xff08;僅供參考&#xff09; 4.1.4問題1求解結果分析&#xff08…

Google A2A協議,是為了戰略性占領標準?

一、導讀 2025 年 4 月 9 日&#xff0c;Google 正式發布了 Agent2Agent&#xff08;A2A&#xff09;協議。 A2A 協議致力于打破智能體之間的隔閡&#xff0c;讓它們能夠跨越框架和供應商的限制&#xff0c;以一種標準化、開放的方式進行溝通與協作 截止到現在&#xff0c;代…

Ansible:roles角色

文章目錄 Roles角色Ansible Roles目錄編排Roles各目錄作用創建 roleplaybook調用角色調用角色方法1&#xff1a;調用角色方法2&#xff1a;調用角色方法3&#xff1a; roles 中 tags 使用實戰案例 Roles角色 角色是ansible自1.2版本引入的新特性&#xff0c;用于層次性、結構化…

MCU的USB接口作為 USB CDC串口輸出

引用&#xff1a; https://microchip-mplab-harmony.github.io/usb_apps_device/apps/usb_uart_bridge_dual/readme.html STM32 USB使用記錄&#xff1a;使用CDC類虛擬串口&#xff08;VCP&#xff09;進行通訊_stm32 usb使用記錄:使用cdc類虛擬串口(vcp)進行通訊-CSDN博客 前…

深度解析強化學習:原理、算法與實戰

深度解析強化學習:原理、算法與實戰 0. 前言1. 強化學習基礎1.1 基本概念1.2 馬爾科夫決策過程1.3 目標函數1.4 智能體學習過程2. 計算狀態值3. 計算狀態-動作值4. Q 學習4.1 Q 值4.2 使用 Q 學習進行 frozen lake 游戲4.3. frozen lake 問題4.4 實現 Q 學習小結系列鏈接0. 前…

UE5藍圖之間的通信------接口

一、創建藍圖接口 二、雙擊創建的藍圖接口&#xff0c;添加函數&#xff0c;并重命名新函數。 三、在一個藍圖&#xff08;如玩家角色藍圖&#xff09;中實現接口&#xff0c;如下圖&#xff1a; 步驟一&#xff1a;點擊類設置 步驟二&#xff1a;在細節面板已經實現的接口中…

2025 年“認證杯”數學中國數學建模網絡挑戰賽 A題 小行星軌跡預測

近地小行星&#xff08; Near Earth Asteroids, NEAs &#xff09;是軌道相對接近地球的小行 星&#xff0c;它的正式定義為橢圓軌道的近日距不大于 1.3 天文單位&#xff08; AU &#xff09;的小行星。 其中軌道與地球軌道最近距離小于 0.05A 且直徑大于 140 米的小行星被…

Axure中繼器(Repeater): 列表多選和 列表查詢

文章目錄 引言I 列表多選添加選中交互事件添加未選中交互事件II 列表查詢知識點操作說明引言 基于鼠標點擊交互事件實現列表多選列表查詢 I 列表多選 添加選中交互事件 給列標題第一列多選框元件命名為ckeck,并同時添加選中交互事件; 同步添加設置選擇/選中動作,目標元件選…

windows11下pytorch(cpu)安裝

先裝anaconda 見最下方 Pytorch 官網&#xff1a;PyTorch 找到下圖&#xff08;不要求版本一樣&#xff09;&#xff08;我的電腦是集顯&#xff08;有navdia的裝gpu&#xff09;&#xff0c;裝cpu&#xff09; 查看已有環境列表 創建環境 conda create –n 虛擬環境名字(…