藍橋杯單片機刷題——通過按鍵觸發串口傳輸電壓值

設計要求

通過內部ADC完成電位器RB2的輸出電壓檢測,并顯示在數碼管上;

通過串口向PC端返回當前檢測的電壓值。

按鍵“S4”定義為發送按鍵,按下按鍵S4,串口向PC端發送當前檢測的電壓值。

串口發送格式:

U:1.25V\r\n

數碼管顯示格式如下圖所示:

電壓為1.25V(數碼管最高位顯示標識符U)

備注

單片機IRC振蕩器頻率設置為12MHz。

????????按鍵模式:BTN;擴展方式:IO模式。

串口波特率:9600。

代碼

sys.h

#ifndef __SYS_H__
#define __SYS_H__#include <STC15F2K60S2.H>
//sys.c
extern bit flag_send;
extern float Vrb2;
void init74hc138(unsigned char n);
void init();
//seg_key.c
void Key_Loop();
void Seg_Loop();
void ui();
//iic.c
float get_Vrb2();
#endif 

main.c

#include "sys.h"
#include "stdio.h"
bit flag1=0;
bit flag2=0;
bit flag3=0;
void Timer0_Init(void)		//100微秒@12.000MHz
{AUXR &= 0x7F;			//定時器時鐘12T模式TMOD &= 0xF0;			//設置定時器模式TL0 = 0x9C;				//設置定時初始值TH0 = 0xFF;				//設置定時初始值TF0 = 0;				//清除TF0標志TR0 = 1;				//定時器0開始計時ET0 = 1;				//使能定時器0中斷EA = 1;
}
void UartInit(void)		//9600bps@12.000MHz
{SCON = 0x50;		//8位數據,可變波特率AUXR |= 0x40;		//定時器時鐘1T模式AUXR &= 0xFE;		//串口1選擇定時器1為波特率發生器TMOD &= 0x0F;		//設置定時器模式TL1 = 0xC7;			//設置定時初始值TH1 = 0xFE;			//設置定時初始值ET1 = 0;			//禁止定時器中斷TR1 = 1;			//定時器1開始計時ES = 1;EA = 1;
}
char putchar(char ch){SBUF=ch;while(!TI);TI=0;return ch;
}
void main(){init();Timer0_Init();UartInit();while(1){if(flag1){flag1=0;Seg_Loop();}if(flag2){flag2=0;Key_Loop();}if(flag3){flag3=0;Vrb2=get_Vrb2();ui();}if(flag_send){flag_send=0;printf("U:%.2fV\r\n",Vrb2);}}
}
void Timer0_Isr(void) interrupt 1
{static unsigned char count1=0;static unsigned char count2=0;static unsigned int count3=0;count1++;count2++;count3++;if(count1==2){count1=0;flag1=1;}if(count2==50){count2=0;flag2=1;}if(count3==1000){count3=0;flag3=1;}
}
void uart() interrupt 4
{if(RI){RI=0;}
}

sys.c

#include "sys.h"
bit flag_send=0;
float Vrb2;
void init74hc138(unsigned char n){P2=(P2&0x1f)|(n<<5);P2&=0x1f;
}
void init(){P0=0x00;init74hc138(5);P0=0xff;init74hc138(4);
}

seg_key.c

#include "sys.h"
code unsigned char Seg_Table[]={0xc0,//00xf9,//10xa4,//20xb0,//30x99,//40x92,//50x82,//60xf8,//70x80,//80x90,//90xc1,//U 100xff //熄滅 11
};
unsigned char Seg_Buff[8]={11,11,11,11,11,11,11,11};
unsigned char keyval,keyold,keyup,keydown;
void Key_Loop(){if(P33==0)keyval=4;keydown=keyval&(keyold^keyval);keyup=~keyval&(keyold^keyval);if(keyval==4&&keyold!=4) flag_send=1;keyold=keyval;keyval=0;
}
void seg(unsigned char addr,num){P0=0xff;init74hc138(7);P0=0x01<<addr;init74hc138(6);P0=Seg_Table[num];if(addr==5) P0&=0x7f;init74hc138(7);
}
void Seg_Loop(){static unsigned char i=0;seg(i,Seg_Buff[i]);i++;if(i==8) i=0;
}
void ui(){Seg_Buff[7]=(int)(Vrb2*100+0.5)%10;Seg_Buff[6]=(int)(Vrb2*10+0.05)%10;Seg_Buff[5]=(int)(Vrb2+0.005)%10;Seg_Buff[4]=11;Seg_Buff[3]=11;Seg_Buff[2]=11;Seg_Buff[1]=11;Seg_Buff[0]=10;
}

