当前位置:   article > 正文

蓝桥杯单片机第十四届省赛题目+代码_蓝桥杯省赛单片机第14届省一

蓝桥杯省赛单片机第14届省一

第一次发CSDN,代码都是自己写的,仅供参考,不保证全对,也是第一次参加蓝桥杯单片机组,也是自己学习的证明吧。

 

 Main文件

  1. #include <STC15F2K60S2.H>
  2. #include "stdio.h"
  3. #include "Key.h"
  4. #include "Nixie.h"
  5. #include "ds1302.h"
  6. #include "iic.h"
  7. #include "onewire.h"
  8. unsigned char keynum;
  9. unsigned char String[10];
  10. unsigned char String_Buff[9];
  11. unsigned int NE_Count,NE;
  12. unsigned int T,Now_T;
  13. unsigned char T_CS=30;
  14. unsigned char SD,Now_SD;
  15. unsigned char AD;
  16. unsigned char showmode;
  17. unsigned char MAX_T;
  18. unsigned int PJ_T,SUM_T;
  19. unsigned char MAX_SD;
  20. unsigned int PJ_SD,SUM_SD;
  21. unsigned char Inter_Time;
  22. unsigned char Last_Hou,Last_Min;
  23. bit CA_Flag;
  24. bit WSD_Flag;
  25. bit WSD_ShowFlag;
  26. bit WSD_NYFlag=1;
  27. unsigned char led_char=0xff;
  28. unsigned char LED_SS;
  29. bit LED_SSFlag;
  30. bit LED_SGFlag;
  31. bit LED_LOW;
  32. void Timer0Init(void) //1毫秒@12.000MHz
  33. {
  34. AUXR |= 0x80; //定时器时钟1T模式
  35. TMOD |= 0x04; //设置定时器模式
  36. TL0 = 0xff; //设置定时初值
  37. TH0 = 0xff; //设置定时初值
  38. TF0 = 0; //清除TF0标志
  39. TR0 = 1; //定时器0开始计时
  40. ET0=EA=1;
  41. }
  42. void Timer1Init(void) //1毫秒@12.000MHz
  43. {
  44. AUXR |= 0x40; //定时器时钟1T模式
  45. TMOD &= 0x0F; //设置定时器模式
  46. TL1 = 0x20; //设置定时初值
  47. TH1 = 0xD1; //设置定时初值
  48. TF1 = 0; //清除TF1标志
  49. TR1 = 1; //定时器1开始计时
  50. ET1=EA=1;
  51. }
  52. void Init_All()
  53. {
  54. P0=0x00;
  55. P2=(P2&0x1f)|0xa0;
  56. P2&=0x1f;
  57. Timer0Init();
  58. Timer1Init();
  59. Set_Time();
  60. Read_T();
  61. }
  62. void Nixie_Logic()
  63. {
  64. if(WSD_ShowFlag)
  65. {
  66. if(WSD_NYFlag)
  67. sprintf(String,"E %02d-%02d",T,(unsigned int)SD);
  68. else
  69. sprintf(String,"E %02d-AA",Now_T);
  70. }
  71. else
  72. {
  73. switch(showmode)
  74. {
  75. case 0x00:sprintf(String,"%02u-%02u-%02u",(unsigned int)Time_Tab[0],(unsigned int)Time_Tab[1],(unsigned int)Time_Tab[2]);break;
  76. case 0x10:sprintf(String,"C %02d-%02d.%01d",(unsigned int)MAX_T,PJ_T/10,PJ_T%10);break;
  77. case 0x11:sprintf(String,"H %02d-%02d.%01d",(unsigned int)MAX_SD,PJ_SD/10,PJ_SD%10);break;
  78. case 0x12:sprintf(String,"F%02d%02d-%02d",(unsigned int)Inter_Time,(unsigned int)Last_Hou,(unsigned int)Last_Min);break;
  79. case 0x20:sprintf(String,"P %02d",(unsigned int)T_CS);break;
  80. }
  81. }
  82. Nixie_Set(String,String_Buff);
  83. }
  84. void WSD_JS()
  85. {
  86. if(WSD_Flag)
  87. {
  88. WSD_Flag=0;
  89. if((NE>=200) && (NE<=2000))
  90. {
  91. WSD_NYFlag=1;
  92. Inter_Time++;
  93. Last_Hou=Time_Tab[0];
  94. Last_Min=Time_Tab[1];
  95. if((Now_T>T) && ((NE*0.0444+1.111)>SD))
  96. {
  97. LED_SGFlag=1;
  98. }
  99. else LED_SGFlag=0;
  100. T=Now_T;
  101. SD=(NE*0.0444)+1.111;
  102. if(T>MAX_T) MAX_T=T;
  103. if(SD>MAX_SD) MAX_SD=SD;
  104. SUM_T+=T*10;
  105. SUM_SD+=SD*10;
  106. PJ_T=SUM_T/Inter_Time;
  107. PJ_SD=SUM_SD/Inter_Time;
  108. }
  109. else
  110. {
  111. WSD_NYFlag=0;
  112. }
  113. }
  114. }
  115. void Key_Logic()
  116. {
  117. if(!WSD_ShowFlag)
  118. {
  119. if(!(showmode==0x12 && Key_Get[1][1]==0))
  120. {
  121. keynum=Key();
  122. }
  123. if(keynum==1)
  124. {
  125. switch(showmode&0xf0)
  126. {
  127. case 0x00:showmode=0x10;break;
  128. case 0x10:showmode=0x20;break;
  129. case 0x20:showmode=0x00;break;
  130. }
  131. }
  132. if(keynum==3)
  133. {
  134. switch(showmode)
  135. {
  136. case 0x10:showmode=0x11;break;
  137. case 0x11:showmode=0x12;break;
  138. case 0x12:showmode=0x10;break;
  139. }
  140. }
  141. if(keynum==2)
  142. {
  143. if(showmode==0x20)
  144. {
  145. T_CS++;
  146. if(T_CS>99) T_CS=0;
  147. }
  148. }
  149. if(keynum==4)
  150. {
  151. if(showmode==0x20)
  152. {
  153. T_CS--;
  154. if(T_CS>200) T_CS=99;
  155. }
  156. }
  157. if(CA_Flag && showmode==0x12)
  158. {
  159. CA_Flag=0;
  160. MAX_T=PJ_T=MAX_SD=PJ_SD=Inter_Time=Last_Hou=Last_Min=0;
  161. //
  162. T_CS=0;
  163. }
  164. }
  165. else
  166. {
  167. WSD_JS();
  168. }
  169. }
  170. void LED_Logic()
  171. {
  172. if(showmode==0x00)led_char&=0xfe;
  173. else led_char|=0x01;
  174. if((showmode&0xf0)==0x10)led_char&=0xfd;
  175. else led_char|=0x02;
  176. if(WSD_ShowFlag)led_char&=0xfb;
  177. else led_char|=0x04;
  178. if(Now_T>T_CS)
  179. {
  180. LED_SSFlag=1;
  181. }
  182. else
  183. {
  184. LED_SSFlag=0;
  185. LED_SS=0;
  186. led_char|=0x08;
  187. }
  188. if(LED_SSFlag)
  189. {
  190. if(LED_SS<100)led_char&=0xf7;
  191. else if(LED_SS>=100 && LED_SS<200) led_char|=0x08;
  192. else{LED_SS=0;}
  193. }
  194. if(!WSD_NYFlag)led_char&=0xef;
  195. else led_char|=0x10;
  196. if(Inter_Time>=2)
  197. {
  198. if(LED_SGFlag)
  199. led_char&=0xdf;
  200. else led_char|=0x20;
  201. }
  202. if(LED_LOW)
  203. {
  204. LED_LOW=0;
  205. P0=led_char;
  206. P2=(P2&0x1f)|0x80;
  207. P2&=0x1f;
  208. }
  209. }
  210. void main()
  211. {
  212. Init_All();
  213. while(1)
  214. {
  215. Nixie_Logic();
  216. Key_Logic();
  217. LED_Logic();
  218. }
  219. }
  220. void T0_LP() interrupt 1
  221. {
  222. NE_Count++;
  223. }
  224. void T1_LP() interrupt 3
  225. {
  226. unsigned int Count,Count1;
  227. unsigned int CA,WSD_Count;
  228. unsigned char AD_Count;
  229. Nixie_Loop(String_Buff);
  230. Key_Loop();
  231. Count++;
  232. Count1++;
  233. AD_Count++;
  234. LED_LOW=1;
  235. if(LED_SSFlag)
  236. {
  237. LED_SS++;
  238. }
  239. //亮度
  240. if(AD_Count>=200)
  241. {
  242. AD_Count=0;
  243. if(ADC()<50 && WSD_ShowFlag==0)
  244. {
  245. WSD_Flag=1;
  246. WSD_ShowFlag=1;
  247. }
  248. }
  249. if(WSD_ShowFlag)
  250. {
  251. WSD_Count++;
  252. if(WSD_Count>=3000)
  253. {
  254. WSD_Count=0;
  255. WSD_ShowFlag=0;
  256. }
  257. }
  258. //NE 温度
  259. if(Count1>=500)
  260. {
  261. Count1=0;
  262. NE=NE_Count*2;
  263. NE_Count=0;
  264. Now_T=Read_T();
  265. }
  266. //时间
  267. if(Count>=1000)
  268. {
  269. Count=0;
  270. Read_Time();
  271. }
  272. if(showmode==0x12 && Key_Get[1][1]==0)
  273. {
  274. CA++;
  275. if(CA>=2000)
  276. {
  277. CA_Flag=1;
  278. CA=0;
  279. }
  280. }
  281. if(showmode==0x12 && Key_Get[1][1]==1)
  282. {
  283. if(CA>0)
  284. {
  285. keynum=4;
  286. CA=0;
  287. }
  288. }
  289. }

