藍橋杯比賽 單片機組 第十一屆最新還熱乎著的省賽題目解答來嘍~(代碼加注釋)
- 一、題目
- 二、hex檔案
- 三、主函式實作
- 四、整個工程檔案
- 最后
- 輔導來嘍~
? 昨天晚上把第十一屆省賽的題目做完了,乘著省賽之前趕緊給大家分享出來,另外這次的題目參考了一個粉絲的代碼,他基本已經實作了大部分的功能了,我完善美化了一下, 特此感謝!!! 另外有想和我交流的同學或者有比較有意思的想法也可以和我說哦! 說不定就碰撞出精彩的火花了呢 嘿嘿嘿~
?
一、題目
? 之前的包里沒有第十一屆的題目,先給大家分享十一屆的題目,這個就是你在比賽時候會看到的題目的樣子~
鏈接:https://pan.baidu.com/s/1ryxOEebvMgbl9FsmfToY9A
提取碼:l4l3
二、hex檔案
讀者下載這個檔案然后用燒錄軟體直接燒入單片機就可以用了!
鏈接:https://pan.baidu.com/s/1erCgBBewaNLJZWcitUf3uQ
提取碼:qp88
三、主函式實作
? 提示:比賽程序中,僅僅主函式修改可能不夠,有的時候需要注意,比賽官方給的各個驅動的代碼是否寫完整了,比如有時候,它的.h檔案中就沒有把這些寫全,故意注釋掉,你需要去對應的.c檔案里找都需要一些什么函式,一個個都補全了才行,

