蓝桥杯论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 83597|回复: 13

2018蓝桥杯单片机组 备赛、分享、交流

[复制链接]

1

主题

10

帖子

59

积分

注册会员

Rank: 2

积分
59
发表于 2018-2-14 13:05:57 | 显示全部楼层 |阅读模式
主要分享一下自己的备赛过程,和大家交流一下问题,以及在给学校同学指导过程中发现的问题的分享。三月中旬比赛前省赛内容应该差不多能结束,就看管理员让不让发了。
博客同步更新,文件下载更方便。

【蓝桥杯单片机设计与开发】(1)赛前学习准备

蓝桥杯单片机设计与开发所需设备:
CT107D实验平台、IAP15F2K61S2转接芯片(或最小系统板)

  • 必备开发软件:
已注册Keil5、 STC-ISP-v6.86
文末下载

注册步骤:①打开keil5→File→License Mana...                   ②复制CID
              

③打开keil5注册机,按图示选择,并粘贴入自己的CID码,复制最下面的LIC码
④返回License Mana...界面,将LIC码粘贴,并点击Add LIC
软件安装注意事项
①下载过程中请关闭所有杀毒软件
②第一次开启keil5,及keil5注册机(有奇妙的音乐建议关闭声音)时,请使用管理员模式运行。

  • 事前准备
1)STC-ISP-v6.86使用说明
①芯片及串口选择                                                                              ②开发辅助功能(范例程序、定时器、延时计算器等)
                                                         

2)keil5工程创建说明
①导入头文件(该操作只需一次)     选择isp软件keil仿真选项点击图中所示位置,选择keil安装目录导入。
                       

②创建keil工程
(1)自定位置创建工程所需文件夹(中英文皆可)。
(2)打开Keil5→Project→New uVision Project
(3)选择芯片(按图示选择,确认后弹出对话框选是)
(4)选择生成HEX文件 点击菜单 Project→Options for Target→Output(勾选图示内容)
(5)创建C程序 点击菜单 File→New→将其保存在工程目录以“xxx.c”命名→导入工程文档中(见图)
              

本章资料下载地址为避免不必要纠纷,不留下载地址请前往原文下载,后续有程序的更新会附带工程文件。

赛前学习的准备工作到此就大致结束了,下一章内容将简单介绍主要学习内容及相关资料下载。

本文采用 「CC BY-NC-SA 4.0」创作共享协议,转载请标注以下信息:
原文出处:Bkoak's blog  http://www.bkoak.com/2018/02/11/lanqiao1/

联系博主
邮箱:wjf418224424@aliyun.com
QQ交流群:693211073


回复

使用道具 举报

1

主题

10

帖子

59

积分

注册会员

Rank: 2

积分
59
 楼主| 发表于 2018-2-14 15:59:37 | 显示全部楼层
【蓝桥杯单片机设计与开发】(2)开发平台及主要学习内容简介

  • CT107D单片机综合实训平台

不推荐官方购买该平台,很贵,建议用同类产品替换,或买二手的。
以下简称实训平台,该文章只介绍比赛使用部分模块。
(1) 单片机芯片
配置 40 脚 51 系列单片机插座(比赛使用IAP15F2K61S2转接芯片);
  
全I/O兼容8051系列,为保留P3.6,P3.7的WR,RD功能由P4.2,P4.4替换。
(2) 显示模块
配置8路led发光二极管;
配置8位8段共阳数码管;
(2) 输入/输出模块
配置 4×4 键盘矩阵,其中四个按键可通过跳线配置为独立按键;
配置继电器、蜂鸣器;
(3) 传感模块
配置红外一体头 1838 及红外发射管;
配置一个霍尔传感器;
配置数字温度传感器 DS18B20;
(4)存储/AD、DA/时钟模块
配置 EEPROM 芯片 AT24C02;
配置 PCF8591A/D、D/A 芯片,内含 8 位 4 通道 A/D 转换、单通道 D/A 转换;
配置时钟芯片DS1302;
   
(5)USB转TTL\IO拓展
配置 ch341进行USB转串口进行程序下载;
配置4片74HC573进行IO复用;
配置138译码器与74HC02四2输入或非门控制573片选;
      

实训平台布局图
各个基本功能模块在实验板上的布局如下图所示。
                原理图文末下载
需使用跳线说明(详见开发板)(1) 红外功能选择 跳线 ( J2 )
5、3 短接,6、4 短接:选择红外发射/接收功能
(2) USB 功能选择(J4 )
1、2 短接:选择 UART 功能,USB 接口用作串行通信
(3) 按键功能选择(J5 )
1、2 短接:选择 4x4 键盘功能
2、3 短接:选择 4 个独立按键功能
(4) 外设访问方式选择(J13 )
2、3 短接:选择 I/O 口直接控制方式
(5) 外设访问方式选择 (J15 )
1、2 短接:选择 51 系列单片机

