当前位置:文档之家› 微机原理实验四 LED数码管显示实验汇总

微机原理实验四 LED数码管显示实验汇总

实验名称 LED数码管显示实验指导教师专业班级姓名学号联系方式一实验要求:实验四 LED数码管显示实验实验目的:理解LED七段数码管的显示控制原理,掌握数码管与MCU的接口技术,能够编写数码管显示驱动程序;熟悉接口程序调试方法。

实验内容:利用C8051F310单片机控制数码管显示器基本要求:利用末位数码管循环显示数字0-F,显示切换频率为1Hz。

提高要求:在数码管上显示0→199计数,计数间隔为0.5秒。

二、设计思路1 基本要求:对F310信号频率进行8分频,再对定时器进行48分频,以使在一次定时时间范围内实现1s定时。

采用查询方式进行定时。

P0.6,P0.7作为位选信号来一直选择末位数码管输出信号。

再利用R0作为相对寻址来储存数据并赋值给A。

通过MOVC A, @A+DPTR指令,利用顺序查表法取出显示段码数据。

寄存器R0自增1,并赋给A以取出下一个显示段码数据。

2 提高要求:依然对信号频率八分频,对定时器进行48分频,通过P0,6,P0.7进行位控选择数码管输出,定时器定时0.5s,当溢出时进入中断,并通过中断程序将段位控制按序加一,R3,R6,R7分别储存第一第二第三位数码管段位码,利用A 为中间变量,通过P1输出储存的值,查表输出数码管值,达到119时结束。