iic.c

#include "sys.h"
#include "intrins.h"
#define DELAY_TIME	10
sbit scl=P2^0;
sbit sda=P2^1;
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;EA=0;I2CStart();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*5.0;
}

測評結果

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

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

相關文章

DeepSeek 都開源了哪些技術?

DeepSeek作為中國領先的人工智能企業,通過開源策略推動了全球AI技術的普及與創新。以下是其官方公布的主要開源項目及其技術內容、應用場景和社區反饋的詳細分析: 1. FlashMLA 技術描述:專為Hopper架構GPU優化的高效MLA(Multi-Layer Attention)解碼內核,針對可變長度序列…

【北京市小客車調控網站-注冊/登錄安全分析報告】

前言 由于網站注冊入口容易被黑客攻擊&#xff0c;存在如下安全問題&#xff1a; 暴力破解密碼&#xff0c;造成用戶信息泄露短信盜刷的安全問題&#xff0c;影響業務及導致用戶投訴帶來經濟損失&#xff0c;尤其是后付費客戶&#xff0c;風險巨大&#xff0c;造成虧損無底洞…

【SQL Server 2017】封閉網絡下,數據調研所有數據表實戰(提效400%)

?? 點擊關注不迷路 ?? 點擊關注不迷路 ?? 點擊關注不迷路 文章大綱 一、Microsoft SQL Server-2017,環境搭建命令二、借助 @@VERSION 函數來查看當前版本三、查詢Microsoft SQL Server數據庫、表名、表注釋四、所有數據表取樣(SQL生成),查詢前2條數據,數據取樣五、執…

【網絡協議】WebSocket講解

目錄 webSocket簡介 連接原理解析: 客戶端API 服務端API&#xff08;java&#xff09; 實戰案例 &#xff08;1&#xff09;引入依賴 &#xff08;2&#xff09;編寫服務端邏輯 &#xff08;3&#xff09;注冊配置類 &#xff08;4&#xff09;前端連接 WebSocket 示例…

路由器端口映射設置方法教程,和無公網IP內網穿透實現外網訪問方案步驟

隨著網絡技術的不斷發展&#xff0c;越來越多的個人和企業需要將自己的內部服務器或設備暴露給外部網絡訪問。這時&#xff0c;內網端口映射公網技術就顯得尤為重要。下面&#xff0c;我們將分別詳細介紹&#xff0c;有公網IP時如何設置路由器端口映射&#xff0c;和無公網IP內…

Linux 系統中從源碼編譯安裝軟件

以下是 Linux 系統中 從源碼編譯安裝軟件 的詳細步驟和注意事項&#xff0c;幫助你掌握這一高級操作技能&#xff1a; 一、編譯安裝的核心流程 1. 下載源碼包&#xff08;通常為 .tar.gz/.tar.bz2/.tar.xz&#xff09; 2. 解壓源碼包 3. 進入源碼目錄 4. 配置編譯參數&#xf…

HTTP:二.URI及相關術語

HTTP相關技術和術語 WEB開發語言 **http:**Hyper Text Transfer Protocol 應用層協議,默認端口: 80/tcp WEB前端開發語言: htmlcssjavascripthtml Hyper Text Markup Language 超文本標記語言,編程語言,主要負責實現頁面的結構 范例:html 語言 <html> <h…

Java網絡編程干貨

1.網絡編程是什么 了解 在Java語言中&#xff0c;我們可以使用java.net包下的技術輕松開發出常見的網絡應用程序&#xff0c;從而把分布在不同地理區域的計算機與專門的外部設備用通信線路互連成一個規模大、功能強的網絡系統&#x…

Java—HTML:CSS選擇器

今天我要介紹的知識點內容是Java HTML中的CSS選擇器&#xff1b; CSS選擇器用于定位HTML元素并為其添加樣式。它允許我們控制網頁的顏色、字體、布局和其他視覺元素。通過分離內容與樣式。 下面我將介紹CSS中選擇器的使用&#xff0c;并作舉例說明&#xff1b; 選擇器基本語…

【2025藍橋杯】賽前2小時考點梳理C++版

【2025藍橋杯】賽前2小時考點梳理 1. &#x1f9e9; STL&#xff08;優先級最高&#xff09; 核心容器/函數 vector push_back() / pop_back() / size()string substr(pos, len) / find(str) / queue push() / front() / pop()priority_queue 默認大根堆&#xff0c;小根堆&…

