提示:一个第十三届蓝桥杯单片机  考生的考后总结

文章目录

  • 前言
  • 一、第十三届考的是什么?
  • 二、数据代码
  • 总结


一、第十三届考的是什么?

1.电位器RB2的电压测量,用DAC输出

2.超声波测距

3.数码管

4.LED灯

5.定时器

二、数据代码

1,代码  MAIN

#include "stc15.h"
#include "iic.h"
#define uchar unsigned char
#define uint unsigned intuchar code SMG_Duanma[22]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
0x88,0x80,0xc6,0xc0,0x86,0x8e,0xbf,0x7f,0xc1,0xc3,0x8c
};  //ULPuchar Speed=340;sbit S4 = P3^3;
sbit S5 = P3^2;
sbit S6 = P3^1;
sbit S7 = P3^0;sbit L1 = P0^0;
sbit L2 = P0^1;
sbit L3 = P0^2;
sbit L8 = P0^7;sbit TX = P1^0;
sbit RX = P1^1;uchar smg_flag=0;                 //数码管显示内容标志量
uchar model_flag=0;                //参数上下限标志量uint rb2=0;                          //显示电压值
uchar Dis_flag=0;                  //距离模式转换量
uint distance=0;                   //距离显示值uint count_t=0;                     //计数值
uint dat=0;
uchar count_d=0,count_led=0;        //计算距离所用时间,灯亮的持续时间
bit LED_flag=0;                     //灯亮标志位
uint DAC=0;                          //DAC输出值
uchar Umax = 45;
uchar Umin = 5;void Scankey();
void Display();
void Read_RB2();
void InitHC138(uchar n);void Timer0Init(void);
void LED_function();
void PAN_duan();
void Jud_CONTI();
void Measure_DIS();void main()
{InitHC138(4);P0 = 0xff;Timer0Init();LED_function();while(1){Jud_CONTI();PAN_duan();Read_RB2();Display();Scankey();Measure_DIS();}
}void InitHC138(uchar n)
{switch(n){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;}
}
void Delay100us(uint t)        //@11.0592MHz
{unsigned char i, j;uint n;for(n=0;n<t;n++){_nop_();_nop_();i = 2;j = 15;do{while (--j);} while (--i);
}
}void SMG_BIT(uchar pos,dat)
{InitHC138(6);P0 = 0x00;P0 = 0x01 << pos;InitHC138(7);P0 = 0xff;P0 = SMG_Duanma[dat];Delay100us(25);P0 = 0xff;
}void Display()
{if(smg_flag==0)              //电压显示{InitHC138(4);L1 = 0;L2 = 1;L3 = 1;SMG_BIT(0,18);InitHC138(6);P0 = 0x00;P0 = 0x01 << 5;InitHC138(7);P0 = 0xff;P0 = SMG_Duanma[rb2/100%10]&(~0x80);Delay100us(25);P0 = 0xff;SMG_BIT(6,rb2/10%10);SMG_BIT(7,rb2%10);}else if(smg_flag==1)        //距离显示{InitHC138(4);L1 = 1;L2 = 0;L3 = 1;if(Dis_flag==0)        //连续测量标志位{SMG_BIT(0,19);if((distance /100) == 0)  //判断距离长度{SMG_BIT(6,distance/10);SMG_BIT(7,distance%10);}else {SMG_BIT(6,distance/100);SMG_BIT(6,distance/10%10);SMG_BIT(7,distance%10);}}else{SMG_BIT(0,19);SMG_BIT(5,10);SMG_BIT(6,10);SMG_BIT(7,10);}}else                        //参数显示{InitHC138(4);L1 = 1;L2 = 1;L3 = 0;if(model_flag==0){SMG_BIT(0,20);InitHC138(6);P0 = 0x00;P0 = 0x01 << 3;InitHC138(7);P0 = 0xff;P0 = SMG_Duanma[Umax/10%10]&(~0x80);Delay100us(25);P0 = 0xff;SMG_BIT(4,Umax%10);P0 = 0xff;}else{SMG_BIT(0,20);InitHC138(6);P0 = 0x00;P0 = 0x01 << 6;InitHC138(7);P0 = 0xff;P0 = SMG_Duanma[Umin/10%10]&(~0x80);Delay100us(25);P0 = 0xff;SMG_BIT(7,Umin%10);P0 = 0xff;}}
}void Timer0Init(void)        //50毫秒@11.0592MHz
{TMOD = 0x01;        //设置定时器模式TL0 = (65535-50000)%256;        //设置定时初值TH0 = (65535-50000)/256;        //设置定时初值TR0 = 1;        //定时器0开始计时EA = 1;ET0 = 1;
}void Service() interrupt 1
{count_led++;if(count_led==2){LED_flag=~LED_flag;   //L8 闪烁控制位count_led=0;}}
uchar Read_PCF8591()
{uchar temp;IIC_Start();IIC_SendByte(0x90);IIC_WaitAck();IIC_SendByte(0x43);IIC_WaitAck();IIC_Start();IIC_SendByte(0x91);IIC_WaitAck();temp = IIC_RecByte();IIC_SendAck(1);IIC_Stop();IIC_Start();IIC_SendByte(0x43);IIC_WaitAck();IIC_SendByte(temp);              //表示选择DAC输出IIC_WaitAck();IIC_SendAck(1);IIC_Stop();return temp;
}float smg_adc=0;    //换算电压值
uchar temp=0;       //获取电压值void Read_RB2()
{temp =  Read_PCF8591();smg_adc = temp * 5.0/255;rb2 = smg_adc*100;}void DelayK(uint t)
{while(t--){Display();}
}void Scankey()
{if(S4 == 0){DelayK(15);if(S4 == 0){smg_flag++;if(smg_flag==3){smg_flag=0;}while(S4 == 0){Display();}}}if(S5 == 0){DelayK(15);if(S5 == 0){model_flag++;if(model_flag==2){model_flag=0;}while(S5 == 0){Display();}}}if(S6 == 0)   //?问题{DelayK(15);if(S6 == 0){if(smg_flag==2){if(model_flag==0){Umax = Umax+5;if(Umax >= 55){Umax=5;}}else{Umin = Umin+5;if(Umin >= 55){Umin=5;}}}while(S6 == 0){Display();}}}if(S7 == 0)   //?{DelayK(15);if(S7 == 0){if(smg_flag==2){if(model_flag==0){Umax = Umax-5;if(Umax <= 0){Umax = 50;}}else{Umin = Umin-5;if(Umin <= 0){Umin = 50;}}}while(S7 == 0){Display();}}}
}void LED_function()
{if(LED_flag==1){InitHC138(4);L8 = 0;}else{InitHC138(4);L8 = 1;}}void Jud_CONTI()
{if((rb2 > Umin)&&(rb2 < Umax)){Dis_flag=0;}else{Dis_flag=1;}
}void PAN_duan()
{if(Dis_flag==0)       //超声波启动位{LED_flag=1;         //启动L8if(distance <= 20){DAC = 200;}else if(distance >= 40){DAC = 400;}else{DAC = 6.7*distance-30;}rb2 = DAC;              //DAC输出显示
}else{    DAC = 0;rb2 = DAC;}}void Send_Wave()             //产生8个40khz超声波
{uchar i;for(i=0;i<8;i++){TX = 1;Delay100us(1);TX = 0;Delay100us(1);}
}void Measure_DIS()
{uint time = 0;TMOD &= 0x0f;         //定时器1模式 13位TL1 = 0x00;TH1 = 0X00;Send_Wave();           //发送超声波信号TR1 = 1;               //开启while((RX == 1)&&(TF1 = 0));//等待超声波信号返回或者等到测量超出范围TR1 = 0;if(Dis_flag==0){if(TF1 == 0){time=TF1;time = (time << 8) | TL1;distance = ((time / 10)*17)/100+3;}else{TF1 = 0;distance = 999;}
}else{TR1 = 0; }}

