《单片机原理及应用--基于Proteus和Keil C》(第4版)实验的原理图(proteus8)、代码、实验报告
内容简介:8051单片机教程第二十五课:键盘接口与编程单片机教程第二十五课:键盘接口与编程8051单片机教程 上一课:8051单片机教程第二十四课:动态扫描显示接口/article/id/37481单片机教程第二十五课:键盘接口与编程键盘是由若干按键组成的开关矩阵,它是微型计算机最常用的输入设备,用户可以通过键盘向计算机输入指令、地址和数据。一般单片机系统中采和非编码键盘,非编码键盘是由软件来识别键盘上的闭合键,它具有结构简单,使用灵活等特点,因此被广泛应用于单片机系统。按键开关的抖动问题组成键盘的按键有触点式和非触点式两种,单片机中应用的一般是由机械触点构成...
本篇文章属于学习笔记,来源于B站教学视频,相关代码工程请从源地址自行下载。这位Up讲解得很好,适合同学们一起学习,在这里推荐给大家。本文为个人学习笔记,只能做参考,细节方面建议观看视频,肯定受益匪浅。
3、普中51单片机开发板
2、本篇所使用的单片机为STC89C52单片机
所属系列为8051,即51单片机。8051最开始指在80年代生产的8051内核的单片机。后延伸为只要是8051内核的单片机,都统称为51单片机。
3、51单片机命名规则
1、打开STC-ISP添加芯片包到开发环境
在下面的图中,我们可以看到LED最终连上了单片机的管脚。而单片机需要通过CPU控制寄存器的值,进而通过驱动器加大控制力度,由控制电路输出高低电平(对应寄存器1/0)。因此,程序需要在对应的寄存器上写1或0,即可控制LED的亮灭。
根据硬件原理图和寄存器定义,来对操作寄存器地址,实现灯的点亮
6、实验过程与代码解释
(1)点击F7编译单个文件,编译失败,给出P2不认识的提示
(2)添加H文件,继续编译,编译通过 ,说明头文件定义了P2
(3)为什么控制的是P2?因为硬件原理图以及头文件的定义,拉低电平即可点亮一盏灯!
7、生成文件,下载到板子上,重新上电之后可运行该程序
1、在指定路径下创建工程并添加新文件
2、通过STC-ISP拷贝延时代码
加入延时,方便观察灯的闪烁
1、在指定路径下创建工程并添加新文件
让LED循环点亮,像流水一样
1、在指定路径下创建工程并添加新文件
3、51单片机的数据类型
我们在上面的程序中使用到了数据类型unsigned int xms,即xms在单片机中能表示0~65535
1、在指定路径下创建工程并添加新文件
按下按键亮灯,松开按键灭灯。
4、51单片机数据运算
上述代码中,我们使用到了==这个运算符,表示等于。
上述程序用到了if语句,通过判断按键的动作来实现灯的亮灭
程序写的是P30独立按键,根据原理图,需要按下K2才能点亮第一盏灯。(原理图设计者并没有按照顺序一一对应按键,这是设计者埋下的小坑)
P30是H文件中定义的,如果是其他H文件可能没有或者用另一个变量表示,这个时候需要你自己去写或者更改变量
1、在指定路径下创建工程并添加新文件
按键消抖,检测松手,才改变LED灯的状态,使其松开按键后长亮或长灭。
1、在指定路径下创建工程并添加新文件
通过不停的按下按键,使得灯以二进制的方式,不断往上加一,达到用灯来表示按键次数
1、在指定路径下创建工程并添加新文件
按下P31,往左边移一位;按下P30,往右边移一位,以LED灯来展示。
1、在指定路径下创建工程并添加新文件
2、单个数码管引脚定义
数码管的接法,有共阳和共阴之分。共阴时,拉高电压即可点亮。共阳时,拉低电平点亮。
3、开发板四位一体的数码管引脚定义
138译码器控制数码管使能(使用3个单片机输入控制8个数码管显示),每个数字的一个笔画由双向数据缓存器245(单片机输出能力有限,需要该芯片提高输入能力)控制亮灭。
因此,首先控制P22~P24来选中数码管,然后选中数码管的笔画,最终呈现数据。
7、数码管段码表(共阴极电路,共阳极则不一样)
1、在指定路径下创建工程并添加新文件
动态清零,数字消影,来实现动态数码管显示,这是单片机不断扫描来成像的,将耗费大量CPU资源。因此,硬件电路一般会加1640的芯片来驱动,将大量减少扫描带来的CPU损耗。
1、在指定路径下创建工程并添加新文件
3、模块化编程框图
4、模块化编程注意事项
1、在指定路径下创建工程并添加新文件
* @brief 在LCD1602指定位置开始以有符号十进制显示所给数字 * @brief 在LCD1602指定位置开始以十六进制显示所给数字 * @brief 在LCD1602指定位置开始以二进制显示所给数字
单引号和双引号都有全角和半角之分,全角的又叫中文字符,半角的又称英文字符。在c语言中,全角字符没有任何意义,它就是一个普通字符,没有含义;半角字符才有不同的意义:
二者含义不同,不能混用。
1、在指定路径下创建工程并添加新文件
我们想选取1、5、9、13,即第一列,可以先把P1全部置为高,即全部拉高;接着让P13拉低,则选中了第一列。其他也这样操作。
其它文件:复制之前写的模块即可。
6、软件使用技巧:配置模板
Password*=10; // 密码左移一位,这样就可以依次输入密码其它文件:复制之前写的模块即可。
4、定时器工作模式
8、定时器和中断系统
9、定时器相关寄存器
通过独立按键控制流水灯模式,并由定时器执行流水灯。
LEDMode++; //模式切换,按1下按键是模式1,按2下是模式0,默认模式0 /*定时器中断函数模板 TL0 = 0x18; //设置定时初值,像沙漏,重置沙漏时间 * @retval 按下按键的键码,范围:0~4,无按键按下时返回值为0其它文件:复制之前写的模块即可。
制作一个一天时间的计时器。
其它文件:复制之前写的模块即可。
5、常见通信接口比较
8、串口参数与时序图
11、使用工具生成串口配置
Delay(1); // 必要的延时,避免误差导致乱码,没误差的时候可以不需要其他文件:复制之前写的模块即可。
其他文件:复制之前写的模块即可。
每记13次数,溢出1次;
文本模式与Hex模式对应情况。
OE要通过跳线帽与GND相连,而开发板默认OE与VCC相连,因此需要操作。
6、开发板引脚对应关系
取出数据如下,将作为程序数组使用:
将数据放在flash里面,用来避免内存被消耗过多,但这种数据是不能更改的,方法如下:
2、引脚定义和应用电路
// DS1302_SCLK=1; // 速度慢可以不加延时,有些速度快的芯片需要增加延时 //寄存器写入地址/指令定义 //时间数组,索引0~6分别为年、月、日、时、分、秒、星期,设置为有符号的便于<0的判断 //外部可调用时间数组,索引0~6分别为年、月、日、时、分、秒、星期,设置为有符号的便于<0的判断无源蜂鸣器,使用的控制引脚是P25
5、钢琴键盘与音符对照
7、C调音符与频率对照表
1、音符对应的重载值计算方式
2、编写天空之城音乐程序
//播放速度,值为四分音符的时长(ms) //音符与索引对应表,P:休止符,L:低音,M:中音,H:高音,下划线:升半音符号# else //如果是停止标志位 /*取对应频率值的重装载值到定时器*/2、存储器简化模型
4、引脚与芯片电路
* @retval 接收到的应答位,0为应答,1为非应答 * @brief 秒表驱动函数,在中断中调用 * @retval 按下按键的键码,范围:0,1~4,0表示无按键按下 * @brief 获取当前按键的状态,无消抖及松手检测 * @retval 按下按键的键码,范围:0,1~4,0表示无按键按下 * @brief 按键驱动函数,在中断中调用 //如果上个时间点按键按下,这个时间点未按下,则是松手瞬间,以此避免消抖和松手检测 * @param Number 要设置的数字,范围:段码表索引范围 * @param Number 要显示的数字,范围:段码表索引范围 * @brief 数码管驱动函数,在中断中调用6、单总线电路规范
7、单总线时序结构
THigh=20; //如果阈值非法,则设为默认值 /*温度读取及显示*/ /*阈值判断及显示*/ * @retval 从机响应位,0为响应,1为未响应 THigh=20; //如果阈值非法,则设为默认值 /*温度读取及显示*/ /*阈值判断及显示*/2、引脚及应用电路
else //计数值大于比较值
* @param Command 命令字,范围:头文件内定义的宏,结尾的数字表示转换的位数 else //计数值大于比较值
3、基本发送与接收
7、外部中断寄存器
* @brief 红外遥控获取收到数据帧标志位 * @retval 是否收到数据帧,1为收到,0为未收到 * @brief 红外遥控获取收到连发帧标志位 * @retval 是否收到连发帧,1为收到,0为未收到 * @brief 红外遥控获取收到的地址数据 * @brief 红外遥控获取收到的命令数据 //外部中断0中断函数,下降沿触发执行 /*外部中断0中断函数模板 /*定时器中断函数模板 else //计数值大于比较值