七段数码管显示程序
LED显示程序设计实验
实验二LED数码管驱动显示程序实验一、实验目的1、初步学习和了解VHDL语言编程方式2、学习和掌握七段数码显示译码器的设计方法3、学习和掌握VHDL的多层设计方法二、实验要求1、根据硬件设计的思维方式,编制LED七段码的显示程序2、要求是一位LED以定位方式显示3、完成LED七段码波形分析的显示功能4、在EDA实验箱上按要求显示三、实验设备1、计算机一台2、EDA——Ⅳ实验箱一台四、实验原理1、七段码是用一种纯组合的逻辑电路,通常是用小型专用的IC门电路组成,数字输入与输出表达均未16进制,处理一般较复杂,而用FPGA/CPLD来实现较为简单。
2、七段码输入与输出的原理与真值表关系。
(a)输入:七段码输入为四个输入信号,用来表示为“0000”到“1111”,即表示为十六进制的“0”到“F”。
(b)输出:七段码输出为七个输出信号,分别用“A、B、C、D、E、F、G”七个符号来表示。
一般规定,输出信号为“1”时,它所控制的发光二极管为点亮状态,输出信号为“0”时,它所控制的发光二极管为熄灭状。
本实验使用的七段数码管为共阴极组,其电路如图2.1所示。
图2.1 共阴极数码管及其电路(c)输入与输关系为四位二进制代码组成十六进制代码,将其代码显示,其对应关系如表2.1所示。
(d)显示方式是通过选位的方式进行,是将FPGA/CPLD的三位二进制的信号输出,通过外部三——八译码器硬件电路,选中一路LED信号为输出,故选择一位LED数码管显示,本实验是采取选相应的一个指定位置进行LED显示。
3、输入是通过外部的四个按键操作而组成一位十六进制。
其连接到FPGA/CPLD的对应的引脚上,需进行引脚分配。
4、编写译码程序,生成底层组件,组合成底层文件。
表2-1 七段字符显示真值表五、实验步骤1、 在D 盘建立自己的文件目录,D: \ EX \ Z04** \ you*\ex*;2、 在Max+Pluse Ⅱ的界面下,自己的文件目录下,建立项目文件 File \ Project \ 文件名A ;3、 在自己的文件目录下,建立文本文件 File \ New \ 文件名B.vhd ;4、 保存此文件并划归到项目文件内, File \ Project \ Set Project current File ,其中文本文件名B 必须和实体名一致;5、 输入程序,保存文件“文件名B.vhd ”,File \ Save As “文件名B.vhd ”(注意后缀,如保存默认文件名时,其后缀通常为“*.tdf ”文件,必须删除后缀为“*.tdf ”文件名;6、 单击编译器快捷方式按钮,对文本文件进行编译,观察是否有原则错误;7、 如有修改则修改程序中错误,若无错误则可做以下工作; 8、 建立底层器件的封装,File \ Create Default Symbol ;9、 建立图形文件,File \ New \ 文件名C.gdf 并化归到项目内。
七段数码管显示控制程序设计
。
。
图2 程序流程图
3.2PLC程序设计
网络1为启动程序。
网络2至网络60为定时器定时程序,定时时间1秒。如“网络3”,数码管显示2。计时器由38至63、101至134。
网络61至67为数码管显示程序。如“网络61”,对应译码管A,译码表如表3所示:
表3 译码表
(2)数据字典的建立
根据课设要求建立数据字典,具体所建数据如图4所示:
图4 数据字典
(3)通信关联
关联方式如图5所示:
图5 通信关联
4.联合调试
当PLC运行的时候,打开组态王监控界面。通过虚拟界面实现对PLC的控制,图5和图6、7分别表示当PLC 启动、停止和复位,PLC与虚拟界面状态显示图。
图5 启动画面
七段数码管显示控制程序设计
xxxx大学
课 程 设 计
(论文)
题目七段数码管显示控制程序设计(三)
班 级
学 号
学 生 姓 名
指 导 教 师
七段数码管显示控制程序设计(三)
xxxxxxx大学自动化学院
摘要:本文主要设计一个西门子S7-200系列的PLC数码管显示与上位机监控。按照设计要求利用PLC做出相应的梯形程序图,然后通过合理的硬件线路连接将PLC运行的结果在数码管上正确的显示出来。通过上位机设计组态王监控界面,对PLC控制数码管的显示进行模拟,实现对PLC的监控功能。并对PLC和组态王的应用和特点做了相关介绍。关键字:西门子s7-200;数码管显示;组态王;监控系统。
1.3组态王
组态王开发监控系统软件,是新型的工业自动控制系统,它以标准的工业计算机软、硬平台构建的集成系统取代传统的封闭式系统。组态王具有适应性强、开放性好、易于扩展、经济、开发周期短等优点。方便地构成监控画面,并以动画方式显示控制设备的状态,具有报警窗口、实时趋势曲线等,可便利的生成各种报表。它还具有丰富的设备驱动程序和灵活的组态方式、数据链接功能。
Lab5 七段数码管显示设计
1
1
1
0
1
1
1
A
11
1
0
1
1
0
0
1
1
1
1
1
b
12
1
1
0
0
1
0
0
1
1
1
0
C
13
1
1
0
1
0
1
1
1
1
0
1
d
14
1
1
1
0
1
0
0
1
1
1
1
E
15
1
1
1
1
0
0
0
0
0
0
0 灭灯
2. 动态扫描显示原理
2
北京中教仪装备技术有限公司
数码管动态扫描显示,是将所用数码管的相同段(a~g 和 p)并联在一起,通过选位通 信号分时控制各个数码管的公共端,循环依次点亮各个数码管。当切换速度足够快时,由于 人眼的“视觉暂留”现象,视觉效果将是六个数码管同时显示,选通信号的时序关系如图 5-4 所示。
四、 实验内容
根据七段数码管的显示原理,用 VHDL 语言编写七段数码显示管的源程序。 要求设计一个带复位的七段数码管循环扫描程序,本程序需要着重实现两部分: 1. 显示数据的设置:程序设定 4 位数码管从左至右分别显示 1、2、3、4; 2. 动态扫描:实现动态扫描时序,这部分是难点,也是重点。参看动态扫描显示原理,
图 5-1 7 段数码管显示原理
该四位数码管与 FPGA 之间通过 8 位拨码开关(JP1)进行连接,当 DIP 开关全部拨到 上方时(板上标示为:7SEGLED),FPGA 的相应 IO 引脚和四位 7 段数码管连接,7 段数码
七段数码管显示实验报告
七段数码管显示实验报告实验目的:本实验的目的是通过控制7段数码管的亮灭状态来显示不同的数字和字母。
实验原理:7段数码管常用于显示数字和字母,每个数码管由7个LED灯组成,分别表示A、B、C、D、E、F、G等7个段。
通过控制这些LED灯的亮灭状态,就可以显示不同的数字和字母。
在实际应用中,通常需要使用一个译码器来根据输入的数字或字母输出相应的控制信号。
常用的译码器有7447、DM9368等。
这些译码器通常都是BCD码到7段数码管的译码器。
在本实验中,我们将使用7447译码器来控制7段数码管的亮灭状态。
7447译码器具有4个输入线和7个输出线,每个输入线上的BCD码可以转换成相应的控制信号,用于控制数码管的7个LED 灯。
实验材料:1.7段数码管2.7447译码器3.电路板4.电压源5.连接线实验步骤:1.将7447译码器插入电路板上相应的插槽中,并将数码管连接到电路板上。
2.将电压源连接到电路板上,并调节电压和电流值。
3.根据所需显示的数字或字母,设置相应的BCD码输入信号。
4.打开电源,观察数码管是否能够正确显示。
实验结果:通过本实验,我们可以成功控制7段数码管的亮灭状态,实现了数字和字母的显示。
同时,我们也了解了7447译码器的原理和使用方法。
实验小结:本实验是电子技术的基础实验之一,通过实验我们深入了解了7段数码管和7447译码器的原理和应用,同时也锻炼了我们的动手能力和实验技能。
在实际应用中,7段数码管和译码器常常被用于数字显示、计数器、时钟、温度计等电子设备中,具有广泛的应用前景。
python七段数码管数字8代码
python七段数码管数字8代码Python是一种流行的编程语言,可用于编写各种类型的程序。
在数码管显示器上,数字8由7条不同的线条组成。
在Python中,我们可以使用各种方法来编写代码,以显示数字8在七段数码管中的形式。
下面是一个简单的代码示例,用于在七段数码管中显示数字8:```pythonimport RPi.GPIO as GPIOimport time# 设置GPIO引脚SEG_A_PIN = 10SEG_B_PIN = 11SEG_C_PIN = 12SEG_D_PIN = 13SEG_E_PIN = 14SEG_F_PIN = 15SEG_G_PIN = 16# 数字8的编码SEGMENT_CODES = [1, 1, 1, 1, 1, 1, 0]# 定义GPIO输出模式GPIO.setmode(GPIO.BOARD)GPIO.setup(SEG_A_PIN, GPIO.OUT)GPIO.setup(SEG_B_PIN, GPIO.OUT)GPIO.setup(SEG_C_PIN, GPIO.OUT)GPIO.setup(SEG_D_PIN, GPIO.OUT)GPIO.setup(SEG_E_PIN, GPIO.OUT)GPIO.setup(SEG_F_PIN, GPIO.OUT)GPIO.setup(SEG_G_PIN, GPIO.OUT)# 给每个引脚写入数字8的编码GPIO.output(SEG_A_PIN, SEGMENT_CODES[0]) GPIO.output(SEG_B_PIN, SEGMENT_CODES[1]) GPIO.output(SEG_C_PIN, SEGMENT_CODES[2]) GPIO.output(SEG_D_PIN, SEGMENT_CODES[3]) GPIO.output(SEG_E_PIN, SEGMENT_CODES[4]) GPIO.output(SEG_F_PIN, SEGMENT_CODES[5]) GPIO.output(SEG_G_PIN, SEGMENT_CODES[6])# 等待一会儿后清除引脚状态time.sleep(5)GPIO.cleanup()在这个代码示例中,我们使用了RPi.GPIO模块来启用GPIO引脚。
《PLC应用与实践(三菱)》 配套教学案例:数码管循环显示数字
数码管循环显示数字
1.案例原理与提示
(1) 数码管的ABCDEFG七段对应Y0~Y6,计数器循环计数。
(2) 用数据寄存器存放变化的数字,用INC(加1)指令使数字不断递增,用CMP(比较)指令实现数据的循环。
(3) 也可以用功能指令直接七段译码。
2. 案例实施过程
1) I/O分配
数码显示控制输入/输出端口分配表如下表所示。
数码显示控制输入/输出端口分配表
2) 控制程序编写
数码显示控制程序梯形图如下图所示。
数码显示控制程序梯形图
用数据寄存器D0存放变化的数字0~9。
由特殊功能继电器M8013产生秒脉冲,采用加1指令使D0中的数据不断递增,每过一秒加1。
当D0中的数据递增为10时,D0中再次
赋值为0。
程序中M8002对程序初始化,把K0(十制数0)放入数据寄存器D0中。
当比较指令(CMP)的比较结果为等于时(D0=10),M11=1,则D0中赋值0。
当SB12断开时,D0=0,[INCP D0]指令不工作,数码管上显示0。
3) 接线与调试
数码显示控制外部接线图如下图所示。
数码显示控制外部接线图
3. 思考与提升
(1) 当SB12开关闭合时,数码管就循环显示0~A,每个数字显示0.5s;当SB12开关断开时,数码管上显示“H”。
(2) 当SB12开关闭合时,数码管就循环显示9~0,每个数字显示0.8s。
2项目 LED七段数码管的显示控制(WZ)
任务一 采用基本逻辑指令编程的显示控制
用于分支回路的起点。 2)OUT指令是驱动线圈的输出指令,可以用于Y、M、C、T和S继 电器,但不能用于输入继电器。
3)并行的OUT指令可以使用多次,但不能串联使用。 4)OUT指令用于计数器、定时器和功能指令线圈时,必须设定合 适的常数,常数K的设定需用一个程序步。 (2)触点串联指令(AND、ANI) AND、ANI指令格式及表示方法见 表2-3,指令的使用方法如图2-6所示。 表2⁃3 AND、ANI指令
任务一 采用基本逻辑指令编程的显示控制
(1)逻辑“与”—触点串联 两个或多个触点与线圈串联的线路, 只有当所有触点都接通时线圈才得电,这种关系在逻辑线路中称 为“与”逻辑,如图2-1所示。
K=A· B
图2-1
“与”电路
(2)逻辑“或”—触点并联 两个或多个触点并联再与线圈连接的 线路,只要有一个触点接通,线圈就得电,这种关系在逻辑线路 中称为“或”逻辑,如图2-2所示。 K=A+B
6.通电运行调试
按图2⁃17所示的系统接线图正确连接好数码管,进行系统的调 试,观察数码管能否按控制要求显示。若不能正常显示,检查电路 并修改调试程序,直至数码管能按控制要求显示为止。
图2-20
题3图
任务三 抢答器的PLC控制
任务目标
1.学习梯形图中的互锁环节。 2.学习梯形图中的“起-保-停”环节。 3.进一步掌握通用辅助继电器“M”的运用方法。 任务分析 设计一个有四个参赛组的抢答器。其控制要求为:任一组抢先 按下后,显示器能显示该组的编号并使蜂鸣器发出响声,同时锁住 抢答器,其他组抢答无效。抢答器设有复位开关,复位后可重新抢 答。
任务一 采用基本逻辑指令编程的显示控制
(3)触点并联指令(OR、ORI)
基于PLC的七段码显示数码管控制
基于PLC的七段码显示数码管控制【摘要】主要介绍了S7-200型PLC传输指令和移位指令的特点和使用方法,并以七段码显示为例,给出了应用不同类型的指令进行显示和编程的方法。
【关键词】传送指令;移位指令;程序设计;七段显示译码指令生活中,经常能见到电梯楼层显示、抢答器、交通灯剩余时间数码显示以及生产线上的显示系统,可以显示数字或字母,本文利用S7-200系列PLC的指令实现对七段显示数码管的控制。
在西门子S7-200系列PLC中,有多种方法可以实现七段码显示,其中比较常用的有基本指令、传送指令和七段显示译码指令SEG,笔者结合自己的工作经验,对几种控制七段码显示的指令进行比较,供大家学习和参考。
1.传输指令和七段码显示译码指令1.1 传输指令传送指令用于在各个编程元件之间进行数据传送[1]。
西门子S7-200系列PLC的传输指令包括单个传送指令和块传送指令。
单个传送指令助记符为MOV,当传送的数据长度不同时,助记符也不尽相同。
单个传送指令根据传送数据长度可以分为:字节传送指令MOVB,字传送指令MOVW,双字传送指令MOVDW,实数传送指令MOVR,利用传送指令可以在不改变原数据值的情况下将IN中的数据传送到OUT。
块传送指令用来进行一次传送多个数据。
单个传送指令的应用如图1所示图1 传送指令的应用在传送指令中,EN端为允许输入端;ENO端为允许输出端。
当输入I0.1为“1”时,传送指令将MB0中的字节传送给MB1,如果指令正确执行,则输出Q4.0为“1”,否则,如果输入I0.0为“0”,则数据不传送。
一旦传送成功,输出Q4.0将一直保持为1,直到将Q4.0复位。
在为变量赋初始值时,为了保证传送只执行一次,一般MOV方块指令和边缘触发指令联合使用。
1.2 移位指令移位指令是使位组合的字节数据、字数据或双字数据向指定方向移位的指令[2]。
根据移位的数据长度可分为字节型移位、字型移位、双字型移位。
还可以进行循环移位。
七段数码显示驱动实验
第 3 步:运行 make 编译命令,用 ls 命令查看编译后的结果,在该目录中应生成 xsb_seg.ko 模块文件,利用 file 命令查看 xsb_seg.ko 文件的格式,应为 ARM 格 式的 ELF 文件。
第 4 步:利用 vi 编辑器在 test 目录下编译测试驱动的 seg_test.c 源文件。
(3)写具体某位七段数码光驱动管显示函数
void value_seting(struct seg *seg_7, char position, char value)
{ if (seg_7->negative==0) value=~value & ~(0x1<<7); else value=(0x1<<7)|value; if (position==1) seg_7->LED1_Val=value; else if(position==2) seg_7->LED2_Val=value; else if(position==3) seg_7->LED3_Val=value; else if(position==4) seg_7->LED4_Val=value; }
(7)实现七段数码管驱动释放函数
static int XSB_Seg_release(struct inode *inode, struct file *filp) { printk(KERN_EMERG "The Module is release,XSB_Seg_release\n"); kfree(filp->private_data); return 0; }
char number[]={0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7F, 0x6F}; void clear_led(int fd) { int i; char val=0; for(i=1;i<=4;i++) ioctl(fd, i, &val); sleep(1); } void display_led(int fd) { int i; char val=0x7f; for(i=1;i<=4;i++) ioctl(fd, i, &val); sleep(1); } void appear_same(int fd) { char i,j,base=0; for (j=0, base=0 ;j<=9; j++, base++) { for(i=1; i<=4; i++) ioctl(fd, i, number+base); sleep(1); } } void appear_roll(int fd) { char i, j, base=0; for (j=0, base=0; j<=9; j++, base++) { for(i=1; i<=4; i++) ioctl(fd, i, number+(base+i-1)%10); sleep(1); } } void display_menu() { printf(" *****Choice Menu*********\n"); printf(" [0] Open Device\n");
七段数码管动态显示控制
实验二七段数码管动态显示控制一、实验目的利用AT89S52和使用两位数码管显示器,循环显示两位数00-99。
其中P2.0和P2.1端口分别控制数码管的个位和十位的供电,当相应的端口变成低电平时,驱动相应的三极管会导通,+5V通过驱动三极管给数码管相应的位供电,这时只要P3口送出数字的显示代码,数码管就能正常显示数字。
二、实验要求1、使用两位数码管显示器,循环显示两位数00-99;2、具有电源开关和指示灯,有复位键;3、数码管动态显示,即扫描方式,每一位每间隔一段时间扫描一次。
字符的亮度及清晰度与每位点亮的停留时间和每位显示的时间内轮换导通次数有关。
三、实验电路四、实验器材AT89S52;动态扫描显示;共阳极数码管;电阻五、实验原理说明图1 AT89S52引脚图图2 共阳极七段数码管引脚图1AT89S52引脚图,说明如下:按照功能,AT89S52的引脚可分为主电源、外接晶体振荡或振荡器、多功能I/O 口、控制和复位等。
1.多功能I/O口AT89S52共有四个8位的并行I/O口:P0、P1、P2、P3端口,对应的引脚分别是P0.0 ~ P0.7,P1.0 ~ P1.7,P2.0 ~ P2.7,P3.0 ~ P3.7,共32根I/O线。
每根线可以单独用作输入或输出。
①P0端口,该口是一个8位漏极开路的双向I/O口。
在作为输出口时,每根引脚可以带动8个TTL输入负载。
当把“1”写入P0时,则它的引脚可用作高阻抗输入。
当对外部程序或数据存储器进行存取时,P0可用作多路复用的低字节地址/数据总线,在该模式,P0口拥有内部上拉电阻。
在对Flash存储器进行编程时,P0用于接收代码字节;在校验时,则输出代码字节;此时需要外加上拉电阻。
②P1端口,该口是带有内部上拉电阻的8位双向I/O端口,P1口的输出缓冲器可驱动(吸收或输出电流方式)4个TTL输入。
对端口写“1”时,通过内部的上拉电阻把端口拉到高电位,此时可用作输入口。
实验二 7 段数码管静态显示译码器
实验二7 段数码管静态显示译码器1.实验目的学习quartusii 和modelsim的使用方法;学习原理图和veriloghdl混合输入设计方法;掌握7 段数码管静态显示译码器的设计及仿真方法。
2.实验原理根据下面电路图,设计7 段数码管静态显示译码器电路,在kx3c10F+开发板上实现该电路,并作仿真。
3.实验设备kx3c10F+开发板,电脑。
4.实验步骤4.1编译4.1.1七段数码管代码module segled(out1,a); //定义模块名和输入输出端口input [3:0]a; //输入一个3位矢量output [6:0]out1; //输出一个6位矢量reg [6:0]out1; //reg型变量用于always语句always@(a) //敏感信号啊begincase(a) //case语句用于选择输出4'b0000:out1<=7'b1000000;4'b0001:out1<=7'b1001111;4'b0010:out1<=7'b0100100;4'b0011:out1<=7'b0110000;4'b0100:out1<=7'b0011001;4'b0101:out1<=7'b0010010;4'b0110:out1<=7'b0000011;4'b0111:out1<=7'b1111000;4'b1000:out1<=7'b0000000;4'b1001:out1<=7'b0011000;4'b1010:out1<=7'b0001000;4'b1011:out1<=7'b0011100;4'b1100:out1<=7'b1000111;4'b1101:out1<=7'b0100011;4'b1110:out1<=7'b0000110;4'b1111:out1<=7'b0001110;endcaseendendmodule //模块结束效果图:4.1.2综合模块代码// Copyright (C) 1991-2013 Altera Corporation// Your use of Altera Corporation's design tools, logic functions // and other software and tools, and its AMPP partner logic// functions, and any output files from any of the foregoing// (including device programming or simulation files), and any// associated documentation or information are expressly subject // to the terms and conditions of the Altera Program License// Subscription Agreement, Altera MegaCore Function License// Agreement, or other applicable license agreement, including,// without limitation, that your use is for the sole purpose of// programming logic devices manufactured by Altera and sold by// Altera or its authorized distributors. Please refer to the// applicable agreement for further details.// PROGRAM "Quartus II 64-Bit"// VERSION "Version 13.1.0 Build 162 10/23/2013 SJ Web Edition" // CREATED "Mon Mar 27 15:23:18 2017"module Blok(a,out1);input wire [3:0] a;output wire [6:0] out1;segled b2v_inst(.a(a),.out1(out1));endmodule效果图:4.1.3编辑结果截图编译解释:在这个报告中,我们可以看到如下信息:Total logic elements 7/5136(<1%): 该芯片中共有5136个LE资源,其中的7个在这个工程的这次编译中得到了使用。
七段数码管静态显示程序
依次将要显示的数字的代码送端口,就可以将相应的段点亮,显示出数字的字形。
为了人的眼睛能看清楚显示的字形,每个显示是字形停留一段时间。
右图是循环显示0~3的程序流程图。
;------------------------------------; 数码循环显示; 设计:黄有全; P2口接七段数码管。
; 2010年10月9日;-------------------------------------#include <reg.h>void delay(){ //函数体起始括号int i,j; //函数内部变量定义,16位的整数。
for(i=0;i<1000;i++) //for语句,循环语句{ //复合语句起始括号for(j=0;j<121;j++) //for语句,循环语句{ //空语句}} //复合语句结束括号}main() //主函数,C语言必须有名称为main的主函数。
{while(1) //循环语句,当while后面括号中数不为0时,执行循环体。
{P2=0xc0; // P2口送16进制数c0,显示0delay(); //调用延时函数delay。
延时0.2秒。
P2=0xf9; // P2口送16进制数f9,显示1delay(); //调用延时函数delay。
P2=0xa4; //显示2delay(); //调用延时函数delay。
延时0.2秒。
P2=0xb0; //显示3delay(); //调用延时函数delay。
}}。
实验2:8255七段数码管静动态显示
微机实验报告书学号:姓名:班级:同组名单:实验日期: 2012.12.21实验题目:七段数码管的静态显示实验目标:掌握数码管显示数字的原理(功能:键盘输入一位十进制数字(0~9),用七段数码管显示。
)解题思路:1.静态显示:按图 10(a)连接好电路,将8255的A口PA0-PA6分别与七段数码管的断码驱动输入端a-g项链,位码驱动输入端S1接+5V,S0、dp接地。
编程从键盘输入一位十进制数字,在七段数码管上显示出来。
2.动态显示:按图10(b)连接好电路,七段数码管段码连接不变,位码驱动输入端S1,S0接8255C口的PC1,PC0。
编程在两个数码管上显示“56”。
程序框图:静态显示见图11(a),动态显示见图11(b)。
关键问题分析(静态显示):1、按键判断和程序结束判断按键来说,由于程序中必须输入数字,所以没有必要对是否按键进行判断,只需要判断按键是否在0-9之间即可。
用以下程序即可:cmp al,'0'jl exit ; jl,条件转移指令,即在小于时转移cmp al,'9'jg exit ;jg, 条件转移指令,即在大于时转移程序中还要用到“cmp”即比较指令,用来比较输入数与0、9的大小关系。
程序结束:如若输入的数字小于0或者大于9,必须直接跳出程序,即结束指令必须单独占用一个程序段,这样,程序顺序执行完毕也可以顺利返回DOS。
2、七段码显示。
实验指导书中给出了七段码的字型代码。
这样一来,七段码的显示只需要用换码指令“XLAT”便可以轻松实现。
前提是必须将七段码字型编成数码表以字符串的形式写进程序中。
3、数字键ASCII码与数值间的转换。
因为0的ASCII码为30H,所以数字键ASCII码与数值间的转换时只需减去30H即可,可用下列语句实现:sub al,30h程序清单:静态显示:data segmentioport equ 0c800h-0280hio8255a equ ioport+288hio8255b equ ioport+28bhled db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fhmesg1 db 0dh,0ah,'Input a num (0--9h):',0dh,0ah,'$'data endscode segmentassume cs:code,ds:datastart: mov ax,datamov ds,axmov dx,io8255b ;使8255的A口为输出方式mov al,80h ;10000000B,控制字PA以方式0输出out dx,alzby: mov dx,offset mesg1 ;显示提示信息mov ah,09hint 21hmov ah,01 ;从键盘接收字符int 21hcmp al,'0' ;是否小于0jl exit ;如若小于0,则跳转到exit退出程序cmp al,'9' ;是否大于9jg exit ; 如若大于9,则跳转到exit退出程序sub al,30h ;将所得字符的ASCII码减30H,数字键ascii码同数值转换mov bx,offset led ;bx为数码表的起始地址xlat ;求出相应的段码mov dx,io8255a ;从8255的A口输出out dx,aljmp zby ;转zbyexit: mov ah,4ch ;返回DOSint 21hcode endsend start动态显示:data segmentioport equ 0c800h-0280hio8255a equ ioport+28ahio8255b equ ioport+28bhio8255c equ ioport+288hled db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh ;段码buffer1 db 5,6 ;存放要显示的个位和十位bz dw ? ;位码data endscode segmentassume cs:code,ds:datastart: mov ax,datamov ds,axmov dx,io8255b ;将8255设为A口输出mov al,80h ;10000000B,控制字PA以方式0输出out dx,almov di,offset buffer1 ;设di为显示缓冲区loop2: mov bh,02zby: mov byte ptr bz,bhpush didec diadd di, bzmov bl,[di] ;bl为要显示的数pop dimov al,0mov dx,io8255aout dx,almov bh,0mov si,offset led ;置led数码表偏移地址为SIadd si,bx ;求出对应的led数码mov al,byte ptr [si]mov dx,io8255c ;自8255A的口输出out dx,almov al,byte ptr bz ;使相应的数码管亮mov dx,io8255aout dx,almov cx,3000delay: loop delay ;延时mov bh,byte ptr bzshr bh,1jnz zbymov dx,0ffhmov ah,06int 21hje loop2 ;有键按下则退出mov dx,io8255amov al,0 ;关掉数码管显示out dx,almov ah,4ch ;返回int 21hcode endsend start运行结果:静态显示:在键盘上输入一个0-9的任意数字,会显示在数码管上。
[指南]七段数码管的静态显示
七段数码管的动态显示1、实验内容:数码管的动态显示利用实验板上的某四位数码管依次显示 16 进制的0000~FFFF。
为实现功能重用的目的,我们仍然将系统划分为几个部分:(1)时钟分频模块:将开发板上的 50MHz 高速时钟进行分频产生一个5Hz 的时钟用于计数。
(2)计数模块:实现从 0000~FFFF 的计数功能。
用4位十六进制数来实现,其中15‐12 位表示十六进制数的最高位,11‐8 位表示次高位,7‐4 位表示次低位,3‐0位表示最低位(3)数码管动态显示模块:将计数模块的输出作为显示字符的输入值,分时送出相应段码,实现数码管的动态显示效果。
2、参考程序:module SegDynamicDisp(CLK,rst_n,SEG0,SEG1,SEG2,SEG3);//数码管动态显示模块?input CLK;input rst_n;output [7:0]SEG0;//定义输出数码管0的段码带output [7:0]SEG1;//定义输出数码管1的段码带output [7:0]SEG2;//定义输出数码管2的段码带output [7:0]SEG3;//定义输出数码管3的段码带//......................................................... .....reg [7:0]SEG0;//定义输出数码管0的段码带reg [7:0]SEG1;//定义输出数码管1的段码带reg [7:0]SEG2;//定义输出数码管2的段码带reg [7:0]SEG3;//定义输出数码管3的段码带//......................................................... .........parameter seg0=8'hC0,seg1=8'hF9,seg2=8'hA4,seg3=8'hB0,seg4=8'h99,seg5=8'h92,seg6=8'h82,seg7=8'hF8,seg8=8'h80,seg9=8'h90,sega=8'h88,segb=8'h83,segc=8'hC6,segd=8'hA1,sege=8'h86,segf=8'h8E;//......................................................... ...........reg[23:0] cnt;//定义计数寄存器,用来实现定时的功能reg [15:0]counter;//定义计数寄存器,用于实现显示的数值always @(posedge CLK or negedge rst_n)//计数过程,记录当前显示的位选序号if(!rst_n)begincnt<=24'D0;//复位时cnt初始化为0counter<=2'b00;//复位时counter初始化为0endelsebegincnt<=cnt+1'b1;//实现计数的功能if(cnt==24'D1*******)begincnt<=0;//当达到计数值以后回复初始值counter<=counter+1;//当达到计时时间以后显示的数值也相应的+1endend//....................................................always @(posedge CLK or negedge rst_n)if(!rst_n)beginSEG0<=0;SEG1<=0;SEG2<=0;SEG3<=0;endelsealways @(counter)begincase(counter[3:0])4'h0: sm_dbr <= seg0; 4'h1: sm_dbr <= seg1; 4'h2: sm_dbr <= seg2; 4'h3: sm_dbr <= seg3; 4'h4: sm_dbr <= seg4; 4'h5: sm_dbr <= seg5; 4'h6: sm_dbr <= seg6; 4'h7: sm_dbr <= seg7; 4'h8: sm_dbr <= seg8; 4'h9: sm_dbr <= seg9; 4'ha: sm_dbr <= sega; 4'hb: sm_dbr <= segb; 4'hc: sm_dbr <= segc; 4'hd: sm_dbr <= segd; 4'he: sm_dbr <= sege; 4'hf: sm_dbr <= segf; default: ;endcasecase(counter[7:4])4'h0: sm_dbr <= seg0; 4'h1: sm_dbr <= seg1; 4'h2: sm_dbr <= seg2; 4'h3: sm_dbr <= seg3; 4'h4: sm_dbr <= seg4; 4'h5: sm_dbr <= seg5; 4'h6: sm_dbr <= seg6; 4'h7: sm_dbr <= seg7; 4'h8: sm_dbr <= seg8; 4'h9: sm_dbr <= seg9;4'hb: sm_dbr <= segb; 4'hc: sm_dbr <= segc; 4'hd: sm_dbr <= segd; 4'he: sm_dbr <= sege; 4'hf: sm_dbr <= segf; default: ;endcasecase(counter[11:8]) 4'h0: sm_dbr <= seg0; 4'h1: sm_dbr <= seg1; 4'h2: sm_dbr <= seg2; 4'h3: sm_dbr <= seg3; 4'h4: sm_dbr <= seg4; 4'h5: sm_dbr <= seg5; 4'h6: sm_dbr <= seg6; 4'h7: sm_dbr <= seg7; 4'h8: sm_dbr <= seg8; 4'h9: sm_dbr <= seg9; 4'ha: sm_dbr <= sega; 4'hb: sm_dbr <= segb; 4'hc: sm_dbr <= segc; 4'hd: sm_dbr <= segd; 4'he: sm_dbr <= sege; 4'hf: sm_dbr <= segf; default: ;endcasecase(counter[15:12]) 4'h0: sm_dbr <= seg0; 4'h1: sm_dbr <= seg1; 4'h2: sm_dbr <= seg2;4'h4: sm_dbr <= seg4; 4'h5: sm_dbr <= seg5; 4'h6: sm_dbr <= seg6; 4'h7: sm_dbr <= seg7; 4'h8: sm_dbr <= seg8; 4'h9: sm_dbr <= seg9; 4'ha: sm_dbr <= sega; 4'hb: sm_dbr <= segb; 4'hc: sm_dbr <= segc; 4'hd: sm_dbr <= segd; 4'he: sm_dbr <= sege; 4'hf: sm_dbr <= segf; default: ;endcaseendendmodule3、接口:clk--PIN_N2rst_n--PIN_N25SEG0[0]--PIN_AF10SEG0[1]--PIN_AB12SEG0[2]--PIN_AC12SEG0[3]--PIN_AD11SEG0[4]--PIN_AE11SEG0[5]--PIN_V14SEG0[6]--PIN_V13SEG1[0]--PIN_V20SEG1[1]--PIN_V21SEG1[2]--PIN_W21SEG1[3]--PIN_Y22SEG1[4]--PIN_AA24SEG1[5]--PIN_AA23SEG1[6]--PIN_AB24SEG2[0]--PIN_AB23SEG2[1]--PIN_V22SEG2[2]--PIN_AC25SEG2[3]--PIN_AC26SEG2[4]--PIN_AB26SEG2[5]--PIN_AB25SEG2[6]--PIN_Y24SEG3[0]--PIN_Y23SEG3[1]--PIN_AA25SEG3[2]--PIN_AA26SEG3[3]--PIN_Y26SEG3[4]--PIN_Y25SEG3[5]--PIN_U22SEG3[6]--PIN_W244、上机程序module SegDynamicDisp(CLK,rst_n,SEG0,SEG1,SEG2,SEG3); input CLK;input rst_n;output [6:0]SEG0;output [6:0]SEG1;output [6:0]SEG2;output [6:0]SEG3;reg [6:0]SEG0;reg [6:0]SEG1;reg [6:0]SEG2;reg [6:0]SEG3;//........以上是定义的一些输入输出接口..........................parameter seg0=7'hC0,seg1=7'hF9,seg2=7'hA4,seg3=7'hB0,seg4=7'h99,seg5=7'h92,seg6=7'h82,seg7=7'hF8,seg8=7'h80,seg9=7'h90,sega=7'h88,segb=7'h83,segc=7'hC6,segd=7'hA1,sege=7'h86,segf=7'h8E;//..............以上是定义的参数,用来标记段代码...................reg[23:0] cnt;reg [15:0]counter;always @(posedge CLK or negedge rst_n)if(!rst_n)begincnt<=24'D0;counter<=2'b00;endelsebegincnt<=cnt+1'b1;if(cnt==24'D1*******)begincnt<=0;counter<=counter+1;endend//..........用来实现计数功能和控制数字递增的速度....................always @(counter)begincase(counter[3:0])4'h0: SEG0 <= seg0;4'h1: SEG0 <= seg1;4'h2: SEG0 <= seg2;4'h3: SEG0 <= seg3;4'h4: SEG0 <= seg4;4'h5: SEG0 <= seg5;4'h6: SEG0 <= seg6;4'h7: SEG0 <= seg7; 4'h8: SEG0 <= seg8; 4'h9: SEG0 <= seg9; 4'ha: SEG0 <= sega; 4'hb: SEG0 <= segb; 4'hc: SEG0 <= segc; 4'hd: SEG0 <= segd; 4'he: SEG0 <= sege; 4'hf: SEG0 <= segf; default: ; endcasecase(counter[7:4]) 4'h0: SEG1 <= seg0; 4'h1: SEG1 <= seg1; 4'h2: SEG1 <= seg2; 4'h3: SEG1 <= seg3; 4'h4: SEG1 <= seg4; 4'h5: SEG1 <= seg5; 4'h6: SEG1 <= seg6; 4'h7: SEG1 <= seg7; 4'h8: SEG1 <= seg8; 4'h9: SEG1 <= seg9; 4'ha: SEG1 <= sega; 4'hb: SEG1 <= segb; 4'hc: SEG1 <= segc; 4'hd: SEG1 <= segd; 4'he: SEG1 <= sege; 4'hf: SEG1 <= segf; default: ; endcasecase(counter[11:8])4'h1: SEG2 <= seg1; 4'h2: SEG2 <= seg2; 4'h3: SEG2 <= seg3; 4'h4: SEG2 <= seg4; 4'h5: SEG2 <= seg5; 4'h6: SEG2 <= seg6; 4'h7: SEG2 <= seg7; 4'h8: SEG2 <= seg8; 4'h9: SEG2 <= seg9; 4'ha: SEG2 <= sega; 4'hb: SEG2 <= segb; 4'hc: SEG2 <= segc; 4'hd: SEG2 <= segd; 4'he: SEG2 <= sege; 4'hf: SEG2 <= segf; default: ;endcasecase(counter[15:12]) 4'h0: SEG3 <= seg0; 4'h1: SEG3 <= seg1; 4'h2: SEG3 <= seg2; 4'h3: SEG3 <= seg3; 4'h4: SEG3 <= seg4; 4'h5: SEG3 <= seg5; 4'h6: SEG3 <= seg6; 4'h7: SEG3 <= seg7; 4'h8: SEG3 <= seg8; 4'h9: SEG3 <= seg9; 4'ha: SEG3 <= sega; 4'hb: SEG3 <= segb;4'hd: SEG3 <= segd;4'he: SEG3 <= sege;4'hf: SEG3 <= segf;default: ;endcaseend//...................用来实现显示功能..................... endmodule5、实验结果复位按键为0时:HEX3 HEX2 HEX1 HEX0 显示的为0000;复位按键为1时:HEX3 HEX2 HEX1 HEX0 显示的依次为:0000——FFFF。
51单片机 电机控制 输入速度 七段数码管显示 汇编程序
51单片机电机控制输入速度七段数码管
显示汇编程序
简介
本文档介绍了使用51单片机控制电机的方法,以及如何通过输入设置速度,并使用七段数码管显示相关信息的汇编程序。
电机控制
在使用51单片机控制电机之前,需要连接合适的电机驱动模块,并将其与单片机进行连接。
通过控制电机驱动模块的引脚,可以实现电机的正转、反转、停止等功能。
输入速度
可以通过外部的输入设备(如按键、旋钮等)来设置电机的速度。
通过读取输入设备的状态,可以在程序中动态地调整电机的速度。
七段数码管显示
可以通过七段数码管来显示相关信息,如电机的速度、转速等。
通过控制七段数码管的引脚,可以实现在数码管上显示相应的数字
或字符。
汇编程序
使用51汇编语言编写程序,通过设置相应的控制寄存器和引
脚状态,可以实现电机的控制和数码管的显示。
汇编程序需要包括
以下几个方面的功能:
- 初始化相关引脚和寄存器
- 读取输入设备的状态
- 根据输入设备的状态设置电机的速度
- 控制电机的正转、反转、停止等操作
- 更新七段数码管显示的内容
总结
本文档介绍了51单片机控制电机的方法,以及通过输入设备
设置速度和使用七段数码管显示信息的汇编程序。
通过合理地编写
汇编程序,可以实现电机的精确控制和相关信息的显示。
以上是本文档的大致内容,希望对您有所帮助。
LabVIEW之七段数码管实验报告(正式版)
Guangdong Polytechnic Normal UniversityLabVIEW程序设计基础实验报告实验题目:一位七段数码管显示专业:应用电子技术教育(师范)年级班别:13级2班组员姓名:指导教师:向英二级学院:电子与信息学院二◦一六年三月三^一日一位七段数码管显示【实验目的】1. 认识七段数码管并学习七段数码管的工作原理;2. 学习在NI ELVIS II硬件实验平台,并通过LabVIEW程序控制数码管显示的数字。
3. 学会使用NI ELVISII的软件驱动、连接NI ELVIS II实验平台、编写LabVIEW 程序。
【实验原理】利用NI ELVIS II硬件实验平台,采用元器件搭建硬件电路,编写LabVIEW 程序框图与前面板控制窗口,然后运行程序以实现采用自动与手动两种方式在数码管上显示数字的现象。
1. 了解数码管结构:图1 一位七段数码管结构图2 •数码管原理及接线原理:每个数码管的有8个段:a、b、c、d、e、f、g、h (h是小数点),都分别连到对应的P0-P7, 8个数码管分别由8个选通信号P0-P7来选择。
本实验采用共阴极的七段数码显示器,将七段数码显示器的阴极连在一起,为了不让数码管被意外烧掉,将abcdefgh七段数码管分别通过100Q的上拉电阻接入原型实验平台中的数字I/O 口,a接口接入上端数码管,b接口接入右上端数码管,c 接口接入右下端数码管,d接口接入下端数码管,e接口接入右下端数码管,f 接口接入右上端数码管。
当需要哪一段数码管发亮时,只需在LabVIEW的程序控制中输入高电平1即可。
2. 数码管硬件接线原理图。
段符十人进制代码显示号dp0f e d c b a共阴极共阳极0001111113FH COH06H F9H 1000001102010110115BH A4H3010011114FH BOH4010011099H5011011016DH92H601111101S2H70000011107H F8H8011111117FH SOH9011011116FH9OH图3 一位七段数码管真值表【实验所需元器件】所需元器件与器材:【实验步骤】、搭建硬件电路:GND■■■VE f 匸O O Q 1 O O S *■ F * ■■ d !• '* lr * n O O 0 o o H AD SB -M CR5O d 口 €Z3 o o o B F-" ■—* I —»■ED 7 tn 5图4七段数码管硬件连接图、设计程序流程图图5七段数码管程序流程图设计思路的是利用应用数码管显示数字,采用两种方式控制输入显示,每位显示的数字由实验者通过各自的数字输入框控制输入0-9的数值,各位数字的显示间相互独立,互不影响。
数码管显示控制设计—间隔1s依次显示数字0(PLC设计课件)
T5
TON
Time
IN
Q
PT
ET
T6
TON
Time
IN
Q
PT
ET
T7
TON
Time
IN
Q
PT
ET
T8
TON
Time
IN
Q
PT
ET
T9
TON
Time
IN
Q
PT
ET
二、梯形图设计-比较指令
M0.0
T#4S
T1
TON
Time
IN
Q
PT
ET
T1.ET
T1.ET
Q0.0
A灯
T#1S
T#2S
M0.0启动后,T1定时器开始定时,ET值开始发生变化;此时ET值小于2s,
01 01 01 01 01 01 01 01
16#55 T1.Q
16#aa T2.Q
16#ff
T3.Q 16#00
I0.1
T#1S
T1
T2
TON
Time
IN
Q
TON
Time
IN
Q
PT
ET
PT
ET
T#1S
T#1S
T3
TON
Time
IN
Q
PT
ET
项目四:数码管显示控制设计
任务一
间隔1s依次点亮各段
9876543210
9S 8S 7S 6S 5S 4S 3S 2S 1S
开 始
二、梯形图设计-知识回顾
M0.0 T1.Q
Q0.0
T2.Q T4.Q
T5.Q
使用多个定时器实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
附录A 八位七段数码管显示程序
library ieee;
use led is
port( clk : in std_logic; --Clock Signal
data_in : in std_logic_vector(7 downto 0); --data bus
ledag : out std_logic_vector(6 downto 0); --定义七位输出信号
sel : out std_logic_vector(2 downto 0) --ledag Select
);
end led;
--------------------------------------------------------------------
architecture behave of led is
signal dcount : std_logic_vector(2 downto 0);
signal adh,adl : std_logic_vector(6 downto 0);
signal adcount : std_logic_vector(7 downto 0);
signal din_h,din_l : std_logic_vector(3 downto 0);
signal coclk : std_logic;
begin
process(clk) --out enable signal
begin
if(clk'event and clk='1') then
if adcount="" then
coclk<='1';
adcount<="00000000";
else
adcount<=adcount+1;
coclk<='0';
end if;
end if;
end process;
process(clk) --rd the adc data
begin
if(clk'event and clk='1') then
din_h<=data_in(7 downto 4);
din_l<=data_in(3 downto 0);
end if;
end process;
process(clk)
begin
case din_h is
when "0000"=>adh<="0111111"; --display 0
when "0001"=>adh<="0000110"; --display 1
when "0010"=>adh<="1011011"; --display 2
when "0011"=>adh<="1001111"; --display 3
when "0100"=>adh<="1100110"; --display 4
when "0101"=>adh<="1101101"; --display 5
when "0110"=>adh<="1111101"; --display 6
when "0111"=>adh<="0000111"; --display 7
when "1001"=>adh<="1101111"; --display 9 when "1010"=>adh<="1110111"; --display a when "1011"=>adh<="1111100"; --display b when "1100"=>adh<="0111001"; --display c when "1101"=>adh<="1011110"; --display d when "1110"=>adh<="1111001"; --display e when "1111"=>adh<="1110001"; --display f when others=>adh<=adh; --no change end case;
case din_l is
when "0000"=>adl<="0111111"; --display 0 when "0001"=>adl<="0000110"; --display 1 when "0010"=>adl<="1011011"; --display 2 when "0011"=>adl<="1001111"; --display 3 when "0100"=>adl<="1100110"; --display 4 when "0101"=>adl<="1101101"; --display 5 when "0110"=>adl<="1111101"; --display 6 when "0111"=>adl<="0000111"; --display 7 when "1000"=>adl<="1111111"; --display 8 when "1001"=>adl<="1101111"; --display 9 when "1010"=>adl<="1110111"; --display a when "1011"=>adl<="1111100"; --display b when "1100"=>adl<="0111001"; --display c when "1101"=>adl<="1011110"; --display d
when "1111"=>adl<="1110001"; --display f
when others=>adl<=adl; --no change
end case;
end process;
process(coclk) --display process
begin
if(coclk'event and coclk='1') then
dcount<=dcount+1;
sel<=dcount;
case dcount is
when "000"=>ledag<="1000000";
when "001"=>ledag<="1000000";
when "010"=>ledag<="1000000";
when "011"=>ledag<=adh;
when "100"=>ledag<=adl;
when "101"=>ledag<="1000000";
when "110"=>ledag<="1000000";
when "111"=>ledag<="1000000";
when others=>ledag<="0000000";
end case;
end if;
end process;
end behave;。