2.底层驱动代码

IIC.C:

#include "iic.h"#define DELAY_TIME 5//I2C总线内部延时函数
void IIC_Delay(unsigned char i)
{do{_nop_();}while(i--);
}//I2C总线启动信号
void IIC_Start(void)
{SDA = 1;SCL = 1;IIC_Delay(DELAY_TIME);SDA = 0;IIC_Delay(DELAY_TIME);SCL = 0;
}//I2C总线停止信号
void IIC_Stop(void)
{SDA = 0;SCL = 1;IIC_Delay(DELAY_TIME);SDA = 1;IIC_Delay(DELAY_TIME);
}//发送应答或非应答信号
void IIC_SendAck(bit ackbit)
{SCL = 0;SDA = ackbit;                      IIC_Delay(DELAY_TIME);SCL = 1;IIC_Delay(DELAY_TIME);SCL = 0; SDA = 1;IIC_Delay(DELAY_TIME);
}//等待应答
bit IIC_WaitAck(void)
{bit ackbit;SCL  = 1;IIC_Delay(DELAY_TIME);ackbit = SDA;SCL = 0;IIC_Delay(DELAY_TIME);return ackbit;
}//I2C总线发送一个字节数据
void IIC_SendByte(unsigned char byt)
{unsigned char i;for(i=0; i<8; i++){SCL  = 0;IIC_Delay(DELAY_TIME);if(byt & 0x80) SDA  = 1;else SDA  = 0;IIC_Delay(DELAY_TIME);SCL = 1;byt <<= 1;IIC_Delay(DELAY_TIME);}SCL  = 0;
}//I2C总线接收一个字节数据
unsigned char IIC_RecByte(void)
{unsigned char i, da;for(i=0; i<8; i++){   SCL = 1;IIC_Delay(DELAY_TIME);da <<= 1;if(SDA) da |= 1;SCL = 0;IIC_Delay(DELAY_TIME);}return da;
}

