山东大学单片机实验 (实验7)
- 格式:doc
- 大小:290.00 KB
- 文档页数:8
单片机原理-答案一、问答题1、利用MSC1211或8051设计应答方式下的多机通讯程序。
通讯参数:晶振为11.0592MHz,9600,n,8,1。
通讯过程如下:主机首先发送从机地址,从机收到地址后进行比较,如果地址相符,则将从机地址回发给主机作为应答信号。
主机收到从机的地址应答信号后,将内存单元中的120个数据发送给从机,并进行数据块校验(将各个数据进行异或),若校验正确,则从机发送00H给主机,否则发送0FFH给主机,主机重新发送数据。
(应在适当的地方加程序注释)解:主机程序如下:ORG 0000HLJMP MAINT ;跳至主程序入口地址ORG 0023H ;串行口中断服务程序入口LJMP INTSTMAINT:MOV SCON,#90H ;置工作方式2,并允许接收MOV TMOD,#20H ;置T1工作方式2MOV TH1,#0FDHMOV TL1,#0FDHMOV DPTR,#ADDR ;设置数据块首址ADDR的地址指针MOV R0,#120 ;设置发送字节数MOV R1,#00H ;设置校验和的初值MOV R2,#NAMESETB TB8 ;置位TB8位,作为发送地址桢信息特征SETB TR1SETB EA ;CPU开中断SETB ES ;允许串行口中断MOV A,R2 ;发送地址桢信息MOV SBUF,ASJMP $;中断服务程序INTST:MOV A,TB8 ;判断是发送地址还是数据,若为数据则转LOOP0CJNE A,01H,LOOP0CLR TI ;地址桢信息发送完后清发送中断LOOP0:JB RI,LOOP1 ;检查是否是接受中断?若RI=1则转入接受乙机发送应答信息CLR TI ;因RI=0,表明是甲机发送中断数据的中断请求。
CPU响应中断,在中断服务程序中应清中断标志MOV A,TB8;CJNE A,#01H,LOO3 ;若为发送数据中断则转LOOP3继续发送数据LJMP ENDT ;甲机发送一数据完毕跳至中断返回程序LOOP1:CLR RI ;清接受中断标志MOV A,TB8 ;判断是发送地址还是数据,若为数据则转LOOP2CJNE A,#01H,LOOP4;若TB8为0则接受的为乙机数据校验应答MOV A,SBUF ;取乙机的应答数据CJNE A,@R2,LOOP2 ;若乙机应答信息不是从机地址,则地址传送不正确,则转LOOP2程序重新发送地址信息,否则清TB8,发送数据CLR TB8LOOP3:MOVX A,@DPTR ;取下一个数MOV SBUF,A ;启动串行口,发送新的数据XRL A,@R1MOV @R1,AINC DPTR ;修改地址指针DEC R0 ;修改发送字节数记数值CJNE R0,#00H,ENDT ;判别120个字节数据都发送完没有。
单片机实验报告孙洪悦2011实验1:汇编程序实验1自我完成实验(1)实验内容将片内RAM 30H 单元中的8 位二进制数转换成10 进制数。
希望转换后的结果保存于31H和32H,31H 低 4 位存放个位,高 4 位存放十位,32H 低 4 位存放百位,高 4 位为0自我完成实验程序ORG 0000H!AJMP MAINORG 0030HMAIN:MOV SP,#62H ;MOV 30H,#0AFH ;先将30H写上100MOV R0,#32H ;将百位地址送R0MOV A,30H ;这句写错了,应该是将30H的内容送给A,而不是30H,我误写成了#30HMOV B,#64H ;除数为100DIV AB ;AB相除…MOV @R0,A ;将百位的数送给32H地址MOV A,B ;将余数送给AMOV B,#0AH ;将10送BDIV AB ;AB相除SWAP A ;高低四位交换DEC R0 ;R0减1 到31HMOV @R0,A ;将十位送31H的高四位MOV A,BANL A,#0FHORL 31H,A ;31高低四位分别存十和百位~SJMP $END总结与提高:本程序用了一个小算法,一个三位数数X除以100,商a为百位,余数为:X-100*a 再用此余数除10,商为十位,余数为个位。
实验2:汇编程序实验2自我完成实验(1)实验内容:将片内RAM 30H 开始的32 个单元中分布着随机的有符号8 位二进制数,请按从小到大的顺序进行排序,排序后的数据仍然保存到30H 开始的32 个单元中(低地址存放小数据)。
程序及其注释②自我完成实验程序第一种排序方法:ORG 0000HAJMP MAINORG 0090H:MAIN:MOV SP,#62H ;MOV A,#0HMOV R1,#30HMOV R7,#20HMOV DPTR,#TABLEMOV R0,#1FH ;执行31次LOOP1:MOVC A,@A+DPTR}MOV @R1,AINC R1INC DPTRMOV A,#0HDJNZ R7,LOOP1 ;执行32次循环,在30-4F写表格数据LOOP2: MOV R1,#30H ;将起始地址给R1MOV A,R0 ;R0为执行31次MOV R2,A ;把进行一次冒泡的次数存到R2中|LOOP3:CLR C ;清CMOV A,@R1 ;;比较开始,取第一个数MOV R3,A ; 腾出累加器INC R1 ;指向下一个地址SUBB A,@R1 ;取后一个数,并与前一个数相减,看是否有CY位溢出,溢出则说明前一个数小,要换位JC LOOP4 ;前一个数小的情况下,两个数交换位置,否则,继续执行MOV A,R3 ;把后一个数存到累加器下XCH A,@R1 ;累加器的数与R1指向的数交换位置,即;前一个数和后一个数交【DEC R1 ;R1自减,准备将后面的数存到前面MOV @R1,A ;将后面的数存到前面INC R1 ;R1自增,准备下次转换,以上五行为交换LOOP4: DJNZ R2,LOOP3 ;R2自减,为下次冒泡准备DJNZ R0,LOOP2 ;跳回去进行下一轮冒泡SJMP $·ORG 30HTABLE: DB 1,3,9,2,17,4,11,6DB 5,20,100,64,21,14,79,35DB 92,7,91,23,65,16,13,18DB 18,73,65,101,27,19,62,69END第二种排序方法;!ORG 0000HAJMP MAINORG 0090HMAIN:MOV SP,#62H ;MOV A,#0HMOV R1,#30HMOV R7,#20HMOV DPTR,#TABLEMOV R0,#1FH ;执行31次(LOOP1:MOVC A,@A+DPTRMOV @R1,AINC R1INC DPTRMOV A,#0HDJNZ R7,LOOP1 ;执行32次循环,在30-4F写表格数据…LOOP2: MOV R1,#30H ;将起始地址给R1MOV A,R0 ;R0为执行31次MOV R2,A ;把进行一次冒泡的次数存到R2中MOV R4,#30H ;R4存的是最大数的位置LOOP3:CLR C ;清CMOV A,@R1 ;;比较开始,取第一个数MOV R3,A ; 腾出累加器INC R1 ;指向下一个地址、MOV A,@R4SUBB A,@R1 ;取后一个数,并与前一个数相减,看是否有CY位溢出,溢出则说明前一个数小,要换位JC LOOP4 ;前一个数小的情况下,两个数交换位置,否则,继续执行;MOV A,R3 ;把后一个数存到累加器下;XCH A,@R1 ;累加器的数与R1指向的数交换位置,即;前一个数和后一个数交;DEC R1 ;R1自减,准备将后面的数存到前面;MOV @R1,A ;将后面的数存到前面;INC R1 ;R1自增,准备下次转换,以上五行为交换>DJNZ R2,LOOP3 ;R2自减,为下次冒泡准备LOOP4:MOV A,R1 ;MOV R4,ADJNZ R2,LOOP3DJNZ R0,LOOP2 ;跳回去进行下一轮冒泡SJMP $#ORG 30HTABLE: DB 1,3,9,2,17,4,11,6DB 5,20,100,64,21,14,79,35DB 92,7,91,23,65,16,13,18DB 18,73,65,101,27,19,62,69END.总结与提高:所谓冒泡法,有两种理解方式:1.相邻的两个数比较,大的数放后一个位置,直到一轮循环后,最后一个数为此轮遍历的最大的数。
《MCS51单片机原理及应用》实验指导书唐山学院电工电子实验教学中心年月前言一.单片机原理实验的任务单片机原理实验是单片机原理及应用课程的一部分,它的任务是:1.通过实验进一步了解和掌握单片机原理的基本概念、单片机应用系统的硬件设计及调试方法。
2.学习和掌握单片机应用系统程序设计技术。
3.提高应用计算机的能力及水平,提高逻辑思维及动手能力。
二.实验设备单片机实验所使用的设备由计算机、单片机实验开发系统(见下图0-1),其中计算机是软件开发平台,主要完成程序编辑、编译、下载程序等任务;单片机实验开发系统是硬件开发平台,是基于51/196单片机的扩展实验系统。
计算机和单片机实验开发系统之间是通过RS232串行接口进行通信的。
图0-1 单片机原理实验设备单片机实验开发系统配有开关电源、单片机、晶振、存储器、可编程并行接口芯片、键盘显示控制芯片、24键键盘、六位LED数码管显示、A/D及D/A转换芯片、简单输出口2个、简单输入口1个、逻辑电平输入开关、发光二极管显示电路,并配有小直流电机、步进电机、继电器、音响等驱动电路。
在计算机软件的控制下可完成单片机基本实验及综合设计性实验项目。
所有的MCS51单片机原理及应用课程实验都是在这套实验系统上完成的。
三.对参加实验学生的要求1.阅读实验指导书,复习与实验有关的理论知识,明确实验目的,了解内容和方法。
2.按实验指导书要求进行接线和操作,经检查和指导老师同意后再通电。
3.在实验中注意观察思考,记录有关数据和程序,并由指导教师复查后才能结束实验。
4.实验后应断电并返回WINDOWS下关闭计算机,整理实验台,恢复到实验前的情况。
5.认真写实验报告,按规定格式写出程序流程图、程序、并分析实验结果、完成思考题等。
字迹要清楚,结论要明确。
爱护实验设备,遵守实验室纪律。
*注:本实验指导书适用于MCS51单片机原理及应用A、单片机原理及应用B等课程。
目录第一章MC51单片机原理及应用实验 (3)实验一P1口实验(验证性) (3)实验二外部中断实验(验证性) (5)实验三定时器实验 (7)实验四串行口实验--串并转换实验 (9)实验五数码显示实验 (11)实验六A/D转换实验 (13)实验七数字电子钟实验(综合性) (15)实验八D/A转换实验 (16)实验九简单I/O口扩展实验 (18)实验十步进电机实验 (20)实验十一直流电机实验 (22)实验十二PC机与单片机串行通信实验 (24)实验十三继电器与电子音响实验 (26)实验十四8255可编程并行接口实验 (28)实验十五键盘显示接口实验 (30)第二章单片机开发实验系统及TMSD调试程序 (32)第一节单片机开发实验系统 (32)第二节TMSD源语言调试程序简介 (35)第一章MCS51单片机原理及应用实验实验一P1口实验一.实验目的1.学习P1口的使用方法。
此文档免费建议下载后再复制代码,百度文库直接复制格式会出错。
学弟学妹们,这是山东大学单片机keil和proteus实验的实验报告(2018年),包含代码,程序框图和proteus原理图硬件实验中报告中代码全部能用,想省事直接复制黏贴即可。
1.如果c语言报错,看下是不是{ } ;// 这三种符号漏掉了{} 在for语句中有些可能复制的时候把这个符号漏掉了如果报错可以试试加上一个这个;在语句结尾处报错时使用// 某些注释或者分割的*********** 可能//复制时会掉需要在前面加上//才能不报错2.proteus在win10系统中必须用proteus8 ,proteus7全不能用。
使用proteus8时必须右键管理员身份运行,否则会提示运行库缺失。
3.此外我这里有已经做好的文件打包分享在网盘里,需要自取。
链接: https:///s/1vTIwya0-kFXyWV9quf8Hfw 密码: 2au6其中Uv2是keil的程序,已生成hex文件可直接使用。
Pdsprj是原理图,在proteus中打开即可(先用2的方法打开proteus,然后再用proteus打开)Ps:传承,分享是中华美德,如果觉得很实用用请传给下一届。
2.2汇编程序实验2(1)实验内容将片内RAM 30H开始的32个单元中分布着随机的有符号8位二进制数,请按从小到大的顺序进行排序,排序后的数据仍然保存到30H开始的32个单元中(低地址存放小数据)。
编程思路:首先,在程序存储器中构建一个表格,该表格具有32个随机产生的8位二进制数,如:TABLE: DB 1,3,9,2,17,4,11,6DB 5,20,100,64,21,14,79,35DB 92,7,91,23,65,16,13,18DB 18,73,65,101,27,19,62,69然后利用查表指令“MOVC A,@A+DPTR”将它们读取到30H-4FH单元中,然后再利用“冒泡法排序法”将它们排序即可。
1、将(R2)和(R4)中的十六进制数相乘,结果存放在3AH(低字节)和3BH (高字节)单元中。
MOV A,R2MOV B,R4MUL ABMOV 3AH,AMOV 3BH,B2、编写程序,把累加器A 中的二进制数变换成3位BCD码,并将百、十、个位数分别存放在内部RAM的30H、31H、32H中。
MOV B, #100DIV ABMOV 30H, AMOV A, #10XCH A, BDIV ABMOV 51H,AMOV 52H,B3、试编写程序,将R3中的低4位数与R4中的高4位数合并成一个8位数,并将其存放回R5中。
一法:MOV A,R3ANL A,#OFHMOV R5,AMOV A,R4ANL A,#FOHORL A,R5MOV R5,A二法:MOV A,R3MOV @R0,AMOV A,R4XCHD A,@R0MOV R5,A4、试编写程序,将外部RAM 中1234H开始的16个单元的十六进制数存入内部RAM 30H到3FH单元中。
MOV DPTR,#1234HMOV R0,#30HLOOP:MOVX A,@DPTR MOV @RO,AINC DPTRINC ROCJNE R0,#40H,LOOP ;如果R0和立即数40H不相等则继续进行循环,相等跳出5、已知被加数存在(R2)(R3)中,加数存在(R4)(R5)中,高位在前;试编两字节加法程序,将相加之和存放在30H(低位)、31H(高位)和32H(进位)中单元中。
MOV A,R3ADD A,R5MOV 30H,AMOV A,R2ADDC A,R4MOV 31H,ACLR AADDC A,#00HMOV 32H,A实验一:编写一套完整的汇编语言程序:将(R2R3)和(R4R5)中的双字节无符号数相加,结果存放在40H、41H和42H单元中。
并生成main.lst文件和top.hex,假设:(R2)=12H,(R3)=34H,(R4) =56H,(R5)=78HOrg 0000hLjmp mainOrg 100h Main: mov r2,#12hMov r3,#34hMov r4,#56hMov r5,#78hmov a,r3Add a,r5Mov 42h,aMov a,r2Addc a,r4Mov 41h,aMov a,#00hAddc a,#00hMov 40h,aend1.应用MOVC A,@A+DPTR指令求累加器A 的平方值Y(设Y<=15),并把结果送至R7中保存。
单片机实验报告学号:100250212姓名:指导教师:实验二一、 实验目的1 、 进一步了解开发系统的功能和使用;2 、 了解程序设计与调试的基本过程;3 、 了解简单程序和分支程序程序的特点和设计。
二、 实验内容1 、 简单程序的设计、输入、调试和运行;2 、 分支程序的设计、输入、调试和运行;三、 实验步骤1、设计、调试双字节乘法程序,功能为:(R2R3)*(R6R7)→R4R5R6R7 输入设计好的程序检查无误后,汇编。
向R2R3和R6R7中输入多组不同的数据,运行程序,观察R4R5R6R7中的内容,分析运行结果是否正确。
2、求符号函数⎪⎩⎪⎨⎧<=>=)0()0()0(1-01X X X Y ,设:X →30H ,Y →31H 输入设计好的程序检查无误后,汇编。
向30H 中输入多个不同的数据,运行程序,观察31H 中的内容,分析运行结果是否正确。
3、将ASCII 码转换十六进制数设ASCII码放在累加器A中,结果放回到A中,如果A中的内容不是十六进制的数的ASCII码,用户标志位F0置1。
输入设计好的程序检查无误后,汇编。
向A中输入多个不同的数据,运行程序,观察A中的内容,分析运行结果是否正确。
四、实验程序及分析结果1、双字节乘法运算程序程序如下:ORG 0000HLJMP MAINMAIN: MOV A, R3 ;先计算R7乘R3MOV B, R7MUL AB ;A中为积的低八位MOV R1,A ;将低八位存入R1中MOV R5,B ;将高八位存入R5中MOV A, R2 ;计算R7乘R2MOV B, R7MUL ABADD A, R5 ;R5加至AMOV R5, A ;将结果存入R5MOV R4, B ;将高位结果存入R4MOV A, R1MOV R7, A ;将低八位存入R7中JNC NEXT1 ;C为零则跳转MOV A, R4 ;如果C为1则将R4加一CLR CADD A, #01MOV R4, ANEXT1: MOV A, R3MOV B, R6MUL ABADD A, R5MOV R5, AMOV R1,BMOV A, R4JNC NEXT2CLR CADD A, #1NEXT2: ADD A, R1MOV R4, AMOV A, R2MOV B, R6MUL ABADD A, R4MOV R4, AMOV A, BJNC NEXT3CLR CADD A, #1NEXT3: MOV R1, AMOV A,R5MOV R6, AMOV A, R4MOV R5, AMOV A, R1MOV R4, AHERE: SJMP HEREEND总体思想为将该16位乘法拆分为四步8位乘法运算在进行带进位的相加程序中每段分别实现一个八位乘法,然后与上次运算结果相加。
第三单元Proteus 系统仿真实验实验一基本并行口I/O口实验自我完成实验1、实验要求当按键 SW1 按下之后,D1-D8 轮流点亮,点亮时间为 100ms,当按键停下后,停止轮换,再次按下后继续轮换。
2、编程思路①进行初始化工作,包括设置堆栈指针 SP,将 P2 口所有位设置为 1,使 P2 口所接发光二极管全部熄灭。
将显示缓冲单元(设为 20H 单元)初始化为 FEH。
②从 P1 口读数据,查看 P1.0 位,如果 P1.0 位为 0,则执行如下循环:将显示缓冲单元的值送给 P2 口,调用 100ms 延时程序,将显示缓冲单元的值循环左移 1 位,再送回显示缓冲单元。
如果 P1.0 位不为 0 则不执行上述循环。
③重复上面的操作②3、实验步骤①根据上述实验容,参考 1.2.2,在 Proteus 环境下建立图 3.5 所示原理图,并将其保存为 basicIO_self.DSN 文件。
②根据(2)和(3)编写控制源程序,将其保存为 basicIO_self.asm。
③将源程序添加到 U1 中,并构造(build)该程序。
④执行仿真过程观察 D1-D8 的指示,查看程序功能是否正确。
⑤修改延时程序延时参数,重新执行③和④。
4、源程序ORG 0000HAJMP MAINORG 0030HMAIN:MOV SP,#60HMOV P2,#0FFHMOV A,#0FEHMOV 20H,A;缓冲单元LOOP:JNB P1.0,LOOP1; ;如果P1.0=0,跳转SJMP LOOP ;否则循环不断检测LOOP1:MOV P2,20H ;将缓冲单元的值给P2口LCALL DELAY100MS ;延时100ms; MOV A,20HRL A ;左移一位MOV 20H,AJB P1.0,LOOP;如果P1.0=1,跳转到LOOP处LJMP LOOP1;否则循环DELAY100MS:MOV R7,#200 ;1usDL:MOV R6,#248 ;1usDJNZ R6,$ ;248*2=496usNOP ;1usDJNZ R7,DL ;2usRET;(496+1+1+2)*200+1=100.001msEND5、电路图6、仿真结果当按键 SW1 按下之后,D1-D8 轮流点亮,点亮时间为 100ms,当按键停下后,停止轮换,再次按下后继续轮换。
实验一:片内RAM30H开始的N个字节的内容送到片外RAM2000H开始的单元中,数据块长度存在2F单元中ORG 0000HSJMP MAINORG 0030HMAIN:MOV R0,#30HMOV DPTR,#2000HLOOP:MOV A,@R0MOVX @DPTR,AINC R0INC DPTRDJNZ 2FH,LOOPSJMP $END二、编程将片外RAM1000H开始的N个单元的内容送到片外RAM2050H开始的单元,N 为数据块的长度,存放在片内RAM2FH单元中ORG 0000HLJMP MAINORG 0030HMAIN:MOV DPTR,#1000HMOV P2,#20HMOV R0,#50HLOOP:MOVX A,@DPTRMOVX @R0,AINC DPTRINC R0DJNZ 2FH ,LOOPSJMP $ENDSJMP MAINORG 0030HMAIN:MOV A,20HMOV DPTR,#TABMOVC A,@A+DPTRMOV 21H,ASJMP $TAB:DB 0,1,5,15,16,18,19,21DB 26,33,32,30,13,11,8END四、连加程序MAIN:MOV R0,#30HMOV R1,#60HMOV R2,#30HACALL SUMSJMP $SUM:PUSH PSWMOV @R1,#0INC R1MOV @R1,#0DEC R1LOOP:MOV A,@R0ADD A,@R1MOV @R1,AINC R1MOV A,@R1ADDC A,#0MOV @R1,ADEC R1INC R0DJNZ R2,LOOPPOP PSWRETEND实验二多字节数乘法和除法1.编写一个双字节数乘以单字节数的程序,实现(R4)(R3)×(R2) →(R4)(R3)(R2)。
并验证:BBFFH×BBH,3FFFH×A2H,FFFFH×0AHMOV A,R3MOV B,R2MUL ABMOV R5,AMOV R6,BMOV A,R4MOV B,R2MUL ABADD A,R6MOV R6,AMOV A,BADDC A,#00HMOV R7,ARETEND2.编写一个双字节数除以单字节数的程序,实现(R7)(R6) ÷(R5) →(R5)(R6) …(R7)。
微机原理与接口技术实验指导书机电工程学院2010年3月实验一拼字程序(基础实验)一、实验目的掌握汇编语言设计和调试方法。
二、实验内容把7000H的低四位BCD数和7001H的低四位BCD数,拼成压缩BCD码的形式存放在7002H。
三、实验说明通过本实验,掌握拼字的编程方法,同时也可以了解单片机编程、调试方法。
四、主要仪器设备及耗材PC机、W A VE软件五、参考程序框图六、参考程序(略)实验二清零实验(基础实验)一、实验目的1. 掌握存储器读写方法。
2. 了解存储器的块操作方法。
二、实验内容1. 指定内部RAM中某块的起始地址和长度,要求能将其内容清零。
2. 指定外部RAM中某块的起始地址和长度,要求能将其内容清零。
3. 指定外部RAM中某块的起始地址和长度,要求能将其内容置为某固定值(如0FFH)。
三、实验说明通过本实验,学生可以了解单片机的存储器结构及读写存储器的方法,同时也可以了解单片机编程、调试方法。
四、实验仪器和设备PC机、W A VE软件。
五、参考程序框图存储器块清零参考程序框图六、参考程序(略)实验三数据块传送程序(基础实验)一、实验目的1.了解内存的移动方法。
2.加深对存储器读写的认识。
二、实验内容将指定源地址和长度的存储块移到指定目标位置。
三、实验说明块移动是计算机常用操作之一,多用于大量的数据复制和图象操作。
本程序是给出起始地址,用地址加一方法移动块,请思考给出块结束地址,用地址减一方法移动块的算法。
另外,若源块地址和目标块地址有重叠,该如何避免?四、实验仪器和设备PC机、W A VE软件。
五、参考程序框图存储块移动参考程序框图六、参考程序(略)实验四P3.5口输入,P1口输出(基础实验)一、实验目的1、掌握P3口、P1口简单使用。
2、学习延时程序的编写和使用。
二、实验内容1、P3.5口做输入口,外接一脉冲,每输入一个脉冲,P1口按十六进制加一。
2、P1口做输出口,编写程序,使P1口接的8个发光二极管D1—D8按16进制加一方式点亮发光二极管。
..信息科学与工程学院2016-2017学年第二学期实 验 报 告课程名称: 单片机原理与应用实验名称: 3.8 ADC0808/9信号采集实验实验报告【实验题目】本实验利用LCD1602和AD0808实现简单的交流信号过零检测与频率分析。
要求信号幅度变化时(满量程的5%~95%),不影响检测的结果。
频率检测的结果通过LCD1602的第1行显示出来,信号过零时,能够通过P2.6输出一个脉冲宽度为5微秒的脉冲信号。
【实验要求】1.编写源程序并进行必要的注释;2.记录实验过程;3.记录程序运行结果;【实验过程及结果记录】自我完成实验A.电路图B.运行结果频率监测过零检测【实验源程序】#include <reg51.h>#include <intrins.h>#define uint unsigned int#define uchar unsigned char sbit LCD_RS=P2^0;sbit LCD_RW=P2^1;sbit LCD_EN=P2^2;sbit AD_CLK=P2^3;sbit Start=P2^4;sbit OE=P2^5;sbit Out_pulse=P2^6;sbit EOC=P2^7;uchar tx50=0;uchar f=0;uchar date,lastdate,ge,shi; void delay_ms(uint xms) {uint i,j;for(i=xms;i>0;i--){for(j=110;j>0;j--); }}bit lcd_busy(){bit result;LCD_RS=0;LCD_RW=1;LCD_EN=1;_nop_();_nop_();_nop_();_nop_();result=(bit)(P1&0x80);LCD_EN=0;return result;}void lcd_wcmd(uchar cmd) {while(lcd_busy());LCD_RS=0;LCD_RW=0;LCD_EN=0;_nop_();_nop_();P1=cmd;_nop_();_nop_();_nop_();_nop_();LCD_EN=1;_nop_();_nop_();_nop_();_nop_();LCD_EN=0;}void lcd_clr(){lcd_wcmd(0x01);delay_ms(2);}void lcd_wdat(uchar dat) {while(lcd_busy());LCD_RS=1;LCD_RW=0;LCD_EN=0;_nop_();_nop_();P1=dat;_nop_();_nop_();_nop_();_nop_();LCD_EN=1;_nop_();_nop_();山东大学·微处理器原理与应用·实验报告_nop_();_nop_();LCD_EN=0;}void lcd_init()//初始化子程序{delay_ms(15);lcd_wcmd(0x38);//8位数据总线,显示2行,5*7点阵delay_ms(5);lcd_wcmd(0x0c);//显示开,关光标,不闪烁delay_ms(5);lcd_wcmd(0x06);//进入模式设置指令中,地址自动增加delay_ms(5);lcd_wcmd(0x01);//清楚LCD显示内容delay_ms(5);}void s_timer0() interrupt 1{TH0=0x3c;TL0=0xb0;tx50=tx50+1;if(tx50==20){TR0=0;tx50=0;f=f/2;shi=f/10;shi=shi+'0';ge=f%10;ge=ge+'0';lcd_wcmd(0x80);lcd_wdat('F');delay_ms(5);lcd_wdat('=');山东大学·微处理器原理与应用·实验报告delay_ms(5);lcd_wdat(shi);delay_ms(5);lcd_wdat(ge);delay_ms(5);lcd_wdat('H');delay_ms(5);lcd_wdat('z');f=0;TR0=1;}}void s_timer1() interrupt 3{AD_CLK=~AD_CLK;}void main(){delay_ms(10);lcd_init();lcd_clr();delay_ms(2);TMOD=0x21;TH1=0xfd;TL1=0xfd;TH0=0x3c;TL0=0xb0;EA=1;ET0=1;ET1=1;TR0=1;TR1=1;while(1){山东大学·微处理器原理与应用·实验报告Start=1;Start=0;while(EOC!=1);OE=1;P0=0xff;lastdate=date;date=P0;OE=0;if(((lastdate<128)&&(date>=128))||((lastdate>=128)&&(date<128))){f++;Out_pulse=1;_nop_();_nop_();_nop_();_nop_();Out_pulse=0;}}}。
《单片机原理与应用》实验文档存放目录:一、实验题目:实验1:按键声光报警实验实验5:8255 并行I/O 扩展及交通信号灯控制实验实验7:7279 键盘扫描及动态LED 显示实验二、实验要求实验1:本实验联系静态按键识别,发光二极管驱动,要求利用外部硬件中断,按键按下一次产生一次外部中断,在中断服务程序中计数器加1,同时,通过发光二极管的闪烁和蜂鸣器响的次数,指示计数器的当前值。
当计数到10 时,再次按键将重新从1 开始计。
实验2:本实验利用8255 实现可编程的并行IO 扩展功能,并利用其完成交通灯控制。
实验要求红灯常亮30S,绿灯常亮25S 后闪烁5S。
使用静态数码管显示绿灯常亮倒计时。
本实验中的东西方向信号灯同步控制,南北方向信号灯同步控制,即:东西方向上同种颜色的灯同时亮或灭,南北方向上同种颜色的灯同时亮或灭。
实验3:本实验利用7279 进行键盘扫描及动态LED 数码管显示控制。
当按下某个按键时所按按键对应的字符显示在最右端LED 数码管上,如果再次按下一个按键’2’,则原来显示的内容往左移 1 位,将新按下的按键’2’,的字符显示在最右端,依次类推显示0~F。
三、实验过程及结果记录(截图)实验1实验2实验3四、实验源程序实验1#include<reg52.h>#define uint unsigned int#define uchar unsigned charsbit bell=P3^1; //P3.1口位赋值给铃声sbit led=P3^0; //P3.0口位赋值给灯sbit key0=P3^2; //P3.2口位赋值给按键uint count;void delay(uint count) //延时1ms {uint x,y;for(x=count;x>0;x--)for(y=110;y>0;y--);}void show(uint count){ uint i;for(i=0;i<=count;i++){led=0;bell=0; //灯亮,铃响delay(500); //延时0.5sled=1;bell=1; //灯灭,铃不响delay(500);}}void s_timer0() interrupt 0 using 0{EA=0; //屏蔽所有中断请求show(count); //调用子程序count++;delay(50);if(count>=10)count=0;EA=1; //开放中断}/**************************主程序**********************************/ void main(){ EA=1; //开放中断EX0=1; //允许外部中断0中断IT0=0; //外部中断0为电平触发方式while(1); //循环执行}实验2#include<reg51.h>#include<stdio.h>#include <absacc.h>#define uchar unsigned char#define uint unsigned int#define PA XBYTE[0x7FFC] //CS--A15#define COM XBYTE[0x7FFF]sbit P30=P3^0;sbit P31=P3^1;uint temp,shi,ge,t;uchar a;void xianshi(uint temp);void delay();void delays();void init_8255();void init_8255(){COM=0x80; // c = out, a = out,b = out }void delay() //延时500MS子程序{uint i,j;for( i=500;i>0;i--)for(j=120;j>0;j--);}void delays() //延时1S子程序{uint i,j;for(i=1000;i>0;i--)for(j=120;j>0;j--);}/***************************主程序*****************************/void main(){init_8255();TMOD=0x01; //设定工作模式1EA=1; //开放中断ET0=1; //允许T0中断TF0=0; //定时器0溢出标志位while(1){a=0x26; //变量a赋初值for(temp=25;temp>19;temp--) //绿灯倒计时25s{a=a-1;PA=0x69; //东西绿灯亮xianshi(a); //调用数码管显示子程序 delays(); //延时1s}a=0x1a; //变量a赋值for(temp=19;temp>9;temp--) //倒计时{a=a-1;PA=0x69; //东西绿灯亮xianshi(a);delays();}a=0x0a;for(temp=9;temp>0;temp--){a=a-1;PA=0x69;xianshi(a);delays();}for(t=5;t>0;t--) //绿灯闪烁5s{a=0; //当计时值为0时闪烁xianshi(a);PA=0xeb; //东西绿灯灭delay(); //延时0.5sPA=0x69; //东西绿灯亮delay(); //延时0.5s}a=0x26;for(temp=25;temp>19;temp--) //绿灯倒计时25s{a=a-1;PA=0x96; //南北绿灯亮xianshi(a);delays();}a=0x1a;for(temp=19;temp>9;temp--){a=a-1;PA=0x96;xianshi(a);delays();}a=0x0a;for(temp=9;temp>0;temp--){a=a-1;PA=0x96;xianshi(a);delays();}for(t=5;t>0;t--) //绿灯闪烁5s {a=0; //当计时值为0时闪烁xianshi(a);PA=0xbe; //南北绿灯灭delay(); //延时0.5sPA=0x96; //南北绿灯亮delay(); //延时0.5s}}}void xianshi(uint a) //显示子程序{SCON=0x00; //工作模式0SBUF=a; //将变量a的值送给缓存寄存器while(!TI) //等待发送是否完成TI=0; //中断标志位清零}实验3#include<reg51.h>#include<stdio.h>sbit CS=P1^0;// cs at P1.0sbit CLK=P1^1; // clk 连接于 P1.1sbit DATA=P1^2; // dat 连接于 P1.2sbit KEY=P1^3; // key 连接于 P1.3//******************** HD7279A 指令******************/#define RESET 0xa4 // 复位指令#define RL 0xa1 //左移指令#define DECODE1 0xc8 //译码方式1#define READ 0x15 //读键盘指令/*********************长延时子程序******************/void ldelay() //25us{unsigned char a,b;for(b=1;b>0;b--)for(a=20;a>0;a--);}/***************短延时子程序****************/void sdelay(){unsigned char a;for(a=3;a>0;a--);}void send(unsigned char out) // 发送一个字节{unsigned char i;CS=0; //芯片使能ldelay(); //长延时for(i=0;i<8;i++) //分8次移入数据{if(out&0x80) //先传高位DATA=1;else DATA=0;CLK=1;sdelay();CLK=0;sdelay();out=out<<1; //数据左移}DATA=0;}void write(unsigned char command,unsigned char dat){send(command);send(dat);}unsigned char receive() //接收一个字节{unsigned char i,inbyte;ldelay(); //长延时for(i=0;i<8;i++) //分8次读入数据高位在前{CLK=1;sdelay();inbyte=inbyte<<1;if(DATA)inbyte=inbyte|0x01; //数据左移CLK=0;sdelay();}DATA=0;return inbyte;}/********************键盘扫描子程序*****************************/ unsigned char keyscan(){unsigned char key;if(!KEY) //检测P1.3是否口为低电平{send(READ);key=receive(); //将接收到的数赋给keyswitch(key) //按键编码{case 0x1b:return 0x00;break;case 0x13:return 0x01;break;case 0x0b:return 0x02;break;case 0x03:return 0x03;break;case 0x1a:return 0x04;break;case 0x12:return 0x05;break;case 0x0a:return 0x06;break;case 0x02:return 0x07;break;case 0x19:return 0x08;break;case 0x11:return 0x09;break;case 0x09:return 0x0a;break;case 0x01:return 0x0b;break;case 0x18:return 0x0c;break;case 0x10:return 0x0d;break;case 0x08:return 0x0e;break;case 0x000:return 0x0f;break;}}return 0xff;}/*******************主程序**********************/void main(){unsigned char i,key;send(RESET);while(1){if(!KEY) //检测P1.3是否口为低电平{key=keyscan(); //将键盘扫描所得值赋给keysend(RL);write(DECODE1,key);while(!KEY); //当P1.3口为低电平,循环执行}}。
1、0-99数码管显示ORG 00HAJMP MAINORG 30HMAIN: MOV 30H,#0MOV 31H,#0 LP: ACALL PLAYACALL DELAYINC 30HMOV A,30HCJNE A,#10,LPMOV 30H,#0INC 31HMOV A,31HCJNE A,#10,LPAJMP MAIN PLAY: MOV R0,#30HMOV DPTR,#TAB LL: MOV A,@R0MOVC A,@A+DPTRSETB P2.1MOV P1,ACLR P2.1INC R0MOV A,@R0MOVC A,@A+DPTRSETB P2.0MOV P1,ACLR P2.0RETDELAY:MOV R7,#0DEL: MOV R6,#0DJNZ R6,$DJNZ R7,DELRETTAB:DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,8 0H,90HEND0-9实验ORG 00HAJMP MAINORG 30H MAIN:MOV 30H,#0 LOOP:ACALL PLAYACALL DELAYINC 30HMOV A,30HCJNE A,#10,LOOPMOV 30,#0AJMP LOOP PLAY:MOV R0,#30HMOV DPTR,#TAB LP:MOV A,@R0MOVC A,@A+DPTRMOV P1,ARETDELAY:MOV R7,#0DEL:MOV R6,#0DJNZ R6,$DJNZ R7,DELRETTAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H END9数码管动态显示ORG 0HAJMP MAIN ORG 30HMAIN:MOV 30H,#0 MOV 31H,#0LOP1: MOV DPTR,#TAB MOV R0,#30H ACALL DISPLAY ACALL DELAYINC 30H MOV A,30H CJNE A,#10,LOP1 MOV 30H,#0 INC 31H MOV A,31H CJNE A,#10,LOP1 AJMP MAINDISPLAY: MOV A,@R0 MOVC A,@A+DPTRMOV P0,A SETB P2.1 CLR P2.1INC R0 MOV A,@R0 MOVC A,@A+DPTRSETB P2.0 MOV P0,A CLR P2.0 RETDELAY: ;误差 0usMOV R7,#0A7HDL1:MOV R6,#0ABHDL0:MOV R5,#10H DJNZ R5,$ DJNZ R6,DL0 DJNZ R7,DL1NOP RETTAB: DB 3FH 06H 5BH 4FH 66H 6DH DB 7DH 07H 7FH 6FH 77H 7CH 3DB 9H 5EH 79H 71H 80HEND10数码管动态显示138位选; 数码管动态显示0~99,; 用74HC138控制77SEG-MPX2-CC-BULL数码管位选,; 当138输入**10 0000(取20H)时位1开,位2关; 当138输入**10 0001(取21H 时位1关,位2开ORG 0AJMP MAINORG 30HMAIN:MOV 30H,#0HMOV 31H,#0HLOP1: MOV DPTR,#TABMOV R0,#30HACALL DISPLAY;ACALL DELAYINC 30HMOV A,30HCJNE A,#10,LOP1MOV 30H,#0INC 31HMOV A,31HCJNE A,#10,LOP1AJMP MAINDISPLAY: MOV R4,#013HLOP4: MOV R3,#014HLOP3: MOV R2,#82HLOP2: MOV A,@R0MOVC A,@A+DPTRMOV P0,AMOV P2,#01H;ACALL DELAY1MOV P2,#3HINC R0MOV A,@R0MOVC A,@A+DPTRMOV P0,AMOV P2,#0;ACALL DELAY1MOV P2,#3HMOV R0,#30HDJNZ R2,LOP2DJNZ R3,LOP3DJNZ R4,LOP4RETDELAY: ;误差0us 1MSMOV R7,#0A7HDL1:MOV R6,#0ABHDL0:MOV R5,#10HDJNZ R5,$DJNZ R6,DL0DJNZ R7,DL1NOPRETDELAY1: ;误差0us 10USMOV R6,#01HDL01:MOV R5,#02HDJNZ R5,$DJNZ R6,DL01RETTAB: DB 3FH 06H 5BH 4FH 66H 6DHDB 7DH 07H 7FH 6FH 77H 7CH 3DB 9H 5EH 79H 71H 80HEND164驱动0-99ORG 00HAJMP MAINORG 30H MAIN:MOV DPTR,#TABMOV 30H,#0MOV 31H,#0 LOOP:ACALL DISPLAYACALL DELAYINC 30HMOV A,30HCJNE A,#10,LOOPMOV 30H,#0INC 31HMOV A,31HCJNE A,#10,LOOPMOV 31H,#0AJMP LOOP DISPLAY:MOV R0,#30HMOV DPTR,#TAB LP:MOV A,@R0MOVC A,@A+DPTRMOV SBUF,AJNB TI,$CLR TIINC R0CJNE R0,#32H,LPRETDELAY:MOV R7,#0DEL:MOV R6,#0DJNZ R6,$DJNZ R7,DELRETTAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80 H,90HEND独立按键识别ORG 00HAJMP MAINORG 30 MAIN:JB P1.0,KEY1MOV P2,#0C0HACALL DELAY KEY1:JB P1.1,KEY2MOV P2,#0F9HACALL DELAY KEY2:JB P1.2,KEY3MOV P2,#0A4HACALL DELAY KEY3:JB P1.3,KEY4MOV P2,#0B0HACALL DELAY KEY4:JB P1.4,KEY5MOV P2,#99HACALL DELAY KEY5:JB P1.5,KEY6MOV P2,#92HACALL DELAY KEY6:JB P1.6,KEY7MOV P2,#82HACALL DELAY KEY7:JB P1.7,LOOPMOV P2,#0F8HACALL DELAY DELAY:MOV R7,#0 DEL:MOV R6,#0DJNZ R6,$DJNZ R7,DELRETLOOP:END交通灯ORG 00HAJMP MAIN ORG 30H MAIN:MOV P2,#00010001B MOV R1,#100 L1:ACALL DELAY DJNZ R1,L1MOV P2,#00100001B MOV R1,#10 L2:ACALL DELAY DJNZ R1,L2MOV P2,#00001010B MOV R1,#100 L3:ACALL DELAY DJNZ R1,L3MOV P2,#00010100B MOV R1,#10 L4:ACALL DELAY DJNZ R1,L4 AJMP MAINDELAY:MOV R7,#0 DEL:MOV R6,#0 DJNZ R6,$ DJNZ R7,DEL RET END流水灯ORG 00H AJMP MAINORG 30HMAIN: MOV A,#0FEHLOOP:MOV P0,ARL A ACALL DELAY SJMP LOOP DELAY: MOV R7,#0DEL:MOV R6,#0DJNZ R6,$ DJNZ R7,DELRETEND流水灯与闪烁交替RG 00HAJMP MAINORG 03HAJMP WWORG 30HMAIN:MOV A,#0FEHSETB IT0SETB EASETB EX0LOOP:MOV P0,ARL AACALL DELAYSJMP LOOPWW:MOV P0,#0ACALL DELAYMOV P0,#0FFHACALL DELAYSJMP WWRETI DELAY: MOV R7,#0DEL: MOV R6,#0 DJNZ R6,$ DJNZ R7,DELRETEND闪烁灯AJMP loopORG 30HLOOP: MOV P0,#0ACALL DELAYMOV P0,#0FFHACALL DELAYSJMP LOOPDELAY:MOV R7,#0DEL: MOV R6,#0DJNz R6,$DJNz R7,DELRETend定时器org 00hajmp mainorg 0bhajmp aaorg 30hmain: mov tmod,#01hmov th0,#0d8hmov tl0,#0f0hmov p1.0,#0ffhsetb easetb et0setb tr0ajmp $aa: clr eamov th0,#0d8hmov tl0,#0f0hcpl p1.0setb earetiORG 0HMAIN:MOV 40H,#253 ;测试显示用语句LOP:ACALL DISPLAY ;调用显示子程序ACALL AD0808 ;调用AD转换子程序ACALL DELAY ;调用延时子程序SJMP LOP ;循环进行AD0808:MOV DPTR,#7FF8H ;给出ADC0808的芯片地址P2.7, A0,A1,A2为0MOV A,#0 ;无意义MOVX @DPTR,A ;通过给DPTR送数,使P2.7为0,WR为低,从而使START为高,使ADC0808启动转换ACALL DELAY ;延时等待ADC0808转换完毕MOVX A,@DPTR ;将ADC0808转换完的数据送AMOV 40H,A ;A将转换完的数据转存40HRET ;转换子程序返回DISPLAY: ;显示子程序MOV DPTR,#TAB ;显示码表首地址MOV A,40H ;取出ADC转换结果MOV B,#100 ;以100为除数DIV AB ;进行除法运算MOV 32H,A ;将百位送32HMOV A,B ;十位、个位数送AMOV B,#10 ;以10为除数DIV AB ;进行除法运算MOV 31H,A ;10位数送31HMOV 30H,B ;个位数送30HMOV R0,#30H ;以R0为寄存器间址的首地址DISLOP:MOV A,@R0 ;将30H内的数送AMOVC A,@A+DPTR ;取显示码MOV SBUF,A ;送串行口显示JNB TI,$ ;未送出(TI<>1)等待CLR TI ;已送出将TI清零INC R0 ;指向下一个单元CJNE R0,#33H,DISLOP;若不是到33H继续RET ;已经显示到32H,返回DELAY:MOV R7,#0DEL1:MOV R6,#0DJNZ R6,$DJNZ R7,DEL1RETTAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH END2LED流水灯ORG 0HAJMP MAINORG 30HMAIN:MOV A,#0FEHLOOP:RL AMOV P0,AACALL DELAYSJMP LOOPDELAY: MOV R7,#0DEL1: MOV R6,#0DJNZ R6,$DJNZ R7,DEL1RETEND3LED闪烁(延时)ORG 0HAJMP MAINORG 30HMAIN:MOV P0, #0FFHACALL DELAYMOV P0,00HACALL DELAYAJMP MAINDELAY::MOV R7,#0HDEL: MOV R6,#0HDJNZ R6,$DJNZ R7,DELRETEND4现流水灯和闪烁的交替出现(利用中断ORG 0HAJMP MAINORG 03HAJMP INT0ORG 30HMAIN: MOV SP,#60HSETB IT0SETB EX0SETB EAMOV A,#0FEH LOP:RL AMOV P0,AACALL DELAY1SJMP LOPINT0: PUSH P0CLR EAMOV P0,#0HACALL DELAY2MOV P0,#0FFHACALL DELAY2MOV P0,#0HACALL DELAY2MOV P0,#0FFHACALL DELAY2SETB EAPOP P0CLR IE0RETIDELAY1:MOV R7,#0 DEL1: MOV R6,#0DJNZ R6,$DJNZ R7,DEL1RETDELAY2: MOV R5,#0 DEL3: MOV R4,#0del4: mov r3,#03djnz r3,$DJNZ R4,del4DJNZ R5,DEL3RETEND12矩阵式按键识别ORG 0HMAIN:MOV R0,#0HMOV DPTR,#TAB KEYSCAN:KEY1:CLR P1.0SETB P1.1JB P1.6,KEY2MOV 32H,#1SJMP DIS1KEY2:JB P1.7,KEY3MOV 32H,#2SJMP DIS1KEY3:SETB P1.0CLR P1.1JB P1.6,KEY4MOV 32H,#3SJMP DIS1KEY4:JB P1.7,KEYSCANMOV 32H,#4DIS1:ACALL DISPLAYACALL DELAYAJMP KEYSCAN DISPLAY:MOV A,32HMOVC A,@A+DPTRSETB P2.2CLR P2.1CLR P2.0MOV P0,AACALL DELAYRETDELAY:MOV R7,#0FHDEL: MOV R6,#0HDJNZ R6,$DJNZ R7,DELRETTAB:DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H END两个数比较大小:DATA1 EQU 2000HDATA2 EQU 2001HDATA3 EQU 2002HORG 00HAJMP MAINORG 30HMAIN:CLR CMOV DPTR,#DA TA1MOVX A,@DPTRMOV R3,AINC DPTRMOVX A,@DPTRSUBB A,R3JNC BIG2XCH A,R3SJMP BIG1BIG2:MOVX A,@DPTRBIG1:INC DPTRMOVX @DPTR,AEND流水灯ORG 00HAJMP MAINORG 30HMAIN: MOV A,#0FEHLOOP: MOV P0, ARL AACALL DELAYSJMP LOOPDELAY: MOV R7,#0DEL : MOV R6,#0DJNZ R6,$DJNZ R7,DELRETEND定时org 0hajmp mainorg 1bhajmp t1intorg 30hmain:mov a,#0mov dptr,#tabmov tmod,#10hmov th1,#3chmov tl1,#0b0hsetb easetb et1setb tr1sjmp $t1int:mov th1,#3chmov tl1,#0b0hinc 30hmov r1,30hcjne r1,#10,loopmov 30h,#0inc acjne a,#10,lp1clr alp1:mov 31h,amovc a,@a+dptrmov p0,amov a,31hloop:retitab:db0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90hend中断:ORG 00HAJMP MAINORG 03HAJMP INTOORG 30HMAIN:MOV SP,#60HSETB IT0SETB EX0SETB EAMOV A,#0FEHLOP:RL AMOV P0,AACALL DELAY1SJMP LOP INTO:PUSH P0CLR EAMOV P0,#0HACALL DELAY2MOV P0,#0FFHACALL DELAY2MOV P0,#0HACALL DELAY2MOV P0,#0FFHACALL DELAY2SETB EAPOP P0RETDELAY1:MOV R7,#0 DEL:MOV R6,#0DJNZ R6,$DJNZ R7,DELRETDELAY2:MOV R5,#0 DEL2:MOV R4,#0DJNZ R4,$DJNZ R5,DEL2RETEND按键显示:org 000hajmp mainorg 30h main:jb p1.0,key1mov p0,#0c0hacall delaykey1:jb p1.1,key2mov p0,#0f9hacall delaykey2:jb p1.2,key3mov p0,#0a4hacall delaykey3:jb p1.3,key4mov p0,#0b0hacall delay key4:jb p1.4,key5mov p0,#99hacall delay key5:jb p1.5,key6mov p0,#99hacall delay key6:jb p1.4,key7mov p0,#92hacall delay key7:jb p1.4,key8mov p0,#82hacall delay delay:mov r7,#0 del:mov r6,#0djnz r6,$djnz r7,delretend矩阵式按键识别独立按键控制数码管控制LED灯两个数比较大小:DATA1 EQU 2000HDATA2 EQU 2001HDATA3 EQU 2002HORG 00HAJMP MAINORG 30HMAIN:CLR CMOV DPTR,#DA TA1MOVX A,@DPTRMOV R3,AINC DPTRMOVX A,@DPTRSUBB A,R3JNC BIG2XCH A,R3SJMP BIG1BIG2:MOVX A,@DPTRBIG1:INC DPTRMOVX @DPTR,AEND流水灯ORG 00HAJMP MAINORG 30HMAIN: MOV A,#0FEHLOOP: MOV P0, ARL AACALL DELAYSJMP LOOPDELAY: MOV R7,#0DEL : MOV R6,#0DJNZ R6,$DJNZ R7,DELRETEND定时org 0hajmp mainorg 1bhajmp t1intorg 30hmain:mov a,#0mov dptr,#tabmov tmod,#10hmov th1,#3chmov tl1,#0b0hsetb easetb et1setb tr1sjmp $t1int:mov th1,#3chmov tl1,#0b0hinc 30hmov r1,30hcjne r1,#10,loopmov 30h,#0inc acjne a,#10,lp1clr alp1:mov 31h,amovc a,@a+dptrmov p0,amov a,31hloop:retitab:db0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90hend中断:ORG 00HAJMP MAINORG 03HAJMP INTOORG 30HMAIN:MOV SP,#60HSETB IT0SETB EX0SETB EAMOV A,#0FEHLOP:RL AMOV P0,AACALL DELAY1SJMP LOPINTO:PUSH P0CLR EAMOV P0,#0HACALL DELAY2MOV P0,#0FFHACALL DELAY2MOV P0,#0HACALL DELAY2MOV P0,#0FFHACALL DELAY2SETB EAPOP P0RETDELAY1:MOV R7,#0 DEL:MOV R6,#0DJNZ R6,$DJNZ R7,DELRETDELAY2:MOV R5,#0 DEL2:MOV R4,#0DJNZ R4,$DJNZ R5,DEL2RETEND按键显示:org 000hajmp mainorg 30h main:jb p1.0,key1mov p0,#0c0hacall delaykey1:jb p1.1,key2mov p0,#0f9hacall delaykey2:jb p1.2,key3mov p0,#0a4hacall delaykey3:jb p1.3,key4mov p0,#0b0hacall delaykey4:jb p1.4,key5mov p0,#99hacall delaykey5:jb p1.5,key6mov p0,#99hacall delaykey6:jb p1.4,key7mov p0,#92hacall delaykey7:jb p1.4,key8mov p0,#82hacall delaydelay:mov r7,#0del:mov r6,#0djnz r6,$djnz r7,delretendADC0808:ORG 0HMAIN: mov 40h,#234ACALL DISPLAYmov p1,#0ADLOOP: MOV A,#0MOV DPTR,#7FF8HMOVX @DPTR,AACALL DELAYMOVX A,@DPTRMOV 40H,AACALL DISPLAYACALL DELAYSJMP ADLOOPDISPLAY: MOV A,40HMOV B,#100DIV ABMOV 32H,AMOV A,BMOV B,#10DIV ABMOV 31H,AMOV 30H,BMOV DPTR,#TABMOV R0,#30HDISLOP: MOV A,@R0MOVC A,@A+DPTRMOV SBUF,AJNB TI,$CLR TIINC R0CJNE R0,#33H,DISLOPRETDELAY: MOV R7,#0DEL1: MOV R6,#0DJNZ R6,$DJNZ R7,DEL1RETTAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FHEND21。
单片机实验总结报告一、实验目的与意义单片机实验是电子、电气、计算机等专业学生必须掌握的基本技能之一。
本实验旨在通过实践操作,使学生掌握单片机的应用,了解单片机的内部结构、工作原理及编程方法,为后续专业课程和实际项目开发奠定基础。
本实验具有重要的实践意义,能够提高学生的动手能力、分析问题和解决问题的能力,培养学生的创新思维和团队协作精神。
二、实验原理单片机是一种集成度高、体积小、价格低、可靠性高的微控制器,广泛应用于工业控制、智能仪表、通信设备等领域。
单片机内部包含中央处理器、存储器、定时器/计数器、串行通信接口等模块,可以通过编程实现各种数字和模拟信号的处理和控制。
本实验采用常见的8051单片机作为实验对象,介绍单片机的最小系统、I/O口操作、中断系统、定时器/计数器、串行通信等基本功能。
通过实验,学生将了解单片机的内部结构和工作原理,掌握单片机的编程方法和常用外设的控制方式。
三、实验步骤与操作方法1、单片机最小系统搭建(1)准备实验器材:8051单片机开发板、杜邦线若干、USB 转串口线等。
(2)按照开发板上的标识,将各个元件焊接或插接到对应的焊盘上。
(3)连接电源,检查开发板上的电源和地线是否连接正确。
(4)通过USB转串口线将PC与开发板连接,确认通信正常。
2、I/O口操作实验(1)编写一个简单的程序,使单片机的P1口输出一个全高电平和一个全低电平,观察LED灯的状态变化。
(2)通过编程控制P1口输出不同的信号,如方波、三角波等。
(3)尝试使用P2口和P3口进行类似的实验操作。
3、中断系统实验(1)编写一个中断服务程序,当按下开发板上的按钮时,触发外部中断0(INT0),使P1口的LED灯闪烁。
(2)了解中断优先级的概念,并尝试改变中断优先级,观察实验结果。
4、定时器/计数器实验(1)编写一个程序,使定时器0在1秒内自动溢出,通过中断服务程序实现LED灯的闪烁。
(2)尝试改变定时器初值,观察LED灯闪烁的频率变化。
《微机原理与应用》实验报告姓名:***学号:**********年级:2014专业:电子2016年春季学期实验一.熟悉单片机开发环境1.功能要求在 P1 端口接8 个LED,并编程依次循环点亮。
要求用软件延时程序控制LED 的亮灭时间,并能精确地计算和用软件测量延时时间。
2.硬件原理3.程序清单ORG 0000HLJMP STARTORG 0030HSTART: MOV R2,#8MOV A,#01H LOOP1: MOV P1,ALCALL DELAY RL ADJNZ R2,LOOP1 MOV R2,#8RR ALOOP2: MOV P1,ALCALL DELAY RR ADJNZ R2,LOOP2 LJMP STARTDELAY: MOV R5,#20 D1: MOV R6,#80 D2: MOV R7,#248 DJNZ R7,$DJNZ R6,D2DJNZ R5,D1RETEND4.实验心得首次接触开发板,通过实验1加强了对单片机的了解,学会使用仿真软件,学会搭线的各种技巧,并且掌握了LED亮灭的原理。
实验二.并行口输入输出实验——循环彩灯控制1.功能要求P1 口接8 个开关,P0 口接8 个灯,每个开关对应一个灯,实时读取开关状态,开关闭合时,灯亮。
开关断开时,灯灭。
用5 个开关K0~K4,控制P0 口所接8 个灯的循环,各开关的功能要求如下:(1)K1~K2 分别选择灯的四种闪动方式;(2)K3 用于控制灯的循环方向(顺时针或逆时针);(3)K4 用于选择灯的两种循环速度;(4)K0 用于引发外部中断,在外部中断子程序中,读取通过K1-K4 所设定 的循环彩灯的工作方式,并按所设定的工作方式控制彩灯运行。
当K0 没有引发 中断时,保持上一次的循环方式。
2.硬件原理3.程序清单ORG 0000HLJMP MAINDELAY2: MOV R0,#200 D4: MOV R1,#200ORG 0003HLJMP INTERRUPTORG 0030HMAIN: SETB EX0SETB IT0SETB EAMOV A,#01HA1: MOV P0,AJB 20H.2,B1JNB 20H.2,B2A2: JB 20H.3,LOOP11 JNB 20H.3,LOOP22 B1: LCALL DELAY1LJMP A2B2: LCALL DELAY2LJMP A2LOOP11: RL ALJMP A1LOOP22: RR ALJMP A1ORG 0600HDELAY1: MOV R0,#100D1: MOV R1,#100D2: MOV R2,#10D3: DJNZ R2,D3DJNZ R1,D2DJNZ R0 ,D1RET4.实验心得开始熟悉开发板,通过实验2加强了对单片机的了解,学会中断程序的书写方法,学会搭线的各种技巧,并且掌握了跑马灯工作的原理。