devbox
Cpp五条
这个屌丝很懒,什么也没留下!
当前位置:   article > 正文

14届蓝桥杯单片机模拟赛试题以及代码完整实现_蓝桥杯第十四届单片机模拟题解析

蓝桥杯第十四届单片机模拟题解析

        之前没有关注这个模拟赛,现在发现了顺手练习以下,还有2天就要开始比赛了,希望大家好好发挥

main函数以及各种定义

  1. #include "reg52.h"
  2. #include "stdio.h"
  3. #include "intrins.h"
  4. typedef unsigned char u8;
  5. typedef unsigned int u16;
  6. #define U ~0x3e
  7. #define DELAY_TIME 20 //iic延时
  8. #define SlaveAddrW 0x90 //pcf8591 写读地址
  9. #define SlaveAddrR 0x91
  10. sbit led1=P0^0; //led蜂鸣器继电器引脚声明
  11. sbit led2=P0^1;
  12. sbit led3=P0^2;
  13. sbit beep=P0^6;
  14. sbit relay=P0^4;
  15. sbit DQ = P1^4; //单总线接口
  16. //总线引脚定义
  17. sbit SDA = P2^1; /* 数据线 */
  18. sbit SCL = P2^0; /* 时钟线 */
  19. void dis_page(); //页面显示函数
  20. void sys_init(); //系统初始化函数
  21. void led_kz(); //led控制函数
  22. void relay_beep_kz(); //继电器蜂鸣器控制函数
  23. void send_string(u8 *x); //串口发送字符串函数
  24. void key_set(); //按键改变状态函数
  25. void UartInit(void); //串口初始化,波特率9600
  26. void send_char(u8 x); //串口发送字符
  27. float get_tmp(); //ds18b20获取温度
  28. float ad_read_rb2(u8 addr); //读取ad值
  29. //u8 putchar(u8 x);
  30. const u8 smg_code[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0x7f};
  31. u16 tmp_dis=275; //显示的温度变量
  32. u16 ad_dis=135; //显示的ad变量
  33. u8 key_flag=0; //按键松开标志,松开为0按下不松开为1
  34. u8 page=0; //页面号
  35. u8 led3_flag=0; //led3闪烁标志,没写
  36. u8 flag=0; //按键锁定标志,s4按下为1,s5按下为0
  37. u8 read_buff; //串口读取的数据
  38. void main()
  39. {
  40. sys_init(); //系统初始化
  41. UartInit(); //串口初始化
  42. while(1)
  43. {
  44. ad_dis=ad_read_rb2(0x03)*100; //读取ad值
  45. tmp_dis=get_tmp()*10; //读取温度值
  46. key_set(); //按键扫描改变
  47. dis_page(); //显示页面
  48. led_kz(); //led控制
  49. relay_beep_kz(); //蜂鸣器继电器控制
  50. }
  51. }

 系统初始化以及数码管显示函数

  1. void h138(u8 x)
  2. {
  3. switch(x)
  4. {
  5. case 1:{P2=P2&0X1F|0X80;break;} //LED
  6. case 2:{P2=P2&0X1F|0Xa0;break;} //RELAY
  7. case 3:{P2=P2&0X1F|0XC0;break;} //SMG_W
  8. case 4:{P2=P2&0X1F|0XE0;break;} //SMG_D
  9. }
  10. }
  11. void sys_init()
  12. {
  13. h138(1);
  14. P0=0XFF;
  15. h138(2);
  16. relay=0;
  17. beep=0;
  18. }
  19. void delay(u16 x)
  20. {
  21. while(x--);
  22. }
  23. void smg_dis_one(u8 x,u8 dat)
  24. {
  25. h138(3);
  26. P0=0x01<<x;
  27. delay(5);
  28. h138(4);
  29. P0=dat;
  30. delay(200);
  31. P0=0XFF;
  32. }
  33. void smg_dis_all(u8 d0,u8 d1,u8 d2,u8 d3,u8 d4,u8 d5,u8 d6,u8 d7)
  34. {
  35. smg_dis_one(0,d0);
  36. smg_dis_one(1,d1);
  37. smg_dis_one(2,d2);
  38. smg_dis_one(3,d3);
  39. smg_dis_one(4,d4);
  40. smg_dis_one(5,d5);
  41. smg_dis_one(6,d6);
  42. smg_dis_one(7,d7);
  43. }
  44. void dis_page()
  45. {
  46. if(page==0)
  47. {
  48. smg_dis_all(U,smg_code[1],0xff,0xff,0xff,smg_code[tmp_dis/100],smg_code[tmp_dis%100/10]&0x7f,smg_code[tmp_dis%10]);
  49. }
  50. if(page==1)
  51. {
  52. smg_dis_all(U,smg_code[2],0xff,0xff,0xff,smg_code[ad_dis/100]&0x7f,smg_code[ad_dis%100/10],smg_code[ad_dis%10]);
  53. }
  54. }