管脚说明见PDF:P48文末下载
CH341驱动文末下载
  • 通过省赛必须掌握内容
1)片上功能(见datasheet文末下载
①定时器
②中断
③捕获
④串口
⑤外部中断
⑥EEPROM
⑦ADC
2)重点外设功能(见后续文章)
①键盘
②数码管、LED
③继电器、蜂鸣器
④DS1302、AT24C02
⑤DS18B20
⑥PCF8591
2)额外功能(视情况更新)
①串口通信
②LCD1602
③红外收发
④霍尔元件频率测算
⑤超声波测距

本章资料下载地址请见原址。

开发平台简介及主要学习内容的介绍到此就大致结束了,下一章将正式开始蓝桥杯单片机教学。

本文采用 「CC BY-NC-SA 4.0」创作共享协议,转载请标注以下信息:
原文出处:Bkoak's blog  http://www.bkoak.com/2018/02/12/lanqiao2/

联系博主
邮箱:wjf418224424@aliyun.com
QQ交流群:693211073

回复

使用道具 举报

1

主题

10

帖子

59

积分

注册会员

Rank: 2

积分
59
 楼主| 发表于 2018-2-15 23:56:15 | 显示全部楼层
【蓝桥杯单片机设计与开发】(3)138译码器、四2输入或非门、573三态锁存器


  • CT107D实验平台操作关键——器件原理部分