三、资源分配1 基本要求:P0.6: 位选信号端口P0.7:位选信号端口P1:输出段码数据R0:存放显示数据DPTR:指向段码数据表首2 提高要求:P0.6: 位选信号端口P0.7:位选信号端口P1:输出段码数据DPTR:指向段码数据表首R3,R6,R7:分别储存第三第二第一位数码管数据四、流程图1 基本要求2 提高要求:主程序接--2 提高要求:动态扫描程序中断程序五、源代码(含文件头说明、语句行注释)1 基本要求:ORG 0000HLJMP MAINORG 0100HMAIN:LCALL Init_DeviceMOV SP,#40HMOV DPTR,#TAB ;将DPTR地址指向表头MOV TMOD,#01H ;定时器采用T0定时方式一MOV TH0,#06H ;定时器赋予初值MOV TL0,#0C6HCLR P0.6 ;选择末位数码管CLR P0.7START:MOV R0,#00H ;赋初值0CLR AMOVC A,@A+DPTR ;查表输出MOV P1,ASETB TR0 ;定时器开始工作HERE:JNB TF0,HERE ;等待溢出CLR TR0CLR TF0MOV TH0,#06H ;重新赋予初值MOV TL0,#0C6HCJNE R0,#0FH,NEXT ;等待末位数码管到FSJMP STARTNEXT:INC R0 ; R0加一MOV A,R0MOVC A,@A+DPTRMOV P1,A ;P1输出SETB TR0SJMP HERE ;踏步org 1000hTAB:DB 0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H DB 0FEH,0E6H,0EEH,3EH,1AH,7AH,9EH,8EH;------------------------------------;- Generated Initialization File --;------------------------------------$include (C8051F310.inc)public Init_DeviceINIT SEGMENT CODErseg INIT; Peripheral specific initialization functions, ; Called from the Init_Device labelPCA_Init:anl PCA0MD, #0BFhmov PCA0MD, #000hretTimer_Init:mov CKCON, #002hretPort_IO_Init:; P0.0 - Unassigned, Open-Drain, Digital ; P0.1 - Unassigned, Open-Drain, Digital ; P0.2 - Unassigned, Open-Drain, Digital ; P0.3 - Unassigned, Open-Drain, Digital ; P0.4 - Unassigned, Open-Drain, Digital ; P0.5 - Unassigned, Open-Drain, Digital ; P0.6 - Unassigned, Open-Drain, Digital ; P0.7 - Unassigned, Open-Drain, Digital; P1.0 - Unassigned, Push-Pull, Digital ; P1.1 - Unassigned, Push-Pull, Digital ; P1.2 - Unassigned, Push-Pull, Digital ; P1.3 - Unassigned, Push-Pull, Digital ; P1.4 - Unassigned, Push-Pull, Digital ; P1.5 - Unassigned, Push-Pull, Digital ; P1.6 - Unassigned, Push-Pull, Digital ; P1.7 - Unassigned, Push-Pull, Digital ; P2.0 - Unassigned, Open-Drain, Digital; P2.1 - Unassigned, Open-Drain, Digital ; P2.2 - Unassigned, Open-Drain, Digital ; P2.3 - Unassigned, Open-Drain, Digitalmov P1MDOUT, #0FFhmov P2MDOUT, #0C0hmov XBR1, #040hret; Initialization function for device,; Call Init_Device from your main programInit_Device:lcall PCA_Initlcall Timer_Initlcall Port_IO_InitretEND2 提高部分:ORG 0000HLJMP STARTORG 000BHLJMP TI00ORG 0300HSTART:LCALL Init_DeviceMOV R3,#00H ;百位数码管赋予初值MOV R6,#00H ;十位数码管赋予初值MOV R7,#01H ;个位数码管赋予初值MOV 60H,#00H ;设置位控码MOV 61H,#40HMOV 62H,#80HMOV TMOD, #01H ;选择定时器T0方式一SETB ET0 ;开外中断T0SETB EAMOV TH0, #131 ;定时器赋予初值MOV TL0, #99MAIN:LJMP DISP ;跳入动态输出子程序MAIN1:LCALL COUNTERAJMP MAIN ;重新扫描;=================动态输出子程序==================DISP:MOV SP,#30H ;设置堆栈指针MOV R1,#60H ;位选指针赋初值MOV P1,#00H ;灯全灭;=================LD0:MOV A,@R1 ;取出位选码ANL P0,#3FH ;将P0端口高两位置零(这样做的目的是为了避免用MOV指令影响到P0端口的低6位)ORL P0,A ;输出位选信号MOV A,R7 ;取出段选码MOV DPTR,#TAB ;DPTR指向段选码表第一个数据MOVC A,@ A+DPTR ;查表,取出段选码MOV P1,A ;输出段选码LCALL DL1MS ;延时1ms,灯亮1msMOV P1,#00H ;灯全灭INC R1 ;位选指针加一MOV A,@R1 ;取出位选码ANL P0,#3FH ;将P0端口高两位置零(这样做的目的是为了避免用MOV指令影响到P0端口的低6位)ORL P0,A ;输出位选信号MOV A,R6 ;取出段选码MOV DPTR,#TAB ;DPTR指向段选码表第一个数据MOVC A,@ A+DPTR ;查表,取出段选码MOV P1,A ;输出段选码LCALL DL1MS ;延时1ms,灯亮1msMOV P1,#00H ;灯全灭INC R1MOV A,@R1 ;取出位选码ANL P0,#3FH ;将P0端口高两位置零(这样做的目的是为了避免用MOV指令影响到P0端口的低6位)ORL P0,A ;输出位选信号MOV A,R3 ;取出段选码MOV DPTR,#TAB ;DPTR指向段选码表第一个数据MOVC A,@ A+DPTR ;查表,取出段选码MOV P1,A ;输出段选码LCALL DL1MS ;延时1ms,灯亮1msMOV P1,#00H ;灯全灭LJMP MAIN1 ;返回主程序;===============延时1ms子程序=============ORG 0050HDL1MS:MOV R4,#4 ;延时程序通过R4,R5 实现D1:MOV R5,#253NOPDJNZ R5,$DJNZ R4,D1RETORG 0100HCOUNTER:SETB TR0 ;定时器开启RET;中断程序TI00:MOV TH0, #133 ;中断程序重新赋予初值MOV TL0,# 99INC R7 ;个位加一CJNE R7,#0BH,S1 ;判断个位是否进位MOV R7,#01H ;重新将个位归零CJNE R6,#00H,S2 ;判断此时十位是否显示MOV R6,#01H ;若不显示则开启显示S2:INC R6 ;十位加一CJNE R6,#0BH,S1 ;判断十位是否进位CJNE R3,#00H,S3 ;判断百位是否显示MOV R3,#01HS3:INC R3 ;百位加一MOV R6,#01H ;十位重新归零CJNE R3,#03H,S1 ;判断百位是否到2MOV P1,#00H ;如果到200则数码管全熄灭SJMP $ ;踏步停止S1:RETI ;中断返回ORG 0200H;===============段选码表==============;TAB: DB 00H,0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H,0FEH,0F6H; $include (C8051F310.inc)public Init_DeviceINIT SEGMENT CODErseg INIT; Peripheral specific initialization functions,; Called from the Init_Device labelPCA_Init:anl PCA0MD, #0BFhmov PCA0MD, #000hretTimer_Init:mov CKCON, #002hretPort_IO_Init:; P0.0 - Unassigned, Open-Drain, Digital ; P0.1 - Unassigned, Open-Drain, Digital ; P0.2 - Unassigned, Open-Drain, Digital ; P0.3 - Unassigned, Open-Drain, Digital ; P0.4 - Unassigned, Open-Drain, Digital ; P0.5 - Unassigned, Open-Drain, Digital ; P0.6 - Unassigned, Push-Pull, Digital ; P0.7 - Unassigned, Push-Pull, Digital; P1.0 - Unassigned, Push-Pull, Digital ; P1.1 - Unassigned, Push-Pull, Digital ; P1.2 - Unassigned, Push-Pull, Digital ; P1.3 - Unassigned, Push-Pull, Digital ; P1.4 - Unassigned, Push-Pull, Digital ; P1.5 - Unassigned, Push-Pull, Digital ; P1.6 - Unassigned, Push-Pull, Digital ; P1.7 - Unassigned, Push-Pull, Digital ; P2.0 - Unassigned, Open-Drain, Digital ; P2.1 - Unassigned, Open-Drain, Digital ; P2.2 - Unassigned, Open-Drain, Digital ; P2.3 - Unassigned, Open-Drain, Digitalmov P0MDOUT, #0C0hmov P1MDOUT, #0FFhmov XBR1, #040hret; Initialization function for device,; Call Init_Device from your main programInit_Device:lcall PCA_Initlcall Timer_Initlcall Port_IO_InitretEND六程序测试方法与结果、软件性能分析1 基本要求:测试方法:观察P1端口输出波形由图可知,LED数码管切换频率为1HZ,跑完一轮经过16s,满足定时要求。

相关主题