xyxvlbkm 发表于 7 天前

10. 矩阵按键任务
第十章 矩阵按键
1.矩阵按键的原理


在按键数量较多时,为了减少I/O口的占用,将按键排列成矩阵排列的形式的按键阵列我们称位矩阵按键。
2.矩阵按键的程序实现

按键识别原理:端口默认为高电平,实时读取到引脚为低电平是表示按下。
①第一步:现将P0.0-P0.3输出低电平,P0.6-P0.7输出高电平,如果有按键按下,按下的那一行的IO就会变成低电平,就可以判断出哪一行按下了。
②第二步:现将P0.0-P0.3输出高电平,P0.6-P0.7输出低电平,如果有按键按下,按下的那一列的IO就会变成低电平,就可以判断出哪一列按下了。
③第三步:行列组合一下就可以判断出是哪个按键按下了。


任务1:数码管显示当前的按键号


密码锁
1.没有输入时,显示“- - - - - - - -”
2.有输入时,按下一个按键,开始按顺序写入
    例如,第一个按下1,显示“1 - - - - - - -”   
    例如,第二个按下3,显示“1 3 - - - - - -”
3.当按下的密码为“ 1 2 3 4 5 6 7 0”时,数码管显示open的字符,否则,还是显示“- - - - - - - -”


简易洗衣机面板
1.按下开机键后,数码管显示1,表示默认为清洗模式1;
2.用矩阵按键模拟洗衣机的操作面板,前五个按键模拟1-5的清洗模式按键,选择几的时候数码管显示数字几,表示以当前为第几个功能;
3.按下启动后,按照选择的模式对应的时间开始倒计时,倒计时结束后,数码管熄灭,表示清洗完成(清洗时间自己随意设置)



西西研究员 发表于 7 天前

推荐优先看的 printf_usb("Hello World !\r\n")及usb不停电下载, 演示视频链接
https://v.stcai.com/sv/1c5eec2-197fcd9b766/1c5eec2-197fcd9b766.mp4
https://v.stcai.com/sv/1fce8086-197cf2b9dd4/1fce8086-197cf2b9dd4.mp4

xyxvlbkm 发表于 前天 15:39

11. 复位系统任务
第十一章 复位系统
确保系统处于确定状态:
复位操作可以确保单片机在开始工作时处于已知的状态,使其能够正确初始化各个寄存器和外设。
避免不确定行为:
没有进行复位时,内部控制寄存器的内容可能是随机的,这可能导致定时器溢出、中断异常、外设误操作等不确定行为。
初始化系统:
复位操作可以进行系统的初始化,包括清除寄存器、设置默认值、配置时钟等,为系统正常运行做好准备。
保证程序正常开始执行:
复位确保程序从正确的地址开始执行,避免跳转到未知的地址或执行错误的指令。

1.硬件复位
1.上电复位(复位电压为1.7-1.9V):

上电复位时间的影响因素1 上电复位使用较长延时
PS:如对开机时间没有严格要求,建议勾选这个!
上电复位时间的影响因素2 下次冷启动时,P3.2/P3.3为0/0才可下载程序
PS:如果需要快速开机,建议将P3.2 P3.3至少一个上拉一个5.1K电阻到VCC
2.低压复位:

● 勾选后,当VCC电压低于设置的低压检测电压时,MCU会产生低压复位。
● 如果不勾选允许低压复位选项,当VCC电压低于设置的低压检测电压时,
MCU会产生低压中断标志。如果使能了低压中断的话,就会产生低压中断。
3.复位脚复位:

● 将下载软件哪个的“复位脚用在I/O口”勾勾去掉,并外接这个电阻和按键,即可实现硬件复位!
4.看门狗复位:

在系统运行以后也就启动了看门狗的计数器,看门狗就开始自动计数,
如果到了一定的时间还不去清理看门狗(也叫喂狗),
那么看门狗计数器就会溢出从而引起看门狗中断,造成系统复位。
所以,在使用有看门狗的芯片时要注意清理看门狗。
任务1:编写看门狗程序
● 参考手册9.7.1范例程序(程序有USB功能记得先加USB复位)
P3M0 = 0x00;
P3M1 = 0x00;
P3M0 &= ~0x03;
P3M1 |= 0x03;
USBCON = 0X00;
USBCLK = 0X00;
IRC48MCR = 0X00;
Delay10ms();
2.软件复位

密码锁
1.没有输入时,显示“- - - - - - - -”
2.有输入时,按下一个按键,开始按顺序写入
    例如,第一个按下1,显示“1 - - - - - - -”   
    例如,第二个按下3,显示“1 3 - - - - - -”
3.当按下的密码为“ 1 2 3 4 5 6 7 0”时,数码管显示open的字符,否则,还是显示“- - - - - - - -”
新增:
1.看门狗,超时1秒自动复位
2.增加开机版本号,开机显示三秒的U 1.00 版本号
3.增加手动复位,P33按钮按下时重启(方便查看版本号和清除密码)


xyxvlbkm 发表于 前天 16:25

12. 外部中断任务
第十二章 外部中断
1.中断系统介绍


      当中央处理机 CPU 正在处理某件事的时候外界发生了紧急事件请求,
CPU 暂停当前的工作,转而去处理这个紧急事件,处理完以后,再回到原来被中断的地方,
继续原来的工作,这样的过程称为中断。实现这种功能的部件称为中断系统。
● CPU 总是先响应优先级别最高的中断请求
● CPU 能够暂停对原来中断源的服务程序,转而去处理优先级更高的中断请求源,处理完以后,再回到原低级中断服务程序,
● 每一个中断源可以用软件独立地控制为开中断或关中断
● 部分中断的优先级别均可用软件设置。高优先级的中断请求可以打断低优先级的中断



CPU 总是先响应优先级别最高的中断请求


CPU 能够暂停对原来中断源的服务程序,转而去处理优先级更高的中断请求源,处理完以后,再回到原低级中断服务程序


每一个中断源可以用软件独立地控制为开中断或关中断


部分中断的优先级别均可用软件设置。高优先级的中断请求可以打断低优先级的中断

2.外部中断介绍


外部中断就是在单片机的一个引脚上,由于外部因素导致了一个电平的变化(比如由高变低),
而通过捕获这个变化,单片机内部自主运行的程序就会被暂时打断,转而去执行相应的中断处理程序,
执行完后又回到原来中断的地方继续执行原来的程序。

什么引脚能作为外部中断口?


引脚带INTx标识的


分别能支持什么类型的中断?



外部中断0:
IT0
IE0
EX0
EA
外部中断1:
IT1
IE1
EX1
EA
外部中断x:x=2-4
INTxIF
EXn
EA


外部中断1:
IT1
IE1
EX1
EA

3.外部中断用法



雕刻机保护系统

1.按下矩阵键盘上的按钮1开始工作
2.工作时打开LED0,表示雕刻机电源已打开
3.当外部中断1端口导通时,立刻关闭LED0,
    表示切断雕刻机电源,从而实现保护功能。


xyxvlbkm 发表于 前天 16:39

13. IO中断任务
第十三章 IO中断
1.IO中断介绍

相比于外部中断,IO中断有以下优点:
1.支持所有的IO口(外部中断只有特定的外部中断的引脚)
2.可以任意配置上升沿/下降沿/高电平/低电平(外部中断只有上升/下降沿中断)
缺点:
IO中断同时只能支持一种中断模式,外部中断0和1可以同时支持上升/下降沿中断(可以用两个IO端口实现双边沿检测!)。
2.IO中断用法
1.选择合适的中断模式

2.打开端口的中断功能

3.配置IO口的中断

4.中断号处理

任务1:编写IO中断的程序
3.中断优先级的设置