Nixie文件

  1. #include <STC15F2K60S2.H>
  2. void Nixie_Set(unsigned char* str,unsigned char* buff)
  3. {
  4. unsigned char i,j,temp;
  5. for(i=1,j=0;i<9;i++,j++)
  6. {
  7. switch(str[j])
  8. {
  9. case '0':temp=0xc0;break;
  10. case '1':temp=0xf9;break;
  11. case '2':temp=0xa4;break;
  12. case '3':temp=0xb0;break;
  13. case '4':temp=0x99;break;
  14. case '5':temp=0x92;break;
  15. case '6':temp=0x82;break;
  16. case '7':temp=0xf8;break;
  17. case '8':temp=0x80;break;
  18. case '9':temp=0x90;break;
  19. case ' ':temp=0xff;break;
  20. case '-':temp=0xbf;break;
  21. case 'C':temp=0xc6;break;
  22. case 'H':temp=0x89;break;
  23. case 'F':temp=0x8e;break;
  24. case 'P':temp=0x8c;break;
  25. case 'E':temp=0x86;break;
  26. case 'A':temp=0x88;break;
  27. }
  28. if(str[j+1]=='.')
  29. {
  30. temp&=0x7f;
  31. j++;
  32. }
  33. buff[i]=temp;
  34. }
  35. }
  36. void Nixie_Loop(unsigned char* buff)
  37. {
  38. static unsigned char i=1;
  39. P0=0xff;
  40. P2=(P2&0x1f)|0xe0;
  41. P2&=0x1f;
  42. P0=0x01<<(i-1);
  43. P2=(P2&0x1f)|0xc0;
  44. P2&=0x1f;
  45. P0=buff[i];
  46. P2=(P2&0x1f)|0xe0;
  47. P2&=0x1f;
  48. i++;
  49. if(i>8) i=1;
  50. }

