如何使用单片机直接控制p1口数码管位选,而不经过38译码器(想要keilc51的代码和proteus模拟的图)?

《单片机原理及应用--基于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 //计数值大于比较值

我要回帖

更多关于 38译码器为什么有3个使能端 的文章

 

随机推荐