相同优先级,靠前的中断源先执行,执行完 之后在执行低中断源,且一个中断源在执行的时候不能被打断。
定时器0和P3中断都是最低优先级,定时器0中断号1,P3中断号40,执行完定时器0,在执行P3,在执行定定时器0,在执行...
任务2:编写P4端口的IO中断 打断 P3低电平中断的的程序(注意优先级)
多路抢答器
1.上电后一位数码管显示0,表示没有按下
2.选择任意三个独立按键作为三个用户,分别
   代表“用户1”,“用户2”,“用户3”
3.谁第一个按下按钮,数码管就显示数字几
   代表抢答成功


xyxvlbkm 发表于 前天 16:47

14. 定时器计数任务

第十四章 定时器计数
1.计数器的作用
只要输出信号是高低电平变化的传感器,想要计算个数的就可以用计数器的功能。
2.定时器做为计数器的用法

任务1:编写定时器1计数的的程序
(为了方便计数,10个脉冲中断一次)
3.定时器1测量INT1引脚低电平脉冲宽度
任务2:编写INT1测量低电平时间
(由按键模拟信号,100us的计数周期计数!)
CT计数器:
在设备的出料端口有一个感应器,每次有成品出来就会有一个低电平出来,计算相邻的两个产品出来的时间差来计算CT时间。
   1.计算P33引脚的相邻两次按下的时间,精确到100ms(即单个时间)
   2.计算按下P33的次数(即总产量)
3.数码管前四位显示单个时间 ,后四位显示次数


xyxvlbkm 发表于 前天 16:59

15. DS18B20测温任务
第十五章 DS18B20测温
1.DS18B20简介

DS18B20是常用的数字温度传感器,其输出的是数字信号,具有体积小,硬件开销低,
抗干扰能力强,精度高的特点。DS18B20数字温度传感器接线方便,封装成后可应用于多种场合,
如管道式,螺纹式,磁铁吸附式,不锈钢封装式,型号多种多样。主要根据应用场合的不同而改变其外观。
封装后的DS18B20可用于电缆沟测温,高炉水循环测温,锅炉测温,机房测温,
农业大棚测温,洁净室测温,弹药库测温等各种非极限温度场合。耐磨耐碰,体积小,
使用方便,封装形式多样,适用于各种狭小空间设备数字测温和控制领域。
①、 独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。
② 、测温范围 -55℃~+125℃,固有测温误差1℃。
③、支持多点组网功能,多个DS18B20可以并联在唯一的三线上,最多只能并联8个,
       实现多点测温,如果数量过多,会使供电电源电压过低,从而造成信号传输的不稳定。
④、工作电源: 3.0~5.5V/DC (可以数据线寄生电源)
⑤ 、在使用中不需要任何外围元件
⑥、 测量结果以9~12位数字量方式串行传送
2.硬件连接

3.功能描述
3.1温度测量

正数补码:本身不变
负数补码:按位取反在+1,加个-号
4.代码编写






1)复位和存在
复位(输出0保持480us,输出1保持60us,读取当前电平,延时420us)
2)写0,写1
写0(输出0保持60us+,输出1保持1us+)
写1(输出0保持1us+,输出1保持60us+)
3)读0,读1
读0/1(输出0保持1us+,输出1保持1us+,读取当前电平,延时60us)
4.1 底层驱动
复位(输出0保持480us,输出1保持60us,读取当前电平,延时420us)
写0(输出0保持60us+,输出1保持1us+)
写1(输出0保持1us+,输出1保持60us+)
读0/1(输出0保持1us+,输出1保持1us+,读取当前电平,延时60us)
4.2 接口函数
写1字节(先输出低位,在输出高位)
读1字节(先读到的是低位,后读到的是高位)
4.3 用户功能函数
温度读取换算函数
(复位-CCH-44H-等待-复位-CCH-BEH-读取2字节温度数据-换算)
测温计:
1.按下开关机按钮开机
2.开机后显示三个横杠和单位 “- - - C”/“- - - F”
3.在2秒内显示出当前温度
4.有一个按键可以切换摄氏和华氏
5.按下开关机按钮后关机,或者无操作30秒自动关机

