实验三 数码管动态显示程序设计1
数码管动态显示EDA实验三

实验三数码管动态显示姓名:赵佳伟学号:1002100449一、实验目的l、实现实现0~9十个数的动态显示。
2、掌握数码管的工作状态。
二、实验的硬件要求1、输入:CLK时钟信号2、输出:LED灯3、主芯片:ALTERA下载板三、实验内容用VHDL语言输入法设计一个数码管动态显示电路,要求能够使之在0~9循环显示。
四、实验步骤(1)进入windows操作系统,打开MAX+PLUSⅡ10.0。
1、启动File/Project Name菜单,输入设计项目的名字。
点Assign/Device菜单,选择器件(本设计全选用EPM7128) 。
见图2.2.1。
2、启动菜单File/New,选择Text Editor file,打开编程编辑器,进行原理图设计输入。
图2.2.1(2)输入代码(下图2.2.2)3、保存单击保存按钮,扩展名为.vhd,本实验中取名为:p4_5.vhd。
(3)编译启动MAX+PLUS II\COMPILER菜单,按START开始编译,生成.SOF和.POF等文件,以便硬件下载和编程时调用,同时生成.RPT文件,如图2.2.3。
图2.2.3(4)仿真1、创建波形文件:①首先,将设计指定为当前项目。
②创建一个波形文件。
选择菜单MAX+PLUSⅡ\Waveform Editor,打开仿真工具Waveform Editor,或选择新建一个Waveform Editor文件,将创建一个新的无标题波形文件,如图2.2.4所示:③储存波形文件。
选择File\Save As,在File Name框中,输入相应文件名,单击OK 按钮存盘。
④设定时间轴网格大小。
选择菜单Option\Grid Size,输入时间间隔(20ns),单击OK 按钮。
⑤设定时间轴长度。
选择菜单File\End Time并输入文件的结束时间(1s )。
图2.2.42、选择欲仿真的引线端子:①选择菜单Node\Enter Nodes Nodes from SNF出现如图2.2.5所示对话框。
数码管动态显示实验报告

数码管动态显示实验报告1.实验目的:本实验旨在通过使用单片机控制数码管的动态显示,了解数码管的原理和使用方法,加深对单片机控制的理解。
2.实验原理:数码管是由许多发光二极管(LED)组成的,每个数码管有7个发光二极管组成7段,再加上一个小数点(或8段数码管),通过控制每个发光二极管的亮灭状态,可以显示出数字、字母等字符。
本实验使用的是共阴极数码管,在通常情况下,数码管引脚为低电平时亮灯,为高电平时灭灯。
3.实验器材:-STC89C52单片机-共阴极数码管-电阻-面包板及连接线-电源4.实验步骤:步骤1:连接电路将数码管的7个引脚分别连接到单片机的7个I/O引脚上,并通过电阻限流。
连接电路后,确认连接无误。
步骤2:编写程序使用C语言编写程序,实现数码管的动态显示。
可以使用延时函数和位操作函数控制数码管的亮灭,通过改变每个数码管引脚的高低电平状态,实现显示不同的数字、字母。
步骤4:实验观察与分析观察数码管的显示效果,通过改变程序中的参数,可以实现不同的显示效果。
5.实验结果与分析:经过实验,我们成功实现了数码管的动态显示。
通过编写程序,我们可以实现数码管显示数字、字母等不同的字符。
调整程序中的参数,可以实现不同的动态显示效果,如流水灯、闪烁等。
数码管的动态显示是通过改变每个数码管引脚的高低电平实现的,通过快速改变引脚电平状态的时间间隔,创建了肉眼无法察觉的视觉效果,从而实现了动态显示。
此外,通过实验我们还了解到了单片机控制数码管的原理和方法,加深了对单片机控制的理解。
6.实验总结:通过本实验,我们了解到了数码管的动态显示原理和方法,并通过编写程序,成功实现了数码管的动态显示。
同时,我们还巩固了单片机控制的知识,提高了自己的动手能力和问题解决能力。
在今后的学习和工作中,我们将进一步掌握数码管的使用方法,并能够将其应用于更加复杂的应用场景中,实现更多有趣的功能。
数码管动态显示程序编写步骤

