当前位置:   article > 正文

【第十五届蓝桥杯单片机国赛真题程序题】

【第十五届蓝桥杯单片机国赛真题程序题】

前段时间在学32,我今天自己写了下,有的记不得,比如sscanf用法(字符串中取数)(在比蓝桥杯单片机国赛前写了下mqtt,用了下这个函数,不过当时记不得了),还有sqrt(开方的)就上网搜了下,我觉得这届的国赛题考得比往届要难。也感谢蓝桥杯杯成为我的第一个比赛。

下面是运行的代码:

  1. #include <STC15F2K60S2.H>
  2. #include "smg.h"
  3. #include "key.h"
  4. #include "pcf8591.h"
  5. #include "csb.h"
  6. #include <stdio.h>
  7. #include <string.h>
  8. #include "key.h"
  9. #include "CSB.h"
  10. #include "PCF8591.h"
  11. #include "SMG.h"
  12. #include <math.h>
  13. //
  14. unsigned char zt=0;//状态
  15. unsigned char jiemian=0;//界面
  16. unsigned int mdd_x=1000,mdd_y=1000;//目的地
  17. unsigned int wz_x=0,wz_y=0;//设备
  18. float yxsd=0;//运行速度
  19. unsigned char zajl;//障碍距离
  20. unsigned char CS_R=10;//节省ARM
  21. char CS_B=0;
  22. bit R_B=0;//指示R_B标志
  23. unsigned int pl=0;//频率
  24. unsigned int i=0,ji=0,daoda_ji=0;//计时
  25. unsigned char daoda_falg=0;//到达目的地标志
  26. unsigned char hjguang;//环境光
  27. unsigned char uled=0xff;//灯
  28. unsigned char RxData,Serial_RxFlag=0;//串口接收数据和标志
  29. data char Serial_RxPacket[10];//串口接收数据包
  30. unsigned char str1[10];
  31. unsigned char smg_flag=0,data_flag=0,deng_flag=0;key_flag=0;//减速变量
  32. //
  33. void Timer1Init(void);
  34. void pro(unsigned char deng);
  35. void ckfs_pro(unsigned char *str);
  36. void jdq(bit a);
  37. void diplay_loop();
  38. void key_loop();
  39. void data_loop();
  40. void deng_loop();
  41. void main()
  42. {
  43. Timer1Init();
  44. PCA();
  45. while(1)
  46. {
  47. key_loop();//按键
  48. diplay_loop();//数码管
  49. data_loop();//数据
  50. deng_loop();//灯
  51. }
  52. }

key_loop()按键部分

  1. void key_loop()
  2. {
  3. unsigned char num;
  4. if(key_flag)
  5. return;
  6. else
  7. {
  8. key_flag=1;
  9. key_zd();
  10. num=key();
  11. if(num!=0)
  12. {
  13. switch(num)
  14. {
  15. case 1:
  16. if(zt==0&&(mdd_y>=0&&mdd_y<=999&&mdd_x>=0&&mdd_x<=999))
  17. {
  18. zt=2;
  19. }
  20. else if(zt==1&&zajl>30)
  21. {
  22. zt=2;
  23. }
  24. else if(zt==2)
  25. {
  26. zt=1;
  27. }
  28. break;
  29. case 2:
  30. if(zt==0)
  31. {
  32. wz_x=0;
  33. wz_y=0;
  34. ji=0;
  35. }
  36. break;
  37. case 3:
  38. if(++jiemian>=3)
  39. {
  40. jiemian=0;
  41. }
  42. break;
  43. case 4:
  44. R_B=~R_B;
  45. break;
  46. case 5:
  47. if(R_B==0&&CS_R<=20)
  48. {
  49. CS_R++;
  50. }
  51. else if(R_B==1&&CS_B<=90)
  52. {
  53. CS_B+=5;
  54. }
  55. break;
  56. case 6:
  57. if(R_B==0&&CS_R>=10)
  58. {
  59. CS_R--;
  60. }
  61. else if(R_B==1&&CS_B>=-90)
  62. {
  63. CS_B-=5;
  64. }
  65. break;
  66. }
  67. }
  68. }
  69. }