汽車性能的幕后保障:慧通測控電動尾翼綜合力學測試淺析

在汽車性能不斷追求極致的當下&#xff0c;電動尾翼已成為眾多高性能車型以及部分新能源汽車提升空氣動力學表現與操控穩定性的關鍵配置。從炫酷的超跑到注重續航與駕駛體驗的新能源車&#xff0c;電動尾翼正逐漸嶄露頭角。它絕非僅僅是外觀上的裝飾&#xff0c;而是能在車輛行…

2、文件上傳漏洞的防范

原文地址:文件上傳漏洞的防范 更多內容請關注&#xff1a;代碼安全 PHP安全編碼——書寫安全的代碼 文件上傳漏洞的防范 提問 問題1&#xff1a;上傳漏洞是怎么產生的&#xff1f; 問題2&#xff1a;是否可以只用js判斷文件類型而php不判斷&#xff1f; 問題3&#…

06軟件測試需求分析案例-添加用戶

給職業顧問部的老師添加用戶密碼后&#xff0c;他們才能登錄使用該軟件。只有admin賬戶具有添加用戶、修改用戶信息、刪除用戶的權利。admin是經理或團隊的第一個人的賬號&#xff0c;后面招一個教師就添加一個賬號。 通讀需求是提取信息&#xff0c;提出問題&#xff0c;輸出…

Ex-Human:在DigitalOcean云平臺之上,構建下一代 AI 數字人

Ex-Human 正在通過創造極具吸引力和富有同理心的人工智能角色&#xff0c;重新定義人們與人工智能的互動方式。該公司由 Artem Rodichev 創立&#xff0c;讓用戶能夠通過文本、圖像、視頻和音頻創建能互動的獨一無二的數字人物。憑借每月超過一百萬的活躍用戶和五百萬個定制創建…

從零實現HTTP服務器

響應&#xff1a; 第一部分測試代碼&#xff0c;讀取請求 Makefile binhttpserver #生成的可執行程序 ccg #編譯器名稱 LD_FLAGS-stdc11 -lpthread #-DDEBUG1 #鏈接選項 srcmain.cc$(bin):$(src)$(cc) -o $ $^ $(LD_FLAGS).PHONY:clean clean:rm -f $(bin) 1111111 main.cc…

構建高可靠C++服務框架:從日志系統到任務調度器的完整實現

構建高可靠C服務框架&#xff1a;從日志系統到任務調度器的完整實現 一、深度解析示例代碼技術體系 1.1 日志系統的進階應用 示例代碼中的ZRY_LOG_XXX宏展示了基礎日志功能&#xff0c;但在生產環境中我們需要更完善的日志系統&#xff1a; 推薦技術棧組合&#xff1a; sp…

小張的工廠進化史——工廠模式

小張的工廠進化史——工廠模式 一、簡單工廠模式&#xff1a;全能生產線二、工廠方法模式&#xff1a;分品牌代工三、抽象工廠模式&#xff1a;生態產品族四、三種模式核心對比表五、結合Spring實現簡單工廠&#xff08;實踐&#xff09; 小張從華強北起家&#xff0c;最初只有…

Python中的eval()函數詳解

文章目錄 Python中的eval()函數詳解基本語法基本用法安全性問題安全使用建議實際應用場景與exec()的區別性能考慮總結 Python中的eval()函數詳解 eval()是Python的一個內置函數&#xff0c;用于執行字符串形式的Python表達式并返回結果。它是一個強大但需要謹慎使用的函數。 …

銀行業務發展歷史

銀行業務發展歷史 銀行業務的發展可以追溯到古代&#xff0c;但其現代形式的發展可以追溯到中世紀。以下是銀行業務發展的主要歷史階段&#xff1a; 1. 古代和中世紀時期 特點&#xff1a;商人提供貸款和存款服務&#xff0c;充當中間人轉移資金&#xff0c;發行紙幣作為支付…

SQL實戰篇,數據庫在Kooboo中的實際應用(一)

本文將結合實際操作與代碼示例&#xff0c;展示SQL 在 Kooboo 中的實際應用 僅需兩步&#xff1a;動態創建表 基礎查詢&#xff0c;無需復雜配置&#xff0c;快速上手&#xff01; 一、動態創建表&#xff1a;插入數據 Kooboo 支持多種數據庫&#xff0c;以 SQLite 為例&…