数码管动态显示程序编写步骤一、准备工作在编写数码管动态显示程序之前,我们需要准备以下工作:1. 硬件设备:数码管、开发板等;2. 开发环境:Arduino IDE等;3. 相关库函数:例如“TM1637.h”库。
二、引入库函数在编写数码管动态显示程序之前,我们首先需要在代码中引入相应的库函数。
在Arduino IDE中,可以通过“库管理器”来搜索并安装需要的库函数。
三、初始化设置在开始编写程序之前,我们需要先对数码管进行初始化设置。
这包括设置数码管的引脚连接方式、亮度等参数。
四、定义变量在程序中我们需要定义一些变量来保存要显示的数字、字符等信息。
可以根据需要定义不同类型的变量,例如整型、字符型等。
五、编写显示函数编写一个显示函数来控制数码管的显示效果。
该函数可以接收一个参数,用来指定要显示的内容。
六、主函数在主函数中,我们可以通过调用显示函数来控制数码管的显示效果。
可以根据需要设置循环次数、延时时间等参数,来实现不同的显示效果。
七、编译与上传在编写完程序后,我们需要将代码进行编译,并将程序上传到开发板中进行运行。
在Arduino IDE中,可以点击“编译”按钮进行代码的编译,然后点击“上传”按钮将代码上传到开发板。
八、调试与优化在程序运行过程中,可能会出现一些问题,例如数码管显示异常、数字错误等。
这时候我们需要对程序进行调试,并进行相应的优化。
可以通过添加调试信息、查看变量的值等方式来进行调试。
九、总结通过以上步骤,我们可以编写出一个简单的数码管动态显示程序。
通过调整不同的参数和函数,我们可以实现不同的显示效果。
读者可以根据自己的需求进一步扩展和优化程序,实现更加复杂的功能。
编写数码管动态显示程序并不复杂,只需要按照上述步骤进行操作即可。
希望本篇文章对读者有所帮助,能够让大家更好地理解和掌握数码管动态显示程序的编写方法。
祝大家编程愉快!。
数码管动态扫描显示实验.

实验三定时器和中断实验一、实验目的1、学习51单片机内部定时器的使用方法。
2、掌握中断处理程序的方法。
3、掌握数码管与单片机的连接方法和简单显示编程方法。
4、学习和理解数码管动态扫描的工作原理。
二、实验内容1、使用定时器T0,定时1秒,控制P1口发光管循环点亮。
2、使用定时器T0,定时1秒,控制1个数码管循环显示数字0~9,每秒钟数字加一。
3、使用软件定时1秒,控制2个数码管循环显示秒数0~59,每秒钟数字加一。
4、使用定时器T0,定时1秒,控制2个数码管循环显示秒数0~59,每秒钟数字加一。
三、实验电路图四、实验说明1、数码管的基本概念(1)段码数码管中的每一段相当于一个发光二极管,8段数码管则具有8个发光二极管。
本次实验使用的是共阴数码管,公共端是1、6,公共端置0,则某段选线置1相应的段就亮。
公共端1控制左面的数码管;公共端6控制右面的数码管。
正面看数码管的引脚、段选线和数据线的对应关系为:图1 数码管封装图图2 数据线与数码管管脚连接关系段码是指在数码管显示某一数字或字符时,在数码管各段所对应的引脚上所加的高低电平按顺序排列所组成的一个数字,它与数码管的类型(共阴、共阳)(2)位码位码也叫位选,用于选中某一位数码管。
在实验图中要使第一个数码管显示数据,应在公共端1上加低电平,即使P2.7口为0,而公共端6上加高电平,即使P2.6口为1。
位码与段码一样和硬件连接有关。
(3)拉电流与灌电流单片机的I/O 口与其他电路连接时,I/O 电流的流向有两种情况:一种是当该I/O 口为高电平时,电流从单片机往外流,称作拉电流;另一种是该I/O 口为低电平时,电流往单片机内流,称为灌电流。
一般I/O 的灌电流负载能力远大于拉电流负载能力,对于一般的51 单片机而言,拉电流最大4mA,灌电流为20mA。
一般在数码管显示电路中采用灌电流方式(用共阳数码管),可以得到更高的亮度。
本实验电路中采用拉电流方式(用共阴数码管)。
FPGA实验三七段数码管静态与动态显示实验报告

