您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > 实验六开机次数统计与独立式键盘显示控制设计实验
1实验六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;虚拟总线的时钟线2SLAEQU2BH;IIC字节读写的节点地址暂存单元//按键和LED定义SW_KBITP1.4;开机次数十位设置按键GW_KBITP1.5;开机次数个位设置按键SETUPBITP1.6;设置按键COUNTBITP1.7;定时计数按键LEDBITP1.0;设置指示灯//数码管位定义LEDSEGEQUP2SEG1BITP1.2;数码管的十位SEG2BITP1.3;数码管的个位SHIEQU60HGEWEIEQU61HTIMESEQU62HETIMESFBIT00H;确认键按键奇偶标志位T1SFBIT01H;定时1s标志位ORG0000HAJMPMAINORG000BHAJMPINTT0ORG0030HMAIN:MOVSP,#70H;堆栈地址ORLP1,#0F0H;设4个按键为输入口CLRLEDCLRETIMESF;初始默认确认键按下偶数次CLRT1SFMOVTMOD,#01HMOVTIMES,#20SETBEALCALLRDIIC;读出24C02在本次开机前的开机次数MOVA,MRDACALLH_BCDLOOP:LCALLDIS;调用显示子程序JBSETUP,M1LCALLSETUPTIMES;JNBSETUP,$M1:JBCOUNT,LOOPLCALLENTER3AJMPLOOP//M1:JBCOUNT,M2//LCALLENTER//AJMPLOOP//M2:CLRTR0//CLRET0//AJMPLOOP;T0中断服务程序INTT0:PUSHACCMOVTH0,#4CHMOVTL0,#00HDJNZTIMES,INTLMOVTIMES,#20MOVA,GEWEICJNEA,#9,INTL1MOVGEWEI,#00HMOVA,SHICJNEA,#9,INT2MOVSHI,#00HAJMPINT3INTL1:INCGEWEIAJMPINT3INT2:INCSHIINT3:SETBT1SFINTL:POPACCRETI;预置开机次数初值子程序SETUPTIMES:CLRTR0CLRET0SETBLEDJBSW_K,ST3;十位按键设置MOVA,SHICJNEA,#9,ST1MOVSHI,#00HAJMPST2ST1:INCSHIST2:JNBSW_K,$;等待按键松开ST3:JBGW_K,ST6;个位按键设置MOVA,GEWEI4CJNEA,#9,ST4MOVGEWEI,#00HAJMPST5ST4:INCGEWEIST5:JNBGW_K,$;等待按键松开ST6:RET;确认预置开机次数子程序ENTER:CPLETIMESF;JNBETIMESF,ENT1CLRLEDMOVA,SHI;保存预置值到EEPROM器件MOVB,#10MULABADDA,GEWEIMOVMRD,AMOVMTD,#00H;MTD/MTD1:EEPROM读写的首地址MOVMTD+1,MRDMOVSLA,#SLAWMOVNUMBYT,#2LCALLWRNBYTLCALLDEL5MSENT1:MOVTIMES,#20MOVTH0,#4CHMOVTL0,#00HSETBET0SETBTR0RET;显示子程序DIS:MOVDPTR,#DSEGS;数码管段表地址MOVA,SHIMOVCA,@A+DPTR;查表SETBSEG2CLRSEG1;选通数码管十位位显示MOVLEDSEG,A;送段显示;CLRSEG1;选通数码管十位位显示;SETBSEG2ACALLDL1MSMOVA,GEWEIMOVCA,@A+DPTR;查表SETBSEG15CLRSEG2;选通数码管个位位显示MOVLEDSEG,A;送段显示;SETBSEG1;CLRSEG2;选通数码管个位位显示ACALLDL1MSRET;共阴极数码管段显示值DSEGS:DB03FH,06H,05BH,04FH,066H,06DH,07DH,07H;0-7DB07FH,06FH,077H,07CH,039H,05EH,079H,071H,40H;8-F,-;延时1ms子程序DL1MS:MOVR7,#04HDL0:MOVR6,#125DL1:DJNZR6,DL1DJNZR7,DL0RET;-----------------H_BCD---------------------;单字节十六进制数转换为2位BCD码子程序;入口参数:AH_BCD:MOVB,#10;分离出十位和个位DIVABMOVSHI,AMOVGEWEI,BRET;-----------------WRIIC---------------------;送数到24C04的子程序WRIIC:MOVMTD,#00HMOVMTD+1,MRDMOVSLA,#SLAWMOVNUMBYT,#02H;再将它们发送到EEPROM中LCALLWRNBYTLCALLDEL5MS;延时等待EEPROM内部数据处理RET;-----------------RDIIC---------------------;读出24C04在本次开机前的开机次数子程序RDIIC:MOVMTD,#00H;MTD:EEPROM读写的首地址MOVSLA,#SLAWMOVNUMBYT,#1LCALLWRNBYTMOVSLA,#SLARMOVNUMBYT,#01H;从EEPROM的指定单元顺序读出1个数据6LCALLRDNBYT;并存放在以MRD(30H)为首地址的单元中;大于99的判断MOVA,MRDCJNEA,#99,RDI1AJMPRDI2RDI1:JCRDI3RDI2:MOVMRD,#00H;大于等于99则清0AJMPRDIENDRDI3:INCMRD;小于99则开机加1RDIEND:MOVMTD,#00H;MTD/MTD1:EEPROM读写的首地址MOVMTD+1,MRDMOVSLA,#SLAWMOVNUMBYT,#2LCALLWRNBYTLCALLDEL5MSRET;-----------------WRNBYT---------------------;*调用向被控器件发送N个字节数据WRNBYT子程序*;WRNBYT:MOVR3,NUMBYTLCALLSTA;启动I2C总线MOVA,SLA;发送SLAW字节LCALLWRBYTLCALLCACK;检查应答位JBF0,WRNBYT;非应答位则重发MOVR1,#MTDWRDA:MOVA,@R1LCALLWRBYTLCALLCACKJBF0,WRNBYTINCR1DJNZR3,WRDALCALLSTOPRET;-----------------RDNBYT--------------------;*调用通用N字节接收子程序RDNBYT*;RDNBYT:MOVR3,NUMBYTLCALLSTA;发送启动位MOVA,SLA;发送寻址字节(读)LCALLWRBYTLCALLCACK;检查应答位JBF0,RDNBYT;非正常应答时重新开始RDN:MOVR1,#MRD;接收数据缓冲区首址MDR入R1RDN1:LCALLRDBYT;读入一个字节到接收数据缓冲中MOV@R1,A7DJNZR3,ACK;N节读完否?未完转ACKLCALLMNACK;N个字节读完发送非应答位LCALLSTOP;发送停止信号RET;子程序结束ACK:LCALLMACK;发送应答位INCR1;指向下一个接收数据缓冲单元SJMPRDN1;转读入下一个字节数据;-----------------STA-----------------------;*I2C总线典型信号的模拟子程序*;;启动STA子程序STA:SETBVSDASETBVSCLNOPNOPCLRVSDANOPNOPCLRVSCLRET;-----------------STOP----------------------;*I2C总线典型信号的模拟子程序;停止(STOP)子程序STOP:CLRVSDASETBVSCLNOPNOPSETBVSDANOPNOPCLRVSDACLRVSCLRET;-----------------MACK----------------------;*I2C总线典型信号的模拟子程序*;;发送应答位MACK子程序MACK:CLRVSDASETBVSCLNOPNOPCLRVSCLSETBVSDARET;-----------------MNACK---------------------;发送非应答位MNACK子程序*;8MNACK:SETBVSDASETBVSCLNOPNOPCLRVSCLCLRVSDARET;-----------------CACK----------------------;I2C总线模拟的通用子程序*;CACK:SETBVSDA;置VSDA为输入方式SETBVSCL;使VSDA上数据有效CLRF0;预设F0=0MOVC,VSDA;输入VSDA引脚状态JNCCEND;检查VSDA状态,正常应答转CEND,且F0=0SETBF0;无正常应答,F0=1CEND:CLRVSCLRET;-----------------WRBYT---------------------;I2C总线模拟的通用子程序;发送一个字节数据(WRBYT)子程序;该子程序是向虚拟I2C总线的数据线VSDA上发送一个字节数据的操作。调用本子程序前将要发送的数据送入A中。占用资源:R0,C。WRBYT:MOVR0,#08H;8为数据长度送R0中WLP:RLCA;发送数据左移,使发送位入CJCWR1;判断发送1还是0,发送1转WR1AJMPWR00;发送0转WR0WLP1:DJNZR0,WLP;8位是否发送完,未完转WLPRET;8位发送完结束WR1:SETBVSDA;发送1程序段SETBVSCLNOP
本文标题:实验六开机次数统计与独立式键盘显示控制设计实验
链接地址:https://www.777doc.com/doc-2459331 .html