xyxvlbkm 发表于 前天 17:14

16. 串口简单应用任务
第十六章 串口简单应用
1.串口通信的基础知识
通信指设备之间通过一定的协议进行的信息交换。
通信要素:通信双方必须用一样的通信格式才能通信成功!


串口1/2和3/4的主要区别就在工作模式和工作方式上,这节课主要讲异步串口。

每次发送一位数据的称为串行通信,多位一起传输的称为并行通信。
今天要讲的串口通信是串行通信的其中的一种!

①异步串口通信不需要统一的时钟信号,每个数据字节的传输都是独立的。所以需要发送和接收设备的时钟比较接近
②每个数据字节通常会被起始位和停止位包围,起始位用于通知接收端数据传输的开始,停止位用于标志数据字节的结束。
③由于没有统一的时钟信号,异步串口的传输速率相对较低,且需要额外的起始位和停止位,因此效率较低

①同步串口通信依赖于一个统一的时钟信号来同步发送端和接收端的数据传输。
②发送端和接收端共享同一个时钟信号,或者通过某种方式(如曼彻斯特编码)在数据流中嵌入时钟信息。
③由于有时钟信号的同步,数据传输的速率可以较高,且不需要起始位和停止位来界定每个数据字节,因此效率较高


●波特率?例如9600的波特率意味着每秒钟可以发9600位的数据。
●数据位?
●校验位?
●停止位?




串口转以太网

串口转WIFI

串口转蓝牙

串口转zigbee

2.串口通信的寄存器配置
引脚选择



3.串口通信的硬件连接



4.使用ISP软件自动生成串口初始化代码


智能数码管显示屏
1.发送OPEN\r\n打开数码管,数码管显示“- - - -”
2.发送CLOSE\r\n打开数码管,数码管全部熄灭
3.再打开的情况下,串口发送DAT+123\r\n,数码管显示数值“123”


xyxvlbkm 发表于 前天 17:47

17. 串口高级应用任务
第十七章 串口高级应用
1.串口通信的奇偶校验


最常用的通信格式为8-N-1(1包为10位数据)
8:代表数据位为8位
N:代表None,无校验 (ODD 奇 ;EVEN 偶)
1:代表1位停止位

串口通信的奇偶校验


偶校验(even parity):让传输的数据(包含校验位)中1的个数为偶数。
即:如果传输字节中1的个数是偶数,则校验位为“0”,奇数相反。



奇校验(odd parity):让传输的数据(包含校验位)中1的个数为奇数。
即:如果传输字节中1的个数是偶数,则校验位为“1”,奇数相反。



为什么需要加校验呢?
传输过程是单向的,可能存在出错的可能!


奇偶校验的优缺点?
优点1:可以减少数据出错的可能
优点2:使用简单便捷
缺点1:奇偶校验的检错率只有50%,因为只有奇数个数据位发生变化能检测到,如果偶数个数据位发生变化则无能为力了
缺点2:奇偶校验每传输一个字节都需要加一位校验位,对传输效率影响很大


程序如何实现?使用9位数据位(8位数据+1位校验)


方案1:可以利用二进制数相加的特点:
0+0=0、1+0=1、1+1=0
可以看出,如果我们将一个字节的所有位相加
有奇数个“1”的字节的和为1
有偶数个“1”的字节的和为0


方案2:可以利用ACC(累加器)和P(奇偶校验位)
将需要运算的数值存入ACC寄存器
打印读取P位用来表示结果中“1”的个数是奇数还是偶数。结果等于1为奇数!
        ACC = dat;
        if(P)        //奇数个1
        else        //偶数个1




任务1:使用奇校验,8位数据位,1位停止位的数据,发送OPEN\r\n打开数码管,数码管显示“- - - -“

2.串口通信的超时中断


当我们在做串口接收的程序的时候,往往需要当接收到一串数据的时候需要及时的响应。
但是响应的第一步就是我们得先判断这一包数据是否已经接收完成,必须要接收完成了才能进行下一步动作;
    案例一:常见的AT指令集,带固定帧尾的数据。假设我们用单片机模拟一个ESP的模块,
