蓝桥杯单片机要点——第十二届省赛(含代码)

news2024/11/27 7:41:31

题目:


用到的模块:

  • LED单个点亮(建议用sbit,文件开头定义单个引脚)

  • 数码管动态显示

  • 矩阵键盘

  • ds18b20,用到onewire.c

  • DAC转化(步骤见文章末尾的易错点),用到iic.c


main.c代码

#include "intrins.h"#include "reg52.h"#include "onewire.h"#include "iic.h"sfr P4=0xc0;sbit r1=P3^2;sbit r2=P3^3;sbit l1=P4^4;sbit l2=P4^2;sbit L1=P0^0;sbit L2=P0^1;sbit L3=P0^2;sbit L4=P0^3;unsigned char code t_display[]={                       //标准字库//   0    1    2    3    4    5    6    7    8    9    A    B    C    D    E    F    0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,//black  -     H    J    K    L    N    o   P    U     t    G    Q    r   M    y    0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e,};    unsigned char code t_display_dot[]={0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x46};    //0. 1. 2. 3. 4. 5. 6. 7. 8. 9. -1unsigned char mode=1;unsigned int temp;unsigned int temp_set=25;unsigned int dac0;unsigned int temp_SMG;unsigned int dac_SMG;unsigned char mode_1=1;//void SelectHC138(unsigned char channel,unsigned char dat);void InitSys();void SMG_bit(unsigned char pos,unsigned char num);void SMG();void Delay2ms();    //@11.0592MHzvoid DS18B20();void Delay(unsigned char t);void ScanKeys();void Delay_key(unsigned char t);void LED();void DAC();///void main(){  InitSys();  while(1)  {    LED();    ScanKeys();    DS18B20();    SMG();    DAC();  }}//void SelectHC138(unsigned char channel,unsigned char dat){  P0=dat;  switch(channel)  {    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;  }  P2=P2&0x1f|0x00;}void InitSys(){  SelectHC138(4,0xff);  SelectHC138(5,0x00);  SelectHC138(6,0xff);  SelectHC138(7,0xff);}void SMG_bit(unsigned char pos,unsigned char num){  SelectHC138(6,0x01<<pos);  SelectHC138(7,num);  Delay2ms();  SelectHC138(7,0xff);}void SMG(){  switch(mode)  {    case 1:      SMG_bit(0,~0x39);      SMG_bit(7,~t_display[temp_SMG%10]);      SMG_bit(6,~t_display[temp_SMG/10%10]);      SMG_bit(5,~t_display_dot[temp_SMG/100%10]);      SMG_bit(4,~t_display[temp_SMG/1000]);    break;    case 2:      SMG_bit(0,~0x73);      SMG_bit(7,~t_display[temp_set%10]);      SMG_bit(6,~t_display[temp_set/10]);    break;    case 3:      SMG_bit(0,~0x77);      SMG_bit(7,~t_display[dac_SMG%10]);      SMG_bit(6,~t_display[dac_SMG%100/10]);      SMG_bit(5,~t_display_dot[dac_SMG/100]);    break;  }}void Delay2ms()    //@11.0592MHz{  unsigned char i, j;  _nop_();  _nop_();  i = 22;  j = 128;  do  {    while (--j);  } while (--i);}void DS18B20(){  unsigned char MSB,LSB;  init_ds18b20();  Write_DS18B20(0xcc);  Write_DS18B20(0x44);  Delay(500);    init_ds18b20();  Write_DS18B20(0xcc);  Write_DS18B20(0xbe);  LSB=Read_DS18B20();  MSB=Read_DS18B20();    temp=MSB;  temp=(temp<<8)|LSB;  temp=temp>>4;  temp_SMG=temp*100+(LSB&0x0f)*6.25;  temp=temp+(LSB&0x0f)*0.0625;  }void ScanKeys(){  //S4  r1=1;  l1=l2=1;  r2=0;  if(l1==0)  {    Delay_key(20);    if(l1==0)    {      while(l1==0)      {        SMG();      }      if(mode==3)        mode=1;      else        mode++;    }  }    //S8  r1=1;  l1=l2=1;  r2=0;  if(l2==0)  {    Delay_key(20);    if(l2==0)    {      while(l2==0)      {        SMG();      }      //      if(mode==2)        temp_set--;          }  }    //S5  r2=1;  l1=l2=1;  r1=0;  if(l1==0)  {    Delay_key(20);    if(l1==0)    {      while(l1==0)      {        SMG();      }      //      if(mode_1==1)        mode_1=2;      else        mode_1=1;    }  }    //S9  r2=1;  l1=l2=1;  r1=0;  if(l2==0)  {    Delay_key(20);    if(l2==0)    {      while(l2==0)      {        SMG();      }      //      if(mode==2)        temp_set++;          }  }  }void LED(){  InitSys();  if(mode_1==1)  {    P2=P2&0x1f|0x80;    L1=0;    P2=P2&0x1f|0x00;  }  if(mode_1==2)  {    P2=P2&0x1f|0x80;    L1=1;    P2=P2&0x1f|0x00;  }  if(mode==1)  {    P2=P2&0x1f|0x80;    L2=0;    P2=P2&0x1f|0x00;  }  if(mode==2)  {    P2=P2&0x1f|0x80;    L3=0;    P2=P2&0x1f|0x00;  }  if(mode==3)  {    P2=P2&0x1f|0x80;    L4=0;    P2=P2&0x1f|0x00;  }}void DAC(){  if(mode_1==1)  {    if(temp<temp_set)    {      dac_SMG=0;      dac0=0;      output(dac0);    }    else    {      dac_SMG=500;      dac0=255;      output(dac0);    }  }  else  {    if(temp<=20)    {      dac_SMG=100;      dac0=1/5*255;      output(dac0);    }    else if(temp>=40)    {      dac_SMG=400;      dac0=4/5*255;      output(dac0);    }    else    {      //y=kx+b;4=40k+b;1=20k+b;20k=3,b=-2      dac0=((3/20)*temp-2)/5*255;      dac_SMG=((3.0/20.0)*temp-2)*100;      output(dac0);    }  }}void Delay(unsigned char t){  while(t--)  {    SMG();    ScanKeys();    LED();    DAC();  }}void Delay_key(unsigned char t){  while(t--)  {    SMG();    LED();    DAC();  }}