Key文件

  1. #include <STC15F2K60S2.H>
  2. sbit H1=P3^3;
  3. sbit H2=P3^2;
  4. sbit L1=P4^4;
  5. sbit L2=P4^2;
  6. unsigned char Key_Get[2][2]={{1,1},{1,1}};
  7. unsigned char Last_Key_Get[2][2]={{1,1},{1,1}};
  8. unsigned char Key()
  9. {
  10. unsigned char i,j;
  11. for(i=0;i<2;i++)
  12. {
  13. for(j=0;j<2;j++)
  14. {
  15. if(Key_Get[i][j]==0)
  16. {
  17. if(Last_Key_Get[i][j]==1)
  18. {
  19. Last_Key_Get[i][j]=0;
  20. return i*2+j+1;
  21. }
  22. else return 0;
  23. }
  24. }
  25. }
  26. return 0;
  27. }
  28. void Key_Loop()
  29. {
  30. static unsigned char Buff[2][2]={{0xff,0xff},{0xff,0xff}};
  31. static unsigned char loop;
  32. unsigned char i;
  33. Buff[loop][0]=(Buff[loop][0]<<1)|L1;
  34. Buff[loop][1]=(Buff[loop][1]<<1)|L2;
  35. for(i=0;i<2;i++)
  36. {
  37. if(Buff[loop][i]==0xff)
  38. {
  39. Last_Key_Get[loop][i]=1;
  40. Key_Get[loop][i]=1;
  41. }
  42. else if(Buff[loop][i]==0x00)
  43. Key_Get[loop][i]=0;
  44. }
  45. loop++;
  46. loop%=2;
  47. switch(loop)
  48. {
  49. case 0:H2=1;H1=0;break;
  50. case 1:H1=1;H2=0;break;
  51. }
  52. }

