昨天晚上把第十一届省赛的题目做完了,乘着省赛之前赶紧给大家分享出来,另外这次的题目参考了一个粉丝的代码,他基本已经实现了大部分的功能了,我完善美化了一下, 特此感谢!!! 另外有想和我交流的同学或者有比较有意思的想法也可以和我说哦! 说不定就碰撞出精彩的火花了呢 嘿嘿嘿~
一、题目
之前的包里没有第十一届的题目,先给大家分享十一届的题目,这个就是你在比赛时候会看到的题目的样子~
链接: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://blog.csdn.net/weixin_45386875/article/details/115748761