CT107D实验平台区别于其他51单片机及开发平台的区别就在于该平台在I/O口复用上的设计。
其中的关键就在于对138译码器、四2输入或非门、573三态锁存器的操作上,本章内容就将着重介绍这三部分的使用方法。
1)3线-8线译码器 —— 74HC138(电气参数见datasheet文末下载
引脚分布                 芯片实物引脚顺序见datasheet。
138译码器的工作原理是选通端(G1)为高电平,另两个选通端((G2A)和(G2B))为低电平时,可将地址端(A、B、C)的二进制编码在一个对应的输出端以低电平译出。
引出端符号:
A、B、C 译码地址输入端(接单片机IO口)
G1 选通端(接电源或单片机IO口)
(G2A)、(G2B) 选通端(低电平有效)
Y0~Y7 译码输出端(接受控器件)
在该平台A、B、C 译码地址输入端接入单片机P2寄存器中的P25、P26、P27三个端口。
真值表:
其中G2* =(G2A) + (G2B)、L = 低电平、H = 高电平、X = 任意
推荐代码写法:
[c]    //如果需要使用P20~P25端口建议如下写法    P2 = ((P2&0x1f)|0xA0); //这种写法只改变后P2高三位的状态,不改变前面低五位的状态。    //P2&0x1f的操作是保留低五位状态将高三位置0,0x1f = 00011111  和  0xA0 = 10100000进行或运算      //最终 P2 = 0xBF = 10111111    P2 = 0xA0; //如无需使用P20~P25端口可直接对P2寄存器进行操作[/c]

2)四2输入或非门(OC)—— 74HC02(电气参数见datasheet文末下载
引脚分布                 芯片实物引脚顺序见datasheet。
四2输入或非门(OC)为四组 2 输入端或非门(正逻辑)。
引出端符号:
A1-A4或非门输入端(接单片机IO口或GND)
B1-B4或非门输入端(接单片机IO口或GND)
Y1~Y4 或非门输出端(接受控器件)
在该平台A1-A4或非门输入端接入GND或P36(通过跳线选择),B1-B4或非门输入端接入GND,Y1~Y4 或非门输出端接四片573(LE)锁存使能端。
功能表:
其中A、B、Y为或非门输入输出端、L = 低电平、H = 高电平
未接单片机IO口不涉及直接操作代码段。



3)八进制3态非反转透明锁存器 —— 74HC573(电气参数见datasheet文末下载
引脚分布                 芯片实物引脚顺序见datasheet。
573三态锁存器是标准CMOS输入/输出器件,当锁存使能端为高时,该器件为透明态(输入同输出);当锁存使能端为低时,在符合建立时间和保持时间的数据会被锁存。
引出端符号:
D1-D8输入端(接单片机IO口)
Q1-Q8输出端(接受控器件)
LE锁存使能端(接控制器件)
OE输出使能端(接GND)
在该平台D1-D8输入端接入单片机P0,Q1-Q8输出端接受控元器件,LE锁存使能端接四2或非门输出端。
功能表:
其中Z为高阻态、L = 低电平、H = 高电平、X 不用关心
  • CT107D实验平台操作关键——代码操作部分
[c]    P2 = ((P2&0x1f)|0xA0); //操作138译码器ABC输入端为 101,Y0~Y7输出为 11111011,其中Y5为 L    /*    CT107D实验平台中 Y4~Y7分别对应控制或非门输出端Y1~Y4    通过或非门选择分别控制以下四部份的573锁存器        ①LED发光二极管        ②达林顿管——(电机、继电器、蜂鸣器)        ③8位8段数码管段选        ④8位8段数码管位选    */    P0 = 0x00; //控制②号573锁存器驱动,达林顿管ULN2003输出0xff,控制电机、继电器、蜂鸣器等原件[/c]
本章资料下载地址:https://pan.baidu.com/s/1o9qFoV4
密码:utx9

开发平台关于138译码器、四2输入或非门、573三态锁存器的介绍到此就大致结束了,下一章将开始讲解消音,点亮LED及流水灯。

本文采用 「CC BY-NC-SA 4.0」创作共享协议,转载请标注以下信息:
原文出处:Bkoak's blog  http://www.bkoak.com/2018/02/12/lanqiao3/

联系博主
邮箱:wjf418224424@aliyun.com
QQ交流群:693211073


回复

使用道具 举报

1

主题

10

帖子

59

积分

注册会员

Rank: 2

积分
59
 楼主| 发表于 2018-2-16 21:46:52 | 显示全部楼层
【蓝桥杯单片机设计与开发】(3)138译码器、四2输入或非门、573三态锁存器

  • CT107D实验平台操作关键——器件原理部分
CT107D实验平台区别于其他51单片机及开发平台的区别就在于该平台在I/O口复用上的设计。
其中的关键就在于对138译码器、四2输入或非门、573三态锁存器的操作上,本章内容就将着重介绍这三部分的使用方法。
1)3线-8线译码器 —— 74HC138(电气参数见datasheet文末下载
引脚分布                 芯片实物引脚顺序见datasheet。
138译码器的工作原理是选通端(G1)为高电平,另两个选通端((G2A)和(G2B))为低电平时,可将地址端(A、B、C)的二进制编码在一个对应的输出端以低电平译出。
引出端符号:
A、B、C 译码地址输入端(接单片机IO口)
G1 选通端(接电源或单片机IO口)
(G2A)、(G2B) 选通端(低电平有效)
Y0~Y7 译码输出端(接受控器件)
在该平台A、B、C 译码地址输入端接入单片机P2寄存器中的P25、P26、P27三个端口。
真值表:
其中G2* =(G2A) + (G2B)、L = 低电平、H = 高电平、X = 任意
推荐代码写法:
[c]    //如果需要使用P20~P25端口建议如下写法    P2 = ((P2&0x1f)|0xA0); //这种写法只改变后P2高三位的状态,不改变前面低五位的状态。    //P2&0x1f的操作是保留低五位状态将高三位置0,0x1f = 00011111  和  0xA0 = 10100000进行或运算      //最终 P2 = 0xBF = 10111111    P2 = 0xA0; //如无需使用P20~P25端口可直接对P2寄存器进行操作[/c]

2)四2输入或非门(OC)—— 74HC02(电气参数见datasheet文末下载
引脚分布                 芯片实物引脚顺序见datasheet。
四2输入或非门(OC)为四组 2 输入端或非门(正逻辑)。
引出端符号:
A1-A4或非门输入端(接单片机IO口或GND)
B1-B4或非门输入端(接单片机IO口或GND)
Y1~Y4 或非门输出端(接受控器件)
在该平台A1-A4或非门输入端接入GND或P36(通过跳线选择),B1-B4或非门输入端接入GND,Y1~Y4 或非门输出端接四片573(LE)锁存使能端。
功能表:
其中A、B、Y为或非门输入输出端、L = 低电平、H = 高电平
未接单片机IO口不涉及直接操作代码段。



3)八进制3态非反转透明锁存器 —— 74HC573(电气参数见datasheet文末下载
引脚分布                 芯片实物引脚顺序见datasheet。
573三态锁存器是标准CMOS输入/输出器件,当锁存使能端为高时,该器件为透明态(输入同输出);当锁存使能端为低时,在符合建立时间和保持时间的数据会被锁存。
引出端符号:
D1-D8输入端(接单片机IO口)
Q1-Q8输出端(接受控器件)
LE锁存使能端(接控制器件)
OE输出使能端(接GND)
在该平台D1-D8输入端接入单片机P0,Q1-Q8输出端接受控元器件,LE锁存使能端接四2或非门输出端。
功能表:
其中Z为高阻态、L = 低电平、H = 高电平、X 不用关心
  • CT107D实验平台操作关键——代码操作部分
[c]    P2 = ((P2&0x1f)|0xA0); //操作138译码器ABC输入端为 101,Y0~Y7输出为 11111011,其中Y5为 L    /*    CT107D实验平台中 Y4~Y7分别对应控制或非门输出端Y1~Y4    通过或非门选择分别控制以下四部份的573锁存器        ①LED发光二极管        ②达林顿管——(电机、继电器、蜂鸣器)        ③8位8段数码管段选        ④8位8段数码管位选    */    P0 = 0x00; //控制②号573锁存器驱动,达林顿管ULN2003输出0xff,控制电机、继电器、蜂鸣器等原件[/c]
本章资料下载地址请前往原址。

开发平台关于138译码器、四2输入或非门、573三态锁存器的介绍到此就大致结束了,下一章将开始讲解消音,点亮LED及流水灯。

本文采用 「CC BY-NC-SA 4.0」创作共享协议,转载请标注以下信息:
原文出处:Bkoak's blog  http://www.bkoak.com/2018/02/12/lanqiao3/

联系博主
邮箱:wjf418224424@aliyun.com
QQ交流群:693211073


回复

使用道具 举报

1

主题

10

帖子

59

积分

注册会员

Rank: 2

积分
59
 楼主| 发表于 2018-2-18 00:18:52 | 显示全部楼层
【蓝桥杯单片机设计与开发】(8)静态数码管/动态数码管的编程作者: bkoak 分类: 蓝桥杯 发布时间: 2018-02-17 19:19 编辑


郑重声明,请不要复制粘贴代码,第一可能会被网页专制标点符号,导致编译报错,其次复制粘贴达成的效果,可能会让你产生一种我会了的错觉。
本章我们的主要内容是静态数码管和动态数码管的编程,主要内容在程序中讲解,同时会复习一下上一章定时器的内容。
共阴/共阳数码管
首先我们先来了解一下数码管的工作原理,我们普遍将数码管分为两种一种是共阴数码管一种是共阳数码管(我们使用的是两个4位八段共阳数码管)。
所谓八段数码管就是八个发光二极管组成的如上图的结构形态,共阴数码管就是八个LED阴极相连组成公共端接GND,共阳数码管就是八个LED阳极相连组成公共端接VCC。
我们使用的4位八段数码驱动原理也是如此其中八个管脚作为(A,B,C,D,E,F,G,DP)的驱动端口,选择哪一段数码管亮或不亮,我们称之为数码管段选,还有4个管脚作为选择四位数码管中的哪一位亮或不亮的驱动端口,也就是四个公共端,我们称之为数码管位选。
驱动原理
下面我们来看一下我们开发板的驱动原理图是如何驱动这两个四位共阳数码管的。
图中a1、b1……dp1就是数码管的段选端口,com1、com2……com8就是数码管的位选端口,我们可以看到,蓝桥杯开发板的数码管段选和位选都是通过单片机的P0寄存器来驱动的,但是因为P0不能同一时刻既做段选又做位选,所以这里就要通过我们第二章所讲的内容来操作在一个很短的时间内在段选和位选之间切换选择操作。


回复

使用道具 举报

1

主题

10

帖子

59

积分

注册会员

Rank: 2

积分
59
 楼主| 发表于 2018-2-18 00:20:21 | 显示全部楼层
静态数码管数码管所有公共端接GND或VCC,在该开发板上不是接GND和VCC而是接在两个573三态锁存器上,全亮全灭不单独选择端口操作。优点:不闪烁,亮度高。缺点:占用端口多。
示例程序:
[backcolor=rgb(15, 25, 42) !important][size=1em]
[size=1em]01

[size=1em]02

[size=1em]03

[size=1em]04

[size=1em]05

[size=1em]06

[size=1em]07

[size=1em]08

[size=1em]09

[size=1em]10

[size=1em]11

[size=1em]12

[size=1em]13

[size=1em]14

[size=1em]15

[size=1em]16

[size=1em]17

[size=1em]18

[size=1em]19

[size=1em]20

[size=1em]21

[size=1em]22

[size=1em]23

[size=1em]24

[size=1em]25

[size=1em]26

[size=1em]27

[size=1em]28

[size=1em]29

[size=1em]30

[size=1em]31

[size=1em]32

[size=1em]33

[size=1em]34

[size=1em]35

[size=1em]36

[size=1em]37

[size=1em]38

[size=1em]39

[size=1em]40

[size=1em]41

[size=1em]42

[size=1em]43

[size=1em]44

[size=1em]45

[size=1em]46

[size=1em]47

[size=1em]48

[size=1em]49

[size=1em]50

[size=1em]51

[size=1em]52

[size=1em]53

[size=1em]54

[size=1em]55

[size=1em]56

[size=1em]57

[size=1em][size=1em]/******************/
[size=1em] /* 2018.2.17 */
[size=1em] /* www.bkoak.com */
[size=1em] /* 数码管程序示例 */
[size=1em] /******************/
[size=1em]#include “stc15f2k60s2.h”
[size=1em]#define uchar unsigned char
[size=1em]#define uint unsigned int

[size=1em]uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,
[size=1em]                  0x82,0xf8,0x80,0x90,0xbf,0xff};
[size=1em]/*这里如果不加code,就会占用寄存器,允许读取和修改寄存器的值,
[size=1em]但是寄存器的数量有限,故我们在这里加上code,将其定义为代码的
[size=1em]类型,只能读取不能修改*/
[size=1em]uchar t = 0,i;

