




已阅读5页,还剩46页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
MCS51单片机原理实验指导书付 浩 编淮阴师范学院 物理与电子电气工程学院2009.948目录实 验 要 求51单片机集成开发环境MedWin V2.39简介1. 安装32. 设置33. 使用4STC单片机下载软件STC-ISP的使用实验一 LED流水灯7一、实验目的7二、实验内容7三、实验电路连线7四、实验说明8五、思考题9实验二 用一位数码管循环显示数字09一、实验目的10二、实验内容10三、实验电路连线10四、实验说明11五、思考题13实验三 LED数码管的动态驱动一、实验目的14二、实验内容14三、实验电路连线14四、实验说明14五、思考题19实验四 用单片机自动演奏乐曲一、实验目的20二、实验内容20三、实验电路连线20四、实验说明20五、思考题23实验五 电子钟一、实验目的27二、实验内容27三、实验电路连线27四、实验说明27五、思考题31实验六 单片机与PC机的串行通信一、实验目的36二、实验内容36三、实验电路连线36四、实验说明36五、思考题42实验七 I2C串行flash存储器的读写一、实验目的43二、实验内容43三、实验电路连线43四、实验说明43五、思考题48实 验 要 求1、实验前预习实验内容,理解实验原理。2、按规定时间进入实验室,登记领取实验板和连接线,按操作程序将实验板连接到PC机上,开始实验。2、实验完毕请指导老师确认后,按操作程序拆除实验板,将连接线收拾好,与实验板一起归还指导老师,方可离开实验室。3、按时撰写并上交实验报告。实验报告格式为:(1)实验目的,(2)实验内容,(3)源代码及流程图,(4)结果记录及分析,(5)思考题,(6)体会及设想。注意:实验板与PC机连接时一定要先连接串行通信电缆,然后再将其电源线插入USB接口;拆除时先断开其电源,再断开串行通信电缆。否则极易损坏PC机的串口。最好先关闭微机电源,再连接或拆除实验板。实验板原理图51单片机集成开发环境MedWin V2.39简介1. 安装从网站免费下载MedWin V2.39集成开发环境安装程序压缩包,将其释放后,按照默认路径安装到C:ManleyPmedWin文件夹。2. 设置(1)每次启动MedWin会出现对话框,询问使用仿真器还是模拟仿真,应点击模拟仿真按钮。(2)设置仿真器 点击设置设置仿真器命令,选择时钟频率为12兆赫兹。(3)设置工作目录 MedWin 集成开发环境默认的工作目录为C:MedWinPMedWin,建议根据需要建立自己的工作目录。注意:不得使用长文件名或长目录名!(4)设置编译器 将C语言编译器C51(文件夹)拷贝到C:MedWin文件夹下,点击设置设置编译工具命令,打开“设置编译工具”对话框,使用汇编语言时选择第一行,使用C语言时选择第二行,如下图所示。3. 使用(1)新建项目 点击项目管理新建项目 命令,输入项目名称,点击确定按钮,出现“添加项目文件”对话框,输入源代码文件名,如T1.C(或T1.ASM),单击打开按钮,出现代码窗口,即可开始编程。(2)打开项目 点击项目管理打开项目 命令,点击项目文件名(项目文件后缀为.mpf),点击打开按钮,即可打开上次保存的项目。(3)编译 点击项目管理编译/汇编命令,启动编译器对源文件进行语法检查并编译,在消息窗口中显示编译结果。(3)模拟仿真 当源程序编译无误后,可进行模拟仿真调试。点击项目管理产生代码并装入命令,编译器对源程序进行重新编译并装入。这时,可使用调试菜单中的相关命令进行调试,如设置断点、单步及全速执行等。(4)生成目标代码 点击项目管理输出Binary文件命令,生成BIN文件,用下载工具将其下载到实验板的单片机中执行。STC单片机下载软件STC-ISP的使用该软件界面如下图所示:按照界面上的提示:第一步,设置单片机型号为STC89C52RC。第二步,点击Open File按钮,打开编译生成的BIN文件或HEX文件。第三步,选择串口,设置波特率。如:COM1,115200。第四步,可按默认值不用设置。第五步,下载程序。在进行第五步之前,一定要保持实验板的串行通信线及电源线与PC机连接良好,并且实验板的电源开关处于关闭状态,然后,点击下载按钮,再打开实验板电源开关,此时,软件将自动完成程序下载,下载完毕,实验板上的单片机立即开始运行。目前,MCS51内核单片机中STC89C5X(宏晶)和AT89S5X(ATMEL)两种芯片支持在线下载功能。实验一 LED流水灯一、实验目的1. 学习单片机并口的使用方法。2. 学习延时子程序的编写和使用。3. 学习集成开发环境MedWin的安装与使用。4. 学习STC单片机在线下载软件STC-ISP的使用。二、实验内容所谓流水灯就是8个发光二极管(LED)轮流点亮,周而复始。实验板上以P0口作输出口,经74LS244驱动,接8只发光二极管LED0-LED7。当单片机的引脚输出为低电平时发光二极管点亮,为高电平时息灭。编写程序,使8个发光二极管循环点亮,时间间隔约0.5秒。三、实验电路连线实验板上与本实验有关的硬件如下图所示。74LS244驱动输出串联8个限流电阻接8个LED发光管,以防止其电流过大而烧坏。单片机的主时钟为11.0592MHz。JMP0和JMP1都短接1-2脚。四、实验说明1、P0口作为通用接口时是一准双向口,它作为输出口时与一般的双向口使用方法相同。由准双向口结构可知当P0口用作输入口时必须先对它置“1”。若不先对它置“1”,读入的数据是不正确的。输出时需要接上拉电阻,P0口内部没有上拉电阻,若将外围电路设计为低有效,高无效,则无需再外接上拉电阻。2、编写一个软件延时子程序,延时时间约0.5秒,采用三重循环实现,汇编语言程序如下:DELAY: MOV R7, #198DEL1: MOV R6, #50DEL2: MOV R5, #23 DJNZ R5, $ DJNZ R6, DEL2 DJNZ R7, DEL1 RET查指令表可知执行MOV指令需用1个机器周期,DJNZ指令需用2个机器周期,在11.0592MHz晶振时,一个机器周期时间长度为1.085s,所以该段程序执行时间为:1(1223)501981.085s 500mS3、若使用C语言,可用for循环实现延时,下面的程序延时约500mS。void delay(void)int i,j; for(i=0;i1000;i+) for(j=0;j50;j+) _nop_(); _nop_();4、流水灯的主程序(汇编语言)为:ORG 0000HLJMP MAINORG 0100HMAIN:CLR P1.5; P1.5=0,关闭蜂鸣器。MOV A,#0FEHLOP:MOV P0,ALCALL DELAYRL ASJMP LOP END5、流水灯的C语言主程序为:#include #include #include void main (void)unsigned char a,c;P1=0xdf;/ P1.5=0,关闭蜂鸣器。a=0xfe;while (1)P0=a;c=a&0x80;a=a1;a=a|(c=0x80);delay();五、思考题1. 如何使点亮的LED从右往左移动?2. 如何使点亮的LED从两边往中间移动?实验二 用一位数码管循环显示数字09一、实验目的1. 学习单片机并口的使用方法。2. 学习延时子程序的编写和使用。3. 学习LED数码管的驱动、编码。二、实验内容实验板上有8个LED数码管,编写程序,使最右边的一个LED数码管循环显示09十个数字。时间间隔约0.5秒,其余LED数码管关闭。三、实验电路连线实验板上与本实验有关的硬件如下图所示。8个共阳的LED数码管(S0-S7)上同名的引脚连接在一起,由单片机P0口通过74HC244驱动(段控制),R12-R19为限流电阻。单片机P2口的8个引脚分别通过三极管Q0-Q7控制8个LED数码管的公共端(位控制)。单片机的主时钟为11.0592MHz。JMP0短接2-3脚,JMP1短接1-2脚。四、实验说明1、P0口和P2都是准双向口,输出时需要接上拉电阻。P0内部没有上拉电阻,P2口内部有弱上拉。2、下表为驱动LED数码管的段代码表,1-代表对应的笔段亮,0-代表对应的笔段不亮。若需要在最右边(S0)显示数字“5”,只要将从表中查得的段代码2CH写入P0口,再将P2.0置高,P2.1-P2.7置低即可。数字dpecgbfa十六进制P0.7P0.6P0.5P0.4P0.3P0.2P0.1P0.0共阴共阳010110111B74810001010014EB210101101AD523100111019D624000111101E64610111011BB4470001010115EA810111111BF409100111119F603、实现最右边的一个LED数码管循环显示09十个数字的C语言程序如下:#include #include #include #define uchar unsigned charconst uchar code tab=0x48,0xeb,0x52,0x62,0xe1,0x64,0x44,0xea,0x40,0x60;void delay(void)int i,j; for(i=0;i1000;i+) for(j=0;j50;j+) _nop_(); _nop_();void main(void)uchar i;P2=0x01;P1=0xdf;while(1)P0=tabi;delay();i+;if(i=10) i=0;4、实现最右边的一个LED数码管循环显示09十个数字的汇编语言程序如下:ORG 0000HLJMP MAINORG 0100HMAIN:MOV P1,#0DFHMOV P2,#01HMOV R1,#00HLOOP:MOV A,R1MOV DPTR,#TABMOVC A,A+DPTRMOV P0,ALCALL DELAYINC R1MOV A,R1CJNE A,#10,LOOPCLR AMOV R1,ASJMP LOOPDELAY:MOV R7,#198DEL1:MOV R6,#50DEL2:MOV R5,#23DJNZ R5,$DJNZ R6,DEL2DJNZ R7,DEL1RETTAB:DB 48H,0EBH,52H,62H,0E1H,64H,44H,0EAH,40H,60HEND五、思考题1. 分别写出 六个字母(用于显示十六进制数)的段代码,编写程序,在最右边数码管上实现0-F的循环显示。2. 能否交替点亮点8个LED数码管?实验三 LED数码管的动态驱动一、实验目的1. 学习LED数码管的动态驱动编程。2. 学习使用定时/计数器、中断。3学习汇编语言的有关运算。二、实验内容编写程序,使实验板上的8个LED数码管稳定显示8个不同的数字,并使这四位数从00000000开始,每0.5秒钟加1。三、实验电路连线本实验有关的硬件见实验二。四、实验说明1. 在实验二中,我们已经能够让某一个LED数码管显示需要的数字,比如选让第一个LED显示“1”,隔一较短的时间(如2.5毫秒)后关闭第一个LED,让第二个LED显示“2”,如此周而复始,让8个LED依次显1、2、3、4、5、6、7、8,我们就能看到8个LED上稳定地显示8个不同的数字。当然,每个瞬间只有一个LED被点亮,大家亮的时间相同,均为2.5毫秒,8个LED数码管点亮一遍需要20毫秒,一秒钟各亮50次,所以看上去不会有闪烁感,但亮度只是实验二中LED亮度的八分之一。要实现每隔再隔2.5毫秒变换一个LED,最好的方法是使用定时器中断。2. 汇编语言参考程序为:LED_PORTEQUP0;笔划输出,低有效SCN_PORTEQUP2;段扫描输出,低有效(P2.4-P2.7)DSEGORG10HDISP_BUF:DS8;显示缓冲区SCN_INX:DS1;扫描指针SCN_COD:DS1;扫描码CNT:DS1;中断计数,每2.5ms加1CSEGORG 00HLJMP MAIN;主程序入口,转初始化程序ORG 0BH;定时中断0入口LJMP INTP0;每2.5ms中断一次,用于刷新显示;-初-始-化-ORG 30HMAIN:MOVSP,#50H;初始化堆栈指针CLRRS0;选用第0组通用寄存器CLRRS1CLR P1.5CLRAMOVCNT,AMOV R1,#8MOV R0,#DISP_BUFLOOP1:MOV R0,A;显示缓冲区清零INC R0DJNZ R1,LOOP1MOVSCN_INX,A;扫描指针置0 MOV SCN_COD,#80H;右边LED先点亮 MOVTMOD,#01H;定时器0,方式1MOV TH0,#0F7H;计数初值,每次2.5ms(11.0592MHz晶振)MOV TL0,#000H;65536-(2.5ms/1.085us)=65536-2304=63232=0F700HSETB TR0;启动定时器0SETBEA ;中断总允许 SETBET0;允许定时器0中断SJMP$;主程序在此循环;-定时器0中断服务程序,间隔2.5ms-INTP0:PUSHACCPUSHPSWMOV TH0,#0F7H;置计数初值MOV TL0,#00HSETBRS0;选用第1组通用寄存器CLRRS1MOVA,SCN_INX;取扫描指针ANLA,#07H;清除高5位ADDA,#DISP_BUF;加显示缓冲区首地址MOVR1,AMOVA,R1MOVDPTR,#CODE_TAB;DPTR指向笔划代码表ANLA,#0FH MOVC A,A+DPTR;取笔划代码MOV LED_PORT,A;笔划代码送LED口MOVA,SCN_COD;取扫描段代码MOVP2,A MOVA,SCN_COD RR A;扫描段代码循环右移一位MOVSCN_COD,AINCSCN_INX;扫描指针+1INCCNTMOVA,CNTCJNE A,#200,ENMOVCNT,#0INCDISP_BUF+7;个位加一MOVA,DISP_BUF+7CJNE A,#10,EN;不进位转移MOVDISP_BUF+7,#0;进位则个位清零INCDISP_BUF+6;十位加一MOVA,DISP_BUF+6CJNE A,#10,ENMOVDISP_BUF+6,#0;进位则十位清零INCDISP_BUF+5;百位加一MOVA,DISP_BUF+5CJNE A,#10,ENMOVDISP_BUF+5,#0;进位则百位清零INCDISP_BUF+4;千位加一MOVA,DISP_BUF+4CJNE A,#10,ENMOVDISP_BUF+4,#0;进位则千位清零INCDISP_BUF+3;万位加一MOVA,DISP_BUF+3CJNE A,#10,ENMOVDISP_BUF+3,#0;进位则万位清零INCDISP_BUF+2;十万位加一MOVA,DISP_BUF+2CJNE A,#10,ENMOVDISP_BUF+2,#0;进位则十万位清零INCDISP_BUF+1;百万位加一MOVA,DISP_BUF+1CJNE A,#10,ENMOVDISP_BUF+1,#0;进位则百万位清零INCDISP_BUF+0;千万位加一MOVA,DISP_BUF+0CJNE A,#10,ENMOVDISP_BUF+0,#0;进位则千万位清零EN:POPPSWPOPACCRETI;-笔划代码表-CODE_TAB:DB48H,0EBH,52H,62H,0E1H,64H,44H,0EAH,40H,60HEND3. C语言参考程序为:#include #define uchar unsigned charconst uchar code tab1=0x48,0xeb,0x52,0x62,0xe1,0x64,0x44,0xea,0x40,0x60;const uchar code tab2=0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01;uchar buf8=0,0,0,0,0,0,0,0;/显示缓冲区,开机先显示00000000void main(void) P1=0xdf;EA= 1; /允许中断TMOD=0x01;/设定时器0为模式1(16位)ET0=1; /定时器0中断允许TH0=0xf7;/晶振11.0592MHz,2.5ms TL0=0;TR0=1;/开始计数while(1); /死循环,等待中断 void timeint(void) interrupt 1 /定时器0中断服务程序static uchar k,count;char i;TH0=0xf7;/设置定时器时间常数TL0=0; k+;k&=0x07;P0=tab1bufk;/笔划代码送P0口P2=tab2k;/控制扫描码送P2口if(+count=200)/ 计数200次为2.5ms X 200=0.5scount=0;/到0.5秒钟,显示的数字加一for(i=7;i=0;i-) bufi+; if(bufi=10) bufi=0;/加到10向前进位 else break;五、思考题如何让8个LED数码管从00-00-00开始,每秒钟自动加1,前两位代表时,中间两位代表分,后两位代表秒?实验四 用单片机自动演奏乐曲一、实验目的(1)进一步熟悉89C51定时器/计数器的功能及应用;(2)掌握其初始化与中断服务程序的编程方法;(3)掌握用定时器/计数器发出不同音调的编程方法。二、实验内容用单片机的定时器/计数器0作定时器使用,工作于模式1,中断产生方波发声,根据各个的频率,计算对应的定时时间常数,定时器中断后按此常数赋初值,从而发出对应的音调。将歌曲的音调和节拍编成一个表,用音调作为定时器的初值,用节拍控制发音时间, 就可以实现自动演奏。三、实验电路连线本实验有关的硬件如右图所示。四、实验说明声单定时初值常数计算方法:根据下表的音阶频率,计算对应的音阶周期T,用T/2计算定时周期数(晶振11.0592MHz),填入下表中。定时器的计数初值为65536定时周期数,在程序计算产生。定时周期数增加1倍,音阶降低八度,定时周期数降低1倍,音阶升高八度。音阶(C调)1234567频率(Hz)256288320341384427480周期(s)3906347231252932260423422083定时周期数3600320028802702240021581920自动演奏东方红乐曲的C语言程序为:#include #define uchar unsigned char#define uint unsigned intsbit P15=P15;code uint cyc=3600,3200,2880,2702,2400,2158,1920;/音阶1-7对应的计数周期数code uchar tone=15,15,16,12,11,11,06,12,15,15,16,21,16,15,11,11, 06,12,15,12,11, 7, 6, 5,15,12,13,12,11,11, 6,12, 13,12,11,12,11, 7, 6, 5, 0;/乐曲东方红的简谱表code uchar time= 8, 4, 4,16, 8, 4, 4,16, 8, 8, 4, 4, 4, 4, 8, 4, 4,16, 8, 8, 8, 4, 4, 8, 8, 8, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,16, 0;/节拍表(8为1拍,约570mS)uchar H0,L0,cnt;void cntint0(void) interrupt 1 /定时器0中断用于产生音调TH0=H0;TL0=L0;P15=P15; /P1.5是音乐信号输出脚void cntint1(void) interrupt 3 /定时器1中断用于产生节拍cnt+;/定时器的计数初值为0,所以不用赋值void main(void)uchar i,a,t;uint b;next:TMOD=0x11;EA=1;ET0=1;ET1=1;cnt=0;TR1=1;i=0;while(1)t=tonei;/读音调if(t=0) break;/是0,则结束b=cyct%10-1;if(t20) b=b/2; b=b/2;H0=(65536-b)/256;L0=(65536-b)%256;cnt=0;a=timei;/读节拍if(a!=255) TR0=1;/255是休止符while(acnt);TR0=0;i+;for(b=0;b1000;b+);P15=1;/关闭喇叭goto next;/重放一遍五、思考题 参考东方红乐曲的演奏程序,编写康定情歌乐曲的演奏程序。康定情歌的乐谱如下:康定情歌13,15,16,16,15,16,13,12,12, 13,15,16,16,15,16, 13, 13, 13,15,16,16,15,8, 8, 8, 4, 4, 8, 8,12, 4, 8, 8, 8, 4, 4, 8, 16, 8, 8, 8, 8, 4, 4,16, 13, 12, 12, 15,13,12,13,12,11, 12, 6, 6, 12,8, 8, 12, 4, 8, 8, 4, 4, 4, 4, 8, 24, 8, 24,15,13, 12, 6, 16,15,13,12,13,12,11,12, 6, 5, 68,24, 8,16, 8, 8, 8, 4, 4, 4, 4, 8,16, 8, 32附:自动演奏乐曲八月桂花启遍地开的汇编语言参考程序。ORG 0000HLJMP STARTORG 000BHINC 20H ;中断服务,中断计数器加1MOV TH0,#0DCHMOV TL0,#00H ;11.0592MHz晶振,形成10毫秒中断RETISTART: MOV SP,#50HMOV TH0,#0DCHMOV TL0,#00HMOV TMOD,#01HMOV IE,#82HMUSIC0:NOPMOV DPTR,#DAT ;表头地址送DPTRMOV 20H,#00H ;中断计数器清0MUSIC1:NOPCLR A ;ACC清零MOVC A,A+DPTR ;查表取代码JZ END0;是00H,则结束CJNE A,#0FFH,MUSIC5;如果是休止符,往下执行LJMP MUSIC3MUSIC5:NOPMOV R6,A ;R6=18H音符的频率INC DPTR ;DPTR加一MOV A,#0MOVC A,A+DPTR ;取节拍代码送R7MOV R7,A ;R7=30H音符发音的时间SETB TR0 ;启动计数 MUSIC2:NOPCPL P1.5 ;P1.5是音乐输出引脚MOV A,R6MOV R3,A ;R3=R6=18HLCALL DELMOV A,R7CJNE A,20H,MUSIC2 ;中断计数器(20H)=R7否? ;不等,则继续循环MOV 20H,#00H ;等于,则取下一代码INC DPTRLJMP MUSIC1MUSIC3:NOP;休止100毫秒CLR TR0 MOV R2,#0DH ;R2=13MUSIC4:NOPMOV R3,#0FFH ;R3=255LCALL DELDJNZ R2,MUSIC4INC DPTRLJMP MUSIC1END0:NOPMOV R2,#0FFH ;歌曲结束,延时1秒后继续MUSIC6:MOV R3,#00HLCALL DELDJNZ R2,MUSIC6LJMP MUSIC0DEL:NOPDEL3: MOV R4,#02HDEL4: NOPDJNZ R4,DEL4NOPDJNZ R3,DEL3RETDAT: DB 18H,30H,1CH,10H,20H,40H,1CH,10H,18H,10H,20H,10H,1CH,10H,18H,40HDB 1CH,20H,20H,20H,1CH,20H,18H,20H,20H,80H,0FFH,20H,30H,1CH,10H,18HDB 20H,15H,20H,1CH,20H,20H,20H,26H,40H,20H,20H,2BH,20H,26H,20H,20HDB 20H,30H,80H,0FFH,20H,20H,1CH,10H,18H,10H,20H,20H,26H,20H,2BH,20HDB 30H,20H,2BH,40H,20H,20H,1CH,10H,18H,10H,20H,20H,26H,20H,2BH,20HDB 30H,20H,2BH,40H,20H,30H,1CH,10H,18H,20H,15H,20H,1CH,20H,20H,20HDB 26H,40H,20H,20H,2BH,20H,26H,20H,20H,20H,30H,80H,20H,30H,1CH,10HDB 20H,10H,1CH,10H,20H,20H,26H,20H,2BH,20H,30H,20H,2BH,40H,20H,15HDB 1FH,05H,20H,10H,1CH,10H,20H,20H,26H,20H,2BH,20H,30H,20H,2BH,40HDB 20H,30H,1CH,10H,18H,20H,15H,20H,1CH,20H,20H,20H,26H,40H,20H,20HDB 2BH,20H,26H,20H,20H,20H,30H,30H,20H,30H,1CH,10H,18H,40H,1CH,20HDB 20H,20H,26H,40H,13H,60H,18H,20H,15H,40H,13H,40H,18H,80H,00HEND实验五 电子钟一、实验目的1. 学习使用定时/计数器。2. 学习独立式按键的查询识别方法。3. 学习实用程序的编程技巧。二、实验内容在实验板上编写程序,实验电子钟功能。时间显示格式为HH-MM-SS,用按键可以调整当前时间,具有整点提示功能。三、实验电路连线本实验有关显示部分的硬件见实验二,按键连接见下图。四、实验说明该电子钟在上电或复位后时间从13时59分50秒开始,若要使电子钟断电后照常行走,应采取电池供电。为了降低使用成本及减小体积,可采用两节5号电池,其满电量时电压为3伏,89C51单片机的正常工作电压范围为4.55.5伏,无法使用,可选用89C2051单片机(电压范围2.76伏),最好使用工作电压更低的单片机(如1.8伏)。为了延长电池使用寿命,必须采取一些节电措施,如将LED换成液晶、让单片机不工作时进入休眠方式、适当降低单片机的时钟频率等。电子钟C语言参考程序如下:(含按键检测、调整时间、整点提示功能)#include #include #include typedef unsigned char uchar;typedef unsigned int uint;typedef unsigned long ulong;#define K0 0x01#define K1 0x02#define K2 0x04#define K3 0x08uchar sec=50,min=59, hour=13;uchar key_new;uint count;uint delay_time;bit key_on, key_again;bit NewTime=0; sbit P15=P15;void keyscan();void delay(uint t);void main()P1=0xdf;TMOD=0x01;TH0=(65536-2304)/256;/设置定时器初值,2.5ms中断一次TL0=(65536-2304)%256;TR0=1;ET0=1; EA=1;while(1)if(key_on)key_on=0;switch(key_new)case K0: sec=0; min+; min%=60; count=0; break;case K1: sec=0; hour+;hour%=24;count=0; break;case K2: sec=0; hour=0;min=0; count=0; break;case K3: sec=0; hour=23;min=59; count=0; break;if(NewTime=1)NewTime=0;if(min=59)&(sec=55)P15=1; delay(80); P15=0; else if(min=0)&(sec=0)P15=1; delay(250); P15=0; /=void keyscan()uchar data key_temp;static uchar data keylong;key_temp=(P1)&0x0f;if(key_temp=0) key_new=key_temp; keylong=0; key_on=0; key_again=0; else if(key_new!=key_temp) key_new=key_temp;key_on=0; key_again=0; keylong=1;else if(keylong200) key_on=0; key_again=1; keylong=170;else keylong+;/=void timer_0(void) interrupt 1code uchar TAB1=0x48,0xeb,0x52,0x62,0xe1,0x64,0x44,0xea,0x40,0x60;code uchar TAB2=0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01;static uchar dsp8;static uchar n;TH0=(65536-2304)/256;/设置定时器初值,2.5ms中断一次TL0=(65536-2304)%256;delay_time+;if(+count=400)+sec; count=0; NewTime=1;if(sec=60)+min;sec=0;if(min=60)+hour;min=0; if(hour=24)hour=0;dsp0=TAB1hour/10;dsp1=TAB1hour%10;dsp2=0xf7;dsp3=TAB1min/10;dsp4=TAB1min%10;dsp5=0xf7;dsp6=TAB1sec/10;dsp7=TAB1sec%10;n+; n%=8;P0=dspn; P2=TAB2n;if(count%10)=0) keyscan();/=void delay(uint t)EA = 0;delay_time = 0;EA = 1;while(delay_timet);五、思考题1. 给电子钟加上打铃的功能,打铃时间固定。2. 给电子钟加上打铃时间调节功能。如何实现多点(4个)打铃功能?附:电子钟汇编参考程序,不含按键检测和整点提示功能。LED_PORTEQUP0;笔划输出,低有效SCN_PORTEQUP2;段扫描输出,低有效(P2.4-P2.7)DSEGORG10HDISP_BUF:DS8;显示缓冲区SCN_INX:DS1;扫描指针SCN_COD:DS1;扫描码CNT:DS2;中断计数,每2.5ms加1CSEGORG 00HLJMP MAIN;主程序入口,转初始化程序ORG 0BH;定时中断0入口LJMP INTP0;每2.5ms中断一次,用于刷新显示;-初-始-化-ORG 30HMAIN:MOVSP,#50H;初始化堆栈指针CLRRS0;选用第0组通用寄存器CLRRS1CLR P1.5CLRAMOVCNT+0,AMOVCNT+1,AMOVDISP_BUF+0,#2;时十位MOVDISP_BUF+1,#3;时个位MOVDISP_BUF+2,#10;显示-MOVDISP_BUF+3,#5;分十位MOVDISP_BUF+4,#8;分个位MOVDISP_BUF+5,#10;显示-MOVDISP_BUF+6,#0;秒十位MOVDISP_BUF+7,#0;秒个位MOVSCN_INX,A;扫描指针置0 MOV SCN_COD,#80H;右边LED先点亮 MOVTMOD,#01H;定时器0,方式1MOV TH0,#0F7H;计数初值,每次2.5ms(11.0592MHz晶振)MOV TL0,#000H;65536-(2.5ms/1.085us)=65536-2304=63232=0F700HSETB TR0;启动定时器0SETBEA ;中断总允许 SETBET0;允许定时器0中断SJMP$;主程序在此循环;-定时器0中断服务程序,间隔2.5ms-INTP0:PUSHACCPUSHPSWMOV TH0,#0F7H;置计数初值MOV TL0,#00HSETBRS0;选用第1组通用寄存器CLRRS1MOVA,SCN_INX;取扫描指针ANLA,#07H;清除高5位ADDA,#DISP_BUF;加显示缓冲区首地址MOVR1,AMOVA,R1MOVDPTR,#CODE_TAB;DPTR指向笔划代码表ANLA,#0FH MOVC A,A+DPTR;取笔划代码MOV LED_PORT,A;笔划代码送LED口MOVA,SCN_COD;取扫描段代码MOVP2,A MOVA,SCN_COD RR A;扫描段代码循环右移一位MOVSCN_COD,A
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025聘请艺术顾问合同范本
- 企业级跨境电商安全管理服务协议
- 房地产经纪代理销售合作协议
- 浙江国企招聘2025温州平阳县城发集团下属房开公司招聘5人笔试参考题库附带答案详解
- 宜宾五粮液股份有限公司2025年上半年社会招聘(11人)笔试参考题库附带答案详解
- 2025湖南兴湘科技创新公司招聘6人笔试参考题库附带答案详解
- 2025河南许昌烟机公司招聘30人笔试参考题库附带答案详解
- 2025江苏苏州日创包装材料有限公司紧急招聘3人笔试参考题库附带答案详解
- 2025四川雅安市宝兴县兴绿林业投资有限公司招聘6人笔试参考题库附带答案详解
- 音乐教育考研试题及答案
- (三模)温州市2025届高三第三次适应性考试语文试卷
- 《危险化学品企业安全生产标准化规范》专业深度解读与应用培训指导材料之5:5管理要求-5.5 安全风险管理和双重预防机制建设(雷泽佳编制-2025A0)
- 铁塔施工安装技术方案
- 2025陕西烟草专卖局招聘42人易考易错模拟试题(共500题)试卷后附参考答案
- 矿山水灾事故处理
- 2024年烟台栖霞市考选毕业生考试真题
- 2025北京九年级(上)期末语文汇编:现代文阅读2
- 光谱分析在大气污染物成分识别中的应用研究
- 2025年高中生物学业水平考试知识点归纳总结(复习必背)
- 2025-2030中国晶圆转移机器人末端执行器行业市场发展趋势与前景展望战略研究报告
- 2025年经济学基础知识试题及答案
评论
0/150
提交评论