实验六开机次数统计与独立式键盘显示控制设计实验.docx
- 文档编号:30464801
- 上传时间:2023-08-15
- 格式:DOCX
- 页数:16
- 大小:21.15KB
实验六开机次数统计与独立式键盘显示控制设计实验.docx
《实验六开机次数统计与独立式键盘显示控制设计实验.docx》由会员分享,可在线阅读,更多相关《实验六开机次数统计与独立式键盘显示控制设计实验.docx(16页珍藏版)》请在冰豆网上搜索。
实验六开机次数统计与独立式键盘显示控制设计实验
实验六5.2开机次数统计与独立式键盘显示控制设计实验
系别专业:
电子系12级电信2班学号:
3121003210
姓名:
李书杰指导老师:
刘志群老师
5.2.1实验要求
1.复习构建单片机应用系统的方法。
2.注意实验前方案论证和硬软件设计过程,硬件电路要有原理图,软件部分要求画出流程图和编写程序并作适当注释,拟定实验(调试、测试)步骤。
5.2.2实验设备
PC机一台,TD-NMC+教学实验系统,万用表一台,AT24C04芯片,若干电阻和导线
5.2.3实验目的
1.学会单片机应用系统的基本设计方法。
2.掌握单片机人机通道的键盘输入和LED显示技术。
3.掌握键盘工作原理和按键设置、处理方法。
4.学会单片机定时器的应用。
5.掌握带I2C总线接口的E2PROM存储器(如AT24C04)的应用。
6.学会面包板在电路设计中的使用。
7.进一步学习单片机I/O口的使用。
8.进一步学习单片机软件编程的方法。
9.掌握单片机应用系统的调试技巧。
5.2.4实验内容
根据TD-NMC+实验平台的单元电路,构建一个硬件系统,设计一个打开实验平台(开机)次数统计、显示并能掉电保存、可预置开机次数的控制系统,要求如下:
使用带I2C总线接口的E2PROM存储器保存开机次数,显示由实验平台上的键盘及数码管单元电路模块实现;开机次数可以从默认的0次开始统计,也可以由设计的系统电路中的按键预置,预置值最大只有两位,由2个独立式按键分别控制;允许多次设置开机次数初值;同时系统中另外设计两个独立式功能按键,一个键用于决定是否预置开机次数初值(但按了预置功能请用指示灯指示),另一个键用于预置后的确认,确认后系统能实现计数器的功能,即从预置初值开始,每隔1s(要求用单片机的定时器实现)加1计数,允许的最大计数值为99,计数值能在数码管上显示。
程序如下:
;本程序最大仅能统计255次开机或复位次数
SLAWEQU0A0H;AT24C02寻址字节写的节点地址
SLAREQU0A1H;AT24C02寻址字节读的节点地址
NUMBYTEQU2FH;被传送数据的字节数存放单元
MTDEQU50H;发送数据缓冲区首地址(24C02高8位地址)
MTD1EQU51H;24C02低8位地址
MRDEQU30H;接收字节缓冲区首地址
VSDABITP0.1;虚拟总线的数据线
VSCLBITP0.0;虚拟总线的时钟线
SLAEQU2BH;IIC字节读写的节点地址暂存单元
//按键和LED定义
SW_KBITP1.4;开机次数十位设置按键
GW_KBITP1.5;开机次数个位设置按键
SETUPBITP1.6;设置按键
COUNTBITP1.7;定时计数按键
LEDBITP1.0;设置指示灯
//数码管位定义
LEDSEGEQUP2
SEG1BITP1.2;数码管的十位
SEG2BITP1.3;数码管的个位
SHIEQU60H
GEWEIEQU61H
TIMESEQU62H
ETIMESFBIT00H;确认键按键奇偶标志位
T1SFBIT01H;定时1s标志位
ORG0000H
AJMPMAIN
ORG000BH
AJMPINTT0
ORG0030H
MAIN:
MOVSP,#70H;堆栈地址
ORLP1,#0F0H;设4个按键为输入口
CLRLED
CLRETIMESF;初始默认确认键按下偶数次
CLRT1SF
MOVTMOD,#01H
MOVTIMES,#20
SETBEA
LCALLRDIIC;读出24C02在本次开机前的开机次数
MOVA,MRD
ACALLH_BCD
LOOP:
LCALLDIS;调用显示子程序
JBSETUP,M1
LCALLSETUPTIMES
;JNBSETUP,$
M1:
JBCOUNT,LOOP
LCALLENTER
AJMPLOOP
//M1:
JBCOUNT,M2
//LCALLENTER
//AJMPLOOP
//M2:
CLRTR0
//CLRET0
//AJMPLOOP
;T0中断服务程序
INTT0:
PUSHACC
MOVTH0,#4CH
MOVTL0,#00H
DJNZTIMES,INTL
MOVTIMES,#20
MOVA,GEWEI
CJNEA,#9,INTL1
MOVGEWEI,#00H
MOVA,SHI
CJNEA,#9,INT2
MOVSHI,#00H
AJMPINT3
INTL1:
INCGEWEI
AJMPINT3
INT2:
INCSHI
INT3:
SETBT1SF
INTL:
POPACC
RETI
;预置开机次数初值子程序
SETUPTIMES:
CLRTR0
CLRET0
SETBLED
JBSW_K,ST3;十位按键设置
MOVA,SHI
CJNEA,#9,ST1
MOVSHI,#00H
AJMPST2
ST1:
INCSHI
ST2:
JNBSW_K,$;等待按键松开
ST3:
JBGW_K,ST6;个位按键设置
MOVA,GEWEI
CJNEA,#9,ST4
MOVGEWEI,#00H
AJMPST5
ST4:
INCGEWEI
ST5:
JNBGW_K,$;等待按键松开
ST6:
RET
;确认预置开机次数子程序
ENTER:
CPLETIMESF
;JNBETIMESF,ENT1
CLRLED
MOVA,SHI;保存预置值到EEPROM器件
MOVB,#10
MULAB
ADDA,GEWEI
MOVMRD,A
MOVMTD,#00H;MTD/MTD1:
EEPROM读写的首地址
MOVMTD+1,MRD
MOVSLA,#SLAW
MOVNUMBYT,#2
LCALLWRNBYT
LCALLDEL5MS
ENT1:
MOVTIMES,#20
MOVTH0,#4CH
MOVTL0,#00H
SETBET0
SETBTR0
RET
;显示子程序
DIS:
MOVDPTR,#DSEGS;数码管段表地址
MOVA,SHI
MOVCA,@A+DPTR;查表
SETBSEG2
CLRSEG1;选通数码管十位位显示
MOVLEDSEG,A;送段显示
;CLRSEG1;选通数码管十位位显示
;SETBSEG2
ACALLDL1MS
MOVA,GEWEI
MOVCA,@A+DPTR;查表
SETBSEG1
CLRSEG2;选通数码管个位位显示
MOVLEDSEG,A;送段显示
;SETBSEG1
;CLRSEG2;选通数码管个位位显示
ACALLDL1MS
RET
;共阴极数码管段显示值
DSEGS:
DB03FH,06H,05BH,04FH,066H,06DH,07DH,07H;0-7
DB07FH,06FH,077H,07CH,039H,05EH,079H,071H,40H;8-F,-
;延时1ms子程序
DL1MS:
MOVR7,#04H
DL0:
MOVR6,#125
DL1:
DJNZR6,DL1
DJNZR7,DL0
RET
;-----------------H_BCD---------------------
;单字节十六进制数转换为2位BCD码子程序
;入口参数:
A
H_BCD:
MOVB,#10;分离出十位和个位
DIVAB
MOVSHI,A
MOVGEWEI,B
RET
;-----------------WRIIC---------------------
;送数到24C04的子程序
WRIIC:
MOVMTD,#00H
MOVMTD+1,MRD
MOVSLA,#SLAW
MOVNUMBYT,#02H;再将它们发送到EEPROM中
LCALLWRNBYT
LCALLDEL5MS;延时等待EEPROM内部数据处理
RET
;-----------------RDIIC---------------------
;读出24C04在本次开机前的开机次数子程序
RDIIC:
MOVMTD,#00H;MTD:
EEPROM读写的首地址
MOVSLA,#SLAW
MOVNUMBYT,#1
LCALLWRNBYT
MOVSLA,#SLAR
MOVNUMBYT,#01H;从EEPROM的指定单元顺序读出1个数据
LCALLRDNBYT;并存放在以MRD(30H)为首地址的单元中
;大于99的判断
MOVA,MRD
CJNEA,#99,RDI1
AJMPRDI2
RDI1:
JCRDI3
RDI2:
MOVMRD,#00H;大于等于99则清0
AJMPRDIEND
RDI3:
INCMRD;小于99则开机加1
RDIEND:
MOVMTD,#00H;MTD/MTD1:
EEPROM读写的首地址
MOVMTD+1,MRD
MOVSLA,#SLAW
MOVNUMBYT,#2
LCALLWRNBYT
LCALLDEL5MS
RET
;-----------------WRNBYT---------------------
;*调用向被控器件发送N个字节数据WRNBYT子程序*;
WRNBYT:
MOVR3,NUMBYT
LCALLSTA;启动I2C总线
MOVA,SLA;发送SLAW字节
LCALLWRBYT
LCALLCACK;检查应答位
JBF0,WRNBYT;非应答位则重发
MOVR1,#MTD
WRDA:
MOVA,@R1
LCALLWRBYT
LCALLCACK
JBF0,WRNBYT
INCR1
DJNZR3,WRDA
LCALLSTOP
RET
;-----------------RDNBYT--------------------
;*调用通用N字节接收子程序RDNBYT*;
RDNBYT:
MOVR3,NUMBYT
LCALLSTA;发送启动位
MOVA,SLA;发送寻址字节(读)
LCALLWRBYT
LCALLCACK;检查应答位
JBF0,RDNBYT;非正常应答时重新开始
RDN:
MOVR1,#MRD;接收数据缓冲区首址MDR入R1
RDN1:
LCALLRDBYT;读入一个字节到接收数据缓冲中
MOV@R1,A
DJNZR3,ACK;N节读完否?
未完转ACK
LCALLMNACK;N个字节读完发送非应答位
LCALLSTOP;发送停止信号
RET;子程序结束
ACK:
LCALLMACK;发送应答位
INCR1;指向下一个接收数据缓冲单元
SJMPRDN1;转读入下一个字节数据
;-----------------STA-----------------------
;*I2C总线典型信号的模拟子程序*;
;启动STA子程序
STA:
SETBVSDA
SETBVSCL
NOP
NOP
CLRVSDA
NOP
NOP
CLRVSCL
RET
;-----------------STOP----------------------
;*I2C总线典型信号的模拟子程序
;停止(STOP)子程序
STOP:
CLRVSDA
SETBVSCL
NOP
NOP
SETBVSDA
NOP
NOP
CLRVSDA
CLRVSCL
RET
;-----------------MACK----------------------
;*I2C总线典型信号的模拟子程序*;
;发送应答位MACK子程序
MACK:
CLRVSDA
SETBVSCL
NOP
NOP
CLRVSCL
SETBVSDA
RET
;-----------------MNACK---------------------
;发送非应答位MNACK子程序*;
MNACK:
SETBVSDA
SETBVSCL
NOP
NOP
CLRVSCL
CLRVSDA
RET
;-----------------CACK----------------------
;I2C总线模拟的通用子程序*;
CACK:
SETBVSDA;置VSDA为输入方式
SETBVSCL;使VSDA上数据有效
CLRF0;预设F0=0
MOVC,VSDA;输入VSDA引脚状态
JNCCEND;检查VSDA状态,正常应答转CEND,且F0=0
SETBF0;无正常应答,F0=1
CEND:
CLRVSCL
RET
;-----------------WRBYT---------------------
;I2C总线模拟的通用子程序
;发送一个字节数据(WRBYT)子程序
;该子程序是向虚拟I2C总线的数据线VSDA上发送一个字节数据的操作。
调用本子程序前将要发送的数据送入A中。
占用资源:
R0,C。
WRBYT:
MOVR0,#08H;8为数据长度送R0中
WLP:
RLCA;发送数据左移,使发送位入C
JCWR1;判断发送"1"还是"0",发送"1"转WR1
AJMPWR00;发送"0"转WR0
WLP1:
DJNZR0,WLP;8位是否发送完,未完转WLP
RET;8位发送完结束
WR1:
SETBVSDA;发送"1"程序段
SETBVSCL
NOP
NOP
CLRVSCL
CLRVSDA
AJMPWLP1
WR00:
CLRVSDA;发送"0"程序段
SETBVSCL
NOP
NOP
CLRVSCL
AJMPWLP1
;-----------------RDBYT---------------------
;*I2C总线模拟的通用子程序
;从VSDA上接收一个字节数据(RDBYT)子程序,该子程序用来从VSDA上读取一个字节数据,执行本程序后,从VSDA上读取的一个字节存放在R2或A中。
资源占用:
R0,R2,C。
RDBYT:
MOVR0,#08H;8位数据长度如R0
RLP:
SETBVSDA;置VSDA为输入方式
SETBVSCL;使VSDA上数据有效
MOVC,VSDA;读入VSDA引脚状态
MOVA,R2;读入"0"程序段,由C拼装入R2中
RLCA
MOVR2,A
CLRVSCL;使VSCL=0可继续接收数据位
DJNZR0,RLP;8位读完否?
未读完转RLP
RET
;延时5ms子程序
DEL5MS:
MOVR7,#20
DL10:
MOVR6,#125
DL11:
DJNZR6,DL11
DJNZR7,DL10
RET
END5.2.5方案提示
系统框图如图5.2.1所示。
软件编程的难点是I2C总线通用软件包的灵活应用;数字键和功能键的切换;功能键的编程;开机次数统计、保存、显示和预置的关系和实现过程。
5.2.6思考题
1.谈谈硬件电路设计与调试、软件编程与调试的体会。
答:
首先是焊接的顺序问题。
焊接的顺序很重要,应该是应该按功能划分的器件进行焊接,顺序是功能部件的焊接--调试(OK)--另一功能部件的焊接,这样容易找到问题的所在。
多观察,多思考。
如我前些日子在调试320×240点阵LCD的时候,发现怎么也不能出现图像,后来在偶然的机会下,发现LCD在MPU的CS2口线下,出现闪动的情况,猜测这时候有数据写入到LCD中,仔细研究才发现,MPU的DATA0-7线与74LVC245的A0-7连接在一起,MPU的通过一个GAL16V8或是与非门等芯片进行逻辑组合后与74LVC245的OE引脚相连,这样MPU只有在某一地址范围内才可以进行数据读写操作。
所以在调试过程中,对于出现的任何现象都不要放过,问题的解决就是从一些小的现象入手的。
有可能的情况下,最好焊两块板子以上,这样才好有个比较,硬件上很小的问题有很多时候是很难发现的。
软件的调试要和硬件配合进行,往往问题可能不是硬件上的。
2.简述独立式键盘和行列式键盘的区别。
答:
独立按键:
一个按键占用单独的一个I/O口;
矩阵键盘:
为了节省I/O口,通常将按键排列成矩阵形式,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。
3.简述单片机系统的静态和动态显示的区别。
答:
如果系统只有一位数码管,那么肯定是静态显示,如果是两位及以上,为了节省资源,一般用动态显示.因为驱动1位数码管需要至少7个IO口,如果两位的你还用静态显示,那么就要14个IO口,同理,更多的位则更多的IO口,而单片机的IO口实在有限,所以多位,一般用动态.有一个特殊方法,就是外加芯片和电路,比如用多片74HC595或者74HC373,也可以利用少量的IO口实现静态显示,这样虽然没有占用太多IO口资源,但是占用了芯片,因为你一个静态显示就要用一个芯片来配合,从成本上,电路上都不合算.
所以动态显示可以节约硬件资源而以软件来实现,静态显示则消耗了硬件,节省了软件的开消.
4.如果实验系统的显示LED用共阳极,则显示数据0~9的编码为多少?
答:
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90
5.简述单片机实现1s定时的方法。
答:
用FOR语句循环N次。
6.简述使用AT24C04的注意事项。
答:
AT24C04是Ateml公司的4KB得电可擦除存储芯片,采用两线串行的总线和单片机通讯,电压最低可以到2.5V,额定电流为1mA,静态电流10uA(5.5V),芯片内的资料可以在断电的情况下保存100年,而且采用8脚的DIP封装,使用方便。
简而言之,AT24C02是一个在突然掉电的情况下存储数据的芯片,即掉电存储芯片。
系统框图如图5.2.1所示。
软件编程的难点是I2C总线通用软件包的灵活应用;数字键和功能键的切换;功能键的编程;开机次数统计、保存、显示和预置的关系。
1
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 开机 次数 统计 立式 键盘 显示 控制 设计