iic文件

  1. /* # I2C代码片段说明
  2. 1. 本文件夹中提供的驱动代码供参赛选手完成程序设计参考。
  3. 2. 参赛选手可以自行编写相关代码或以该代码为基础,根据所选单片机类型、运行速度和试题
  4. 中对单片机时钟频率的要求,进行代码调试和修改。
  5. */
  6. #include <STC15F2K60S2.H>
  7. #include "intrins.h"
  8. #define DELAY_TIME 5
  9. sbit sda=P2^1;
  10. sbit scl=P2^0;
  11. //
  12. static void I2C_Delay(unsigned char n)
  13. {
  14. do
  15. {
  16. _nop_();_nop_();_nop_();_nop_();_nop_();
  17. _nop_();_nop_();_nop_();_nop_();_nop_();
  18. _nop_();_nop_();_nop_();_nop_();_nop_();
  19. }
  20. while(n--);
  21. }
  22. //
  23. void I2CStart(void)
  24. {
  25. sda = 1;
  26. scl = 1;
  27. I2C_Delay(DELAY_TIME);
  28. sda = 0;
  29. I2C_Delay(DELAY_TIME);
  30. scl = 0;
  31. }
  32. //
  33. void I2CStop(void)
  34. {
  35. sda = 0;
  36. scl = 1;
  37. I2C_Delay(DELAY_TIME);
  38. sda = 1;
  39. I2C_Delay(DELAY_TIME);
  40. }
  41. //
  42. void I2CSendByte(unsigned char byt)
  43. {
  44. unsigned char i;
  45. for(i=0; i<8; i++){
  46. scl = 0;
  47. I2C_Delay(DELAY_TIME);
  48. if(byt & 0x80){
  49. sda = 1;
  50. }
  51. else{
  52. sda = 0;
  53. }
  54. I2C_Delay(DELAY_TIME);
  55. scl = 1;
  56. byt <<= 1;
  57. I2C_Delay(DELAY_TIME);
  58. }
  59. scl = 0;
  60. }
  61. //
  62. unsigned char I2CReceiveByte(void)
  63. {
  64. unsigned char da;
  65. unsigned char i;
  66. for(i=0;i<8;i++){
  67. scl = 1;
  68. I2C_Delay(DELAY_TIME);
  69. da <<= 1;
  70. if(sda)
  71. da |= 0x01;
  72. scl = 0;
  73. I2C_Delay(DELAY_TIME);
  74. }
  75. return da;
  76. }
  77. //
  78. unsigned char I2CWaitAck(void)
  79. {
  80. unsigned char ackbit;
  81. scl = 1;
  82. I2C_Delay(DELAY_TIME);
  83. ackbit = sda;
  84. scl = 0;
  85. I2C_Delay(DELAY_TIME);
  86. return ackbit;
  87. }
  88. //
  89. void I2CSendAck(unsigned char ackbit)
  90. {
  91. scl = 0;
  92. sda = ackbit;
  93. I2C_Delay(DELAY_TIME);
  94. scl = 1;
  95. I2C_Delay(DELAY_TIME);
  96. scl = 0;
  97. sda = 1;
  98. I2C_Delay(DELAY_TIME);
  99. }
  100. unsigned char ADC()
  101. {
  102. unsigned char temp;
  103. EA=0;
  104. I2CStart();
  105. I2CSendByte(0x90);
  106. I2CWaitAck();
  107. I2CSendByte(0x01);
  108. I2CWaitAck();
  109. I2CStart();
  110. I2CSendByte(0x91);
  111. I2CWaitAck();
  112. temp=I2CReceiveByte();
  113. I2CSendAck(1);
  114. I2CStop();
  115. EA=1;
  116. return temp;
  117. }