data_loop数据计算部分

  1. void data_loop()
  2. {
  3. if(data_flag)
  4. return;
  5. else
  6. {
  7. data_flag=1;
  8. zajl=csb_cj();
  9. yxsd=pl*3.14*CS_R/1000+CS_B;
  10. if(mdd_y>=0&&mdd_y<=999&&mdd_x>=0&&mdd_x<=999)
  11. {
  12. wz_x=(unsigned int)(yxsd*mdd_x/sqrt(mdd_x*mdd_x+mdd_y*mdd_y)*0.001*ji);
  13. wz_y=(unsigned int)(yxsd*mdd_y/sqrt(mdd_x*mdd_x+mdd_y*mdd_y)*0.001*ji);
  14. }
  15. hjguang=pcf8591_read(0x01);
  16. //
  17. if(zt==1)
  18. {jdq(1);}
  19. else
  20. {jdq(0);}
  21. if(zajl<30)
  22. {
  23. zt=1;
  24. }
  25. //
  26. if(RxData=='?')
  27. {
  28. if(zt==0)
  29. {
  30. ckfs_pro("Idle");
  31. }
  32. else if(zt==1)
  33. {
  34. ckfs_pro("Wait");
  35. }
  36. else if(zt==2)
  37. {
  38. ckfs_pro("Busy");
  39. }
  40. RxData=0;
  41. }
  42. else if(RxData=='#')
  43. {
  44. sprintf(str1,"(%d,%d)",wz_x,wz_y);
  45. ckfs_pro(str1);
  46. RxData=0;
  47. }
  48. else if(Serial_RxFlag==1)
  49. {
  50. sscanf(Serial_RxPacket,"(%d,%d)",&mdd_x,&mdd_y);
  51. ckfs_pro("Got it");
  52. Serial_RxFlag=0;
  53. }
  54. else
  55. {
  56. ckfs_pro("Error");
  57. }
  58. //
  59. if(wz_x>=mdd_x&&wz_y>=mdd_y)
  60. {
  61. daoda_falg=1;
  62. }
  63. else if(wz_x<=mdd_x&&wz_y<=mdd_y)
  64. {
  65. daoda_falg=0;
  66. }
  67. }
  68. }

diplay_loop数码管部分

  1. void diplay_loop()
  2. {
  3. if(smg_flag)
  4. return;
  5. else
  6. {
  7. smg_flag=1;
  8. if(jiemian==0&&(zt==1||zt==2))
  9. {
  10. smg_hc(1,30);
  11. smg_hc(2,mdd_x/100>0?(unsigned char)(mdd_x/100)%10:20);
  12. smg_hc(3,mdd_x/10>0?(unsigned char)(mdd_x/10)%10:20);
  13. smg_hc(4,(unsigned int)(mdd_x)%10);
  14. smg_hc(5,20);
  15. smg_hc(6,mdd_y/100>0?(unsigned char)(mdd_y/100)%10:20);
  16. smg_hc(7,mdd_y/10>0?(unsigned char)(mdd_y/10)%10:20);
  17. smg_hc(8,(unsigned int)(mdd_y)%10);
  18. }
  19. if(jiemian==0&&zt==0)
  20. {
  21. smg_hc(1,30);
  22. smg_hc(2,wz_x/100>0?(unsigned char)(wz_x/100)%10:20);
  23. smg_hc(3,wz_x/10>0?(unsigned char)(wz_x/10)%10:20);
  24. smg_hc(4,(unsigned char)(wz_x)%10);
  25. smg_hc(5,20);
  26. smg_hc(6,wz_y/100>0?(unsigned char)(wz_y/100)%10:20);
  27. smg_hc(7,wz_y/10>0?(unsigned char)(wz_y/10)%10:20);
  28. smg_hc(8,(unsigned char)(wz_y)%10);
  29. }
  30. if(jiemian==1&&zt==1)
  31. {
  32. smg_hc(1,26);
  33. smg_hc(2,1);
  34. smg_hc(3,20);
  35. smg_hc(4,yxsd/1000>0?(unsigned int)(yxsd/1000)%10:20);
  36. smg_hc(5,yxsd/100>0?(unsigned int)(yxsd/100)%10:20);
  37. smg_hc(6,yxsd/10>0?(unsigned int)(yxsd/10)%10:20);
  38. smg_hc(7,(unsigned int)(yxsd)%10+10);
  39. smg_hc(8,(unsigned int)(yxsd*10)%10);
  40. }
  41. if(jiemian==1&&zt==0)
  42. {
  43. smg_hc(1,26);
  44. smg_hc(2,2);
  45. smg_hc(3,20);
  46. smg_hc(4,21);
  47. smg_hc(5,21);
  48. smg_hc(6,21);
  49. smg_hc(7,21);
  50. smg_hc(8,21);
  51. }
  52. if(jiemian==1&&zt==2)
  53. {
  54. smg_hc(1,26);
  55. smg_hc(2,3);
  56. smg_hc(3,20);
  57. smg_hc(4,zajl/10000>0?(unsigned char)(zajl/10000)%10:20);
  58. smg_hc(4,zajl/1000>0?(unsigned char)(zajl/1000)%10:20);
  59. smg_hc(5,zajl/100>0?(unsigned char)(zajl/100)%10:20);
  60. smg_hc(6,zajl/10>0?(unsigned char)(zajl/10)%10:20);
  61. smg_hc(7,(zajl)%10);
  62. }
  63. if(jiemian==2)
  64. {
  65. smg_hc(1,29);
  66. smg_hc(2,20);
  67. smg_hc(3,(unsigned char)(CS_R/10)%10+10);
  68. smg_hc(4,(unsigned char)(CS_R)%10);
  69. smg_hc(5,20);
  70. if(CS_B>=0)
  71. {
  72. smg_hc(6,CS_B/100>0?(unsigned char)(CS_B/100)%10:20);
  73. smg_hc(7,CS_B/10>0?(unsigned char)(CS_B/10)%10:20);
  74. smg_hc(8,(unsigned char)(CS_B)%10);
  75. }
  76. if(CS_B<0)
  77. {
  78. smg_hc(6,-CS_B/10>0?21:20);
  79. smg_hc(7,-CS_B/10>0?(unsigned char)(-CS_B/10)%10:21);
  80. smg_hc(8,(unsigned char)(-CS_B)%10);
  81. }
  82. }
  83. }
  84. }

