文章目录

  • 前言
  • 一、题目​​
  • 二、代码部分
    • 1.IIC.C
    • 2.IIC.H
    • 3.onewire.h
    • 4.onewire.h
    • 5. main.c
  • 总结

前言

蓝桥杯单片机——第十一届省赛赛题二解析

今年我也参加了第十三届的蓝桥杯单片机组省赛题,分享一下我在练习时写的代码,因为我是第一次

参加,如果有错误的地方欢迎大家指出来。我们大家一起加油进步,打造美好的明天!


一、题目​​

这次题目,就我个人而言难度还是比较简单的,没有什么特别难的地方,赛题总体难度中规中矩,考
的都是一些经常用到并考到的模块。

比如独立键盘、LED指示灯、数码管显示模块、DS18B20、PCF8591,这些都是蓝桥杯板子中基础的
模块,相信大家在平时的练习中都经常写过,都唯一需要注意的地方就是DAC输出,因为比赛考的比
较少,难免有可能一下子忘了怎么写。

其中那个按S4进行界面切换的时候,需要检测参数合理性,大家可以直接在进入参数界面时,将温度最大值和温度最小值分别赋给一个变量储存起来,在进入数据界面显示时在进行判定,不合理则分别将参数赋值回来。


二、代码部分

1.IIC.C

根据官方给出的驱动代码进行修改并加入自己的执行代码。(其中的ad_read函数在试题中并没有什

么大用,因为这套题根本用不了读取函数,纯粹是我在写代码时没怎么审题、直接就把这个给写出来

了。。。。。我也懒的删除了,大家直接忽略便是)

代码如下(示例):

#include "iic.h"#define DELAY_TIME 5//I2C总线内部延时函数
void IIC_Delay(unsigned char i)
{do{_nop_();}while(i--);
}//I2C总线启动信号
void IIC_Start(void)
{SDA = 1;SCL = 1;IIC_Delay(DELAY_TIME);SDA = 0;IIC_Delay(DELAY_TIME);SCL = 0;
}//I2C总线停止信号
void IIC_Stop(void)
{SDA = 0;SCL = 1;IIC_Delay(DELAY_TIME);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;
}unsigned char ad_read(unsigned char add)
{unsigned char temp;IIC_Start();IIC_SendByte(0x90);IIC_WaitAck();IIC_SendByte(add);IIC_WaitAck();IIC_Stop();IIC_Start();IIC_SendByte(0x91);IIC_WaitAck();temp=IIC_RecByte();IIC_WaitAck();     IIC_Stop();return temp;
}void ad_write(unsigned char dat)
{EA=0;IIC_Start();IIC_SendByte(0x90);IIC_WaitAck();IIC_SendByte(0x40);IIC_WaitAck();IIC_SendByte(dat);IIC_WaitAck();IIC_Stop();EA=1;
}

2.IIC.H

代码如下(示例):

#ifndef _IIC_H
#define _IIC_H#include "stc15f2k60s2.h"
#include "intrins.h"sbit SDA = P2^1;
sbit SCL = P2^0;void IIC_Start(void);
void IIC_Stop(void);
bit IIC_WaitAck(void);
void IIC_SendByte(unsigned char byt);
unsigned char IIC_RecByte(void);
void IIC_Delay(unsigned char i);
unsigned char ad_read(unsigned char add);
void ad_write(unsigned char dat);#endif

3.onewire.h

#include "onewire.h"//单总线内部延时函数
void Delay_OneWire(unsigned int t)
{while(t--);
}//单总线写操作
void Write_DS18B20(unsigned char dat)
{unsigned char i;for(i=0;i<8;i++){DQ = 0;DQ = dat&0x01;Delay_OneWire(50);DQ = 1;dat >>= 1;}Delay_OneWire(50);
}//单总线读操作
unsigned char Read_DS18B20(void)
{unsigned char i;unsigned char dat;for(i=0;i<8;i++){DQ = 0;dat >>= 1;DQ = 1;Delay_OneWire(1);if(DQ){dat |= 0x80;}       Delay_OneWire(50);}return dat;
}//DS18B20初始化
bit init_ds18b20(void)
{bit initflag = 0;DQ = 1;Delay_OneWire(120);DQ = 0;Delay_OneWire(800);DQ = 1;Delay_OneWire(100); initflag = DQ;     Delay_OneWire(50);return initflag;
}unsigned char ds_read()
{unsigned char temp;unsigned char low,high;init_ds18b20();Write_DS18B20(0xcc);Write_DS18B20(0x44);Delay_OneWire(200);init_ds18b20();Write_DS18B20(0xcc);Write_DS18B20(0xbe);Delay_OneWire(200);low=Read_DS18B20();high=Read_DS18B20();temp=(high<<4)|(low>>4);return temp;
}

