实验六开机次数统计与独立式键盘显示控制设计实验.docx
《实验六开机次数统计与独立式键盘显示控制设计实验.docx》由会员分享,可在线阅读,更多相关《实验六开机次数统计与独立式键盘显示控制设计实验.docx(14页珍藏版)》请在冰豆网上搜索。
实验六开机次数统计与独立式键盘显示控制设计实验
实验六5.2开机次数统计与独立式键盘显示控制设计实验
系别专业:
电子系12级电信2班学号:
3121003210
某某:
李书杰指导教师:
X志群教师
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;调用显示子程序
SETUP,M1
LCALLSETUPTIMES
;JNBSETUP,$
M1:
COUNT,LOOP
LCALLENTER
AJMPLOOP
//M1:
COUNT,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
SW_K,ST3;十位按键设置
MOVA,SHI
CJNEA,#9,ST1
MOVSHI,#00H
AJMPST2
ST1:
INCSHI
ST2:
JNBSW_K,$;等待按键松开
ST3:
GW_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;检查应答位
F0,WRNBYT;非应答位如此重发
MOVR1,#MTD
WRDA:
MOVA,R1
LCALLWRBYT
LCALLCACK
F0,WRNBYT
INCR1
DJNZR3,WRDA
LCALLSTOP
RET
;-----------------RDNBYT--------------------
;*调用通用N字节接收子程序RDNBYT*;
RDNBYT:
MOVR3,NUMBYT
LCALLSTA;发送启动位
MOVA,SLA;发送寻址字节〔读〕
LCALLWRBYT
LCALLCACK;检查应答位
F0,RDNBYT;非正常应答时重新开始
RDN:
MOVR1,#MRD;接收数据缓冲区首址MDR入R1
RDN1:
LCALLRDBYT;读入一个字节到接收数据缓冲中
MOVR1,A
DJNZR3,ACK;N节读完否?
未完转ACK
LCALLMNACK;N个字节读完发送非应答位
LCALLSTOP;发送停止信号
RET;子程序完毕
ACK:
LCALLMACK;发送应答位
INCR1;指向下一个接收数据缓冲单元
SJMPRDN1;转读入下一个字节数据
;-----------------STA-----------------------
;*I2C总线典型信号的模拟子程序*;
;启动STA子程序
STA:
SETBVSDA
SETBVSCL
NOP
NOP
CLRVSDA
NOP
NOP
CL