FPGA实验三七段数码管静态与动态显示实验报告实验目的:通过FPGA实现七段数码管的静态与动态显示,在FPGA上可实现对任意数字的显示和计数功能。
实验原理:七段数码管是一种能够显示数字的晶体管数字显示器件,它由七个LED数码管组成,每个数码管分别由a、b、c、d、e、f、g七个LED组成。
通过控制每个LED的亮灭情况,可以对任意数字进行显示。
七段数码管的静态显示是指每个数字的显示都是固定的,而动态显示则是通过快速地刷新七段数码管的显示,使得数字像是在变化。
在FPGA 中,可以通过时钟信号和计数器实现刷新,从而实现数字的动态显示。
实验过程:首先,将FPGA和七段数码管连接,在FPGA上选择适当的引脚连接到a、b、c、d、e、f、g七个数码管。
在FPGA中创建工程,并添加适当的引脚约束,以实现与七段数码管的连接。
然后,根据需要选择静态或动态显示。
静态显示:静态显示的原理是通过直接控制每个LED的亮灭情况,使得每个数字都可以被显示出来。
首先,需要定义每个数字对应的LED的状态(亮灭),例如数字0对应的LED状态可能为(1,1,1,1,1,1,0)等。
然后,通过FPGA的逻辑电路实现对应数字的显示。
动态显示:动态显示的原理是通过快速地刷新显示,使得数字在若干个数码管中切换,从而造成数字变化的视觉效果。
这里需要使用时钟信号和计数器来控制刷新。
首先,需要设计一个计数器,它的计数范围应该与显示数字的个数相同。
然后,通过时钟信号让计数器开始计数,并根据计数器的值选择对应的数字显示在七段数码管上。
通过控制计数器的计数速度和刷新频率,可以实现数字的动态显示。
实验结果:经过实验,我们成功地实现了七段数码管的静态显示和动态显示。
在静态显示中,我们可以通过FPGA的逻辑电路对七段数码管的每个LED进行控制,从而实现任意数字的显示。
在动态显示中,我们通过时钟信号和计数器实现了刷新功能,使得数字在七段数码管中快速地切换,从而呈现出动态的显示效果。
单片机实验3 数码管控制实验-动态显示

;实验名称:数码管动态显示
;功能:4位数码管循环显示“0123”“4567”“89AB”“CDEF”,间隔0.5S。
;编写人:陈建泽
;编写时间:2010年11月2日
/**********************程序代码************************/
D1MS: MOV R2,#250 ;250*(1+1+2)=1000us=1ms
L1:NOP
NOP
DJNZ R2,L1
RET
/*****************中断服务子程序*****************/
T0_INT:MOV TH0,#(65536-50000)/256
MOV TL0,#(65536-50000)MOD 256
MOV A,R4
CJNE A,#16,L3
AJMP MAIN
L3:MOV R5,A
AJMP L1
DIS:MOV P2,R6;用A作为中间寄存器,因后面要循环显示
MOV A,R5
ACALL SQR ;查表
MOV P0,A
ACALL D1MS ;1ms
INC R5
MOV A,R6
RL A;指向下一位
MOV R6,A
RET;子程序返回
TAB: DB 0C0H,0F9H,0A4H,0B0H ;共阳极字型码表0、1、2、3
DB 99H, 92H, 82H, 0F8H;共阳极字型码表4、5、6、7
DB 80H, 90H, 88H, 83H;共阳极字型码表8、9、A、B
DB 0C6H,0A1H,86H, 8EH;共阳极字型码表C、D、E、F
EDA设计课程实验报告数码管动态显示实验报告