iic.c代码,注意最后一个函数是自己写的,且要将这个函数声明加入iic.h中

/*  程序说明: IIC总线驱动程序  软件环境: Keil uVision 4.10   硬件环境: CT107单片机综合实训平台 8051,12MHz  日    期: 2011-8-9*/#include "reg52.h"#include "intrins.h"#define DELAY_TIME 50#define SlaveAddrW 0xA0#define SlaveAddrR 0xA1//总线引脚定义sbit SDA = P2^1;  /* 数据线 */sbit SCL = P2^0;  /* 时钟线 */void IIC_Delay(unsigned char i){    do{_nop_();}    while(i--);        }//总线启动条件void IIC_Start(void){    SDA = 1;    SCL = 1;    IIC_Delay(DELAY_TIME);    SDA = 0;    IIC_Delay(DELAY_TIME);  //  SCL = 0;  }//总线停止条件void IIC_Stop(void){    SDA = 0;    SCL = 1;    IIC_Delay(DELAY_TIME);    SDA = 1;    IIC_Delay(DELAY_TIME);}//发送应答void IIC_SendAck(bit ackbit){    SCL = 0;    SDA = ackbit;            // 0:应答,1:非应答    IIC_Delay(DELAY_TIME);    SCL = 1;    IIC_Delay(DELAY_TIME);    SCL = 0;     SDA = 1;    IIC_Delay(DELAY_TIME);}//等待应答bit IIC_WaitAck(void){    bit ackbit;      SCL  = 1;    IIC_Delay(DELAY_TIME);    ackbit = SDA;    SCL = 0;    IIC_Delay(DELAY_TIME);    return ackbit;}//通过I2C总线发送数据void IIC_SendByte(unsigned char byt){    unsigned char i;    for(i=0; i<8; i++)    {        SCL  = 0;        IIC_Delay(DELAY_TIME);        if(byt & 0x80) SDA  = 1;        else SDA  = 0;        IIC_Delay(DELAY_TIME);        SCL = 1;        byt <<= 1;        IIC_Delay(DELAY_TIME);    }    SCL  = 0;  }//从I2C总线上接收数据unsigned char IIC_RecByte(void){    unsigned char i, da;    for(i=0; i<8; i++)    {         SCL = 1;  IIC_Delay(DELAY_TIME);  da <<= 1;  if(SDA) da |= 1;  SCL = 0;  IIC_Delay(DELAY_TIME);    }    return da;    }void output(unsigned char dac0){  IIC_Start();  IIC_SendByte(0x90);  IIC_WaitAck();  IIC_SendByte(0x40);  IIC_WaitAck();  IIC_SendByte(dac0);  IIC_WaitAck();  IIC_Stop();  }

iic.h(最后加入自己在iic.c中写的函数的声明)

#ifndef __IIC_H__#define __IIC_H__#include "reg52.h"#include "intrins.h"#define DELAY_TIME 50#define SlaveAddrW 0xA0#define SlaveAddrR 0xA1//总线引脚定义sbit SDA = P2^1;  /* 数据线 */sbit SCL = P2^0;  /* 时钟线 */void IIC_Delay(unsigned char i);void IIC_Start(void);void IIC_Stop(void);void IIC_SendAck(bit ackbit);bit IIC_WaitAck(void);void IIC_SendByte(unsigned char byt);unsigned char IIC_RecByte(void);void output(unsigned char dac0);#endif