考完总结

去年报名了蓝桥杯第十三届比赛,原定于趁寒假这个时间段学完关于这个比赛的所有内容,当时我每天的主要任务就是学习C语言,看书(不是关于单片机的书)。在假期剩余十多天的时候,买的单片机板子到了,我在第一次开到单片机的小灯时开心的笑了,然后,我开始了“玩”单片机的时期,一直到开始考试前,我对于单片机的学习都是很看重的,可是这次的考试,我的发挥并不如意,我只看过一眼的超声波考到了,我在看到试题的时候,就觉得这次就连省三都保不住了,我刚开始的想法是尽量取得省一,还能用公费去北京考试,那可是与我每次上学或者回家的途中可不一样的体验,好吧,下次接着努力吧。


总结

在看了超声波的代码后,感觉到了超声波原理不难,基本代码也不是很难,可是我在准备的时候却没有想着要去准备一下他,想到前两个晚上都在搞温度如何换算才能显示更好的代码,我想对我说,你的学习方法以及思考方式有很大的问题,反正已经考完了,结果不是那么重要了。

现在来说一下我在这次的单片机的学习中的学习方式吧:和之前学习任何一门学科的学习方式没有什么区别,报名了这个比赛,那就学吧,学不懂也得学,我每天都会话大约三个小时时间去学习单片机的原理以及如何敲代码,还有搞清代码的意思,刚开始的学习是跟着小蜜蜂老师,在B站看他的单片机教程,小蜜蜂老师真的是一个非常优秀的老师,我强烈推荐想学习单片机比赛的人跟着小蜜蜂老师学习,不仅内容全,还会有意想不到的惊喜。刚开始真的就是看,看完之后敲代码,看到自己的代码和老师的一样了,一字不差了,就行了,然后我开始学习下一节,直到我看完所有的视频,敲完所有的代码,我开始自己写代码的时候,我发现我根本不会写,然后我将之前写的代码烧录到单片机运行的时候,才发现即使当时我跟老师的代码“一样”,可是我在单片机上呈现的内容完全不一样,甚至刚开始的流水灯,我连流水灯都无法点亮。我产生了或许是老师的代码有一些问题,我就去官网找那些测试代码,在成功显示后,我试图去理解代码的意思,我在延时函数那里卡住了,后来才发现那个直接可以再STC里面复制粘贴(我真的服了我的学习效率,强烈建议大家在学习单片机的时候,边实践边敲代码,不然最后可能只是浪费时间)。我又开始了新一轮的跟着小蜜蜂老师的学习,一般学习敲代码,然后在单片机上呈现出来,听老师讲解代码的意思是什么,并通过修改代码,查看单片机的反应,知道它是什么原理。慢慢的,我发现的单片机也没有那么难,流水灯和数码管的显示不再话下了,我可以真的懂得函数之间的联系是什么,我又想到过单片机比赛会考到超声波,但是我还是没有想去掌握这个内容,相对是等我拿到省一在学习吧。没想到真是因为这个,我才痛失了省一(或许)。打无准备之战,是我的“特色”,也许我要努力改变我的学习方法还有思维习惯,我相信我可以的,加油。