[size=1em]void Timer0Init(void);

[size=1em]void main()
[size=1em]{
[size=1em]   P2 = ((P2&0x1f)|0xa0);//不再重复解释,前两章已解释多次
[size=1em]   P0 = 0x00;
[size=1em]   P2 = ((P2&0x1f)|0xc0);//打开位选选573
[size=1em]   P0 = 0xff;//选择8位数码管
[size=1em]   P2 = ((P2&0x1f)|0xff);//打开段选573

[size=1em]   Timer0Init();
[size=1em]   EA=1;
[size=1em]   ET0=1;

[size=1em]   while(1)
[size=1em]   {
[size=1em]      if(t == 100)
[size=1em]      {
[size=1em]         t = 0;
[size=1em]         P0 = tab;
[size=1em]         i++;
[size=1em]         if(i == 12)
[size=1em]            i = 0;
[size=1em]      }
[size=1em]   }
[size=1em]}

[size=1em]void Timer0Init(void)//5毫秒@11.0592MHz
[size=1em]{
[size=1em]   AUXR |= 0x80;//定时器时钟1T模式
[size=1em]   TMOD &= 0xF0;//设置定时器模式
[size=1em]   TL0 = 0x00;//设置定时初值
[size=1em]   TH0 = 0x28;//设置定时初值
[size=1em]   TF0 = 0;//清除TF0标志
[size=1em]   TR0 = 1;//定时器0开始计时
[size=1em]}

