【蓝桥杯第十二届省赛】





#include "reg52.h"
#include "onewire.h"
#include "iic.h"/*============================================
第十二届蓝桥杯单片机
Date:2022.2.4
Author:小殷同学
Version:1.0
=============================================*/
sfr  P4 = 0xc0;
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;unsigned char Temperature = 25;
unsigned char Temperature_Param = 25;//温度参数设置
unsigned int voltage = 325; //电压   扩大100倍方便计算显示
unsigned char interface_mode  = 0,work_mode = 1; //界面切换 工作模式
unsigned char Temperature_start = 0,DAC_start = 0,count = 0;// 温度 DAC刷新标志  计时
unsigned char code SMG_duama[18]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,0xbf,0x7f};//数码管段码不带小数点
unsigned char code SMG_DOT[10] ={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//数码管段码带小数点//------------------------------简单延时-------------------------
void Delay(unsigned int t)
{while(t--);
}
//-------------------------74HC138初始化-------------------------
void Init_74HC138(unsigned char n)
{switch(n){case 0:P2 = (P2 & 0x1f) | 0x00;break;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;}
}
//---------------------------系统初始化--------------------------
void Init_System(void)
{Init_74HC138(4);P0 = 0xff;Init_74HC138(5);P0 = 0x00;Init_74HC138(0);
}
//--------------------------------数码管安位显示-----------------
void SMG_DisplayBit(unsigned char pos,unsigned char dat)
{Init_74HC138(6);P0 = (0x01 << pos);Init_74HC138(7);P0 = dat;
}
//------------------------------数码管显示----------------------
void SMG_Close(void)
{Init_74HC138(6);P0 = 0xff;Init_74HC138(7);P0 = 0xff;
}
void SMG_Display_Volate(void)
{SMG_DisplayBit(0,SMG_duama[10]);Delay(200);    SMG_DisplayBit(1,0xff);Delay(200);  SMG_DisplayBit(2,0xff);Delay(200);SMG_DisplayBit(3,0xff);Delay(200);SMG_DisplayBit(4,0xff);Delay(200);SMG_DisplayBit(5,SMG_DOT[voltage/100]);Delay(200);SMG_DisplayBit(6,SMG_duama[voltage/10%10]);Delay(200);SMG_DisplayBit(7,SMG_duama[voltage%10]);                    Delay(200);   SMG_Close();Delay(200);
}
void SMG_Display_Temperature(void)
{SMG_DisplayBit(0,SMG_duama[12]);Delay(200);    SMG_DisplayBit(1,0xff);Delay(200);  SMG_DisplayBit(2,0xff);Delay(200);SMG_DisplayBit(3,0xff);Delay(200);SMG_DisplayBit(4,SMG_duama[Temperature*100/1000]);Delay(200);SMG_DisplayBit(5,SMG_DOT[Temperature*100/100%10]);Delay(200);SMG_DisplayBit(6,SMG_duama[Temperature*100/10%10]);Delay(200);SMG_DisplayBit(7,SMG_duama[Temperature*100/10%10]);Delay(200);  SMG_Close();Delay(200);
}void SMG_Set_Temperature(void)
{//P 0011 0001 0X8CSMG_DisplayBit(0,0X8c);Delay(200);   SMG_DisplayBit(1,0xff);Delay(200);  SMG_DisplayBit(2,0xff);Delay(200);SMG_DisplayBit(3,0xff);Delay(200);SMG_DisplayBit(4,0xff);Delay(200);SMG_DisplayBit(5,0xff);Delay(200);SMG_DisplayBit(6,SMG_duama[Temperature_Param/10]);Delay(200);SMG_DisplayBit(7,SMG_duama[Temperature_Param%10]);Delay(200);  SMG_Close();Delay(200);
}
//--------------------------------DS18B20------------------------
void Read_Temperature(void)
{unsigned char LSB,MSB;init_ds18b20();Write_DS18B20(0xcc);Write_DS18B20(0x44);Delay(500);init_ds18b20();Write_DS18B20(0xcc);Write_DS18B20(0xbe);LSB = Read_DS18B20();MSB = Read_DS18B20();init_ds18b20();Temperature = (MSB << 8) | LSB;if(Temperature & 0xf800 == 0x0000){Temperature   = Temperature >> 4;Temperature *= 10;Temperature = Temperature + (LSB & 0x0f)*0.625;}
}
//---------------------------------PCF8591----------------------
void Read_Rd2_DAC(float dat)
{IIC_Start();IIC_SendByte(0x90);IIC_WaitAck();IIC_SendByte(0x40);IIC_WaitAck();IIC_SendByte(dat);IIC_WaitAck();IIC_Stop();
}
//----------------------------------矩阵键盘--------------------
void Matrix_Key(void)
{H3 = 0;H1 = H2 = H4 = 1;L1 = L2 = L3 = L4 = 1;//s9 在参数界面下按下S9按键,温度参数加1if(L3 == 0){Delay(20);if(L3 == 0){while(L3 == 0){SMG_Set_Temperature(); //温度设置界面    }if(interface_mode == 1)   //在温度界面下进行温度加一{Temperature_Param++;}}}//S5 定义为“模式”切换按键。 /*模式1:DAC输出电压与温度相关。 通过DS18B20采集到的实时温度小于温度参数时,DAC输出0V,否则,DAC输出5V。 模式2:DAC按照图7给出的关系输出电压。 */if(L4 == 0){Delay(20);if(L4 == 0){while(L4 == 0){SMG_Display_Volate();}if(work_mode == 1){if(Temperature < Temperature_Param){Read_Rd2_DAC(0);    //实时温度小于温度参数时,DAC输出0V,voltage = 0;}else{Read_Rd2_DAC(255); //DAC输出5Vvoltage = 500; //5v 扩大100 倍 方便计算}work_mode = 2;}else if(work_mode == 2){work_mode = 0;if(Temperature <= 20){//5/255 = 1/x x->255/5  Read_Rd2_DAC(51);voltage = 100; //1v}else if(Temperature > 40){//5/255 = 4/x x-> 204Read_Rd2_DAC(204);voltage = 400; //4v}//关系式输出else if(Temperature > 20 && Temperature < 40){Read_Rd2_DAC((0.15*Temperature-2)*51.0);voltage = (0.15*Temperature-2)*100; //扩大100倍方便计算}work_mode = 1; }}  }H4 = 0;H1 = H2 = H3 = 1;L1 = L2 = L3 = L4 = 1;//s8 定义为“减”按键 参数界面下按下S8按键,温度参数减1if(L3 == 0){Delay(20);if(L3 == 0){while(L3 == 0){SMG_Set_Temperature(); //温度设置界面    }if(interface_mode == 1)       //在温度界面下进行温度减一{Temperature_Param--;}}  }//S4 定义为“界面”按键,按下S4按键,切换温度显示界面、参数设置界面和DAC输出界面,if(L4 == 0){Delay(20);if(L4 == 0){while(L4 == 0){if(interface_mode == 0){interface_mode = 1;SMG_Display_Temperature(); //温度显示界面                }else if(interface_mode == 1){interface_mode = 2;SMG_Set_Temperature(); //温度设置界面                     }else if(interface_mode == 2){interface_mode = 0;SMG_Display_Volate(); //电压显示界面          }}}}
}//--------------------------------LED功能处理-------------------
void Led_Running(void)
{//当前处于模式1状态,指示灯L1点亮,否则熄灭Init_74HC138(4);if(work_mode == 1){P0 = 0x7f; //0111 1111}switch(interface_mode){case 0:P0 = 0xfd;break;//当前处于温度显示界面,指示灯L2点亮,否则熄灭case 1:P0 = 0xfb;break;//当前处于参数设置界面,指示灯L3点亮,否则熄灭。case 2:P0 = 0xf7;break; //当前处于DAC输出界面,指示灯L4点亮,否则熄灭}/*if(interface_mode == 0){P0 = 0xfd;  //1011 1111}//当前处于参数设置界面,指示灯L3点亮,否则熄灭。 if(interface_mode == 1){P0  = 0xfb; //1101 1111}//当前处于DAC输出界面,指示灯L4点亮,否则熄灭if(interface_mode == 2){P0 = 0xf7; //1110 1111}*/}
//--------------------------------定时器初始化-------------------
void Init_Timer(void)
{TMOD = 0x01;TH0  = (65535-50000)/256; //50MSTL0  = (65535-50000)%256;ET0  = 1;TR0  = 1;EA   = 1;
}
//----------------------------主函数-----------------------------
void main(void)
{Init_System();Init_Timer();while(1){Matrix_Key();  Read_Temperature();                                                                                                       switch(interface_mode){case 0:SMG_Display_Temperature();break;case 1:SMG_Set_Temperature();break;case 2:SMG_Display_Volate(); break;}Led_Running();}
}
//----------------------------------中断服务函数----------------
//温度数据刷新时间:≤1秒。
//DAC输出电压刷新时间:≤0.5秒
void Server_Timer0() interrupt 1
{TH0 = (65535-50000)/256;TL0 = (65535-50000)%256;count++;if(count == 10) //0.5s{if(DAC_start == 0 )//DAC刷新标志{DAC_start = 1;}else if(DAC_start == 1){DAC_start = 0;}}if(count == 20)// 1s{if(Temperature_start == 0) //温度刷新标志{Temperature_start = 1;}else if(Temperature_start == 1){Temperature_start = 0;}count = 0;}}

【蓝桥杯第十二届省赛】相关推荐

  1. 2021年蓝桥杯第十二届软件赛省赛 C/C++ 大学B组 第二场 A-I

    目录 A: 求余 (水题) B:双阶乘(模拟) C:格点(模拟/枚举) D:整数分解 (闫式dp/数学) E:城邦(并查集+Kruskal) F:特殊年份(模拟) G:小平方 (模拟) H:完全平方数 ...

  2. 蓝桥杯第十二届省赛题解

    赛后才知道计算公式是256乘1024乘1024乘8除以32,泪崩== #include<bits/stdc++.h> using namespace std; int num[10]; b ...

  3. 【蓝桥杯嵌入式】蓝桥杯第十二届省赛程序真题,真题分析与代码讲解

  4. 蓝桥杯第十二届真题解析

    目录 前言 考试技巧 真题解析 第一题 (ASC) 第二题 (卡片) 第三题 (直线) 第四题 (货物摆放) 第五题 (路径) 第六题 (时间显示) 第七题 (最少砝码) 第八题 (杨辉三角形) 第九 ...

  5. 蓝桥杯第十届省赛java组解析(灵能传输 四星难度,后缀表达式 两星难度)

    第一题太简单懒得复制题目了 答案是:490 第二题: 试题 B: 不同子串 本题总分:5 分 [问题描述] 一个字符串的非空子串是指字符串中长度至少为 1 的连续的一段字符组成 的串.例如,字符串aa ...

  6. Java B组蓝桥杯第十届国赛:大胖子走迷宫

    试题 H: 大胖子走迷宫 时间限制: 1.0s 内存限制: 512.0MB 本题总分:20 分 [问题描述] 小明是个大胖子,或者说是个大大胖子,如果说正常人占用 1 × 1 的面积, 小明要占用 5 ...

  7. 蓝桥杯第十届国赛C++研究生组 试题 A: 三升序列

    试题 A: 三升序列 [问题描述] 对于一个字母矩阵,我们称矩阵中的一个三升序列是指在矩阵中找到三个 字母,它们在同一行,同一列,或者在同一 45 度的斜线上,这三个字母从左向 右看.或者从上向下看是 ...

  8. 关于蓝桥杯第十二届H题杨辉三角(满分结果)

    一.题目描述 二.题目初步分析 杨辉三角大家都会,这题多了一个进行判断,相等就输出位置,难点在于:n可以为10亿,运行次数过多会超内存,超时 三.寻找规律 按照这类题,想出正确结果,只有寻找规律 第一 ...

  9. 蓝桥杯第十届省赛试题

    题目要求 1. 基本要求 1.1 使用大赛组委会提供的国信长天单片机竞赛实训平台,完成本试题的程序设计与调试. 1.2 选手在程序设计与调试过程中,可参考组委会提供的"资源数据包" ...

最新文章

  1. python 局域网共享
  2. session过期跳出irame
  3. 一个简单的你好,世界! 使用 Boost.MPI 消息传递的示例
  4. D3 Data Visualization in Ext JS
  5. 关于CRM AET table extension是否能够在S4CRM继续使用的问题
  6. C语言模拟11答案,C语言模拟试题11答案.doc
  7. testflight怎么做版本更新_《动物森友会》万圣节版本更新后,别忘了做这五件事情...
  8. react-native-router-flux 页面跳转与传值
  9. MATLAB印刷体汉字识别
  10. 密码学·编码类密码·CTF常见考察密码
  11. 蓝桥杯训练系统 分解质因数
  12. 三星显示器 测试软件,3D+TV+APP!三星27英寸LED显示器全国首测
  13. [JS真好玩] 掘金创作者必备: 监控每天是谁取关了你?
  14. android仿ppt,android 仿ppt进入动画效果合集
  15. 如何自己动手给笔记本电脑增加内存
  16. MacBook Pro电脑一键切换输入法
  17. C/C++ 无法解析的外部符号解决方案
  18. mac怎么强制退出程序,强制退出Mac程序,mac 强制退出程序
  19. ros与stm32串口通信
  20. docker-comose搭建openldap + jenkins

热门文章

  1. 海关公务员规范工资后薪酬下降
  2. 钢笔墨水能否代替打印机墨水_日本兔村文具店的原创文具钢笔墨水温柔如诗的美好设计...
  3. GemFire 是什么?
  4. 鲁大师发布手机功耗测试:荣耀Magic3登上第一期榜首
  5. request 的相关请求方法
  6. 浅述 国产 仪器 4456系列数字荧光示波器
  7. ElasticSearch - Mapping 配置字段属性:对 long 类型字段聚合需要开启 doc_values:true
  8. rrt算法流程图_基于RRT的运动规划算法综述
  9. VSCode编译调试复杂C/C++项目
  10. 65动态版式标题Premiere Pro模板