deng_loop灯

  1. void deng_loop()
  2. {
  3. if(deng_flag)
  4. return;
  5. else
  6. {
  7. deng_flag=0;
  8. if(zt==0)
  9. {
  10. uled|=0x01;
  11. }
  12. else if(zt==1)
  13. {
  14. uled^=0x01;
  15. }
  16. else if(zt==2)
  17. {
  18. uled&=~0x01;
  19. }
  20. //
  21. if(hjguang>62)
  22. {
  23. uled|=0x02;
  24. }
  25. else
  26. {
  27. uled&=~0x02;
  28. }
  29. //
  30. if(daoda_falg==1&&daoda_ji<3000)
  31. {
  32. uled&=~0x04;
  33. }
  34. else
  35. {
  36. uled|=0x04;
  37. }
  38. if(daoda_ji>3000)
  39. {daoda_ji=0;}
  40. }
  41. }

调用函数

  1. void jdq(bit a)//继电器
  2. {
  3. static unsigned char flag=1;
  4. if(a==1&&flag==1)
  5. {
  6. P2=(P2&0x1f)|0xa0;
  7. P04=1;
  8. P06=0;
  9. P2&=0x1f;
  10. flag=0;
  11. }
  12. else if(flag==0&&a==0)
  13. {
  14. P2=(P2&0x1f)|0xa0;
  15. P04=0;
  16. P06=0;
  17. P2&=0x1f;
  18. flag=1;
  19. }
  20. }
  21. void pro(unsigned char deng)//灯
  22. {
  23. P2=(P2&0x1f)|0x80;
  24. P0=deng;
  25. P2=0x1f;
  26. }
  27. void ckfs_pro(unsigned char *str)//串口发送
  28. {
  29. while(*str!='\0')
  30. {
  31. SBUF=*str;
  32. while(TI==0);
  33. TI=0;
  34. str++;
  35. }
  36. }

定时,中断和串口

  1. void Timer1Init(void)//定时器及串口,方便,所以放一起了
  2. {
  3. 1000微秒@12.000MHz
  4. AUXR=0x00;
  5. AUXR |= 0x40;
  6. TMOD &= 0x0F;
  7. TL1 = 0xCD; //设置定时初值
  8. TH1 = 0xD4; //设置定时初值
  9. TF1 = 0;
  10. TR1 = 1;
  11. ET1=1;
  12. //4800bps@12.000MHz
  13. SCON = 0x50;
  14. AUXR |= 0x01;
  15. AUXR |= 0x04;
  16. T2L = 0x8F;
  17. T2H = 0xFD;
  18. AUXR |= 0x10;
  19. ES=1;
  20. //计数
  21. TMOD =(TMOD&0xf0)|0x05;
  22. TL0 = 0x00;
  23. TH0 = 0x00;
  24. TF0 = 0;
  25. TR0 = 1;
  26. EA=1;
  27. }
  28. void Uart1_Isr() interrupt 4//串口接收
  29. {
  30. static char pRxPacket=0,RxState=0;
  31. if (RI)
  32. {
  33. RI = 0;
  34. RxData=SBUF;
  35. if (RxState == 0)
  36. {
  37. if ((RxData == '(') && Serial_RxFlag == 0)
  38. {
  39. RxState = 1;
  40. pRxPacket = 0;
  41. Serial_RxPacket[pRxPacket] = RxData;
  42. pRxPacket ++;
  43. }
  44. }
  45. else if(RxState == 1)
  46. {
  47. if (RxData == ')')
  48. {
  49. Serial_RxPacket[pRxPacket] = RxData;
  50. pRxPacket ++;
  51. Serial_RxPacket[pRxPacket] = '\0';
  52. RxState = 0;
  53. Serial_RxFlag = 1;
  54. }
  55. else
  56. {
  57. Serial_RxPacket[pRxPacket] = RxData;
  58. pRxPacket ++;
  59. }
  60. }
  61. }
  62. }
  63. //
  64. void Timer1_Iur() interrupt 3
  65. {
  66. if(++smg_flag==200)smg_flag=0;
  67. if(++data_flag==300)data_flag=0;
  68. if(++deng_flag==100)deng_flag=0;
  69. if(++key_flag==20)key_flag=0;
  70. if(daoda_falg==1)
  71. {
  72. daoda_ji++;
  73. }
  74. if(++i>999)//算频率
  75. {
  76. i=0;
  77. pl=TH0*256+TL0;
  78. TH0=0;
  79. TL0=0;
  80. }
  81. if(zt==2)
  82. ji++;
  83. smg_zd();//扫描数码管
  84. pro(uled);//扫描灯
  85. }

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/爱喝兽奶帝天荒/article/detail/737297
推荐阅读
相关标签
  

闽ICP备14008679号