[size=1em]void Timer0() interrupt 1
[size=1em]{
[size=1em]   t++;
[size=1em]}





本文采用 「CC BY-NC-SA 4.0」创作共享协议,转载请标注以下信息:
原文出处:Bkoak’s bloghttp://www.bkoak.com/2018/02/17/lanqiao8/

联系博主
邮箱:wjf418224424@aliyun.com
QQ交流群:693211073

回复

使用道具 举报

1

主题

10

帖子

59

积分

注册会员

Rank: 2

积分
59
 楼主| 发表于 2018-2-18 00:21:22 | 显示全部楼层
动态数码管数码管公共端依次扫描接通。优点:占用端口少。缺点:摄像,拍照时闪烁,在同样电压下与静态相比,亮度较低。

  1. #include "stc15f2k60s2.h"
  2. #include "intrins.h"

  3. #define uchar unsigned char
  4. #define uint unsigned int

  5. uchar code tab[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,
  6.                     0x82,0xf8,0x80,0x90,0xbf,0x7f};
  7. /*这里如果不加code,就会占用寄存器,允许读取和修改寄存器的值,
  8. 但是寄存器的数量有限,故我们在这里加上code,将其定义为代码的
  9. 类型,只能读取不能修改*/
  10. uchar t = 0;
  11. uchar c5, c6, c7, c8;
  12. uint num = 2330;

  13. void Timer0Init(void);
  14. void display(uchar c5, uchar c6, uchar c7, uchar c8);
  15. void Delay1ms();

  16. void main()
  17. {
  18.    P2 = ((P2&0x1f)|0xa0);//不再重复解释,前两章已解释多次
  19.    P0 = 0x00;
  20.    
  21.    Timer0Init();
  22.    EA=1;
  23.    ET0=1;
  24.    
  25.    while(1)
  26.    {
  27.       if(t == 200)
  28.       {
  29.          t = 0;
  30.          num--;
  31.          c5 = (num / 1000) % 10;
  32.          c6 = (num / 100) % 10;
  33.          c7 = (num /10) % 10;
  34.          c8 = num % 10;
  35.       }
  36.       display(c5, c6, c7, c8);
  37.    }
  38. }

  39. void display(uchar c5, uchar c6, uchar c7, uchar c8)
  40. {
  41.    P2 = ((P2&0x1f)|0xc0);
  42.    P0 = 0x80;
  43.    P2 = ((P2&0x1f)|0xff);
  44.    P0 = tab[c8];
  45.    Delay1ms();

  46.    P2 = ((P2&0x1f)|0xc0);
  47.    P0 = 0x40;
  48.    P2 = ((P2&0x1f)|0xff);
  49.    P0 = tab[c7];
  50.    Delay1ms();

  51.    P2 = ((P2&0x1f)|0xc0);
  52.    P0 = 0x20;
  53.    P2 = ((P2&0x1f)|0xff);
  54.    P0 = tab[c5];
  55.    Delay1ms();

  56.    P2 = ((P2&0x1f)|0xc0);
  57.    P0 = 0x10;
  58.    P2 = ((P2&0x1f)|0xff);
  59.    P0 = tab[c6];
  60.    Delay1ms();
  61. }