要点及易错点:

  1. DAC写入是要将数据*255/5.0的

  2. 计算斜率的时候,要加小数点,不然计算会错误,例如:3/20是错的,要写成(3.0/20.0)

  3. 矩阵键盘用到P4端口的时候,要在文件的开头加上sfr P4=0xc0,

  4. DAC写入不要忘记步骤:

  •  启动start

  •  写入0x90

  •   等回应

  •  写入0x40

  •  等回应

  •  写入dac数据(要将电压转换成虚拟值,所以要/5*255)

  •  等回应

  • 结束

5. DS18B20模块的Delay函数中,while(t--)的循环下要有所有的显示+读取+按键扫描

6.按键扫描的延时函数中,while(t--)的循环下要有所有的显示+读取,但不要加入按键扫描


作者的话:

本系列不是教学篇,为速通版。因此涉及打破砂锅问到底的逻辑部分较少。

C语言教程可移步曾经发过的C语言速通教程。

有建议欢迎指出,也欢迎友好交流!

另也欢迎关注其他平台上本人的账号 如下:

知乎:youzuos

微信公众号:知识薪火站

感谢支持!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1582261.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一本书了解AI的下一个风口:AI Agent

在数字化浪潮中&#xff0c;人工智能&#xff08;AI&#xff09;已成为推动现代社会前进的强劲引擎。 从智能手机的智能助手到自动驾驶汽车的精准导航&#xff0c;AI技术的应用已经渗透到生活的方方面面。 随着技术的飞速发展&#xff0c;我们正站在一个新的转折点上&#xff…

Playwright安装和基本使用(ui/web自动化)

1.简介 Playwright是2021年微软开源的一个项目「playwright-python」。针对 Python 语言的纯自动化工具&#xff0c;它可以通过单个API自动执行 Chromium&#xff0c;Firefox 和 WebKit 浏览器&#xff0c;同时支持以无头模式、有头模式运行。 Playwright&#xff08;Git&…

美国CPC认证是什么认证

美国CPC认证是一种针对儿童产品的认证&#xff0c;旨在确保这些产品的安全性。CPC全称为Consumer Product Certification&#xff0c;即消费品认证&#xff0c;是美国消费品安全委员会&#xff08;CPSC&#xff09;所推行的一种自愿性认证制度。通过CPC认证的产品&#xff0c;意…

人证比对接口在游戏行业的作用

人证比对接口又叫实人认证接口、人脸身份证比对接口、人脸实名认证接口&#xff0c;这个接口在很多行业都有重大作用&#xff0c;特别是确认当前用户信息至关重要。今天我们来聊一聊实人认证接口在游戏行业的作用。 今天为什么聊这个话题呢&#xff0c;主要就是最近热搜都被杭…

AR远程空间标注Vuforia+WebRTC音视频通话和空间标注功能

AR远程空间标注VuforiaWebRTC音视频通话和空间标注功能 视频学习地址&#xff1a;https://www.bilibili.com/video/BV1ZT4y187mG/?vd_sourcefc4b6cdd80b58c93a280fd74c37aadbf

LeetCode110:平衡二叉树

题目描述 给定一个二叉树&#xff0c;判断它是否是 平衡二叉树 解题思想 使用递归依次计算左子树的高度和右子树的高度 代码 class Solution { public:int height(TreeNode* node) {if (node nullptr) return 0;int leftT height(node->left);if (leftT -1) return -1;…

武汉星起航:亚马逊助力中国卖家拓展全球市场,实现品牌价值最大化

亚马逊&#xff0c;作为全球电商的领军平台&#xff0c;不仅为消费者提供了丰富的购物选择&#xff0c;同时也为中国卖家带来了前所未有的益处和在中国市场的巨大优势。 亚马逊为中国卖家提供了一个全球化的销售平台。这个平台不仅连接了中国与世界的消费者&#xff0c;还为中…

标准C库文件操作

open 系列API 和 fopen系列API的区别 1.来源: -open 是UNIX系统调用函数(包括LINUX系统)&#xff0c;返回的是文件描述符 -fopen是ANSIC标准的C语言库函数&#xff0c;在不同系统重调用不同内核的API 2.移植性: fopen 是C标准函数&#xff0c;具有良好的移植性&#xff1b; 而…

Vue 移动端(H5)项目怎么实现页面缓存(即列表页面进入详情返回后列表页面缓存且还原页面滚动条位置)keep-alive简单使用

一、需求 产品要求&#xff1a;Vue移动端项目进入列表页&#xff0c;列表页需要刷新&#xff0c;而从详情页返回列表页&#xff0c;列表页则需要缓存并且还原页面滚动条位置 二、实现思路 1、使用Vue中的keep-alive组件&#xff0c;keep-alive提供了路由缓存功能 2、因为我项…