4.onewire.h

#ifndef __ONEWIRE_H
#define __ONEWIRE_H#include "stc15f2k60s2.h"sbit DQ = P1^4;  unsigned char ds_read();
void Delay_OneWire(unsigned int t);
void Write_DS18B20(unsigned char dat);
unsigned char Read_DS18B20(void);
bit init_ds18b20(void);#endif

5. main.c

#include "IIC.H"
#include "onewire.h"sbit S7=P3^0;
sbit S6=P3^1;
sbit S5=P3^2;
sbit S4=P3^3;#define uchar  unsigned charuchar temp[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xBF,0XFF,0xc6,0x8c};                //12c,13P
uchar yi,er,san,si,wu,liu,qi,ba;
unsigned char tempare;
unsigned int voltage,mode=0,team=0,TMAX;TMIN,jia=30,jian=20,mode_tt=0,tempare_tt=0,sflg=1;void delayms(int ms);
void us_waishe();
void display1(uchar yi,uchar er);
void display2(uchar san,uchar si);
void display3(uchar wu,uchar liu);
void display4(uchar qi,uchar ba);
void discan();
void Timer0Init(void);
void mode0_dis();
void mode1_dis();
void display();void main()
{Timer0Init();us_waishe();while(1){voltage=ad_read(0x03);mode1_dis();mode0_dis();display1(yi,er);display2(san,si);display3(wu,liu);display4(qi,ba);discan();display();}
}
void display()
{if((jia>jian)||(jia=jian)){if(tempare>jia){ad_write(204);P2=0X80;P0=0XFE;}else if((tempare>=jian)&&(tempare<=jia)){ad_write(153);P2=0X80;P0=0XFD;}else if(tempare<jian){ad_write(102);P2=0X80;P0=0XFB;}}else{P2=0X80;P0=0XFF;}
}
void Timer0Init(void)       //1毫秒@12.000MHz
{AUXR |= 0x80;     //定时器时钟1T模式TMOD &= 0xF0;       //设置定时器模式TL0 = 0x20;       //设置定时初值TH0 = 0xD1;        //设置定时初值TF0 = 0;       //清除TF0标志TR0 = 1;      //定时器0开始计时ET0=1;EA=1;
}void Timer0() interrupt 1
{mode_tt++;tempare_tt++;if(mode_tt==200)                                //每200ms选中的模块闪一次{if(mode==1)sflg=1;                              //sflg==1时全显}else if(mode_tt==400){mode_tt=0;if(mode==1)sflg=0;}if(tempare_tt==400)                                       //每400ms刷新一次温度{tempare_tt=0;tempare=ds_read();}
}void mode0_dis()
{if(mode==0)                                  //数据界面{yi=12;er=11;san=11;si=11;wu=11;liu=11;qi=tempare/10;ba=tempare%10;}}
void mode1_dis()                                        //参数界面显示函数
{if(mode==1){if(sflg==1){if((jia/10!=0)&&(jian/10!=0))                                               //判断是两位数还是一位数{yi=13;er=11;san=11;si=jia/10;wu=jia%10;liu=11;qi=jian/10;ba=jian%10;}else if((jia/10==0)&&(jian/10==0)){yi=13;er=11;san=11;si=11;wu=jia;liu=11;qi=11;ba=jian;}else if((jia/10!=0)&&(jian/10==0)){yi=13;er=11;san=11;si=jia/10;wu=jia%10;liu=11;qi=11;ba=jian;}else if((jia/10==0)&&(jian/10!=0)){yi=13;er=11;san=11;si=11;wu=jia;liu=11;qi=jian/10;ba=jian%10;}}else if(sflg==0){if(team==1)                                                 //TMIN{if(jia/10!=0)                                            //判断是两位数还是一位数{yi=13;er=11;san=11;si=jia/10;wu=jia%10;liu=11;qi=11;ba=11;}else if(jia/10==0){yi=13;er=11;san=11;si=11;wu=jia;liu=11;qi=11;ba=11;}}else if(team==0)                                                  //TMAX{if(jian/10!=0)                                               //判断是两位数还是一位数{yi=13;er=11;san=11;si=11;wu=11;liu=11;qi=jian/10;ba=jian%10;}else if(jian/10==0){yi=13;er=11;san=11;si=11;wu=11;liu=11;qi=11;ba=jian;}}}}
}
void discan()
{if(S4==0){delayms(5);if(S4==0){ if(mode==0){TMAX=jia;TMIN=jian;mode=1;team=1;}                                                               //mode=0进入数据界面,mode=1进入参数界面。(有问题)else if(mode==1){mode=0;if(jia<jian)                                         //参数不合理则赋值;{jia=TMAX;jian=TMIN;}
//              else if(jia>=jian)
//              {//                  jia=jia;jian=jian;
//              }}}while(!S4);}else if(S5==0){delayms(5);if(S5==0){if(team==0)team=1;                                      //team=0时,选择TMAX,team=1时,选择TMINelse if(team==1)team=0;}while(!S5);}else if(S6==0){delayms(5);if(S6==0){if(mode==1){if(team==0){if((jia<100)&&(jia>=0))jia=jia+1;}else if(team==1){if((jian>=0)&&(jian<100))jian=jian+1;}}}while(!S6);}else if(S7==0){delayms(5);if(S7==0){if(mode==1){if(team==0){if((jia<100)&&(jia>0))jia=jia-1;}else if(team==1){if((jian<100)&&(jian>0))jian=jian-1;}}}while(!S7);}
}void us_waishe()
{P2=0X80;P0=0XFF;P2=0XA0;P0=0X00;P2=0XC0;P0=0XFF;P2=0XFF;P0=0XFF;
}void delayms(int ms)
{unsigned int i,j;for(i=ms;i>0;i--)for(j=845;j>0;j--);
}
void display1(uchar yi,uchar er)
{P2=0XC0;P0=0X01;P2=0XE0;P0=temp[yi];delayms(1);P2=0XC0;P0=0X02;P2=0XE0;P0=temp[er];delayms(1);
}
void display2(uchar san,uchar si)
{P2=0XC0;P0=0X04;P2=0XE0;P0=temp[san];delayms(1);P2=0XC0;P0=0X08;P2=0XE0;P0=temp[si];delayms(1);
}void display3(uchar wu,uchar liu)
{P2=0XC0;P0=0X10;P2=0XE0;P0=temp[wu];delayms(1);P2=0XC0;P0=0X20;P2=0XE0;P0=temp[liu];delayms(1);
}
void display4(uchar qi,uchar ba)
{P2=0XC0;P0=0X40;P2=0XE0;P0=temp[qi];delayms(1);P2=0XC0;P0=0X80;P2=0XE0;P0=temp[ba];delayms(1);P2=0XC0;P0=0XFF;P2=0XFF;P0=0XFF;
}

总结

这些就是蓝桥杯单片机第十一届省赛题赛题二的解析部分,祝大家都能进郭赛!!!!!!!!!!!!

蓝桥杯单片机省赛第十一届赛题二相关推荐

  1. 第十一届蓝桥杯 单片机设计与开发省赛试题

    第十一届蓝桥杯 单片机设计与开发 省赛 在昨天举办了第一波11届蓝桥杯比赛,第2波大概在10月份左右,看了看比赛题目,这次题目对于我来说,程序设计题简单,客观题全靠蒙! 本次比赛涉及: 1.数码管显示 ...

  2. 蓝桥杯单片机第七届省赛-模拟风扇控制系统

    九层妖塔 起于垒土 ● 改编自国信长天蓝桥杯官方蓝皮书例程,按照自己的习惯进行了补充和修改 蓝桥杯单片机第七届省赛-模拟风扇控制系统 Notes1:按键按下后在某些情况下给一定的缓冲时间 Notes2 ...

  3. 最新 2021年 第十二届 蓝桥杯 单片机设计与开发 省赛 客观试题 个人答案

    第十二届蓝桥杯单片机设计与开发项目省赛 第一部分客观试题(30分) 不定项选择(3分/题) (1)MCS-51单片机外部中断1的中断请求标志是( B ).     A.ET1        B.IE1 ...

  4. 【蓝桥杯单片机第十二届国赛真题】

    [蓝桥杯单片机第十二届国赛真题] 文章目录 [蓝桥杯单片机第十二届国赛真题] 前言 一.真题 二.源码 前言 有幸进入国赛,为自己大学最后一个比赛画上完满的句号^@^ 下面为蓝桥杯单片机第十二届国赛程 ...

  5. 蓝桥杯单片机第十届国赛练习

    单片机型号:IAP15F2K60S2. 蓝桥杯第十届国赛有串口,本文着手进行一番练习, 文末会附上整个工程下载地址. 这一届赛题的练习对我来说还是有些难度 我看题后做了以下几个设计方面的点总结列举: ...

  6. 蓝桥杯单片机第十届国赛

    今天是第十三届蓝桥杯单片机国赛的比赛时间,刚比完,简单说一下感想,这次国赛必须要用到三个定时器,昨天刚看了定时器2的使用,不太熟练,所以写的也不是很好,超声波和频率有点冲突,就个人而言,我觉得这一届最 ...

  7. 2018第八届至2022年第十三届蓝桥杯单片机开放与设计省赛客观题及简解整理

    前言: 由于本人马上要参加第十四届蓝桥杯单片机设计与开发的省赛了,在对客观题复习两轮后,发现效率是比较低的,因此整理了2018至2022年的省赛客观题,将大概的考点划分三部分,这样可以更加系统的复习其 ...

  8. 蓝桥杯单片机第十届省赛题程序实现

    文章目录 main.c iic.c main.c #include<reg52.h> #include<intrins.h> #include<iic.h>sbit ...

  9. 2020第十一届至2022年第十三届蓝桥杯单片机开放与设计省赛第二批客观题及简解整理

    前言: 之前的2018第八届至2022年第十三届的省赛客观题,其中第十一届至第十三届又包含第二批类型,这里作为补充,两篇文章可互相参考. 2018第八届至2022年第十三届的省赛客观题[http:// ...

  10. 蓝桥杯单片机第十二届省赛

    如果有用请点赞,还会继续更新的 题目: 思路: 还是千篇一律的定时器中断,简直就是yyds.这届和第十一届的题可以说是有很多相似的地方,我感觉难点可能还是LED的那个部分.废话少说,直接上代码. ma ...

最新文章

  1. Python中的模块和包:模块的(动态)导入、__future__模块使用
  2. 【手势交互】9. PS Move
  3. windows系统环境变量过长解决方案(PATH too long installer unable to modify Path)
  4. plsql打开sql窗口快捷键_巧用Navicat for MySQL的快捷键
  5. oracle udev 多路径,Suse 11下多路径及udev配置
  6. 有哪些必看的前端 JS 库?
  7. 曾经“杀手级”的桌面语言 Java 将要退隐江湖?
  8. python代码编辑器、最好_这十大文本/代码编辑器最好用
  9. 中南林科大c语言程序设计,2017年中南林业科技大学计算机与信息工程学院802C语言与数据结构之C程序设计考研强化模拟题...
  10. Somatic vs Germline Mutations
  11. linux安装离线docker包教程,Centos7离线安装Docker环境
  12. python代码模拟 手写字体
  13. 《推荐系统》基于标签的用户推荐系统
  14. 学习open62541 --- [15] 使用建模工具UaModeler
  15. Node.js 单元测试:我要写测试 - Mocha - Nodejs开源项目里怎么样写测试、CI和代码测试覆盖率
  16. 天刀 服务器状态,天刀实用技巧_天刀各种游戏小技巧_玩游戏网
  17. firewalld防火墙配置IP伪装和端口转发
  18. 专升本第一讲(计算机的“前世今生”)
  19. AV1比HEVC/H.265简单对比
  20. 利用webuploader实现超大文件分片上传、断点续传

热门文章

  1. 憎恨之心最强套装攻略_憎恨之心装备获取技巧 | 手游网游页游攻略大全
  2. python爬虫实践--晋江小说书籍分析
  3. 免费的收银系统靠谱吗
  4. SSM-SpringMVC-02:SpringMVC最简单的小案例
  5. uniapp 微信小程序最简单的生成图片示例
  6. pip 指定镜像不超时安装
  7. .NET的ConcurrentDictionary,线程安全集合类
  8. R绘图案例|基于分面的面积图
  9. sort排序规则 - 最全
  10. this是什么?this的概念是什么?