复制代码

本章资料下载地址见原文。
本章的内容到这里就结束了,最后给大家留一个题目,可以回去思考,后面有时间也会更新讲解,使用单片机定时器制作一个以00-00-00为初始可以通过四个独立按键进行时间修改的24小时制时钟。

回复

使用道具 举报

1

主题

10

帖子

59

积分

注册会员

Rank: 2

积分
59
 楼主| 发表于 2018-2-18 18:14:58 | 显示全部楼层
【蓝桥杯单片机设计与开发】(9)定时器中断实现实时时钟程序作者: bkoak 分类: 蓝桥杯 发布时间: 2018-02-18 18:10 编辑


本章的内容就是上一章结束后留给大家的思考题,使用单片机定时器制作一个以00-00-00模式显示,可以通过四个独立按键进行时间修改的24小时制时钟。
在前面几张已经为大家介绍了定时器、中断、数码管、按键等功能的使用方法,本章我们就将使用这些工能制作一个简易的可调实时时钟,自己写不出可以抄代码,但是不要用复制粘贴的方式去完成程序,这是在为自己学习,在位比赛做准备,比赛的时候没有例程让你复制。

示例程序:
  1. #include "stc15f2k60s2.h"

  2. #define uchar unsigned char
  3. #define uint unsigned

  4. sbit key1=P3^0;//定义端口参数
  5. sbit key2=P3^1;
  6. sbit key3=P3^2;
  7. sbit key4=P3^3;
  8. /*
  9. key1用于小时 +1
  10. key2用于小时 -1
  11. key3用于分钟 +1
  12. key4用于分钟 -1
  13. */

  14. int uchar code tab[] =
  15. {0xc0,0xf9,0xa4,0xb0,0x99,0x92,
  16. 0x82,0xf8,0x80,0x90,0xbf,0x7f};
  17. uchar strtab[8];//定义缓冲区域
  18. uchar hour = 10, minute = 25, second = 12;
  19. //初始化起始时间10-25-12

  20. void display(void);
  21. void delayms(int ms);
  22. void Timer0Init(void);
  23. void Timer1Init(void);

  24. void main()
  25. {
  26.    P2 = ((P2&0x1f)|0xa0);
  27.    P0 = 0x00;

  28.    Timer0Init();
  29.    Timer1Init();
  30.    ET0 = 1;//开启定时器0
  31.    ET1 = 1;//同上
  32.    EA = 1;//定时器使能

  33.    display();
  34.    while(1)
  35.    {
  36.       if (!key1)
  37.       {
  38.          delayms(5);//按键消抖
  39.          if (!key1)
  40.          {
  41.             hour++;
  42.             if (hour == 24)
  43.                hour = 0;
  44.             display();
  45.             while(!key1);//松手检测
  46.          }
  47.       }
  48.       //其余三个按键功能请自行编写,如遇问题请下载参考源程序
  49.    }
  50. }

  51. void display(void)
  52. {
  53.    strtab[0] = tab[hour / 10];
  54.    strtab[1] = tab[hour % 10];
  55.    strtab[2] = tab[10];
  56.    strtab[3] = tab[minute % 10];
  57.    strtab[4] = tab[minute % 10];
  58.    strtab[5] = tab[10];
  59.    strtab[6] = tab[second / 10];
  60.    strtab[7] = tab[second % 10];
  61. }

  62. void delayms(int ms)
  63. {
  64.    int i,j;
  65.    for(i=ms;i>0;i--)
  66.       for(j=845;j>0;j--);
  67. }

  68. void Timer0Init(void) //5毫秒@11.0592MHz
  69. //内容请自行计算

  70. void Timer1Init(void) //1毫秒@11.0592MHz
  71. //内容请自行计算

  72. void Timer1_int() interrupt 3 using 0
  73. {
  74.    static uchar num;
  75.    TH1 = 0xcd;
  76.    TL1 = 0xd4;

  77.    switch(num)//分别调用缓冲区的值进行扫描
  78.    {
  79.       case 0: P2 = ((P2&0x1f)|0xc0); P0 = 0x01;
  80.               P2 = ((P2&0x1f)|0xff); P0 = strtab[num];break;
  81.       case 1: P2 = ((P2&0x1f)|0xc0); P0 = 0x02;
  82.               P2 = ((P2&0x1f)|0xff); P0 = strtab[num];break;
  83.       case 2: P2 = ((P2&0x1f)|0xc0); P0 = 0x04;
  84.               P2 = ((P2&0x1f)|0xff); P0 = strtab[num];break;
  85.       case 3: P2 = ((P2&0x1f)|0xc0); P0 = 0x08;
  86.               P2 = ((P2&0x1f)|0xff); P0 = strtab[num];break;
  87.       case 4: P2 = ((P2&0x1f)|0xc0); P0 = 0x10;
  88.               P2 = ((P2&0x1f)|0xff); P0 = strtab[num];break;
  89.       case 5: P2 = ((P2&0x1f)|0xc0); P0 = 0x20;
  90.               P2 = ((P2&0x1f)|0xff); P0 = strtab[num];break;
  91.       case 6: P2 = ((P2&0x1f)|0xc0); P0 = 0x40;
  92.               P2 = ((P2&0x1f)|0xff); P0 = strtab[num];break;
  93.       case 7: P2 = ((P2&0x1f)|0xc0); P0 = 0x80;
  94.               P2 = ((P2&0x1f)|0xff); P0 = strtab[num];break;
  95.       default:break;
  96.    }
  97.    num++;
  98.    if (num == 8)
  99.       num = 0;
  100. }
  101. void Timer0_int() interrupt 1 using 1
  102. {
  103.    static uchar count;//定义内部静态变量
  104.    TL0 = 0x00; //初始化初值
  105.    TH0 = 0x28;<
  106.    count++;

  107.    switch (count);
  108.    {
  109.       case 0:
  110.       case 40:
  111.       case 80:
  112.       case 120:
  113.       case 160:display();break;
  114.    }
  115.    if (count == 200)
  116.    {
  117.       count = 0;
  118.       second++;//加一秒
  119.       if (second == 60)
  120.       {
  121.          second = 0;
  122.          minute++;//加一分
  123.          if (minute == 60)
  124.          {
  125.             minute = 0;
  126.             hour++;//加一小时
  127.             if (hour == 24)
  128.                hour = 0;
  129.          }
  130.       }
  131.    }
  132. }
