从51开始的单片机之旅(一)----流水灯、矩形键盘、电子时钟
- 说一下个人的学习经历
- 我做过的项目:
- 今天先把当初做的89E51总结出来
- 先说下89E51
- 一、流水灯、数码管
- 二、矩阵键盘,蜂鸣器和电子时钟
- 结语:
说一下个人的学习经历
我是大二开始进入学校电子设计实验室的,从SST89E516到现在stm32f4。以前没有系统的整理过自己的项目,现在由于疫情期间在家有空,就把这些学习成长经历给总结和分享出来,也去自己从新走一遍自己的路,温故而知新。
我做过的项目:
我们在实验室的是按老师上节课把题目讲下后我们自己做(实验室有单独的教室和专门负责的老师),做完找老师验收(验收的时候还会提问,当初最怕的就是这个了)
0. 89E51的 流水灯 按键 数码管 时钟 液晶 adc dac
1. 模电的 放大器 300-3.4kHz带通滤波器 低频功率放大器
2. stm32f4语音存储回放
3. 电子秤
4. 帆板
5. 平衡车
6. 纸张测量(19年8月参加全国大学生电子设计大赛,获得省2奖)
7. 倒立摆
8. 手势识别
9. 红外通信
10.风力摆 (未做完 开始调参数了)
今天先把当初做的89E51总结出来
先说下89E51
我们实验室用的是SST89E516RD
SST89E516RD片内有两块SuperFlashEEPROM。
SST89E516RD是一款8位单片机。SST89E516RD含有1k的RAM和64k+8k的内置可擦除程序存储器ROM
SST89E516RD在5V电压时可工作在0~40MHz和3V。
主要特性:·
· 兼容80C51 系列,内置超级FLASH 存储器的单片机·
· SST89E5XXRD工作电压 VDD=4.5~5.5V5 伏工作电压时0-40MHz 的频率范围
· SST89V5XXRD工作电压 VDD=2.7~3.6V在3 伏工作电压下,原厂保证0~25 MHz的工作频率 ,实际最高可达40MHz
· 1K*8 的内部RAM(256Bytes+768Bytes)
· 最大片外程序/数据地址空间为64K*8(当然也可以通过I/O 口进行块切换,实现超64K 扩展)
· 三个16 位定时器/计数器
· 9 个中断源,四个中断优先级
· 四个8 位I/O 口(32 根输入输出线)
一、流水灯、数码管
实验要求: 实现8个LED灯轮流循环被点亮,将6只数码管按指定字符点亮
设计思路:
流水灯:先点亮最右边的LED,延时,再点亮下一盏灯,循环点亮
数码管:先将位选给高电平,在逐一给低电平,将段选逐一赋值,延时时间要短,让视觉效果上是一起亮
电路图:
//流水灯程序
ORG 0000HLJMP MAINORG 000BHLJMP T0ISRORG 0030HMAIN:MOV TMOD,#01HMOV TH0,#HIGH(65536-50000) //50毫秒定时MOV TL0,#LOW(65536-50000)SETB TR0SETB ET0SETB EAMOV A,#0FEHMOV P1,AMOV R2,#20SJMP $T0ISR:CLR TR0MOV TH0,#HIGH(65536-50000)MOV TL0,#LOW(65536-50000)SETB TR0DJNZ R2,T0E //1秒未到直接退出MOV R2,#20RL A MOV P1,A //秒一变的花样流水灯。T0E:RETIEND
//数码管程序ORG 0000HAJMP 0030HORG 0030HMAIN:CLR P2.0MOV P1,#0F9H //1ACALL DELAY1MSMOV P1,#0FFH //P1口赋值FFH,即P1口全部置1 #0FFH, 转换为二进制是11111111 SETB P2.0CLR P2.1MOV P1,#0A4H //2ACALL DELAY1MSMOV P1,#0FFHSETB P2.1CLR P2.2MOV P1,#0B0H //3ACALL DELAY1MSMOV P1,#0FFHSETB P2.2CLR P2.3MOV P1,#099H //4ACALL DELAY1MSMOV P1,#0FFHSETB P2.3CLR P2.4MOV P1,#092H //5ACALL DELAY1MSMOV P1,#0FFHSETB P2.4CLR P2.5MOV P1,#082H //6ACALL DELAY1MSMOV P1,#0FFHSETB P2.5AJMP MAINDELAY1MS: ;//误差 0usMOV R6,#04HDL:MOV R5,#0F8HDJNZ R5,$DJNZ R6,DLRETEND
总结
复位电路:
复位条件:两个机器周期以上的高电平(2us)
前提:足够的电压启动晶振,频率越低,启动时间越长
据查SST89E516RD文档知RC电路是使用时,应确保VDD的上升时间不超过1ms,振荡器启动时间不超过10ms,因此复位时应保证有足够的时间保证振荡器启动,因此时间应大于等于10ms,所以Urst=Vcc*e^(-t/RC)=0.77 Vcc t=R1Cln0.7>10ms R1>2.8k R1/(R1+R2)Vcc R2<3/7R
定时:单片机的定时器是一个16位的定时器,则能从0~65536计数,一次最多能计时65.5ms,定时要先定一个时间,然后执行n次
例如:计时1sMOV R4,#20MOV TMOD,#01HMOV TH0,#030HMOV TL0,#0B0H
定时有4种工作模式:
模式0为13位计数器;
模式1为16位计数器;
模式2为自动再装入8位计数器;
模式3为定时器0:分成二个8位计数器 定时器1:停止计数
- ORG 0050H 地址从0050H开始是因为此单片机在0000H到0050H之间存在中断002BH
- EA=0,只访问外部ROM
EA=1,先访问内部ROM,当PC值超过内部的ROM的地址范围时会转到执行外部ROM - 片机使用低电平驱动的原因:此单片机是采用的负逻辑语言,只能低电平驱动,低电平驱动能力强
- 码管电路中加三极管的作用:增大电流,单片机的输出电流小于20mA,而数码管是5mA左右,不加三极管会导致单片机功耗过大
- 不能用P3驱动流水灯或数码管的原因:
- P3.0与P3.1是单片机与计算机串口通信的端口
- P3.6与P3.7是外部数据存储器写/读选通,只有当对片外ROM进行读写时,WR与RD才会工作
二、矩阵键盘,蜂鸣器和电子时钟
实验要求:构建44的16位矩阵键盘,从左至右,从上至下分别代表“0-F”,按任意键时,数码管都能显示出与之相对应的字符,并通过蜂鸣器来实现按键音;实现一电子时钟,6位数码管从左至右分别代表时,分,秒,并可以通过44的矩阵键盘实现时钟的调时功能。
- 矩阵键盘:
(1)矩阵所用的按键为四脚轻触按键其外观图及内部结构图如下图所示
如上图可知按键1,2脚导通;3,4脚导通。按下按键时1,3或1,4或2,3或2,4导通
(2)矩阵的连接
本实验连接4*4矩阵键盘其连接图如下。在控制的过程中矩阵键盘采用的是行列扫描法。因为我们的矩阵按键接的是单片机的P0口,且矩阵的行接P0.0-P0.3,列接P0.4-0.7,所以其扫描原理为:将接P0.0口的行变为低电平,其余行为高电平,然后读取列线的电平;在这一行上如果有某一按键被按下,则相应的列被拉到低电平,则此行与此列相交的按键被按下;若没有任何一列被拉为低电平则表示没有按键被按下。以此方法类推其他按键的定位。
(3)按键的程序及流程图
ORG 0000H ;//伪指令,指定一下程序汇编后代码在入程序存储器0000H单元开始的连续单元中,不占有内存 AJMP MAIN ;//短转移指令,转到主程序开始处 ORG 0050H ;//伪指令,指定一下程序是从0050H之后连续单元存储 MAIN: MOV P0,#0F0H ;//给P0口赋值,使得低四位为低电平,所有行为低电平,全扫描 高四位列 ONE:MOV A,P0 ;//将P0口值赋值给寄存器A,读取列值 XRL A,#0F0H ;//将A中的值与11110000异或 JZ ONE ;//判断A的值是否为0,为0则没有键按下,继续判断,有则进行下面程序 ACALL DELAY ;//延时20ms去除按压时的抖动 MOV A,P0 ;//再将P0口的值赋值给寄存器A XRL A,#0F0H ;//与11110000异或 JZ ONE ;//判断若A=0则PC+ONE的地址跳转 MOV A,#00H ;//若不为0,PC值继续向下运行,给A赋值0 JNB P0.4,TWO ;//判断P0.4引脚是否为0,若不为0跳转TWO,继续下面的判断键值 INC A ;//若为0,将A 值加1 JNB P0.5,TWO ;//继续判断P0.5位是否为0,舨晃?跳转TWO,继续下面的判断键值 INC A ;//若为0,将A 值加1 JNB P0.6,TWO ;//继续判断P0.6位是否为0,舨晃?跳转TW,继续下面的判断键值 INC A ;//若为0,将A 值加1 JNB P0.7,TWO ;//继续判断P0.7位是否为0,舨晃?跳转TW,继续下面的判断键值 TWO:MOV R1,A ;//将判断列值的A赋值与R1,暂存于此 MOV R2,#00H ;//R2赋值0将作为行值 MOV R3,#0FEH ;//R3赋值为11111110,作为后面提取行 FOUR: MOV A,R3 ;//将R3的值赋给寄存器A MOV P0,A ;//将A赋值给P0口,将第一行给低电平 MOV A,P0 ;//再将P0口的值赋值给A XRL A,R3 ;//与R3做异或,若某一位不一样,则该位赋值于1 JNZ THREE ;//判断A是否不为0,若不为0则证明该行有键按下,若为0 ,继续下一行的判断 MOV A,R3 ;//将R3的值给A RL A ;//循环左移一位,将第二行赋于低电平 MOV R3,A ;//将A的值给R3,暂存 MOV A,R2 ;//将R2的值给R2 INC A ;//由于上一行无键按下,则自加1 MOV R2,A ;//再将A 的值赋值给R2暂存 AJMP FOUR ;//挑战FOUR循环判断 THREE: MOV A,R2 ;//判断到具体的某行时,将暂存行数的R2值,赋值给A MOV B,#04H ;//给寄存器B赋值4 MUL AB ;//A*B=A,两者相乘赋值给A ADD A,R1 ;//再将列值相加就得到了该键所对应的具体值 MOV P2,#0FEH ;//将P2口赋值0FE,唤醒数码管第一位,作为显示 MOV DPTR,#TAB ;//寄存器间接寻址,采用数据指针(DPTR)作为间接寻址寄存器,将表TAB赋值于DPTR,以查表方式赋值 MOVC A,@A+DPTR ;//以查表的方式将DPTR中数值赋值于A MOV P1,A ;//将P1口赋值A中的所查值,P1口控制数码管段选 AJMP MAIN ;//跳转至MAIN,继续下一次判断 DELAY: ;//延迟程序20ms MOV R6,#40 ;//该语句占1个机器周期 D1: MOV R5,#246 ;//该语句占1个机器周期 D2: DJNZ R5,D2 ;//该语句占2个机器周期共执行246*40次 DJNZ R6,D1 ;//该语句占2个机器周期共执行40次 RET ;//该语句占2个机器周期 TAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,88H,83H,0C6H,0A1H,86H,8EH;//表,伪指令DB,通知汇编程序从当前ROM地址开始保留一字节或字节串的存储单元,并存入DB后面的数据 END ;//伪指令,表示END后面所有的汇编语言指令均不予以汇编
- 蜂鸣器
本实验内蜂鸣器的作用是连接矩阵按键,当有键按下时蜂鸣器会发出响声,起到提示的作用。我们所用到的蜂鸣器是无源蜂鸣器,无源是指蜂鸣器的内部不带震荡源,以至与用直流信号是无法让蜂鸣器发出响声的,必须用方波信号输入谐振装置转换为声音信号输出,可控制方波信号的频率来改变声音的大小。无源蜂鸣器的内部结构图如下。
蜂鸣器接的是单片机的P3.7口,且连接了一个限流电阻。如上面电路图接法给三级管接5V电源满足发射结正偏,集电结正偏,8550工作在饱和导通状态。蜂鸣器的另一端接地。蜂鸣器用延时程序使谐振装置转化为声音信号,其程序如下。
ORG 0000HLJMP MAINORG 000BHMAIN: MOV P3, #0FFHLCALL DELAYMOV P3, #00H LCALL DELAY LJMP MAIN DELAY:MOV R7, #250 D1: MOV R6, #250 D2: DJNZ R6, D2 DJNZ R7, D1 RET END//如上程序可知其延时时间为[1+(1+2*250+2)*250+2]*1us.~
- 电子时钟
用数码管实现电子时钟的显示,6个数码管分别依次两个显示时,两个显示分,两个显示秒并且分,时,秒之间有点隔开。电子时钟还需有调时功能,通过矩阵按键控制,及在矩阵按键中每一行的四个按键都可以完成相应的功。每一行从右到左四个按键依次实现控制时钟启动,调节秒(每按一次加一),调节分(每按一次加一),调节时(每按一次加一)。
主要设计的思路为,数码管的段选a,b,c,d,e,f,g,dp依次接到单片机的P1.0-P1.7且段选和I/O口之间要接电阻460Ω,且数码管一侧的GND接一个三级管,在三级管的基级接一个电阻起限流作用电阻的大小为4.7KΩ。电子时钟通过按键控制,按键的行依次接P0.1-P0.3,列依次接P0.4-P0.7,并在各处接一个上拉电阻。按键和数码管组成的电路图如下所示。
电子时钟的程序及流程图
//电子时钟STRT EQU P0.0 ;等价代换SEC EQU P0.1MIN EQU P0.2HOUR EQU P0.3CL EQU P2.0ORG 0000HSJMP MAINORG 000BH ;TO溢出时的中断程序入口地址AJMP T0INT0 ;TO溢,跳到T0INT0ORG 0100H MAIN:CLR P0.4MOV P2,#0FFH ;初值MOV R4,#20
;20*0.05=1sMOV TMOD,#01H ;TO为模式1MOV TH0,#03CH MOV TL0,#0B0H ; 即:t=0.05后,TO溢出SETB ET0 ;T0中断允许位SETB EA ;开中断MOV 30H,#00H ;清零30H-32H地址单元:MOV 31H,#00HMOV 32H,#00HKS:LCALL DISP ;作用:无任何按键,动态显示JB SEC, KM ;检查 秒键 按否?KSS:LCALL DISPLCALL DALY2 ;显示JNB SEC,KSS ;当前地址,产生中断AJMP SINC ;松秒键(秒+1)KM: LCALL DISPJB MIN,KH ;分调整按键(按,不管)KMM:LCALL DISPLCALL DALY2JNB MIN,KMMAJMP MINC;(分+1)KH:LCALL DISPJB HOUR,K1 ;时调整按键 (按,不跳)KHH:LCALL DISPLCALL DALY2 JNB HOUR,KHHAJMP HINC ;(时+1)SINC:LCALL DISPLCALL CLOLCALL DISPINC 30H ;秒调整 30H单元的数据+1MOV A,30H CJNE A,#60,SINC0 ;A=60时,不管 , 否则跳MOV 30H,#0 ;A=60 30H单元的数据清零60/10=6.0(6与0)59/10=(5与9)SINC0:AJMP KS MINC:LCALL DISPLCALL CLOLCALL DISPINC 31H ;31H单元的数据+1MOV A,31HCJNE A,#60,MINC0MOV 31H,#0MINC0:AJMP KM ;返回"主跳"HINC:LCALL DISPLCALL CLOLCALL DISPINC 32H MOV A,32HCJNE A,#24,HINC0MOV 32H,#0HINC0:AJMP KH k1: LCALL DISP JB STRT,KS ;检查开始键K11:LCALL DISPLCALL DALY2JNB STRT,K11AJMP STARTSTART:LCALL DISPLCALL CLOLCALL DISPCPL TR0 AJMP K1DISP:MOV A,30H ;单元中的数据/10,分离个位与十位 MOV B,#10DIV ABMOV 40H,B ;余数(秒个位数)MOV 41H,A ;商(秒十位数)MOV A,31HMOV B,#10DIV ABMOV 42H,B ;余数(分个位数)MOV 43H,A ;商(分十位数)MOV A,32HMOV B,#10DIV ABMOV 44H,B ;余数(时个位数)MOV 45H,A ;商(时十位数)MOV A,40H ;秒个位ACALL SEG7MOV P1,ACLR P2.5ACALL DLYSETB P2.5MOV A,41H ;秒十位ACALL SEG7MOV P1,ACLR P2.4ACALL DLYSETB P2.4MOV A,42H ;分个位ACALL SEG7MOV P1,ACLR P2.3ACALL DLYSETB P2.3 MOV A,43H ;分十位ACALL SEG7 MOV P1,ACLR P2.2ACALL DLYSETB P2.2MOV A,44H ;时个位CALL SEG7MOV P1,ACLR P2.1ACALL DLYSETB P2.1MOV A,45H ;时十位ACALL SEG7MOV P1,ACLR P2.0ACALL DLYSETB P2.0RET T0INT0:PUSH ACCPUSH PSWCLR TR0MOV A,#0B5HADD A,TL0MOV TH0,#03CH ;定时中断子程序。重装定时常数 MOV TL0,A SETB TR0DJNZ R4,T0INTRMOV R4,#20INC 30H ;1S,秒存储单元内数+1MOV A,30H CJNE A,#60,T0INTR ;未满60S,跳出中断。MOV 30H,#0 ;满60S,秒单元清零INC 31H ;分+1MOV A,31HCJNE A,#60,T0INTRMOV 31H,#0INC 32HMOV A,32HCJNE A,#24,T0INTRMOV 32H,#0T0INTR: POP PSWPOP ACCRETICLO:CLR CLLCALL DALY1SETB CLRETDALY2: ;误差 0usMOV R6,#01HDL0:MOV R5,#2FHDJNZ R5,$DJNZ R6,DL0RETDLY:MOV R7,#2D1:MOV R6,#40DJNZ R6,$DJNZ R7,D1RETDALY1: ;误差 0usMOV R6,#0D7HDL3:MOV R5,#2DHDJNZ R5,$DJNZ R6,DL3NOPNOPRETSEG7:INC AMOVC A,@A+PCRETIDB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90
- 矩阵键盘,蜂鸣器和电子时钟中知识点
(1) 按键扫描的工作原理
将接P0.0口的行变为低电平,其余行为高电平,然后读取列线的电平;在这一行上如果有某一按键被按下,则相应的列被拉到低电平,则此行与此列相交的按键被按下;若没有任何一列被拉为低电平则表示没有按键被按下
。其他行的按键判断都是以此方法进行,将该行置为低电平,其余行为高电平,然后读取列的电平来判断哪个按键被按下。
(2)为什么按键接P0口时要接上拉电阻
因为P0口的内部接构中没有上拉电阻,加了上拉电阻可以很好的控制按键的电平的状态,使按键按下后能很好的回复为初始状态。
(3)定时和中断
T0INT0:PUSH ACC PUSH PSW
CLR ETO CLR TR0 MOV A,#0B7H (7是补从CLR TR0到MOV TH0,A用时) ADD A,TL0 (TL0值从50ms后到TR0所有用时,弥补中断响应时间)中断响应的时间不能确定因此用定时器补误差) MOV TH0,#03CH ;定时中断子程序。重装定时常数 MOV TL0,A MOV A,#3CH ADDC A,TH0 (当前面的ADD中A+TL0高八位有溢出时ADD会进位使初值精确) MOVTH0,A TB TR0
①中断请求Interrupt Request
②Interrupt Enable中断使能 (中断总开关,允许其它中断的前提)
③Interrupt Priority中断优先级
④breakpoint address断点地址
⑤Vector address
①②③④⑤构成中断响应
结语:
我们当初的时候是零基础进的实验室,开始的时候都要求用汇编写程序,以此打好基础(建议零基础的同学也这样),每次做完一个项目时要好好作报告和总结,每一封耕耘都会有一份收获 下一篇写89E51的LCD1602液晶、ADC0809、DAC0832
从51开始的单片机之旅(一)----流水灯、矩形键盘、电子时钟相关推荐
- 51单片机-LED模块-来回流水灯
51单片机-LED模块-来回流水灯 1. 视频 哔哩哔哩视频地址: https://www.bilibili.com/video/av89552821 51单片机-LED模块-来回流水灯 2. 文件 ...
- 51单片机 74HC154译码器制作流水灯+Proteus仿真
51单片机 74HC154译码器制作流水灯+Proteus仿真 Proteus仿真 实例代码 #include <reg52.h> #define uint unsigned int #d ...
- 51单片机AT24C02写读流水灯实例+Proteus仿真
51单片机AT24C02写读流水灯实例+Proteus仿真 Proteus仿真 这个流水灯的状态是通过读取AT24C02地址中的数值来改变的.(有点废AT24C02) 程序代码 #include &l ...
- 51单片机通过CD4051实现流水灯效果+Proteus仿真
51单片机通过CD4051实现流水灯效果+Proteus仿真 Proteus仿真效果 CD4051 CD4051是一款八选一模拟开关电路,内置3个地址选择端(A0-A2),低有效的使能输入端( E), ...
- 51单片机学习笔记5 流水灯实现及蜂鸣器控制
51单片机学习笔记5 流水灯实现及蜂鸣器控制 一.流水灯 1. 硬件电路 2. 代码实现 (1) 点亮一个LED的基本操作 (2) 使用算术左移实现流水灯 (3) 使用库文件左移函数 二.蜂鸣器 1. ...
- 设计分享|单片机左右来回的流水灯
目录 具体实现功能 设计介绍 51单片机简介 设计思路 设计内容 仿真图(protues8.7) 程序(Keil5) 具体实现功能 51单片机控制8路流水灯左右来回移动! 设计介绍 51单片机简介 5 ...
- c语言编程流水灯与交通灯实验,C51单片机实验报告_流水灯_交通灯_定时器_双机交互_时钟.doc...
C51单片机实验报告_流水灯_交通灯_定时器_双机交互_时钟 学 号: 班 级: 自动化10班 姓 名: 张 指导老师: 胡 2012.12 单片机核心板实验要求 流水灯实验 实验目的: 简单I/O引 ...
- c51单片机学习笔记-LED流水灯实验
目的:实现 LED 流水灯,只需循环让 D1-D8 指示灯逐个点亮. 方法:点亮 D1 且把 D2-D8 熄灭,延时一段时间后再点亮 D2 且把 D1. D3-D8 熄灭,延时一段时间后再点亮 D3 ...
- 从51开始的单片机之旅(二)----LCD1602液晶、ADC0809、DAC0832
说在前面 上篇已经把流水灯.矩形键盘.电子时钟已经总结完了,今天来总结89E51的LCD1602液晶.ADC0809.DAC0832的相关内容 说在前面 一.基本原理介绍 二.原器件介绍 三.设计及接 ...
最新文章
- 使用JSON.parse(),JSON.stringify()实现对对象的深拷贝
- kettle 遇到 解决Incorrect integer value: '' for column 'id' at row 1 完美解决-费元星
- 超详细的8psk调制解调通信系统讲解与仿真
- 机器学习能诊断病情,还能预测患者出院后的情况?
- 【转】TFS签入签出规范
- 2-4实战分类之模型构建
- 设置loadrunner中每个mdrv.exe进程中包含的vuser个数
- Android内核开发:为什么刷机后系统第一次启动会很慢?
- php中dump是什么文件怎么打开,Win8/Win10 dump文件怎么打开?dump文件分析工具下载及使用教程...
- 仿视频字幕弹幕网站 – Miko二次元动漫视频网站源码 视频播放带源码
- 项目管理第四章项目整合管理
- gateway断言工厂Path,Weight
- J2ME平台的的RPG游戏开发历程(1)-盘古开天辟地,j2me创造游戏世界
- 给定连接查询ems配送信息
- arduino点阵声音频谱_Arduino实现32分频音频频谱显示器
- android 电池运行时间计算,android 电池充电时间计算方法
- KNN和K-means的区别 为什么KNN算法里的K越小模型会越复杂? 过拟合和欠拟合的偏差和方差问题
- 可变数据之流水号数据的批量打印
- 310页(11万字)2021年数字医院信息化综合解决方案
- 一次协作多端同步,打通看云、github互相同步(serverless实践)