EDA设计课程实验报告实验题目:数码管动态显示实验学院名称:专业:电子信息工程班级:姓名:高胜学号小组成员:指导教师:一、实验目的学习动态扫描显示的原理;利用数码管动态扫描显示的原理编写程序,实现自己的学号的显示。
二、设计任务及要求1、在SmartSOPC实验箱上完成数码管动态显示自己学号的后八个数字。
2、放慢扫描速度演示动态显示的原理过程。
三、系统设计1、整体设计方案数码管的八个段a,b,c,d,e,f,g,h(h是小数点)都分别连接到SEG0~SEG7,8个数码管分别由八个选通信号DIG0~DIG7来选择,被选通的数码管显示数据,其余关闭。
如果希望8个数码管显示希望的数据,就必须使得8个选通信号DIG0~DIG7分别被单独选通,并在此同时,在段信号输入口SEG0~SEG7加上该对应数码管上显示的数据,于是随着选通信号的扫描就能实现动态扫描显示的目的。
虽然每次只有1个数码管显示,但只要扫描显示速率足够快,利用人眼的视觉余辉效应,我们仍会感觉所有的数码管都在同时显示。
2、功能模块电路设(1)输入输出模块框图(见图1)图1(2)模块逻辑表达(见表1)表1(数码管显示真值表)clk_1k dig seg↑01111111 C0↑10111111 F9注:数码管显示为01180121(3)算法流程图(见图2)(4)Verilog源代码module scan_led(clk_1k,d,dig,seg); //模块名scan_ledinput clk_1k; //输入时钟input[31:0] d; //输入要显示的数据output[7:0] dig; //数码管选择输出引脚output[7:0] seg; //数码管段输出引脚reg[7:0] seg_r; //定义数码管输出寄存器reg[7:0] dig_r; //定义数码管选择输出寄存器reg[3:0] disp_dat; //定义显示数据寄存器reg[2:0]count; //定义计数寄存器assign dig = dig_r; //输出数码管选择assign seg = seg_r; //输出数码管译码结果always @(posedge clk_1k) //定义上升沿触发进程begincount <= count + 1'b1;endalways @(posedge clk_1k)begincase(count) //选择扫描显示数据3'd0:disp_dat = d[31:28]; //第一个数码管3'd1:disp_dat = d[27:24]; //第二个数码管3'd2:disp_dat = d[23:20]; //第三个数码管3'd3:disp_dat = d[19:16]; //第四个数码管3'd4:disp_dat = d[15:12]; //第五个数码管3'd5:disp_dat = d[11:8]; //第六个数码管3'd6:disp_dat = d[7:4]; //第七个数码管3'd7:disp_dat = d[3:0]; //第八个数码管endcasecase(count) //选择数码管显示位3'd0:dig_r = 8'b01111111; //选择第一个数码管显示3'd1:dig_r = 8'b10111111; //选择第二个数码管显示3'd2:dig_r = 8'b11011111; //选择第三个数码管显示3'd3:dig_r = 8'b11101111; //选择第四个数码管显示3'd4:dig_r = 8'b11110111; //选择第五个数码管显示3'd5:dig_r = 8'b11111011; //选择第六个数码管显示3'd6:dig_r = 8'b11111101; //选择第七个数码管显示3'd7:dig_r = 8'b11111110; //选择第八个数码管显示endcaseendalways @(disp_dat)begincase(disp_dat) //七段译码4'h0:seg_r = 8'hc0; //显示04'h1:seg_r = 8'hf9; //显示14'h2:seg_r = 8'ha4; //显示24'h3:seg_r = 8'hb0; //显示34'h4:seg_r = 8'h99; //显示44'h5:seg_r = 8'h92; //显示54'h6:seg_r = 8'h82; //显示64'h7:seg_r = 8'hf8; //显示74'h8:seg_r = 8'h80; //显示84'h9:seg_r = 8'h90; //显示94'ha:seg_r = 8'h88; //显示a4'hb:seg_r = 8'h83; //显示b4'hc:seg_r = 8'hc6; //显示c4'hd:seg_r = 8'ha1; //显示d4'he:seg_r = 8'h86; //显示e4'hf:seg_r = 8'h8e; //显示fendcaseendendmodule四、系统调试(1)仿真代码`timescale 1ns/1nsmodule scan_ledfz;reg clk_1k;reg[31:0] d;wire[7:0] dig;wire[7:0] seg;parameter dely=100;scan_led u1(clk_1k,d,dig,seg);always #(dely/2)clk_1k=~clk_1k;initial beginclk_1k=0;d=32'h01180134;#dely ;#dely ;#dely ;#dely ;#dely ;#(dely*20);#dely $finish;endinitial $monitor($time,,,"%b,%d,%h,%h",clk_1k,d,dig,seg); endmodulemodule scan_led(clk_1k,d,dig,seg); //模块名scan_ledinput clk_1k; //输入时钟input[31:0] d; //输入要显示的数据output[7:0] dig; //数码管选择输出引脚output[7:0] seg; //数码管段输出引脚reg[7:0] seg_r; //定义数码管输出寄存器reg[7:0] dig_r; //定义数码管选择输出寄存器reg[3:0] disp_dat; //定义显示数据寄存器reg[2:0] count=3'b000; //定义计数寄存器assign dig = dig_r; //输出数码管选择assign seg = seg_r; //输出数码管译码结果always @(posedge clk_1k) //定义上升沿触发进程begincount <= count + 1'b1;endalways @(posedge clk_1k)begincase(count) //选择扫描显示数据3'd0:disp_dat = d[31:28]; //第一个数码管3'd1:disp_dat = d[27:24]; //第二个数码管3'd2:disp_dat = d[23:20]; //第三个数码管3'd3:disp_dat = d[19:16]; //第四个数码管3'd4:disp_dat = d[15:12]; //第五个数码管3'd5:disp_dat = d[11:8]; //第六个数码管3'd6:disp_dat = d[7:4]; //第七个数码管3'd7:disp_dat = d[3:0]; //第八个数码管endcasecase(count) //选择数码管显示位3'd0:dig_r = 8'b01111111; //选择第一个数码管显示3'd1:dig_r = 8'b10111111; //选择第二个数码管显示3'd2:dig_r = 8'b11011111; //选择第三个数码管显示3'd3:dig_r = 8'b11101111; //选择第四个数码管显示3'd4:dig_r = 8'b11110111; //选择第五个数码管显示3'd5:dig_r = 8'b11111011; //选择第六个数码管显示3'd6:dig_r = 8'b11111101; //选择第七个数码管显示3'd7:dig_r = 8'b11111110; //选择第八个数码管显示endcaseendalways @(disp_dat)begincase(disp_dat) //七段译码4'h0:seg_r = 8'hc0; //显示04'h1:seg_r = 8'hf9; //显示14'h2:seg_r = 8'ha4; //显示24'h3:seg_r = 8'hb0; //显示34'h4:seg_r = 8'h99; //显示44'h5:seg_r = 8'h92; //显示54'h6:seg_r = 8'h82; //显示64'h7:seg_r = 8'hf8; //显示74'h8:seg_r = 8'h80; //显示84'h9:seg_r = 8'h90; //显示94'ha:seg_r = 8'h88; //显示a4'hb:seg_r = 8'h83; //显示b4'hc:seg_r = 8'hc6; //显示c4'hd:seg_r = 8'ha1; //显示d4'he:seg_r = 8'h86; //显示e4'hf:seg_r = 8'h8e; //显示fendcaseendendmodule位码代码仿真代码`timescale 1ns/1nsmodule smg_tp; //测试模块的名字reg [2:0] c; //测试输入信号定义为reg型wire[7:0] dig; //测试输出信号定义为wire型parameter DEL Y=100; //延时100秒wei u1(c,dig); //调用测试对象initial begin //激励波形设定c=3'b0;#DEL Y c=3'b001 ;#DEL Y c=3'b010 ;#DEL Y c=3'b100 ;#DEL Y c=3'b101 ;#DEL Y c=3'b110 ;#DEL Y c=3'b111 ;#DEL Y $finish;endinitial $monitor($time,,,"dig=%d,c=%b ",dig,c); //输出格式i定义endmodulemodule wei(c,dig); //命名模块名字input[2:0] c;output[7:0] dig; //定义输入与输出reg[7:0] dig_r;reg[2:0] c_r; // 定义dig_r与c_r2个reg型数据assign dig=dig_r; //将reg型数据转化为wire型数据always @(*) //检测c_r的数据是否变化begin c_r=c;case (c_r)3'b000:dig_r=8'b11111110; //c_r的数据变化而dig_r对于的数据变化3'b001:dig_r=8'b11111101;3'b010:dig_r=8'b11111011;3'b011:dig_r=8'b11110111;3'b100:dig_r=8'b11101111;3'b101:dig_r=8'b11011111;3'b110:dig_r=8'b10111111;3'b111:dig_r=8'b01111111;default: dig_r=8'b11111111;endcase //结束case语句end //结束always语句endmodule //结束程序译码器代码仿真代码`timescale 1ns/1nsmodule duan_tp; //测试模块的名字reg[3:0] a; //测试输入信号定义为reg型wire[7:0] seg; //测试输出信号定义为wire型parameter DEL Y=100; //延时100秒duan u1(a,seg); //调用测试对象initial begin //激励波形设定a=4'b0;#DELY a=4'b0001;#DELY a=4'b0010;#DELY a=4'b0011;#DELY a=4'b0100;#DELY a=4'b0101;#DELY a=4'b0110;#DELY a=4'b0111;#DELY a=4'b1000;#DELY a=4'b1001;#DELY a=4'b1010;#DELY a=4'b1011;#DELY a=4'b1100;#DELY a=4'b1101;#DELY a=4'b1110;#DELY a=4'b1111;#DELY $finish;endinitial $monitor($time,,,"seg=%d,a=%b",seg,a); //输出格式i定义endmodulemodule duan(a,seg); //命名模块名字input[3:0] a;output[7:0] seg; //定义输入与输出reg[7:0] seg_r;reg[3:0] a_r; // 定义seg_r与a_r2个reg型数据assign seg=seg_r; //将reg型数据转化为wire型数据always @(*) //检测c_r的数据是否变化begin a_r=a;case(a_r) //七段译码4'b0000:seg_r = 8'hc0; //显示04'b0001:seg_r = 8'hf9; //显示14'b0010:seg_r = 8'ha4; //显示24'b0011:seg_r = 8'hb0; //显示34'b0100:seg_r = 8'h99; //显示44'b0101:seg_r = 8'h92; //显示54'b0110:seg_r = 8'h82; //显示64'b0111:seg_r = 8'hf8; //显示74'b1000:seg_r = 8'h80; ///显示84'b1001:seg_r = 8'h90; //显示94'b1010:seg_r = 8'h88; //显示a4'b1011:seg_r = 8'h83; //显示b4'b1100:seg_r = 8'hc6; //显示c4'b1101:seg_r = 8'ha1; //显示d4'b1110:seg_r = 8'h86; //显示e4'b1111:seg_r = 8'h8e; ///显示f endcase //结束case语句end //结束always语句endmodule //结束程序(2)仿真波形图(3)引脚图五、实验感想通过这次实验,让我学习动态扫描显示的原理;利用数码管动态扫描显示的原理编写程序,实现自己的学号的显示。
数码管动态显示实验

