赞
踩
//******************************************************* //题目:独立四键控制事件(按键分为有锁存和无锁存) //语言:汇编语言(51MCU) //功能:任意独立按键控制(带扫描式的) //优点:中间有20ms延时函数消抖;可以扩展任意个按键;可移植 // 含扫描按键所有操作; //作者: 梦 //提醒: 记得点赞哦!!!!! //转载要著名出处,原创不易!!! //******************************************************* K1 BIT P3.1 K2 BIT P3.0 K3 BIT P3.2 K4 BIT P3.4 LED EQU P2 KEY EQU P3 ORG 0000H AJMP MAIN ORG 0030H MAIN: MOV LED ,#0FFH MOV P0,#0FFH CLR RS1 CLR RS0 //调用第0组寄存器 KLOOP: SETB K1 //先置高,再检测低 SETB K2 SETB K3 SETB K4 JB K1, KT1 MOV A, #11H ACALL DELAY200MS //消除抖动 AJMP TRS1 KT1:JB K2, KT2 MOV A, #22H ACALL DELAY200MS //消除抖动 AJMP TRS1 KT2:JB K3, KT3 MOV A, #44H ACALL DELAY200MS //消除抖动 AJMP TRS1 KT3:JB K1, KLOOP MOV A, #88H ACALL DELAY200MS //消除抖动 TRS1: JB K1, KT1_T MOV A, #11H ;CPL A ;MOV LED,A ;JNB K1,$ //无锁存 AJMP CONVERS_T KT1_T:JB K2, KT2_T MOV A, #22H ;CPL A ;MOV LED,A ;JNB K2,$ //无锁存 AJMP CONVERS_T KT2_T:JB K3, KT3_T MOV A, #44H ;CPL A ;MOV LED,A ;JNB K3,$ //无锁存 AJMP CONVERS_T KT3_T:JB K4, KLOOP MOV A, #88H CONVERS_T: ;MOV A,#00H //无锁存 CPL A MOV LED,A LJMP KLOOP DELAY200MS: ;误差 0us SETB RS1 SETB RS0 //调用第3组寄存器 MOV R7,#43H DL1: MOV R6,#8EH DL0: MOV R5,#09H DJNZ R5,$ DJNZ R6,DL0 DJNZ R7,DL1 CLR RS1 CLR RS0 //调用第0组寄存器 RET END
- //*******************************************************
- //题目:4X4矩阵键盘控制LED数码管(按键分为有锁存和(隔离的为)无锁存)
- //语言:汇编语言(51MCU)
- //功能:任意独立按键控制(带扫描式的)
- //优点:中间有20ms延时函数消抖;两种扫描方式其中定时器扫描很大程度优化CPU;可移植
- // 含扫描按键所有操作;
- //矩阵键盘目前扫描方法:(1)程序扫描(本程序) (2)定时器扫描(本程序也有) (3)中断扫描(51中断固定不能实现)
- //作者: 梦
- //提醒: 记得点赞哦!!!!!
- //转载要著名出处,原创不易!!!
- //*******************************************************
- KEY EQU P1 //程序扫描 但由于大部分CPU在扫描键盘,当要显示两个数码管值显然做不到
- LED EQU P0 //按键控制一个数码管(数码管带锁存芯片)
- KEY1 EQU P2.0
- KEY4 EQU P2.4
- ORG 0000H
- AJMP MAIN
- ORG 0030H
- MOV 30H,#00H
- MOV 31H,#00H
- ORG 0035H
- MAIN:
- CLR RS0
- CLR RS1 //使用寄存器组0
- START:
- MOV KEY, #11110000B //矩阵键盘高四位通过电阻串联电阻,接高电平(初始化)
- MOV A, KEY //读按键值,
- XRL A, #11110000B
- JNZ KEY_ENA
- ;CJNE A, #00H,KEY_ENA //两种处理办法
- ;AJMP START
- AJMP START
- KEY_ENA:
- ACALL DELAY200MS
- MOV KEY,#11110000B //矩阵键盘高四位通过电阻串联电阻,接高电平(初始化)
- MOV A,KEY //读按键值,
- XRL A, #11110000B
- JNZ KEY_ENB
- ;CJNE A, #00H,KEY_ENB //两种处理办法
- ;AJMP START
- AJMP START
- KEY_ENB:
- KEY111: //扫描第一列
- MOV KEY,#11101111B //在第一列中如果按下那么低四位肯定有为0的
- JB KEY.0,KEY5
- MOV A, #1
- AJMP CONVER
- KEY5: MOV KEY,#11101111B //在第一列中如果按下那么低四位肯定有为0的
- JB KEY.1,KEY9
- MOV A, #5
- AJMP CONVER
- KEY9: MOV KEY,#11101111B //在第一列中如果按下那么低四位肯定有为0的
- JB KEY.2,KEY13
- MOV A, #9
- AJMP CONVER
- KEY13: MOV KEY,#11101111B //在第一列中如果按下那么低四位肯定有为0的
- JB KEY.3,KEY22
- MOV A, #13
- AJMP CONVER
- KEY22: MOV KEY,#11011111B //在第2列中如果按下那么低四位肯定有为0的
- JB KEY.0,KEY6
- MOV A, #2
- AJMP CONVER
- KEY6: MOV KEY,#11011111B //在第2列中如果按下那么低四位肯定有为0的
- JB KEY.1,KEY10
- MOV A, #6
- AJMP CONVER
- KEY10:MOV KEY,#11011111B //在第2列中如果按下那么低四位肯定有为0的
- JB KEY.2,KEY14
- MOV A, #10
- AJMP CONVER
- KEY14:MOV KEY,#11011111B //在第2列中如果按下那么低四位肯定有为0的
- JB KEY.3,KEY33
- MOV A, #14
- AJMP CONVER
- KEY33: MOV KEY,#10111111B //在第3列中如果按下那么低四位肯定有为0的
- JB KEY.0,KEY7
- MOV A, #3
- AJMP CONVER
- KEY7: MOV KEY,#10111111B //在第3列中如果按下那么低四位肯定有为0的
- JB KEY.1,KEY11
- MOV A, #7
- AJMP CONVER
- KEY11:MOV KEY,#10111111B //在第3列中如果按下那么低四位肯定有为0的
- JB KEY.2,KEY15
- MOV A, #11
- AJMP CONVER
- KEY15: MOV KEY,#10111111B //在第3列中如果按下那么低四位肯定有为0的
- JB KEY.3,KEY44
- MOV A, #15
- AJMP CONVER
- KEY44:MOV KEY,#01111111B //在第4列中如果按下那么低四位肯定有为0的
- JB KEY.0,KEY8
- MOV A, #4
- AJMP CONVER
- KEY8: MOV KEY,#01111111B //在第4列中如果按下那么低四位肯定有为0的
- JB KEY.1,KEY12
- MOV A, #8
- AJMP CONVER
- KEY12:MOV KEY,#01111111B //在第4列中如果按下那么低四位肯定有为0的
- JB KEY.2,KEY16
- MOV A, #12
- AJMP CONVER
- KEY16:MOV KEY,#01111111B //在第4列中如果按下那么低四位肯定有为0的
- JB KEY.3,KEY_BACK
- MOV A, #16
- AJMP CONVER
- KEY_BACK: AJMP START
- CONVER: //一般都会吧二进制转10进制 就是把得到数据A(1-16)看成 个数
- MOV B,#10
- DIV AB
- MOV 30H,A//存储高位
- MOV A,B
- MOV 31H,A//存储低位
-
- MOV DPTR,#TABLE_CC
- MOV A,31H
- MOVC A, @A+DPTR
- CLR KEY1
- MOV LED, A
- AJMP START
- TABLE_CC:DB 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f
-
- DELAY200MS: ;误差 0us
- SETB RS0
- SETB RS1 //使用寄存器组3
- MOV R7,#43H
- DL1:
- MOV R6,#8EH
- DL0:
- MOV R5,#09H
- DJNZ R5,$
- DJNZ R6,DL0
- DJNZ R7,DL1
- CLR RS0
- CLR RS1 //使用寄存器组0
- RET
-
- END