蓝桥杯单片机第十三届第二场考后归纳总结相关推荐

  1. 蓝桥杯单片机第十三届第二场

    第十三届蓝桥杯单片机第二场 文章目录 第十三届蓝桥杯单片机第二场 前言 一.赛题分析 二.程序调试步骤 三.部分源程序 主函数部分 DAC处理函数 数码管处理函数 ADC处理函数 超声波处理函数 LE ...

  2. 蓝桥杯嵌入式第十三届第一场省赛真题

    一.程序设计题 A.CubeMx 1.选用80MHZ时钟.SW线 2.GPIO配置 3.TIM2_Channel2 4.串口USART1 选择PA9.PA10引脚,DAM传输.使能空闲中断 5.中断优 ...

  3. 蓝桥杯单片机第七届省赛-模拟风扇控制系统

    九层妖塔 起于垒土 ● 改编自国信长天蓝桥杯官方蓝皮书例程,按照自己的习惯进行了补充和修改 蓝桥杯单片机第七届省赛-模拟风扇控制系统 Notes1:按键按下后在某些情况下给一定的缓冲时间 Notes2 ...

  4. 2020年第十一届蓝桥杯C/C++ B组第二场省赛真题

    2020年第十一届蓝桥杯C/C++ B组第二场省赛真题 第一题 门牌制作 题目描述 小蓝要为一条街的住户制作门牌号.这条街一共有2020位住户,门牌号从1到2020编号.小蓝制作门牌的方法是先制作0到 ...

  5. 蓝桥杯单片机第十二届第一场省赛--张三填坑

    Less interests.More interest. 蓝桥杯单片机第十二届第一场省赛--张三填坑 坑0 坑1 坑2 坑3 坑4 坑5 坑6 坑7 坑8 仅记录试题中可能存在的坑. 源码和PDF题 ...

  6. 被十三届第二场蓝桥杯背刺了

    考的是AD/DA.超声波哭了!十三年省赛我都写个遍都没有考过超声波,为什么第一场比赛和第二次差距这么大? 国赛才会有的模块,现在在省赛这里考了,相信大家第一眼都是蒙的状态,如果机器阅卷的话想办法解决就 ...

  7. 【蓝桥杯】第十三届蓝桥杯单片机第二次省赛 代码程序

    第十三届蓝桥杯单片机第二次省赛 题目 hex文件 代码 工程文件 B站视频 更多资料 题目 历届的省赛和国赛的题目我已经在前面的文章(点击查看)里给大家分享了(网盘资源),需要的话,直接去下载,我在这 ...

  8. 【蓝桥杯】第十三届蓝桥杯单片机国赛 代码程序

    第十三届蓝桥杯单片机国赛 程序 题目 hex文件 代码 工程文件 B站视频 更多资料 题目 历届的省赛和国赛的题目我已经在前面的文章(点击查看)里给大家分享了(网盘资源),需要的话,直接去下载,我在这 ...

  9. 蓝桥杯单片机第十届国赛

    今天是第十三届蓝桥杯单片机国赛的比赛时间,刚比完,简单说一下感想,这次国赛必须要用到三个定时器,昨天刚看了定时器2的使用,不太熟练,所以写的也不是很好,超声波和频率有点冲突,就个人而言,我觉得这一届最 ...

最新文章

  1. stack与queue
  2. 第二章:Webdriver 控制浏览器前进和后退
  3. MEF学习笔记(6):出口和元数据
  4. Jsoup代码解读之三-Document的输出
  5. 5902. 检查句子中的数字是否递增
  6. java 嵌套调用_Java嵌套类的使用
  7. Delphi XE2有什么新功能
  8. C4D 通过python导入外部.txt文件数据驱动物体
  9. linux 服务器 告警声,服务器故障,报警声汇总
  10. 关于travis scott的网名_异地恋情侣网名甜蜜秀恩爱
  11. Debezium系列之:永久保存history topic中的数据
  12. C语言之位操作和整形的补位
  13. 用php做一个相册的程序,搭建自己的相册 50个免费的相册程序(上)
  14. sqlplus操作oracle
  15. 一直显示无法连接服务器失败,老显示无法连接服务器失败
  16. blackjack java gui_求助一个java的题,blackjack, class 分为Card 和Deck,求大神帮我做一个程序...
  17. 解决申请 Googl e账号填写电话号码不能验证的问题
  18. raise err.InterfaceError((0, ''))
  19. Linux系统配置(shell基础)
  20. 阿里云网页跳转淘宝app授权登陆流程

热门文章

  1. 程序员职场江湖的黑话!一定要牢记~
  2. 大学计算机基础实验教程课后答案,大学计算机基础与实验教程习题答案.doc
  3. MThings连接Modbus物联网平台
  4. PyEcharts学习笔记整理,基于B站千锋教育
  5. nodejs 查看下载文件路径_QQ、迅雷、新浪等App下载文件保存路径以及隐藏文件提取...
  6. Learning in situ: 视频流媒体中真实环境下训练的自适应码率选择算法Fugu
  7. 华为苏州实习面试--机器学习算法岗
  8. 程序员麦兜【编程笔记】-String存储管理
  9. 破解黑红梅方提前知道保单机里的答案
  10. 高通骁龙820亚洲首秀:功耗低,跑分高,体验好--ESM