基于知识图谱的推理:智能决策与自动发现

基于知识图谱的推理&#xff1a;智能决策与自动发现 一、引言 在今天这个数据驱动的时代&#xff0c;我们经常会听到人们提及“知识图谱”这个词。知识图谱&#xff0c;作为一种结构化知识的表达方式&#xff0c;已经成为智能系统不可或缺的一部分&#xff0c;它通过连接大量的…

ModuleNotFoundError: No module named ‘mlxtend‘

from mlxtend.plotting import plot_decision_regions 报错信息: ModuleNotFoundError: No module named mlxtend Jupyter和Spyder报错原因&#xff1a;因为anaconda下没有这个模块&#xff0c;需要安装mlxtend 解决方案&#xff1a; 1.打开anaconda(或终端) 2. 点击路径点…

项目文章| Plant CellDAP-seq解析草莓NAC转录因子FvRIF的调控网络

DAP-seq是一种体外研究蛋白与DNA结合的技术&#xff0c;该技术利用麦胚乳表达体系表达目标蛋白然后与基因组DNA文库体外孵育&#xff0c;得到目标蛋白的结合信息。与ChIP-seq和CUT&Tag不同&#xff0c;DAP-seq不需要抗体&#xff0c;在植物中应用更为广泛。今天我们分享一篇…

Java开发面试题分享

目录 1、简述MyISAM和InnoDB的区别 2、简述Hash和B树索引的区别 3、简述MyBatis的实现逻辑 4、#{}和${}的区别 5、简述Mybatis的优缺点 6、当实体类中的属性名和表中的字段名不一样时怎么办&#xff1f; 7、resultType与resultMap的区别 8、如何执行批量插入 9、Mybat…

[中级]软考_软件设计_计算机组成与体系结构_12_概述及回顾

概述及回顾 总纲考情分析与分值海明校验码计算公式重点 总纲 考情分析与分值 海明校验码计算公式 2 r m r 1 2^r mr1 2rmr1 重点 数据的表示是计算题型的基础计算机组成中的CPU组成计算机组成中的存储系统&#xff0c;是核心重点的考察CISC与RISC及流水线执行时间的求取

YOLOv8在windows平台的C++推理

前言 YOLOv8很多人很多人很熟悉了,现在V9都已经出来了,学习没有比别人更新的快! 个人记录一下在windows平台使用C++推理的记录。 环境配置 YOLOv8的传统的环境配置,就不多说,网上很多参考教程。 需要注意的点就是,本次C++推理需要使用OPENCV的DNN模块,所以我们需要下…

每日OJ题_BFS解决FloodFill①_力扣733. 图像渲染

目录 BFS解决FloodFill简介 力扣733. 图像渲染 解析代码 BFS解决FloodFill简介 FloodeFill算法即填充算法&#xff0c;中文&#xff1a;洪水灌溉&#xff0c;算法原理就是从一个点开始向四周扩散&#xff0c;向周围可以走到的点填充颜色&#xff0c;直到将可扩散到的点全部填…

ElasticSearch分词检索

1. 倒排索引&#xff1a;表示一种数据结构&#xff0c;分词词条与文档id集合的隐射关系 2. 它跟关系型数据库是一种互补的关系&#xff0c;因为关系型数据库支持事务操作&#xff0c;满足ACID原则 3. 索引库的文档字段只允许新增不允许修改 1.创建索引库 put /索引库名称2.1 …

Altair® (澳汰尔)Inspire™ Render —— 强大的 3D 渲染和动画工具

Inspire Render 是一种全新 3D 渲染和动画工具&#xff0c;可供创新设计师、建筑师和数字艺术家以前所未有的速度快速制作精美的产品演示。 借助基于物理特性的内置高品质全局照明渲染引擎 Thea Render&#xff0c;可以快速创建、修改和拖放各种材质并添加照明环境&#xff0c…

风电场智能化转型基于ARM工控机的HDMI数据实时监控显示

全球能源结构不断调整的大背景下&#xff0c;智能电网、太阳能发电、风能发电等清洁能源领域正经历着一场由技术创新引领的深刻变革。在这场变革中&#xff0c;ARM架构的工控机凭借其出色的性能、低功耗及高度可定制化的特点&#xff0c;正在成为能源管理系统的核心组件&#x…

LeetCode-1702. 修改后的最大二进制字符串【贪心 字符串】

LeetCode-1702. 修改后的最大二进制字符串【贪心 字符串】 题目描述&#xff1a;解题思路一&#xff1a;贪心&#xff0c;几个规则。解题思路二&#xff1a;当前遇到0&#xff0c;去找下一个0的位置&#xff0c;将当前变为00。通过解题思路三&#xff1a;另一种贪心写法。 题目…