数码管动态显示实验一该实验采用proteus 7.5 sp3进行的仿真,仿真原理图如下图所示,其中采用的元器件有AT89C51单片机,74HC573锁存器,共阳极数码管。
单片机的P0口用与输出数码管要显示的段码,P2口用于选通要点亮的数码管。
数码管通过动态扫描显示HELLO,HELLO循环左移,左移一位LED灯亮下。
实验程序如下:/*********************************************************************** 程序名; 数码管动态显示实验* 功能:数码管通过动态扫描显示HELLO,HELLO循环左移,左移一位LED灯* 亮下。
* 编程者:ZPZ* 编程时间:2009/8/4**********************************************************************/#include<reg52.h>#include <intrins.h>#define uint unsigned int#define uchar unsigned charsbit P1_7=P1^7;uchar num;uchar code table2[]={0x89,0x86,0xc7,0xc7,0xc0,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0x89,0x86,0xc7,0xc7,0xc0,0xbf};void delay(uint);void main(){unsigned long b=0;uint a;uint l=0,k=6;P1_7=0;while(1){b++;a=0x01;if(b<80){for(num=l;num<k;num++){P2=a;a=a<<1;if(a==0x40)a=0x01;P0=table2[num];delay(2);}}else{ b=0;l++;k++;P1_7=!P1_7;if(l==12){l=0;k=6;}}}}void delay(uint z){uint i,j;for(i=z;i>0;i--)for(j=110;j>0;j--);}数码管动态显示实验二该实验如同实验一,不同之处在于,该实验是将预先设定的一个百位数,通过动态扫描使其在数码管的后三位显示。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验三数码管动态显示程序设计实验目的1、理解数码管动态显示原理2、理解数码管动态显示电路的设计方法3、掌握数码管动态显示程序的设计方法实验仪器单片机开发板、万利仿真机、稳压电源、计算机实验内容1、动态扫描显示程序2、特征位小数点控制显示程序实验电路图实验步骤及调试信息1、新建实验项目2、输入实验程序并补充完整;------------------------------------------------------;数码管动态显示程序;包含小数点显示;位选码输出有两种方式:; DispSelection1: 一次一位; DispSelection2: 一次一字节;; 2009-08-20;-------------------------------------------------------LEDCLK bit P3.4LEDDIN bit P2.3LEDDATA data P0dseg at 30hdispbuf: ds 8 ;显示缓冲区8字节disppoint: ds 1 ;小数点控制数据maincode SEGMENT CODECSEG at 0LJMP StartRSEG maincodeStart: CLR E Amov sp,#0c0hmov dispbuf ,#08hmov dispbuf+1, #04hmov dispbuf+2, #00hmov dispbuf+3, #08hmov dispbuf+4, #02hmov dispbuf+5, #00hmov dispbuf+6, #02hmov dispbuf+7, #07hmov disppoint,#02h ;第2位小数点亮LCALL dispSJMP $-3;------------------------------------------------------;数码管动态显示程序;包含小数点显示;位选码输出有两种方式:; DispSelection1: 一次一位; DispSelection2: 一次一字节;; 2009-08-20;-------------------------------------------------------Disp: MOV R7,#8MOV R0,#dispbufCLR LEDCLKSETB L EDDINDisp1: MOV A,@R0MOV DPTR,#DispTabMOVC A,@A+DPTRcpl a; LCALL Dispdot ;显示小数点程序MOV LEDDA TA,A ;在输出之前加入显示小数点程序LCALL DispSelection1 ;输出位选择信号,DispSelection2是第二种; lcall dispsel3LCALL Delay1msmov p2,#0ffhINC R0DJNZ R7,Disp1mov p2,#0ffhRET;-------------------------------------------------;位选码以一次一位方式输出;-------------------------------------------------dispsel3:mov dptr,#DispSTabmov a,r7movc a,@a+dptrcpl a; swap amov p2,aretDispSelection1:CJNE R7,#8,DispSelection11CLR L EDDINDispSelection11:SETB LEDCLKNOPCLR L EDCLKSETB LEDDINRET;-------------------------------------------------;位选码以一次一字节方式输出;-------------------------------------------------DispSelection2:MOV B,#8MOV DPTR,#DispSTabMOV A,R7MOVC A,@A+DPTRCPL ADispSelection21:RLC AMOV LEDDIN,CSETB LEDCLKNOPCLR L EDCLKDJNZ B,DispSelection21RETDispSTab: DB 00H,80H,20H,40H,10H,08H,04H,02H,01H;位选码数据表dispa equ 80h ;数码管各段数据定义dispb equ 40hdispc equ 20hdispd equ 10hdispe equ 08hdispf equ 04hdispg equ 02hdisph equ 01hdisp8 equ 0ffh-disphDispTab: db disp8-dispg,dispb+dispc,dispa+dispb+dispg+dispd+dispe ;0,1,2 db disp8-dispe-dispf,disp8-dispa-dispd-dispe,disp8-dispb-dispe;3,4,5db disp8-dispb,dispa+dispb+dispc,disp8,disp8-dispe ;6,7,8,9db disp8-dispd,disp8-dispa-dispb,disp8-dispb-dispc-dispg ;a,b,cdb disp8-dispa-dispf,disp8-dispb-dispc,disp8-dispb-dispc-dispd;d,e,fdb disp8-dispb-dispc,0ffh,00h,dispg ;H,全亮,全暗,-;--------------------------------------------------------------------;特征位小数点控制显示程序;把小数点显示程序加到显示码输出之前;输入:A : 显示译码值; R7:当前正在显示的LED编号;输出:无;--------------------------------------------------------------------Dispdot:MOV B,AMOV A,R7MOV DPTR,#DispSTabMOVC A,@A+DPTRANL A,disppointSETB C ;本行及以下4行可改成MOV C,PJZ Dispdot1CLR C;点亮小数点Dispdot1:CPL C ;本行根据情况增减MOV A,BCPL AMOV ACC.7,C ;小数点由D7控制; MOV LEDDA TA,A ;本行可以删除RETDelayNms:LCALL Delay1msDJNZ R7, $-3RETDelay1ms:PUSH 07MOV R7,#250 ;1msNOPNOPDJNZ R7, $-2POP 07RETEND3、编译下载实验程序,并修改错误(按附录说明)4、全速运行程序,查看实验现象。
数码管稳定的显示8408 20276、单步执行,分析各程序的功能特点。
7、整理实验设备实验现象在LED数码管上稳定显示8408 2027,没有闪烁等情况。
说明显示扫描速度较快,一般大于50Hz以上。
LED数码管有一盏不亮,原因是它对应的三极管不能正常工作。
程序运行之后,0030H后8位为08 04 00 08 02 00 02 07调试信息1、编译无误。
2、程序各主要部分运行时间显示一位数码管用时524us,显示8位用时4195us。
3、通过改变move disppoint,#08H 可以改变显示小数点。
如要显示后3位小数点,可改为move disappoint,#07H.思考题1、运行上面的程序,计算显示程序每秒运行的次数?答:显示8位数码管用时4197us,所以显示程序每秒运行次数为1÷(4197×10-6)﹦238次。
2、请说明数码管的消隐如何实现。
;包含小数点显示;位选码输出有两种方式:; DispSelection1: 一次一位; DispSelection2: 一次一字节;; 2009-08-20;------------------------------------------------------- LEDCLK bit P3.4LEDDIN bit P2.3LEDDATA data P0dseg at 30hdispbuf: ds 8 ;显示缓冲区8字节;disppoint: ds 1 ;小数点控制数据disapper: ds 1maincode SEGMENT CODECSEG at 0LJMP StartRSEG maincodeStart:CLR EAMOV sp,#0c0h ;重定义堆栈空间MOV dispbuf+0 ,#08h ;往显示缓冲区填充数MOV dispbuf+1, #04hMOV dispbuf+2, #00hMOV dispbuf+3, #08hMOV dispbuf+4, #02hMOV dispbuf+5, #00hMOV dispbuf+6, #02hMOV dispbuf+7, #07h;MOV disppoint, #08h ;第4位小数点亮MOV disapper ,#01h ;第1位数码管消隐LCALL dispSJMP $-3;------------------------------------------------------;数码管动态显示程序;包含小数点显示;位选码输出有两种方式:; DispSelection1: 一次一位; DispSelection2: 一次一字节;-------------------------------------------------------Disp:MOV R7,#8MOV R0,#dispbuf ;送缓冲区首地址CLR LEDCLK ;送低电平SETB LEDDIN ;Disp1:MOV A,@R0 ;送要显示的数据MOV DPTR,#DispTab ;表首地址MOVC A,@A+DPTR ;查表;CPL A; LCALL Dispdot ;显示小数点程序LJMP disapper1 ;消隐程序F: MOV LEDDATA,A ;在输出之前加入显示小数点程序LCALL DispSelection1 ;输出位选择信号,DispSelection2是第二种; LCALL dispsel3LCALL Delay1msMOV P2,#0FFHINC R0DJNZ R7,Disp1MOV P2,#0FFHRET;------------------------------------------------------- ;位选码以一次一位方式输出;------------------------------------------------------- ;dispsel3:;; MOV DPTR,#DispSTab; MOV A,R7; MOVC A,@A+DPTR; CPL A; swap A; MOV P2,A; RETdisapper1:mov B,AMOV A,R7MOV DPTR,#DispSTabmovc A,@A+DPTRANL A, disapperJNZ disapper2MOV A,BCPL ALJMP F ;不消隐disapper2:MOV A,#0FFHLJMP F ;消隐DispSelection1:; PUSH ACC; MOV LEDDATA,0FFHCJNE R7,#8,DispSelection11CLR LEDDIN; POP ACC; MOV LEDDATA,ADispSelection11:SETB LEDCLKNOPCLR LEDCLKSETB LEDDINRET;-------------------------------------------------;位选码以一次一字节方式输出;6和7不能显示相反;-------------------------------------------------DispSelection2:MOV B,#8MOV DPTR,#DispSTabMOV A,R7MOVC A,@A+DPTRCPL ADispSelection21:RLC AMOV LEDDIN,CSETB LEDCLKNOPCLR LEDCLKDJNZ B,DispSelection21RETDispSTab:DB 00H,80H,20H,40H,10H,08H,04H,02H,01H;位选码数据表dispa equ 80h ;数码管各段数据定义dispb equ 40hdispc equ 20hdispd equ 10hdispe equ 08hdispf equ 04hdispg equ 02hdisph equ 01hdisp8 equ 0ffh-disphDispTab:db disp8-dispg,dispb+dispc,dispa+dispb+dispg+dispd+dispe ;0,1,2 dbdisp8-dispe-dispf,disp8-dispa-dispd-dispe,disp8-dispb-dispe;3,4,5 db disp8-dispb,dispa+dispb+dispc,disp8,disp8-dispe ;6,7,8,9 db disp8-dispd,disp8-dispa-dispb,disp8-dispb-dispc-dispg ;a,b,c dbdisp8-dispa-dispf,disp8-dispb-dispc,disp8-dispb-dispc-dispd;d,e,f db disp8-dispb-dispc,0ffh,00h,dispg ;H,全亮,全暗,-;-------------------------------------------------------------------- ;特征位小数点控制显示程序;把小数点显示程序加到显示码输出之前;输入:A : 显示译码值; R7:当前正在显示的LED编号;输出:无;-------------------------------------------------------------------- Dispdot:MOV B,AMOV A,R7MOV DPTR,#DispSTabMOVC A,@A+DPTR; ANL A,disppointSETB C ;本行及以下4行可改成MOV C,PJZ Dispdot1CLR C ;点亮小数点Dispdot1:; CPL C ;本行根据情况增减MOV A,BCPL AMOV ACC.0,C ;小数点由D7控制; MOV LEDDATA,A ;本行可以删除RETDelayNms:LCALL Delay1msDJNZ R7, $-3RETDelay1ms:PUSH 07MOV R7,#250 ;1msNOPNOPDJNZ R7, $-2POP 07RETEND。