复制代码
本章资料下载请前往原网址。
本章的内容到这里就结束了,最后给大家留一个题目,可以回去思考,后面有时间也会更新讲解,使用单片机定时器制作一个以00-00-00为初始可以通过四个独立按键进行时间修改的24小时制时钟。

本文采用 「CC BY-NC-SA 4.0」创作共享协议,转载请标注以下信息:
原文出处:Bkoak’s blog http://www.bkoak.com
联系博主
邮箱:wjf418224424@aliyun.com
QQ交流群:693211073


回复

使用道具 举报

1

主题

10

帖子

59

积分

注册会员

Rank: 2

积分
59
 楼主| 发表于 2018-2-21 00:26:50 | 显示全部楼层
【蓝桥杯单片机设计与开发】(10)DS18B20原理讲解及程序编写(上)
  • DS18B20——可编程分辨率的单总线®数字温度计
首先我们先看来看一下DS18B20的引脚说明:
GND  -   地
DQ     -   数据 I/O
VDD  -   可选电源电压
NC     -   无连接
*所有上表未提及的引脚都无连接。
我们再来看看DS18B20的基本特征:
① 独特的单线接口仅需一个端口引脚进行通讯
② 每个器件有唯一的 64 位的序列号存储在内部存储器中
③ 简单的多点分布式测温应用
④ 无需外部器件
⑤ 可通过数据线供电。供电范围为 3.0V到 5.5V
⑥ 测温范围为-55~+125℃(-67~+257℉)
⑦ 在-10~+85℃范围内精确度为±5℃
⑧ 温度计分辨率可以被使用者选择为9~12 位
⑨ 最多在 750ms 内将温度转换为 12 位数字
⑩ 用户可定义的非易失性温度报警设置
⑪ 报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件
⑫ 与 DS1822 兼容的软件
⑬ 应用包括温度控制、工业系统、消费品、温度计或任何热感测系统
说明、概览内容请自行参阅datasheet
① 64 位只读存储器储存器件的唯一片序列号
② 高速暂存器含有两个字节的温度寄存器,这两个寄存器用来存储温度传感器输出的数据
③ 高速暂存器提供一个直接的温度报警值寄存器(TH 和 TL)
④ 控制线需要连接一个弱上拉电阻
测温操作
当需要执行温度测量和 AD 转换时,总线控制器必须发出[44h]命令。
温度/ 数据关系
*上电复位时温度寄存器默认值为+85℃
报警操作信号
当 TH 和 TL 为 8 位寄存器时,4 位温度寄存器中的 11 个位用来和 TH、TL 进行比较。如果测得的温度高于 TH 或低于 TL,报警条件成立,DS18B20 内部就会置位一个报警标识,总线控制器通过发出报警搜索命令[ECh]检测总线上所有的 DS18B20 报警标识。
DS18B20 供电
DS18B20 可以通过从 VDD 引脚接入一个外部电源供电,或者可以工作于寄生电源模式,该模式允许 DS18B20 工作于无外部电源需求状态。
当 DS18B20 处于寄生电源模式时,VDD 引脚必须接地。
在发出温度转换指令[44h]或拷贝暂存器指令[48h]之后,必须在至多 10us 之内把单总线转换到强上拉,并且在温度转换时序(tconv)或拷贝数据时序(ter=10 ms)必须一直保持为强上拉状态。
温度高于 100℃时,不推荐使用寄生电源,因为 DS18B20 在这种温度下表现出的漏电流比较大,通讯可能无法进行。
总线控制器发出一个 Skip ROM指令[CCh],然后发出读电源指令[B4h],这条指令发出后,控制器发出读时序,寄生电源会将总线拉低,而外部电源会将总线保持为高。
DS18B20 温度转换期间的强上拉供电
外部电源给 DS18B20 供电
单总线系统
单总线系统包括一个总线控制器和一个或多个从机,DS18B20 总是充当从机,当只有一只从机挂在总线上时,系统被称为“单点”系统;如果由多只从机挂在总线上,系统被称为“多点”。
所有的数据和指令的传递都是从最低有效位开始通过单总线。
硬件结构
执行序列
通过单线总线端口访问 DS18B20 的协议如下:
步骤1. 初始化
步骤2. ROM 操作指令
步骤3. DS18B20 功能指令
每一次 DS18B20 的操作都必须满足以上步骤,若是缺少步骤或是顺序混乱,器件将不会返回值。例如这样的顺序:发起 ROM 搜索指令[F0h]和报警搜索指令[ECh]之后,总线控制器必须返回步骤 1。
ROM指令
Search ROM [F0h] ( 搜索 ROM 指令)  
READ ROM [33h] ( 读取 ROM 指令 )
MATH ROM [55h] ( 匹配 ROM 指令 )
SKIP ROM [CCh] ( 忽略 ROM 指令)
ALARM SEARCH [ECH] (报警 搜索指令)
DS18B20功能指令
CONVERT T [44h] ( 温度转换 指令)
WRITE SCRATCHPAD [4Eh] ( 写暂存器 指令 )
READ SCRATCHPAD [BEh] ( 读暂存器指令)
COPY SCRATCHPAD [48h] ( 拷贝暂存器 指令 )
RECALL E2 [B8H] ( 召回 EEPROM 指令 )
READ POWER SUPPLY [B4h] ( 读电源模式 指令)
本文采用 「CC BY-NC-SA 4.0」创作共享协议,转载请标注以下信息:
原文出处:Bkoak’s blog http://www.bkoak.com

联系博主
邮箱:wjf418224424@aliyun.com
更多资讯关注公众号:智术灵慧(zslh_dyh)
QQ交流群:693211073


回复

使用道具 举报

1

主题

10

帖子

59

积分

注册会员

Rank: 2

积分
59
 楼主| 发表于 2018-2-23 20:14:40 | 显示全部楼层
没人回帖停更了,有兴趣的取我博客继续看吧
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|蓝桥杯论坛

GMT+8, 2020-8-3 17:32 , Processed in 0.137138 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表