按键扫描函数和按键控制函数

  1. u8 key_scan()
  2. {
  3. u8 key,h,l;
  4. P44=1;P42=1;P3=0XF0;
  5. if(P44==0||P42==0||P3!=0XF0&&key_flag==0)
  6. {
  7. if(P44==0) l=1;
  8. if(P42==0) l=2;
  9. if(P35==0) l=3;
  10. if(P34==0) l=4;
  11. }
  12. P44=0;P42=0;P3=0X0F;
  13. if(P3!=0X0F&&key_flag==0)
  14. {
  15. key_flag=1;
  16. if(P30==0) h=4;
  17. if(P31==0) h=3;
  18. if(P32==0) h=2;
  19. if(P33==0) h=1;
  20. }
  21. key = l*4+h-1;
  22. while(P3!=0X0F)
  23. {
  24. return key;
  25. }
  26. key_flag=0;
  27. return 0;
  28. }
  29. void key_set()
  30. {
  31. u8 key;
  32. key=key_scan();
  33. if(key==4) flag=1;
  34. if(flag==1){
  35. if(key==5) flag=0;
  36. }
  37. if(key==12){
  38. if(page==0) printf("TEMP:%.1fC\n",tmp_dis/10.0);
  39. if(page==1) printf("Voltage:%.2fV\n",ad_dis/100.0);
  40. }
  41. }

继电器蜂鸣器和led控制函数

  1. void led_kz()
  2. {
  3. h138(1);
  4. if(page==0) led1=0;
  5. else led1=1;
  6. if(page==1) led2=0;
  7. else led2=1;
  8. if(flag) led3=0;
  9. else led3=1;
  10. }
  11. void relay_beep_kz()
  12. {
  13. h138(2);
  14. if(tmp_dis>=280) relay=1;
  15. else relay=0;
  16. if(ad_dis>360) beep=1;
  17. else beep=0;
  18. }

串口配置使用

  1. void UartInit(void) //9600bps@12.000MHz
  2. {
  3. SCON = 0x50; //8位数据,可变波特率
  4. AUXR |= 0x40; //定时器时钟1T模式
  5. AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
  6. TMOD &= 0x0F; //设置定时器模式
  7. TL1 = 0xC7; //设置定时初始值
  8. TH1 = 0xFE; //设置定时初始值
  9. ET1 = 0; //禁止定时器中断
  10. TR1 = 1; //定时器1开始计时
  11. EA=1;
  12. ES=1;
  13. REN=1;
  14. }
  15. void uart() interrupt 4 using 1
  16. {
  17. if(RI)
  18. {
  19. read_buff=SBUF;
  20. RI=0;
  21. if(flag==0){
  22. if(read_buff=='A') page=0;
  23. if(read_buff=='B') page=1;
  24. }
  25. }
  26. }
  27. void send_char(u8 x)
  28. {
  29. SBUF=x;
  30. while(!TI);
  31. TI=0;
  32. }
  33. //void send_string(u8 *x)
  34. //{
  35. // u8 i=0;
  36. // while(*(x+i)!='\0')
  37. // {
  38. // send_char(*(x+i));
  39. // i++;
  40. // }
  41. //}
  42. /*
  43. **重写printf调用的putchar函数,重定向到串口输出
  44. **需要引入头文件<stdio.h>
  45. *****/
  46. char putchar(char c){
  47. //输出重定向到串口
  48. send_char(c);
  49. return c; //返回给函数的调用者printf
  50. }

还有两个模块获取数据这里就不贴出了,祝大家都能取得好成绩。

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

闽ICP备14008679号