//******************************************************* //题目:4X4矩阵键盘控制LED数码管(按键分为有锁存和(隔离的为)无锁存) //语言:汇编语言(51MCU) //功能:任意独立按键控制(带扫描式的) //优点:中间有20ms延时函数消抖;两种扫描方式其中定时器扫描很大程度优化CPU;可移植 // 含扫描按键所有操作; //矩阵键盘目前扫描方法:(1)程序扫描(本程序也有) (2)定时器扫描(本程序) (3)中断扫描(51中断固定不能实现) //作者: 梦 //提醒: 记得点赞哦!!!!! //转载要著名出处,原创不易!!! //******************************************************* KEY EQU P1 //定时器扫描 设置定时时常,中断读键盘是否按下,按下得到输出标志,得到提示,然后在主函数提示扫描键盘 LED EQU P0 //其他时间显示键盘控制两个数码管(数码管不带锁存芯片) LED1 EQU P2.0 LED2 EQU P2.4//KEY为矩阵键盘 LED1为数码管1公共端,LED2为数码管2公共端,LED为数码管(这里共阴) ORG 0000H AJMP MAIN ORG 000BH AJMP INI_T0 //定时器中断 ORG 0030H MOV 30H,#00H //存高位 MOV 31H,#00H //存低位 MOV 32H,#00H //00表示没有键盘按下,01表示有键盘按下 ORG 0035H MAIN: CLR RS0 CLR RS1 //使用寄存器组0 MOV TMOD,#01H MOV TH0,#0F0H MOV TL0,#60H SETB EA SETB ET0 SETB TR0//定时器初始化20MS扫描 //------------------------ DISPLAY: MOV DPTR,#TABLE_CC MOV R1,#30H MOV A,@R1 MOVC A, @A+DPTR CLR LED1 SETB LED2 MOV LED, A ACALL DELAY1MS //ACALL DELAY50US //个位ms级别扫描稳定 MOV R1,#31H MOV A,@R1 MOVC A, @A+DPTR CLR LED2 SETB LED1 MOV LED, A ACALL DELAY1MS // ACALL DELAY50US MOV R1,#32H MOV A,@R1 CJNE A,#01H,KEY_FIRST //初次判断没有按键按下 ACALL KEY_BOARD KEY_FIRST:AJMP DISPLAY //--------------------------------- INI_T0: MOV KEY, #11110000B //矩阵键盘高四位通过电阻串联电阻,接高电平(初始化) MOV A, KEY //读按键值, XRL A, #11110000B JNZ KEY_EN00 AJMP initT0_END KEY_EN00: MOV R1,#32H MOV @R1,#01H //传递主函数标志 initT0_END: MOV TH0,#0F0H MOV TL0,#60H RETI //-------------------------- KEY_BOARD: ACALL DELAY200MS MOV KEY,#11110000B //矩阵键盘高四位通过电阻串联电阻,接高电平(初始化) MOV A,KEY //读按键值, XRL A, #11110000B JNZ KEY_ENB ;CJNE A, #00H,KEY_ENB //两种处理办法 ;AJMP START AJMP BACK //------- KEY_ENB: KEY111: //扫描第一列 MOV KEY,#11101111B //在第一列中如果按下那么低四位肯定有为0的 JB KEY.0,KEY5 MOV A, #1 AJMP CONVER KEY5: MOV KEY,#11101111B //在第一列中如果按下那么低四位肯定有为0的 JB KEY.1,KEY9 MOV A, #5 AJMP CONVER KEY9: MOV KEY,#11101111B //在第一列中如果按下那么低四位肯定有为0的 JB KEY.2,KEY13 MOV A, #9 AJMP CONVER KEY13: MOV KEY,#11101111B //在第一列中如果按下那么低四位肯定有为0的 JB KEY.3,KEY22 MOV A, #13 AJMP CONVER KEY22: MOV KEY,#11011111B //在第2列中如果按下那么低四位肯定有为0的 JB KEY.0,KEY6 MOV A, #2 AJMP CONVER KEY6: MOV KEY,#11011111B //在第2列中如果按下那么低四位肯定有为0的 JB KEY.1,KEY10 MOV A, #6 AJMP CONVER KEY10: MOV KEY,#11011111B //在第2列中如果按下那么低四位肯定有为0的 JB KEY.2,KEY14 MOV A, #10 AJMP CONVER KEY14: MOV KEY,#11011111B //在第2列中如果按下那么低四位肯定有为0的 JB KEY.3,KEY33 MOV A, #14 AJMP CONVER KEY33: MOV KEY,#10111111B //在第3列中如果按下那么低四位肯定有为0的 JB KEY.0,KEY7 MOV A, #3 AJMP CONVER KEY7: MOV KEY,#10111111B //在第3列中如果按下那么低四位肯定有为0的 JB KEY.1,KEY11 MOV A, #7 AJMP CONVER KEY11: MOV KEY,#10111111B //在第3列中如果按下那么低四位肯定有为0的 JB KEY.2,KEY15 MOV A, #11 AJMP CONVER KEY15: MOV KEY,#10111111B //在第3列中如果按下那么低四位肯定有为0的 JB KEY.3,KEY44 MOV A, #15 AJMP CONVER KEY44: MOV KEY,#01111111B //在第4列中如果按下那么低四位肯定有为0的 JB KEY.0,KEY8 MOV A, #4 AJMP CONVER KEY8: MOV KEY,#01111111B //在第4列中如果按下那么低四位肯定有为0的 JB KEY.1,KEY12 MOV A, #8 AJMP CONVER KEY12: MOV KEY,#01111111B //在第4列中如果按下那么低四位肯定有为0的 JB KEY.2,KEY16 MOV A, #12 AJMP CONVER KEY16: MOV KEY,#01111111B //在第4列中如果按下那么低四位肯定有为0的 JB KEY.3,BACK MOV A, #16 AJMP CONVER KEY_BACK: //AJMP START CONVER: //一般都会吧二进制转10进制 就是把得到数据A(1-16)看成 个数 MOV B,#10 DIV AB MOV R1,#30H MOV @R1, A//存储高位 MOV A,B MOV R1,#31H MOV @R1,A //存储低位 BACK: MOV R1,#32H MOV @R1,#00H RET TABLE_CC:DB 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f //共阴(0-9) DELAY1MS: ;误差 0us SETB RS0 SETB RS1 //使用寄存器组3 MOV R7,#01H DL11: MOV R6,#8EH DL00: MOV R5,#02H DJNZ R5,$ DJNZ R6,DL00 DJNZ R7,DL11 CLR RS0 CLR RS1 //使用寄存器组0 RET DELAY200MS: ;误差 0us SETB RS0 SETB RS1 //使用寄存器组3 MOV R7,#43H DL1: MOV R6,#8EH DL0: MOV R5,#09H DJNZ R5,$ DJNZ R6,DL0 DJNZ R7,DL1 CLR RS0 CLR RS1 //使用寄存器组0 RET DELAY50US: ;误差 0us MOV R6,#01H DL05: MOV R5,#16H DJNZ R5,$ DJNZ R6,DL05 RET END
基础知识:CPU与外界交换的信息称为通信。通信分为并行通信(速度快,连接复杂)和串行通信(速度相对慢)。
串行通信又分为异步通信(需要每发送一个字节要验证UART)和同步通信(无需校验位,只要时钟脉冲约定典型iic,spi)。
UART为全双工串口。
80C51串行口是一个可编程、全双工的串行口,它由两个独立的发送器和接收器构成,通过设置SCON、PCON这两个寄存器来控制串行口的工作方式和波特率。
发送器可以自动将CPU放入到发送缓冲器中的数据,完成并/串转换(以后的如果深学的化,有模拟iic通信,就有串并转换代码),从TXD(P3.1)引脚串行输出;接收器可以自动将数据从RXD(P3.0)引脚串行输入,完成串/并转换,送入接收缓冲器,由CPU取走。发送缓冲器与接收缓冲器,物理上是独立的,可由CPU直接访问。对于发送缓冲器来说,它只能写入而不能读出数据;对于接收缓冲器来说,它只能读出而不能写入数据,因此赋予两个缓冲器同一个名称(SBUF)和地址(99H)。CPU对SBUF执行写操作,就是将数据写入发送缓冲器;对SBUF执行读操作,就是读出接收缓冲器的内容。1.串行口控制寄存器SCON和PCON
STC89C52系列单片机的串行口设有两个控制寄存器:串行控制寄存器SCON和波特率选择特殊功能寄存器PCON。
SCON :串行控制寄存器(可位寻址)SMO/FE:当PCON寄存器中的SMODO/PCON.6位为1时,该位用于帧错误检测。当检测到一个无效停止位时,通过UART接收器设置该位。它必须由软件清零。
当PCON寄存器中的SMOD0/PCON.6位为0时,该位和SM1一起指定串行通信的工作方式,如下表所示。
其中SM0,SM1按下列组合确定串行口的工作方式:
当单片机工作在12T模式时,定时器1的溢出率=SYSclk/12/( 256-T HI);当单片机工作在6T模式时,定时器1的溢出率=SYSclk / 6/ ( 256-T HI)(注意SMOD为1为小分频,加倍效果)
(方式0又叫同步移位串行方式)
多机通
目录
2矩阵键盘(4X4)按键控制程序(汇编)控制led数码管1个
3矩阵键盘(4X4)汇编语言控制多个数码管,使用定时器扫描,数码管不带锁存芯片
STC89C52系列单片机的串行口设有两个控制寄存器:串行控制寄存器SCON和波特率选择特殊功能寄存器PCON。 SCON :串行控制寄存器(可位寻址)
信SM2功能
- REN:接收允许位。由软件置位或复位。REN=0,则禁止串行口接收;若REN=1,则允许串行口接收。
- TB8:发送数据的第9位,用于在方式2和方式3时存放发送数据的第9位。TB8由软件置位或复位。在方式0和方式1中,该位未使用。
- RB8:接收数据的第9位。用于在方式2和方式3时存放接收数据的第9位。在方式1下,若SM2=0,则RB8用于存放接收到的停止位;对于方式0,该位未使用。
- TI:发送中断请求标志位。用于指示一帧数据是否发送完。在方式0下,发送器发送完第8位数据时,TI由内部硬件自动置1,向主机请求中断,响应后软件清零;在其他方式下,TI在发送器开始发送停止位时置1。当TI=1时,向CPU请求中断,CPU响应中断后,必须由软件清零。
- RI:接收中断请求标志位。用于指示一帧数据是否接收完。在方式0下,RI在接收器接收到第8位数据时由内部硬件自动置1向主机请求中断,响应后软件清零;在其他方式下,RI在接收器接收到停止位的中间时刻由内部硬件自动置1。当RI=1时,向CPU请求中断,CPU响应中断后,必须由软件清零。
电源控制寄存器PCON(不可位寻址)
(复位值为0,SMOD=1控制加倍 PCON.6前面已讲到)
波特率
在串行通信中,常用波特率表征数据传输的速度。波特率用每秒钟传送二进制数码的位数来表示,单位为位/秒(b/s)。例如:传送的速率为120字符/秒,而每个字符又包含10位(1位起始位,7位数据位,1位奇偶校验位,1位停止位),则波特率为:120字符/秒×10位/字符=1200位/秒在串行通信中,发送端与接收端必须按照约定的数据帧格式及比特率进行通信,这样才能成功地传输数据。异步通信的重要指标:字符帧格式和波特率
波特率因子
在波特率指定后,输入移位寄存器/输出移位寄存器在接收时钟/发送时钟控制下,按指定的波特率速度进行移位。一般几个时钟脉冲移位一次。要求:接收时钟/发送时钟是波特率的16、32或64倍。波特率因子就是发送/接收1个数据(1个数据位)所需要的时钟脉冲个数,其单位是个/位。如波特率因子为16,则16个时钟脉冲移位1次。 例:波特率=9600bps,波特率因子=32,则 接收时钟和发送时钟频率=9600×32=297200Hz。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。