? 另外,我的代碼都是完全在一個檔案中寫完的,所以各位讀者大大用起來就比較方便,可以直接拷貝我的.c檔案也可以把內容復制粘貼走,放到你想要的地方去,
?
上代碼:
#include "reg52.h"
#include "iic.h"
sfr P4 = 0xC0;
sbit R1 = P3^0;
sbit R2 = P3^1;
sbit R3 = P3^2;
sbit R4 = P3^3;
sbit C1 = P4^4;
sbit C2 = P4^2;
sbit C3 = P3^5;
sbit C4 = P3^4;
sbit L1 = P0^0;
sbit L2 = P0^1;
sbit L3 = P0^2;
unsigned int count_L1 = 0; //L1計數
bit L1_flag = 0; //L1點亮標志位
unsigned char mode_s12 = 0; //S12按鍵模式
unsigned int dat_rb2 = 0; //rb2阻值
unsigned int dat_v = 0; //電壓資料
int dat_set = 200; //電壓設定資料
unsigned int count = 0; //計數引數
unsigned char code SMG_duama[18]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,0xbf,0x7f};//數碼管段碼不帶小數點
unsigned char code SMG_DOT[10] ={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//數碼管段碼帶小數點
bit dat_v_pflag = 0; //0表示dat_v為沒有大于dat_set
unsigned char invalid_key = 0; //無效按鍵次數
//==============================================
void Delay(unsigned int t)
{
while(t--);
}
void SelectHC573(unsigned char channel)
{
switch(channel)
{
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;
case 0:P2 = (P2 & 0x1f) | 0x00;break;
}
}
void DisplaySMG_Bit(unsigned char value,unsigned char pos)
{
SelectHC573(7);
P0 = 0xff;
SelectHC573(6);
P0 = 0x01 << pos;
SelectHC573(7);
P0 = value;
SelectHC573(0);
}
void CloseALL()
{
SelectHC573(6);
P0 = 0xff;
SelectHC573(7);
P0 = 0xff;
}
//=============================================
//==========定時器及中斷服務函式===============
void InitTimer0()
{
TMOD = 0x01;
TH0 = (65535 - 10000) / 256;
TL0 = (65535 - 10000) % 256;
EA = 1;
ET0 = 1;
}
void ServiceTimer0() interrupt 1
{
TH0 = (65535 - 10000) / 256;
TL0 = (65535 - 10000) % 256;
count_L1++;
if(count_L1 >= 500)
{
count_L1 = 0;
L1_flag = 1;
TR0 = 0;
}
}
//=============================================
//==========24C02相關函式======================
void Write_24C02(unsigned char addr,unsigned char dat)
{
IIC_Start();
IIC_SendByte(0xa0);
IIC_WaitAck();
IIC_SendByte(addr);
IIC_WaitAck();
IIC_SendByte(dat);
IIC_WaitAck();
IIC_Stop();
}
unsigned char Read_24C02(unsigned char addr)
{
unsigned char temp;
IIC_Start();
IIC_SendByte(0xa0);
IIC_WaitAck();
IIC_SendByte(addr);
IIC_WaitAck();
IIC_Start();
IIC_SendByte(0xa1);
IIC_WaitAck();
temp = IIC_RecByte();
IIC_SendAck(1);
IIC_Stop();
return temp;
}
//=============================================
//==========ADC電壓輸出函式====================
void Read_rb2()
{
IIC_Start();
IIC_SendByte(0x90);
IIC_WaitAck();
IIC_SendByte(0x43);
IIC_WaitAck();
IIC_Stop();
IIC_Start();
IIC_SendByte(0x91);
IIC_WaitAck();
dat_rb2 = IIC_RecByte();
IIC_SendAck(1);
IIC_Stop();
}
//=============================================
//==========數碼管顯示函式=====================
void Display_v()//rb2輸出電壓顯示函式
{
DisplaySMG_Bit(0xc1,0);Delay(500);
DisplaySMG_Bit(0xff,1);Delay(500);
DisplaySMG_Bit(0xff,2);Delay(500);
DisplaySMG_Bit(0xff,3);Delay(500);
DisplaySMG_Bit(0xff,4);Delay(500);
DisplaySMG_Bit(SMG_DOT[dat_v / 100],5);Delay(500);
DisplaySMG_Bit(SMG_duama[(dat_v / 10) % 10],6);Delay(500);
DisplaySMG_Bit(SMG_duama[dat_v % 10],7);Delay(500);
CloseALL();
}
void Display_set()//電壓設定顯示函式
{
DisplaySMG_Bit(0x8c,0);Delay(500);
DisplaySMG_Bit(0xff,1);Delay(500);
DisplaySMG_Bit(0xff,2);Delay(500);
DisplaySMG_Bit(0xff,3);Delay(500);
DisplaySMG_Bit(0xff,4);Delay(500);
DisplaySMG_Bit(SMG_DOT[dat_set / 100],5);Delay(500);
DisplaySMG_Bit(SMG_duama[(dat_set / 10) % 10],6);Delay(500);
DisplaySMG_Bit(SMG_duama[dat_set % 10],7);Delay(500);
CloseALL();
}
void Display_count()//計數顯示
{
DisplaySMG_Bit(0x89,0);Delay(500);
DisplaySMG_Bit(0xff,1);Delay(500);
DisplaySMG_Bit(0xff,2);Delay(500);
DisplaySMG_Bit(0xff,3);Delay(500);
DisplaySMG_Bit(0xff,4);Delay(500);
if(count > 99)
{
DisplaySMG_Bit(SMG_duama[(count / 100) % 10],5);Delay(500);
}
if(count > 9)
{
DisplaySMG_Bit(SMG_duama[(count / 10) % 10],6);Delay(500);
}
DisplaySMG_Bit(SMG_duama[count % 10],7);Delay(500);
CloseALL();
}
void Display()//數碼管顯示函式
{
if(mode_s12 == 0)
{
Read_rb2();
dat_v = dat_rb2 * 1.961;
Display_v();
}
else if(mode_s12 == 1)
{
Display_set();
}
else if(mode_s12 == 2)
{
Display_count();
}
}
//=============================================
//==============矩陣鍵盤掃描函式===============
void ArrayKeyScan()
{
R4 = 0;
R2 = R3 = R1 = 1;
C1 = C2 = C3 = C4 = 1;
if(C3 == 0)//S12被按下
{
Delay(100);
if(C3 == 0)
{
while(C3 == 0)
{
Display();
}
if(mode_s12 == 0)
{
mode_s12 = 1;
}
else if(mode_s12 == 1)
{
mode_s12 = 2;
Write_24C02(0x00,dat_set / 10);
Delay(1000);
}
else if(mode_s12 == 2)
{
mode_s12 = 0;
}
invalid_key = 0;
}
}
else if(C4 == 0)//S16被按下,加
{
Delay(100);
if(C4 == 0)
{
while(C4 == 0)
{
Display();
}
if(mode_s12 == 1)
{
dat_set = dat_set + 50;
if(dat_set >= 550)
{
dat_set = 0;
}
invalid_key = 0;
}
else
{
invalid_key ++;
}
}
}
R3 = 0;
R2 = R4 = R1 = 1;
C1 = C2 = C3 = C4 = 1;
if(C3 == 0)//S13被按下,計數清零
{
Delay(100);
if(C3 == 0)
{
while(C3 == 0)
{
Display();
}
if(mode_s12 == 2)
{
count = 0;
invalid_key = 0;
}
else
{
invalid_key ++;
}
}
}
else if(C4 == 0)//S17被按下,減
{
Delay(100);
if(C4 == 0)
{
while(C4 == 0)
{
Display();
}
if(mode_s12 == 1)
{
dat_set = dat_set - 50;
if(dat_set < 0)
{
dat_set = 500;
}
invalid_key = 0;
}
else
{
invalid_key ++;
}
}
}
}
//=============================================
//===============燈顯示函式====================
void LedRunning ()
{
SelectHC573(4);
if(dat_v < dat_set)
{
TR0 = 1;
}
else
{
TR0 = 0;
count_L1 = 0;
L1_flag = 0;
}
if (L1_flag == 1)
{
L1 = 0;
}
else
{
L1 = 1;
}
if ((count % 2 ) == 1)
{
L2 = 0;
}
else
{
L2 = 1;
}
if (invalid_key >= 3)
{
L3 = 0;
}
else
{
L3 = 1;
}
SelectHC573(0);
}
//=============================================
//===========系統初始化函式====================
void InitSystem()
{
SelectHC573(5);
P0 = 0x00;
SelectHC573(4);
P0 = 0xff;
SelectHC573(0);
}
//=============================================
void main()
{
InitSystem();
InitTimer0();
dat_set = Read_24C02(0x00) * 10;
while(1)
{
Read_rb2();
dat_v = dat_rb2 * 1.961;
if (dat_v > dat_set)
{
dat_v_pflag = 1;
}
else if (dat_v <= dat_set)
{
if (dat_v_pflag == 1)
{
count++;
dat_v_pflag = 0;
}
}
Display();
ArrayKeyScan();
LedRunning ();
}
}
//==========================================================
四、整個工程檔案
鏈接:https://pan.baidu.com/s/1DhpoIrMFheCEi0ZzbFKlRA
提取碼:x293
?直接打開這專案如果失敗的話,可能是因為keil使用版本問題,我用的是keil3,出現問題的話,可以直接拷貝.c檔案的內容,前面我也說了,我的實作程序我在一個.c檔案中實作的,方便讀者大大取用!

?
最后
??到此,所有的比較新的省賽題目就到位啦~
??另外,有需要的小伙伴可以隨時評論或者私信我,討論學習程序中的問題,我會盡我所能提供一些幫助的~
?
輔導來嘍~
據各位讀者大大的反饋,我和大部分讀者大大的代碼套路都比較像,所以看得比較順眼,挺多童鞋在我這里獲得了或多或少的幫助,這讓我非常非常的開心,后天就省賽啦,提前祝大家省一啊!!!最后把我微信給大家,有問題可以直接加我微信,我可以給大家解決大家比賽程序中的問題,直接改你出問題的代碼都可以的哦~ryc875327878,驗證訊息寫csdn 的id就可以啦!!!
?
溫馨提示:
??我還有學python的,經常也會發一些python的相關內容,之后我會分享一些python的系列文章,關注我不容易讓文章走丟哦!
?
藍橋杯比賽 單片機組 歷屆省賽題目解答(代碼加注釋)剩余參見——https://blog.csdn.net/weixin_45386875/article/details/114136549
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/277073.html
標籤:其他