onewire文件

  1. /* # 单总线代码片段说明
  2. 1. 本文件夹中提供的驱动代码供参赛选手完成程序设计参考。
  3. 2. 参赛选手可以自行编写相关代码或以该代码为基础,根据所选单片机类型、运行速度和试题
  4. 中对单片机时钟频率的要求,进行代码调试和修改。
  5. */
  6. #include <STC15F2K60S2.H>
  7. sbit DQ=P1^4;
  8. //
  9. void Delay_OneWire(unsigned int t)
  10. {
  11. unsigned char i;
  12. while(t--){
  13. for(i=0;i<12;i++);
  14. }
  15. }
  16. //
  17. void Write_DS18B20(unsigned char dat)
  18. {
  19. unsigned char i;
  20. for(i=0;i<8;i++)
  21. {
  22. DQ = 0;
  23. DQ = dat&0x01;
  24. Delay_OneWire(5);
  25. DQ = 1;
  26. dat >>= 1;
  27. }
  28. Delay_OneWire(5);
  29. }
  30. //
  31. unsigned char Read_DS18B20(void)
  32. {
  33. unsigned char i;
  34. unsigned char dat;
  35. for(i=0;i<8;i++)
  36. {
  37. DQ = 0;
  38. dat >>= 1;
  39. DQ = 1;
  40. if(DQ)
  41. {
  42. dat |= 0x80;
  43. }
  44. Delay_OneWire(5);
  45. }
  46. return dat;
  47. }
  48. //
  49. bit init_ds18b20(void)
  50. {
  51. bit initflag = 0;
  52. DQ = 1;
  53. Delay_OneWire(12);
  54. DQ = 0;
  55. Delay_OneWire(80);
  56. DQ = 1;
  57. Delay_OneWire(10);
  58. initflag = DQ;
  59. Delay_OneWire(5);
  60. return initflag;
  61. }
  62. unsigned int Read_T()
  63. {
  64. unsigned char TL,TH;
  65. unsigned int T;
  66. init_ds18b20();
  67. Write_DS18B20(0xcc);
  68. Write_DS18B20(0x44);
  69. init_ds18b20();
  70. Write_DS18B20(0xcc);
  71. Write_DS18B20(0xbe);
  72. TL=Read_DS18B20();
  73. TH=Read_DS18B20();
  74. T=(TH<<8)|TL;
  75. T=T>>4;
  76. T+=(TL&0x0f)*0.0625;
  77. return T;
  78. }

头文件就不写出来了,毕竟都一样。

我自己测试功能感觉都是正确的,毕竟没有人会认为自己写的代码有问题哈哈哈,评论如果问题我看到的话会回复,没回复的话要不就是没看到,要不就是我也不知道。

好了就这么多,加纳!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/706105
推荐阅读
相关标签
  

闽ICP备14008679号