当前位置:   article > 正文

蓝桥杯单片机 第三届到十三届历年真题及部分代码_蓝桥杯单片机历届试题

蓝桥杯单片机历届试题

 

一、本人在准备过程中遇到的问题:

1、矩阵键盘不稳定的情况:可以看看下面链接的内容,有多种按键的处理方法。

https://blog.csdn.net/qq_43935020/article/details/114108489https://blog.csdn.net/qq_43935020/article/details/114108489

2、串口通信时ISP软件无法接受到信息:

例如stc-isp-15xx-v6.86r,可以将最低波特率和最高波特率调节相同的波特率。

042ce1ef585442acba185d9543babbd6.png

3、使用DS18B20时会读到85℃:在主程序中引用下面的代码,并且加上750ms的延时函数

  1. void ds18b20_init()
  2. {
  3. unsigned char lsb,msb;
  4. unsigned int tep;
  5. init_ds18b20();
  6. Write_DS18B20(0xcc);
  7. Write_DS18B20(0x44);
  8. do
  9. {
  10. init_ds18b20();
  11. Write_DS18B20(0xcc);
  12. Write_DS18B20(0xbe);
  13. lsb=Read_DS18B20();
  14. msb=Read_DS18B20();
  15. tep=msb;
  16. tep=(msb<<4)|(lsb>>4);
  17. }while(tep==85);
  18. void Delay750ms() //@12.000MHz
  19. {
  20. unsigned char i, j, k;
  21. _nop_();
  22. _nop_();
  23. i = 35;
  24. j = 51;
  25. k = 182;
  26. do
  27. {
  28. do
  29. {
  30. while (--k);
  31. } while (--j);
  32. } while (--i);
  33. }
  34. void main()
  35. {
  36. void ds18b20_init();
  37. void Delay750ms();
  38. while(1)
  39. {
  40. }
  41. }

4、使用DS1302时,时钟停止不动:这是一个小常识

  1. void main()
  2. {
  3. ds1302_wirte();
  4. while(1)
  5. {
  6. ds1302_read();
  7. }
  8. }

 

二、比赛准备与学习

蓝桥杯单片机比赛需要用到的知识有:数电知识+模电知识+C语言知识+单片机知识(考试时可用比赛时给的PDF阅读器查看STC手册的知识)。

选择题有15分,10小题,一题1.5分。(选择题的基础,本人学习在参加蓝桥杯之前都已学过,若没有学习过的同学需要多加准备了。)

设计题:应该先把考试会考到的几大模块摸索清楚,这里推荐B站【小蜜蜂笔记】的视频。清楚基本的内容后可以看历年的真题。看到真题时,不要盲目的下手,直接就开始打代码。可以先在草稿纸上,把基础的界面显示,按键功能,LED的亮灭功能,以及参数的设定等等,有大致的了解之后再进行代码的编写。

 

三、主要的学习资源

1、【欧浩源】小蜜蜂老师的基础教程https://www.bilibili.com/video/BV1Bt41187hw/?spm_id_from=333.999.0.0&vd_source=9622193d8b15b12f3f5d7b274ed88882https://www.bilibili.com/video/BV1Bt41187hw/?spm_id_from=333.999.0.0&vd_source=9622193d8b15b12f3f5d7b274ed88882

2、历年选择题答案与解析

小蜜蜂老师的宝藏网站!!!

https://www.xmf393.com/2019/06/11/lqbmcu/https://www.xmf393.com/2019/06/11/lqbmcu/

3、设计题的代码驱动修改 (以14届为例)

https://blog.csdn.net/boybs/article/details/129911996https://blog.csdn.net/boybs/article/details/129911996

4、历年设计https://pan.baidu.com/s/1GNSoH7eSqL-r3zMhZoxTEg 提取码:235u

四、各模块的主要程序(考前模块总结)

下面的内容需要对各模块功能有一定了解。

1、PCF8591        (iic.h)

  1. unsigned char adc_value=0;//采样电压
  2. float adc_volt=0; //换算电压
  3. unsigned int smg_volt; //数码管显示电压
  4. void read_adc()//ADC
  5. {
  6. IIC_Start();
  7. IIC_SendByte(0x90);
  8. IIC_WaitAck();
  9. IIC_SendByte(0x43);
  10. IIC_WaitAck();
  11. IIC_Stop();
  12. IIC_Start();
  13. IIC_SendByte(0x91);
  14. IIC_WaitAck();
  15. adc_value=IIC_RecByte();
  16. IIC_SendAck(1);
  17. IIC_Stop();
  18. adc_volt=adc_value*(5.0/255);
  19. smg_volt=adc_volt*100;
  20. }
  21. void read_dac(float dat)//DAC
  22. {
  23. IIC_Start();
  24. IIC_SendByte(0x90);
  25. IIC_WaitAck();
  26. IIC_SendByte(0x03);//0x01为光敏电阻的A/D转换通道,0x03为电位器的A/D转换通道
  27. //0x41为光敏电阻的A/D转换通道或者D/A,0x43为电位器的A/D转换通道或者D/A
  28. IIC_WaitAck();
  29. IIC_SendByte(dat);
  30. IIC_WaitAck();
  31. IIC_Stop();
  32. }

 

2、24C02        (iic.h)

  1. void write_24c02(unsigned char addr,unsigned char dat)//单字节写入
  2. {
  3. IIC_Start();
  4. IIC_SendByte(0xa0);
  5. IIC_WaitAck();
  6. IIC_SendByte(addr);//需要存放的地址
  7. IIC_WaitAck();
  8. IIC_SendByte(dat);//需要存放的数据
  9. IIC_WaitAck();
  10. IIC_Stop();
  11. }
  12. unsigned char read_24c02(unsigned char addr)//单字节读出
  13. {
  14. unsigned char tmp=0;
  15. //伪操作
  16. IIC_Start();
  17. IIC_SendByte(0xa0);
  18. IIC_WaitAck();
  19. IIC_SendByte(addr);
  20. IIC_WaitAck();
  21. IIC_Start();
  22. IIC_SendByte(0xa1);//读指令
  23. IIC_WaitAck();
  24. tmp=IIC_RecByte();//读出数据
  25. IIC_SendAck(1);
  26. IIC_Stop();
  27. return tmp;//返回读到的数据
  28. }

 

3、DS18B20        (onewire.h)

  1. //DS18B20 温度的读出与显示
  2. void read_display_ds18b20()
  3. {
  4. unsigned char LSB,MSB;
  5. unsigned int temp;
  6. init_ds18b20();
  7. Write_DS18B20(0xcc);//忽略ROM操作
  8. Write_DS18B20(0x44);//启动温度转换
  9. smg_dispalay();//延时
  10. init_ds18b20();
  11. Write_DS18B20(0xcc);//忽略ROM操作
  12. Write_DS18B20(0xbe);//读出内部存储器
  13. LSB=Read_DS18B20();//第0字节,温度的低8位
  14. MSB=Read_DS18B20();//第1字节,温度的高8位
  15. init_ds18b20();
  16. temp=MSB;
  17. temp=(temp<<8)|LSB;
  18. if((temp&0xf800)==0x0000)//判断是否为正温度
  19. {
  20. temp_ds18b20=temp*0.0625;//计算实际温度
  21. }
  22. smg_ds18b20=temp_ds18b20;//若要保留一位小数点则temp_ds18b20*10,
  23. //保留两位则 temp_ds18b20*100;
  24. smg_dispalay();
  25. }

 

4、DS1302        (ds1302.h)

  1. void DS1302_W()
  2. {
  3. char i;
  4. Write_Ds1302_Byte( 0x8e,0x00);//允许写入
  5. for(i=0;i<7;i++)
  6. {
  7. Write_Ds1302_Byte( Write_DS1302_add[i],Timer[i]);
  8. }
  9. Write_Ds1302_Byte( 0x8e,0x80);//禁止写入
  10. }
  11. void DS1302_R()
  12. {
  13. char i;
  14. for(i=0;i<7;i++)
  15. {
  16. Timer[i]=Read_Ds1302_Byte( Read_DS1302_add[i] );//将时钟读出
  17. }
  18. }

 

5、PWM信号

  1. unsigned char count=0;//计数
  2. unsigned char pwm_duty=0;//脉冲宽度,占空比
  3. void Init_Timer0()//定时100us
  4. {
  5. TMOD = 0x01;
  6. TH0=(65535-100)/256;
  7. TL0=(65535-100)%256;
  8. ET0=1;
  9. EA=1;
  10. }
  11. void ServiceTimer0() interrupt 1
  12. {
  13. TH0=(65535-100)/256;
  14. TL0=(65535-100)%256;
  15. count++;
  16. if(count==pwm_duty)
  17. {
  18. L1=1;
  19. }
  20. else if(count==100)//count==100,宽度为10ms
  21. {
  22. L1=0;
  23. count=0;
  24. }
  25. }

 

6、NE555频率发生器

  1. unsigned int count_t=0; //时间计数
  2. unsigned int dat_f=0; //得到的实际频率
  3. unsigned char count_f; //频率计数
  4. void Init_Timer() //T0计数,模式二。T1定时,模式一。
  5. {
  6. TH0=0xff;
  7. TL0=0xff;
  8. TH1=(65535 - 50000 +1)/256;
  9. TL1=(65535 - 50000 +1)%256;
  10. TMOD=0x16;//0001 0110
  11. ET0=1;
  12. ET1=1;
  13. EA=1;
  14. TR0=1;
  15. TR1=1;
  16. }
  17. void Service_T0() interrupt 1
  18. {
  19. count_f++; //频率计数
  20. }
  21. void Service_T1() interrupt 3
  22. {
  23. TH1=(65535 - 50000 +1)/256;
  24. TL1=(65535 - 50000 +1)%256;
  25. count_t++;
  26. if(count_t==20) //当定时50ms*20=1s,
  27. {
  28. dat_f=count_f; //得到实际频率
  29. count_f=0; //重新测频率,先清零
  30. count_t=0; //定时计数重新开始,先清零
  31. }
  32. }

 

7、超声波

  1. sfr AUXR=0x8e;
  2. sbit TX=P1^0;
  3. sbit RX=P1^1;
  4. void Delay13ms() //@12.000MHz
  5. {
  6. unsigned char i, j, k;
  7. _nop_();
  8. _nop_();
  9. i = 1;
  10. j = 152;
  11. k = 187;
  12. do
  13. {
  14. do
  15. {
  16. while (--k);
  17. } while (--j);
  18. } while (--i);
  19. }
  20. void send_wave() //产生8个40KHZ的信号
  21. {
  22. unsigned char i;
  23. for(i=0;i<8;i++)
  24. {
  25. TX=0; //发送
  26. Delay13us();
  27. TX=1;
  28. Delay13us();
  29. }
  30. }
  31. unsigned int get_distance() //得到测量距离
  32. {
  33. unsigned long distant;
  34. AUXR |=0x80;
  35. TL0=0x00;
  36. TH0=0x00;
  37. send_wave();
  38. TR0=1; //打开定时器
  39. while((RX==1)&&(TF0==0)); //等待超声波返回,或者等待测量距离超出范围
  40. TR0=0; //关闭定时器
  41. if(TF0==0) //在正常的距离范围
  42. {
  43. distant=TH0*256+TL0;
  44. distant=(distant*170)/110592;
  45. }
  46. else //不正常的距离范围
  47. {
  48. TF0=0;
  49. distant=999;
  50. }
  51. return distant;
  52. }

 

8、串口通信

  1. void InitUart()
  2. {
  3. TMOD=0x20;
  4. TH1=0xfd;
  5. TL1=0xfd;
  6. TR1=1;
  7. SCON=0x50;
  8. AUXR=0x00;
  9. ES=1;
  10. EA=1;
  11. }
  12. unsigned char command=0x00;//上位机内容
  13. void ServiceUart() interrupt 4 //接受完成用中断
  14. {
  15. if(RI==1)
  16. {
  17. command=SBUF; //接受完成则将内容传给上位机
  18. RI=0;;
  19. }
  20. }
  21. void SendByte(unsigned char dat) //发送完成用查询
  22. {
  23. SBUF=dat;
  24. while(TI==0);
  25. TI=0;
  26. }
  27. void SendString(unsigned char *s) //发送字符串
  28. {
  29. while(*s!='\0')
  30. {
  31. SendByte(*s++);
  32. }
  33. }

 

注:以上内容大多数都是小蜜蜂老师的内容,可能存在部分的问题,希望大家给予指正。

 

 

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号