是不是当串口发来一个"AT\r\n"的时候需要回应一个"OK\r\n";这个可以串口接收函数里判断结尾是不是"\r\n",监测到这个才是结尾。
    案例二:串口接收定长输出,每一包的数据都是固定的字节,接受到这个长度的数据就是这一包结束了。
    案例三:每一帧的数据里包含数据长度,比如每一包数据的第一个字节是长度,长度多长后面就跟几个字节的数据。
    上面的几种常见案例虽然都能实现数据的完整接收,但是在实际使用的时候数据包里有没有长度,
有没有固定帧尾都不是我们做从机的时候能决定的,那我们怎么样才能用最好的办法来判断一个数据包也没有接收完成呢!答案是有的————串口超时中断。



这个寄存器其实在我们接收的时候再打开即可,ENTO不用说坑定需要使能,ENTOI是中断,
可以及时响应。SCALE的话这里为了时钟相对准,我们选择系统时钟即可。
这里需要注意如果选择1us时钟的话务必要设置IAP_TPS寄存器
这里三个寄存器共同组成了一个计时器,最终的计时时间 = 1/系统时钟(单位mhz)*计时器数值,
假设计时器数值为44000(0XABE0),那么UR1TOTL = 0XE0;UR1TOTH = 0XAB;UR1TOTE = 0X00;
需要注意的是这里一定要从低位开始写,且这三个寄存器一定都要写,哪怕这个寄存器的数值是0也必须要写一次。
需要注意的是这个计时器的数值不能全为0!
这个寄存器就很简单了,只有一个位,触发的时候这个位会置1,我们手动清0即可。
需要注意的是这个和串口发送和接收中断共用同一个中断向量号!串口1的中断号是4,那么串口1的超时中断号也是4.


什么时候需要串口空闲中断呢?


没有固定帧尾的时候,虽然数据可能是定长的,但是如果数据是错误的呢?
在modbus rtu协议中,假设帧1是主机发送的,帧2是从机的回复命令,按照标准的modbus rtu协议来说,中间应该要间隔3.5个字符周期



有校验位:假设 1个字符=1(起始位)+8(数据位)+1(奇偶校验位)+1(停止位)=11位
3.5个字符=3.5*11=38.5位 如果波特率=9600bps,则3.5个字符间隔时间为38.5/9.6=4.0104167毫秒
无校验位:假设 1个字符=1(起始位)+8(数据位)+0(无校验位)+1(停止位)=10位
3.5个字符=3.5*10=35位
9600波特率下,8N1的空闲时间就是 1/9600*35 ≈3.646ms;带入公式3646= 1/22.1184*计时器数值,得出计时器数值 = 87504 = 0x13b04;


1.初始化配置
    UR2TOCR = 0x00;                                 
    UR2TOTL = 0x04;                                 
    UR2TOTH = 0x3b;                              
    UR2TOTE = 0x01;                              
2.中断接收+
UR2TOCR = 0xe0;                           //开启超时中断,使用系统时钟
3.超时中断处理
    if(UR2TOSR & 0x01)                              //串口超时中断
    {
      B_RX2_OK = 1;                               //接收完成标志位
      UR2TOSR = 0x00;                           //清除超时标志位
      UR2TOCR = 0x00;                           //关闭超时中断
    }


智能数码管显示屏(MODBUS RTU版本,使用9600,8-N-1通信)
1.发送01 06 00 00 00 01 48 0A,数码管显示数值1,返回01 06 00 00 00 01         48 0A
2.发送01 06 00 00 03 E8 89 74 ,数码管显示数值1000,返回01 06 00 00         03 E8 89 74
3.发送01 03 00 03 00 01 74 0A,即可读取当当前显示的数值,返回数值为1000时返回:01 03 02 03 E8 B8 FA ,数值为1时返回01 03 02 00 01 79 84


页: 1 [2]
查看完整版本: 0.初识8051U