第十四届蓝桥杯单片机组模拟赛1

距第十四届蓝桥杯单片机还有不到一个月的时间啦,加油







源码

/*------------------------------第十四届蓝桥杯单片机模式赛--------------------------
@Author:小殷丫
@Date:2023.03.11
-----------------------------------------------------------------------------------*/#include <STC15F2K60S2.H>
#include "absacc.h"
#include "intrins.h"
#include <stdio.h>//定义行
sbit H1 = P3^0;
sbit H2 = P3^1;
sbit H3 = P3^2;
sbit H4 = P3^3;//定义列
sbit L1 = P3^4;
sbit L2 = P3^5;
sbit L3 = P4^2;
sbit L4 = P4^4;sbit TX = P1^0;
sbit RX = P1^1;int distance = 0,distance_param = 30;    //实时距离和设置参数
unsigned char L3_flag = 0,L3_Flash = 0;  //LED 相关标志位
char usart_flag = 0,mode = 1;            //串口发送标志和界面模式
char str[24] = {0};                      //存储字符串数据
char led_status = 0xff;                  //LED 控制
//数码管段码
char code smg_data[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};void delay(unsigned int t);                                      //简单延时
void Delay12us();                                                //@12.000MHz 延时12us
void Delay200ms();                                               //@12.000MHz
void Init_74HC138(unsigned char dat);                            //74HC138锁存器初始化
void SMG_Choice_By_Bit(unsigned char pos,unsigned char dat);     //数码管安位操作
void Controal_ALL_SMG(unsigned char dat);                        //所以数码管控制
void Key_Controal(void);                                         //按键控制
void Display_Distance(void);                                     //实时距离显示
void Display_Distance_Param(void);                               //设置参数距离
void Send_Wave();                                                //产生8个40KHx超声波信号
void Measure_Distance();                                         //超声波测距
void initUart(void);                                             //9600bps@12.000MHz
void SendByte(unsigned char dat);                                //发送单个字符
void SendString(unsigned char *str);                             //字符串发送
void Init_Timer1(void);                                          //定时器1初始化
void Led_Running(void);                                          //led功能函数
void Init_System(void);                                          //上电初始化相关/*===============================================下面为正式功能实现=========================================*/void delay(unsigned int t)
{while(t--);
}void Delay200ms()      //@12.000MHz
{unsigned char i, j, k;_nop_();_nop_();i = 10;j = 31;k = 147;do{do{while (--k);} while (--j);} while (--i);
}
//74HC138初始化
void Init_74HC138(unsigned char dat)
{switch(dat){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;case 0:P2 = (P2 & 0x1f)|0x00;break;}P2 = (P2 & 0x1f)|0x00;
}//数码管位选操作
void SMG_Choice_By_Bit(unsigned char pos,unsigned char dat)
{P0 = (0x01 << pos);Init_74HC138(6);P0 = dat;Init_74HC138(7);
}//控制所有数码管
void Controal_ALL_SMG(unsigned char dat)
{P0 = 0xff;Init_74HC138(6);P0 = dat;Init_74HC138(7);
}void Key_Controal(void)
{H4 = 0;H1 = H2 = H3 = 1;if(mode == 2){//S12if(L2 == 0){delay(20);if(L2 == 0){while(L2 == 0){Display_Distance_Param();}if(mode == 2){             distance_param += 10;         }}}//S16if(L1 == 0){delay(20);if(L1 == 0){while(L1 == 0){Display_Distance_Param();}if(mode == 2){   if(distance_param - 10 < 0){distance_param = 0;}else{distance_param -= 10; }}}}}if(mode == 1){//S8if(L3 == 0){delay(20);if(L3 == 0){while(L3 == 0){Display_Distance();}distance_param = distance ;}}}//S4if(L4 == 0){delay(20);if(L4 == 0){if(mode == 1){while(L4 == 0){Display_Distance();}mode = 2;}else if(mode == 2){while(L4 == 0){Display_Distance_Param();}mode = 1;}}}//S9 串口发送H3 = 0;H1 = H2 = H4 = 1;if(L3 == 0){delay(20);if(L3 == 0){while(L3 == 0){if(mode == 1){Display_Distance();}else{Display_Distance_Param();}}usart_flag = 1;      }}
}void Display_Distance(void)
{//U 1000 0011 0xc1SMG_Choice_By_Bit(0,0xc1);delay(500);SMG_Choice_By_Bit(1,smg_data[mode]);delay(500);SMG_Choice_By_Bit(5, smg_data[distance / 100]);delay(500);SMG_Choice_By_Bit(6, smg_data[(distance % 100) / 10]);delay(500);SMG_Choice_By_Bit(7, smg_data[distance % 10]);delay(500);
}   void Display_Distance_Param(void)
{//U 1000 0011 0xc1SMG_Choice_By_Bit(0,0xc1);delay(500);SMG_Choice_By_Bit(1,smg_data[mode]);delay(500);SMG_Choice_By_Bit(5, smg_data[distance_param / 100]);delay(500);SMG_Choice_By_Bit(6, smg_data[(distance_param /10) % 10]);delay(500);SMG_Choice_By_Bit(7, smg_data[distance_param % 10]);delay(500);
}void Delay12us()                  //@12.000MHz 延时12us
{unsigned char i;_nop_();_nop_();i = 33;while (--i);
}void Send_Wave()                 //产生8个40KHx超声波信号
{unsigned char i;for(i = 0; i < 8; i++){TX = 1;Delay12us();  TX = 0;Delay12us();}
}void Measure_Distance()            //超声波测距
{unsigned int time = 0;TMOD &= 0xf0;              //定时器0模式0,13位,最大8192个计数脉冲                             TL0 = 0x00;                                        TH0 = 0x00;        Send_Wave();                //发送超声波信号                           TR0 = 1;            //启动定时器                        while((RX == 1) && (TF0 == 0));    //等待超声波信号返回或者等到测量超出范围TR0 = 0;            //停止定时器                if(TF0 == 0)              //正常测量范围                            {time = TH0;                                   time = (time << 8) | TL0;        distance = ((time / 10) * 17) / 100 + 3;//distance = time * 0.017;}else                        //超出测量范围          {TF0 = 0;distance = 999;}}void initUart(void)     //9600bps@12.000MHz
{SCON = 0x50;      AUXR |= 0x01;      AUXR &= 0xFB;      T2L = 0xE6;        T2H = 0xFF;        AUXR |= 0x10;  ES = 1;EA = 1;
}//发送一个字节
void SendByte(unsigned char dat)
{SBUF = dat;while(TI == 0); //等待发送完成TI = 0;  //清除标志位}//发送一个字符串
void SendString(unsigned char *str)
{//字符串以'\0'为结束标志while(*str != '\0'){SendByte(*str++);}
}//定时器1初始化
void Init_Timer1(void)
{TMOD = 0x10;         // 定时器1方式1 16TH1 = (65535 - 50000)/256;  //50msTL1 = (65535 - 50000)%256;ET1 = 1;TR1 = 1;EA  = 1;
}void Led_Running(void)
{if(mode == 1){//0111 1111  将bit0置0 其他位不变led_status &= 0xfe;}else{//1000 0000   将bit0置1 其他位不变led_status |= 0x01;}if(mode == 2){//1011 1111   将bit2置0 其他位不变led_status &= 0xfd;}else{//0100 0000   将bit2置1 其他位不变led_status |= 0x02;}if(distance_param < distance){L3_flag = 1;if(L3_Flash){//1101 1111  将bit3置0 其他位不变led_status &= 0xfb;L3_Flash = 0;}else{//0100 0000   将bit3置1 其他位不变led_status |= 0x04;}}else{L3_flag = 0;//0100 0000   将bit3置1 其他位不变led_status |= 0x04;}P0 = led_status;Init_74HC138(4);
}
//系统初始化
void Init_System(void)
{P0 = 0xff;Init_74HC138(4);P0 = 0x00;Init_74HC138(5);Controal_ALL_SMG(0xff);
}void main(void)
{Init_System();   //系统初始化Init_Timer1();  //定时器1初始化initUart();   //串口初始化while(1){Led_Running();Key_Controal();Measure_Distance();      switch(mode){case 1:Display_Distance();break;case 2:Display_Distance_Param();break;}if(usart_flag){usart_flag = 0;sprintf(str,"Distance:%dcm\r\n",distance);SendString(str);Delay200ms();}}
}//定时器中断服务函数 50ms进一次中断
void Timer1_Server() interrupt 3
{static unsigned char t = 0;TH1 = (65535 - 50000)/256;  //50msTL1 = (65535 - 50000)%256;if(L3_flag){t++;  if(t == 4)//200ms{t = 0;L3_Flash = 1;}}
}

【第十四届蓝桥杯单片机组模拟赛1】相关推荐

  1. 【第十四届蓝桥杯单片机组客观题1】

    第十四届蓝桥杯单片机组客观题1 以下客观题来自4T测评的模拟题,希望可以帮助到大家,加油丫 1.C 若希望将IAP15F2K61S2单片机的IO口输出电流能力较强,应将IO配置为( )模式. A : ...

  2. 第十四届蓝桥杯第三期模拟赛 C/C++ B组 原题与详解

    本篇文章对第十四届蓝桥杯第三期模拟赛所有的题目进行了详细解析.如果大家还想刷题的话,我给大家整理出了第十二届的省赛真题:第十二届省赛C/C++ B组真题.推荐大家可以去做一下. 文章目录 一.填空题 ...

  3. 十四届蓝桥青少组模拟赛Python-20221108

    十四届蓝桥青少组模拟赛Python-20221108 T1.二进制位数 十进制整数2在十进制中是1位数,在二进制中对应10,是2位数. 十进制整数22在十进制中是2位数,在二进制中对应10110,是5 ...

  4. 第十四届蓝桥杯第一期模拟赛试题与题解 C++

    第十四届蓝桥杯第一期模拟赛试题与题解 C++ 试题 A 题解:位运算 试题 B 题解:日历模拟 试题 C 题解:double 求和 试题 D 题解:枚举 试题 E 题解:二维前缀和 试题 F 题解:两 ...

  5. 第十四届蓝桥杯第二期模拟赛 【python】

    第十四届蓝桥杯第二期模拟赛 [python] 文章目录 第十四届蓝桥杯第二期模拟赛 [python] ✨最小的2022 (python二进制) ❓️问题描述 答案提交

  6. 第十四届蓝桥杯第一期模拟赛 python

    第十四届蓝桥杯python第一期模拟赛 文章目录 第十四届蓝桥杯python第一期模拟赛 1. 二进制位数 问题描述 答案提交 思路 参考答案 2. 晨跑 问题描述 答案提交 思路 参考答案 3. 调 ...

  7. 第十四届蓝桥杯cb组省赛个人题解

    试题 C: 冶炼金属 ​ 时间限制: 1.0s 内存限制: 256.0MB 本题总分:10 分 [问题描述] ​ 小蓝有一个神奇的炉子用于将普通金属 O 冶炼成为一种特殊金属 X.这个 炉子有一个称作 ...

  8. 十三届蓝桥杯单片机组省赛真题程序解析

    第一次参加蓝桥杯,线上比赛,记录一下 比赛刚开始了十分钟才做上客观题,做上了之后才发现看一次题警告一次,当时就蚌埠住了,随便做了做就交了,手册也没怎么查(查一下直接给了3次黄牌,就没敢查了)其实老师1 ...

  9. 第jiu届蓝桥杯单片机省赛真题_第九届蓝桥杯单片机组省赛试题.pdf

    第九届蓝桥杯单片机组省赛试题 "彩灯控制器"的程序设计与调试 (70 分) 一.基本要求 1.1 使用CT107D 单片机竞赛板,完成"彩灯控制器"功能的程序设 ...

最新文章

  1. 如何下载python2.7.16_Python2.7.16安装(Win10)
  2. CAT 性能优化的实践和思考
  3. Oracle Database Appliance
  4. 【计蒜客 - 蓝桥训练】阶乘位数(数学,对数运算,求阶乘位数)
  5. chrome控制台如何把vw显示成px_你可能不知道的chrome调试技巧
  6. oracle undo head,淺談Oracle的undo管理
  7. iphone实用配置工具_Debookee for Mac(网络数据抓包及分析工具)
  8. 对python语言的认识_认识Python语言和基础知识
  9. 自动控制原理第七版胡寿松课后答案
  10. 显示器尺寸对照表_各种电脑显示器尺寸对应的最佳分辨率大小是多少
  11. Python分析成绩
  12. 共模电感 | 关键参数的计算步骤
  13. 矩阵的分解:满秩分解和奇异值分解
  14. (翻译自用)TG^2———IJDAR杂志论文
  15. ​Windows域关系学习 全攻略
  16. 木星协定_木星笔记本简介
  17. [SV]SystemVerilog進程之fork join专题详解及案例分析
  18. 微信小程序父组件调用子组件方法
  19. uoni扫地机器人好用吗_扫地机器人好用吗?选购注意这些关键指标,8.28张大奕生活节帮你选...
  20. 稳压电源如何操作使用

热门文章

  1. 5G谈“风暴”可能为之尚早,芯片厂商之间的拉锯战才是这场变革的热身赛
  2. 数学建模 matlab 标准规划问题的MATLAB求解
  3. 腾讯云服务器自动断开连接的解决办法
  4. k8s 自定义dns_kubernetes 容器 DNS 设置
  5. ALOAM试跑及程序注释
  6. 12/15历史上的今天
  7. android固件轻松,安卓轻松改工具-安卓固件修改软件-安卓轻松改工具下载 v1.0.2官方版-完美下载...
  8. Excel一键另存工作簿中的多个工作表为PDF
  9. 持续集成——接口测试集成实战
  10. Excel DAY 01 保护工作簿结构工作表 保护工作表填充柄文本记忆输入数据有效性验证导入外部数据文本 数值 日期选中多个数据冻结行头