barriers / 阅读 / 详情

数码管动态扫描中的delay 函数有什么作用?

2023-05-20 06:34:15
共3条回复
小教板
蓓蓓

该实验用到实验板的资源电路图如下:

其中P0口是段码,低电平有效。P2口是位码,高电平有效。P2.0口控制第1个数码管,一直到P2.7口控制第8个。该板的段码表如下:

各个数码管的段码都是p0口的输出,即各个数码管输入的段码都是一样的, 为了使其分别显示不同的数字, 可采用动态显示的方式,即先只让最低位显示0(含点),经过一段延时,再只让次低位显示1,如此类推。由视觉暂留,只要我们的延时时间足够短,就能够使得数码的显示看起来非常的稳定清楚。过程如下图。

采用上述方法思路编写如下:

org 0000h

start: mov a,#08h ;0 ;段码

mov p0,a

mov p2,#01h ;位码

lcall delay_1ms

mov a,#0abh ;1

mov p0,a

mov p2,#02h

lcall delay_1ms

mov a,#12h ;2

mov p0,a

mov p2,#04h

lcall delay_1ms

mov a,#22h ;3

mov p0,a

mov p2,#08h

lcall delay_1ms

mov a,#0a1h ;4

mov p0,a

mov p2,#10h

lcall delay_1ms

mov a,#24h ;5

mov p0,a

mov p2,#20h

lcall delay_1ms

mov a,#04h ;6

mov p0,a

mov p2,#40h

lcall delay_1ms

; mov a,#0aah ;7

; mov p0,a

mov p0,#0aah ;感觉用这句和上面两句实现一样,可能这种习惯以后会有用吧

mov p2,#80h

lcall delay_1ms

ljmp start

delay_1ms: mov r6,#2

temp: mov r5,#0ffh

djnz r5,$

djnz r6,temp

ret

end

下载到板上得到测结果为从低到高八位分别显示0到7(含点)。

★ 上述方法逐次给P0或者P2赋值,一方面程序的复杂程度增加,另外一方面会使得程序的灵活性降低。如果要改变显示的数字,程序改动起来很麻烦。 所以要用51单片机中常用的一种方法:查表法。例如P0口输出段码时,我们可以把要显示的段码放在一个表格中,然后每次从这个表格里面取数,送到P0口即可。P2口输出位码时,可以把要用的位码放在另一个表格里,每次从此表中取数,送入P2口。这样,如果要改变显示的数字,只需要改变表格里面的数。

org 0000h

start: mov r7,#0ffh ;r7,r6查表时送入变址寄存器a (因自加1后为0,所以预置ffh)

mov r6,#0ffh

loop: lcall play1 ;调用显示段码子程序

lcall play2 ;调用显示位码子程序

lcall delay_1ms

cjne a,#80h,loop ;判断是否到了最左边的数,即第8个位码

ajmp start

play1: ;查表求段码子程序

; mov a,r7

; inc a

; mov r7,a

inc r7 ;这2句和上面三条语句实现功能相同

mov a,r7 ;a在这里做变址寄存器

mov dptr,#table1 ;表首址送dptr,dptr做基址寄存器

movc a,@a dptr ;基址寄存器加变址寄存器寻址

mov p0,a

ret

play2: ;查表求位码子程序(原理同play1)

mov a,r6

inc a

mov r6,a

mov dptr,#table2

movc a,@a dptr

mov p2,a

ret

table1: db 08h,0abh,12h,22h,0a1h,24h,04h,0aah ;段码表

table2: db 01h,02h,04h,08h,10h,20h,40h,80h ;位码表

delay_1ms: mov r5,#02h ;延时1ms子程序

temp: mov r4,#0ffh

djnz r4,$

djnz r5,temp

ret

end

下载到板上验证得到预想结果。

--------------------------------------------------------------------------------

C51实现如下(参考了AS的例程):

#include

okok云

时间延迟的作用,其实有些程序中可以直接省略,这是因为延时会导致数码管扫屏频率降低,延时稍长便会导致人眼可识别的闪动。

相关推荐

1ms/m等于多少us/cm?

1ms/cm=1000us/cmms=10^3usm=10^2cmms/m=10^3us/10^2cm=10 us/cmus/cm= 10^-1 ms/m例如:us/cm=10^-1 ms/m因为:ms=10^3us;m=10^2cm所以:ms/m=10^3us/10^2cm=10 us/cm即:us/cm=10^-1 ms/m例如:0.1ms/m=1us/cm;7.1us/cm=0.71ms/m扩展资料:通常,当电压保持不变时,这种直流电电路中的电流与电导成比例关系。如果电导加倍,则电流也加倍;如果电导减少到它初始值的1/10,电流也会变为原来的1/10。这个规则也适用于许多低频率的交流电系统,如家庭电路。在一些交流电电路中,尤其是在高频电路中,情况就变得非常复杂,因为这些系统中的组件会存储和释放能量。电导和电阻也有关系,如果R是一个组件和设备的电阻(单位欧姆Ω),电导为G(单位西门子S),则:G = 1/R
2023-04-05 05:40:311

时间单位:US NS MS(小写)的关系是什么? RT

1s=1000ms 1ms=1000us 1us=1000ns
2023-04-05 05:40:461

1us和1ns哪个大

1ns大。周期就是1ms,就是1000us,如果高电平出现的时间是200us,那么低电平的时间肯定是800us,那么占空比就是200:1000,也就是说PWM的占空比就是1:5。us表示时间单位,微秒。微秒是一种时间单位,多用于计算机的计算周期、时钟周期等方面。一般来说,计算机的时钟周期越短(时钟频率越高)计算机的运算速度越快。微秒,时间单位,符号μs(英语:microsecond),1微秒等于百万分之一秒(10的负6次方秒),1毫秒等于千分之一秒(10的负3次方秒)。
2023-04-05 05:40:531

理工科论文中时间微秒怎么表示是us吗?,有什么大小写之分吗?

①. 微秒,时间单位,符号μs(英语:microsecond ).   1微秒等于百万分之一秒(10的负6 次方秒)   0.000 001 微秒 = 1皮秒   0.001 微秒 = 1纳秒   1,000 微秒 = 1毫秒   1,000,000 微秒 = 1秒   1s = 1000ms   1ms = 1000us   1us = 1000ns   1ns = 1000ps②无大小写之分,因为就是μs.
2023-04-05 05:41:291

5000us等于多少ms

1毫秒等于1000微秒,5000us=5ms
2023-04-05 05:41:362

我的电导率仪表的单位是ms我测的饮用水的数值是0.07请问是多少us,自来水显示0.14请问是多少us?谢谢!

这个不好说!电导仪后面有量程的指拔开关,要看你这个开关拔在什么档位,才好分析!
2023-04-05 05:41:454

1毫米等于多少us?

1毫米等于1000um
2023-04-05 05:41:5415

8051单片机,此延时1ms是怎么来的?语法略懂得,求大神告知关键的地方,当然越详细越好啦谢谢。

C语言没有时间概念。具体用多少时间,都是实际测试出来的。延时1ms是怎么来的?还能怎么来!就是瞎猫。。。
2023-04-05 05:42:387

ns/cm和us/cm关系

ns/cm和us/cm关系是1ms/cm=(0.001)us/cm。根据相关公开资料显示us/cm即微西每厘米,是电导率的单位,1m=100cm换算过来1us/cm=0.1ms/m电导率的单位。
2023-04-05 05:42:521

20khz等于多少ms

5ms。1/20kHz=50us,1ms/m=10us/cm。us可以代表时间单位,指的是微秒,一微秒是一秒的百万分之一。也可以用来表示美元。时间单位,符号ms。单位在各个领域中有着不同的地位,有指机关、团体或着企业上班的地方,也有的在数学方面或物理方面计算单位。
2023-04-05 05:42:581

晶振是12mhz的单片机,定时1ms,如用定时方式1时的初值怎么计算?

对于12MHz的时钟,51单片机的机器周期就为1/(12000000/12)=1us那么对于定时1ms,需要定时器计数的个数就为1ms/1us=1000那么,对于方式1,需要装入的时间常数就为2^16-1000=64536——0xfc18建议随便参考一本51单片机的教材,都会有相关介绍。
2023-04-05 05:43:172

电导率换算

你用的单位不对,电导率通常用MS/m(读作兆西门子每米)或者%IACS。%IACS是试样电导率与某一标准值的比值的百分数称为该试样的导电率。1913年,国际退火铜标准确定:采用密度为8.89g/cm3、长度为1m、重量为1g、电阻为0.15328欧姆的退火铜线作为测量标准。在20摄氏度下,上述退火铜线的电导率为58.0MS/m时确定为100%IACS(国际退火铜标准),其他任何材料的导电率(%IACS)可用下式进行计算:导电率(%IACS)=电导率/58.0*100%你说的那个1MS/m等于10的10次方uS/cm;MΩ*cm(没有MΩ/cm这种单位)是个电阻率单位,1S=1/1Ω,非要换算过去那就是1MS/m等于10的负10次方MΩ*cm
2023-04-05 05:43:251

200us是多少频率

记上升时间为τ,截止频率为f0初略估计可采用下述公式:f0=0.35/τ=0.35/(200/1000000)=1750Hz
2023-04-05 05:43:334

电导率换算

电导率的定义及测量原理:电导率是物体传导电流的能力,是电阻率的倒数。电导率测量仪的测量原理是将两块平行的极板,放到被测溶液中,在极板的两端加上一定的电势(通常为正弦波电压),然后测量极板间流过的电导。根据欧姆定律,电导(G)--电阻(R)的倒数,是由电压和电流决定的。电导率的测量需要两方面信息。一个是溶液的电导G,另一个是溶液的几何参数K。电导可以通过电流、电压测量得到。根据关系式S=K×G可以等到电导率的数值。这一测量原理在直接显示测量仪表中得到广泛应用。而K=L/A(A—测量电极的有效极板;L—两极板的距离) 这一值则被称为电极常数K。在电极间存在均匀电场的情况下,电极常数可以通过几何尺寸算出。当两个面积为1cm的方形极板,之间相隔1cm组成电极时,此电极的常数K=1cm-1。电导率的基本单位及单位换算:为了纪念德国工程学家、企业家、电动机、发电机、有轨电车和指南针式电报机的发明人,改进过海底电缆,提出平炉炼钢法,革新了炼钢工艺,西门子公司创始人维尔纳·冯·西门子(ErnstWernervonSiemens)所以将电导率的基本单位用姆欧又称西门子(Siemens)。用S表示。常采用毫西门子mS/cm,微西门子uS/cm。1mS/cm.=1000uS/cm.
2023-04-05 05:43:402

1m/s等于多少s

一米每秒是速度单位,不是时间单位,因此也就不能说一米每秒是多少秒
2023-04-05 05:43:486

1ms等于多少ms

好傻啊,1ms不就等于1ms吗,哈哈哈打错了吧
2023-04-05 05:44:224

关于对单片机延时时间的疑惑(谁来解释一下,解释的好追加50分)

仿照楼主的问题,进行了程序调试,C调用汇编的时间,可以看插图。实验证明了三个问题。1. 使用 RETI 是不必要的,使用 RET 并不报错。2. C调用这个汇编函数的时间,是 (5 + 5 * n)us。(假设机器周期T=1us)。3. 从仿真调试过程中,没有看到楼主所说“衰减”的现象。分析说明如下:主函数传值到R7:1us;主函数调用汇编:2us;汇编返回值(无):0us;汇编返回(RET):2us;以上就是公式中的“5us”。汇编函数体各指令的耗时:ROND:NOP      ;1us     MOV 70H,#00H   ;2us     DJNZ R7,ROND   ;2us执行一遍共5us,以R7的值,控制循环次数,故有“5*n(us)”。条件所限,没有使用示波器进行测试,等以后找个机会吧。
2023-04-05 05:44:306

1ms等于多少秒?

1ms等于0.001秒如果本题有什么不明白可以追问,如果满意记得采纳如果有其他问题请采纳本题后另发点击向我求助,答题不易,请谅解,谢谢。祝学习进步
2023-04-05 05:44:563

脉宽为100us 带宽为1mhz 脉冲功率-20dbm

P平均=P峰*1us/1ms=100kw^(1/1000)=100w.
2023-04-05 05:45:031

1毫米等于多少us

1s=1000ms,1ms=1000us1秒=1000毫秒(ms),1毫秒=1/1000秒(s); 1秒=1000000 微秒(μs),1微秒=1/1000000秒(s);1秒=1000000000 纳秒(ns),1纳秒=1/1000000000秒(s);1秒=1000000000000皮秒 1皮秒==1/1000000000000秒;1分钟=60秒;1小时=60分钟;1天=24小时;1星期=7天;近点年=365.25964日;恒星年=365.256363004个平太阳日(≈365日6时9分10秒);回归年(贝塞尔年)=365.242199174日(≈365日5小时48分45.5秒);交点年=346.62003日(346日14小时52分52.9秒)。时间单位有(按时间单位从长到短排序):长于年:银河年、 千年、世纪、年代年:贝塞耳年、 回归年、近点年、交点年季度月旬周候日:太阳日、恒星日小时分秒短于秒:毫秒、 微秒、 纳秒、 皮秒、 飞秒、 阿秒、千分之一阿秒、 瞬间YS、普朗克常数请点击输入图片描述拓展资料秒是国际单位制中时间的基本单位,符号是s。有时也会借用英文缩写标示为sec。时间单位秒(second)是国际单位制中时间的基本单位,符号是s。有时也会借用英文缩写标示为sec.。秒的定义:铯133原子基态的两个超精细能阶之间跃迁时所辐射的电磁波的周期的9,192,631,770倍 的时间  。这个定义提到的铯原子必须在绝对零度时是静止的,而且所在的环境是零磁场  。毫秒是一种较为微小的时间单位,是一秒的千分之一(0.001秒),简称ms。典型照相机的最短曝光时间为一毫秒。一只家蝇每三毫秒扇一次翅膀;蚊子二十毫秒振翅一次;蜜蜂则每五毫秒扇一次。由于月亮绕地球的轨道逐渐变宽,它绕一圈所需的时间每年长两毫秒。在计算机科学中,10毫秒的间隔称为一个jiffy。微秒(microsecond)即百万分之一秒(10的负6次秒),简称μs。光在这个时间里可以传播300米,大约是3个足球场的长度,但是海平面上的声波只能传播1/3毫米。高速的商业频闪仪闪烁一次大约持续1微秒。一筒炸药在它的引信烧完之后大约24微秒开始爆炸。皮秒(picosecond)即纳秒的千分之一(10的负12次秒),简称ps。最快晶体管的运行以皮秒计。一种高能加速器产生的罕见亚原子粒子b夸克在衰变之前可存在1皮秒。室温下水分子间氢键的平均存在时间是3皮秒。飞秒(femtosecond)也叫毫微微秒,即10的负15次秒,简称fs。是标衡时间长短的一种计量单位。1飞秒只有1秒的一千万亿分之一,即1e−15秒或0.001皮秒(1皮秒是,1e−12秒)。即使是每秒飞行30万千米的光速,在一飞秒内,也只能走0.3微米,不到一根头发丝的百分之一。可见光的振荡周期为1.30到2.57飞秒。一个分子里的一个原子完成一次典型振动需要10到100飞秒。完成快速化学反应通常需要数百飞秒。光与视网膜上色素的相互作用(产生视觉的过程)约需200飞秒。阿秒(attosecond),又名阿托秒和渺秒,相当于10的负18次秒,简称as。是可测量的最短时间,中性π介子的寿命。如果宇宙的年龄几百亿年,那么10的负18次相当于其中的1秒。科学家是用阿秒来对瞬时事件进行计时的。 研究人员已经用稳定的高速激光产生了仅持续250阿秒的光脉冲。时间单位,是7种基本单位之一,长度、时间、质量、物质的量、光照度、电流 和(热力学)温度 是七种基本单位。 本词条中时间单位以时间从大到小列。现时每昼夜为二十四小时,在古时则为十二个时辰。当年西方机械钟表传入中国,人们将中西时点,分别称为“大时”和“小时”。随着钟表的普及,人们将“大时”忘淡,而“小时”沿用至今。
2023-04-05 05:45:331

5ms=多少μs?

1ms=1000us,5ms=5000us。
2023-04-05 05:45:462

ms/cm和us/cm如何换算?

1ms/cm=1000us/cmms=10^3usm=10^2cmms/m=10^3us/10^2cm=10 us/cmus/cm= 10^-1 ms/m例如:us/cm=10^-1 ms/m因为:ms=10^3us;m=10^2cm所以:ms/m=10^3us/10^2cm=10 us/cm即:us/cm=10^-1 ms/m例如:0.1ms/m=1us/cm;7.1us/cm=0.71ms/m扩展资料:通常,当电压保持不变时,这种直流电电路中的电流与电导成比例关系。如果电导加倍,则电流也加倍;如果电导减少到它初始值的1/10,电流也会变为原来的1/10。这个规则也适用于许多低频率的交流电系统,如家庭电路。在一些交流电电路中,尤其是在高频电路中,情况就变得非常复杂,因为这些系统中的组件会存储和释放能量。电导和电阻也有关系,如果R是一个组件和设备的电阻(单位欧姆Ω),电导为G(单位西门子S),则:G = 1/R
2023-04-05 05:45:532

1ms等于多少us

10
2023-04-05 05:46:152

1ms/m=?us/cm

ms毫秒=1000us微秒1m=100cmms/m=1000us/100cm=10us/cm
2023-04-05 05:46:242

1ns等于多少s

-910 *1/60
2023-04-05 05:46:433

1s等于多少us

1S=1000MS 1MS=1000US 1s=1000000us
2023-04-05 05:47:351

1s等于多少us

1S=1000MS 1MS=1000US 1s=1000000us
2023-04-05 05:47:411

1us=多少mhos

等等1000mhos。周期就是1ms,就是1000us,如果高电平出现的时间是200us,那么低电平的时间肯定是800us,那么占空比就是200:1000,也就是说PWM的占空比就是1:5。us表示时间单位,微秒。微秒是一种时间单位,多用于计算机的计算周期、时钟周期等方面。一般来说,计算机的时钟周期越短(时钟频率越高)计算机的运算速度越快。微秒,时间单位,符号μs(英语:microsecond),1微秒等于百万分之一秒(10的负6次方秒),1毫秒等于千分之一秒(10的负3次方秒)。
2023-04-05 05:47:481

1ms等于多少us

1秒=1000毫秒 1秒=1000000微秒
2023-04-05 05:47:541

us/cm的计算公式是什么?

1ms/cm=1000us/cmms=10^3usm=10^2cmms/m=10^3us/10^2cm=10 us/cmus/cm= 10^-1 ms/m例如:us/cm=10^-1 ms/m因为:ms=10^3us;m=10^2cm所以:ms/m=10^3us/10^2cm=10 us/cm即:us/cm=10^-1 ms/m例如:0.1ms/m=1us/cm;7.1us/cm=0.71ms/m扩展资料:通常,当电压保持不变时,这种直流电电路中的电流与电导成比例关系。如果电导加倍,则电流也加倍;如果电导减少到它初始值的1/10,电流也会变为原来的1/10。这个规则也适用于许多低频率的交流电系统,如家庭电路。在一些交流电电路中,尤其是在高频电路中,情况就变得非常复杂,因为这些系统中的组件会存储和释放能量。电导和电阻也有关系,如果R是一个组件和设备的电阻(单位欧姆Ω),电导为G(单位西门子S),则:G = 1/R
2023-04-05 05:48:281

电导率换算

0.1mS/m=1μS/cm,1m=100cm,1mS=1000μS
2023-04-05 05:48:431

24分一21分等于几分几秒

时间单位换算表: 1秒=1000毫秒(ms) 1毫秒=1/1,000秒(s) 1秒=1,000,000 微秒(μs) 1微秒=1/1,000,000秒(s) 1秒=1,000,000,000 纳秒(ns) 1纳秒=1/1,000,000,000秒(s) 1秒=1,000,000,000,000 皮秒(ps) 1皮秒=1/1,000,000,000,000秒(s) 1s=1000ms 1ms=1000us 1us=1000ns 1ns=1000ps 60秒 = 1分钟 60分钟 = 1小时 24小时 = 1天 7天 = 1星期 365.25天 = 1年 100年 = 1世纪 1平太阳日 = 24小时3分56.555秒 1恒星日 = 23小时56分4.091秒 1太阳年(回归年) = 365.2422天 (= 365天5小时48分46秒) 1恒星年 = 365.2564天 (= 365天6小时9分9.5秒) 1朔望月 = 29.5306天 1恒星月 = 27.3712天 1太阳年 = 12个朔望日 = 354.36天
2023-04-05 05:48:501

32.68us等于都是ms

S=1000MS1MS=1000US1s=1000000us 1us=0.0000001s
2023-04-05 05:48:572

电导率单位1ms/cm=( )us/cm

电导率单位1ms/cm=(0.001)us/cm 一般单位进级为:m=10-3 μ=10-6 n=10-9 p=10-12
2023-04-05 05:49:041

一微秒等于几秒?

1微秒等于一百万分之一秒
2023-04-05 05:49:133

电导率3mS/cm等于多少uS/cm

30us/cm。电导率单位us和ms的关系是ms=10^3us,速度可换算为1ms/m=10us/cm。
2023-04-05 05:49:201

电导率103.4μs/cm换算成mS/m是多少?

1ms=1000us,1m=100cm 换算过来1us/cm=0.1ms/m,所以103.4μs/cm=10.34ms/m
2023-04-05 05:49:281

电导率换算 200μS/cm=多少mS/m求结果和换算步骤 谢谢

1ms=1000us,1m=100cm 换算过来1us/cm=0.1ms/m 所以200us/cm=20ms/m。
2023-04-05 05:49:451

5000s等于多少MΩ?

1000ms=1000000us∴1ms=1000us∴5000us=5000÷1000=5ms
2023-04-05 05:49:532

电导率量程是200us/cm怎么换算成us/cm?

是ms/cm吧,1ms/cm等于1000us/cm,你是不是测纯水
2023-04-05 05:50:001

us/cm等于10^-1ms/m吗?

1ms/cm=1000us/cmms=10^3usm=10^2cmms/m=10^3us/10^2cm=10 us/cmus/cm= 10^-1 ms/m例如:us/cm=10^-1 ms/m因为:ms=10^3us;m=10^2cm所以:ms/m=10^3us/10^2cm=10 us/cm即:us/cm=10^-1 ms/m例如:0.1ms/m=1us/cm;7.1us/cm=0.71ms/m扩展资料:通常,当电压保持不变时,这种直流电电路中的电流与电导成比例关系。如果电导加倍,则电流也加倍;如果电导减少到它初始值的1/10,电流也会变为原来的1/10。这个规则也适用于许多低频率的交流电系统,如家庭电路。在一些交流电电路中,尤其是在高频电路中,情况就变得非常复杂,因为这些系统中的组件会存储和释放能量。电导和电阻也有关系,如果R是一个组件和设备的电阻(单位欧姆Ω),电导为G(单位西门子S),则:G = 1/R
2023-04-05 05:50:071

1ms是多少千米:1m每秒等于多少千米每小时

3.6
2023-04-05 05:51:072

什么是数码管动态显示

  该实验用到实验板的资源电路图如下:  其中P0口是段码,低电平有效。P2口是位码,高电平有效。P2.0口控制第1个数码管,一直到P2.7口控制第8个。该板的段码表如下:  各个数码管的段码都是p0口的输出,即各个数码管输入的段码都是一样的, 为了使其分别显示不同的数字, 可采用动态显示的方式,即先只让最低位显示0(含点),经过一段延时,再只让次低位显示1,如此类推。由视觉暂留,只要我们的延时时间足够短,就能够使得数码的显示看起来非常的稳定清楚。过程如下图。  采用上述方法思路编写如下:  org 0000h  start: mov a,#08h ;0 ;段码  mov p0,a  mov p2,#01h ;位码  lcall delay_1ms  mov a,#0abh ;1  mov p0,a  mov p2,#02h  lcall delay_1ms  mov a,#12h ;2  mov p0,a  mov p2,#04h  lcall delay_1ms  mov a,#22h ;3  mov p0,a  mov p2,#08h  lcall delay_1ms  mov a,#0a1h ;4  mov p0,a  mov p2,#10h  lcall delay_1ms  mov a,#24h ;5  mov p0,a  mov p2,#20h  lcall delay_1ms  mov a,#04h ;6  mov p0,a  mov p2,#40h  lcall delay_1ms  ; mov a,#0aah ;7  ; mov p0,a  mov p0,#0aah ;感觉用这句和上面两句实现一样,可能这种习惯以后会有用吧  mov p2,#80h  lcall delay_1ms  ljmp start  delay_1ms: mov r6,#2  temp: mov r5,#0ffh  djnz r5,$  djnz r6,temp  ret  end  下载到板上得到测结果为从低到高八位分别显示0到7(含点)。  ★ 上述方法逐次给P0或者P2赋值,一方面程序的复杂程度增加,另外一方面会使得程序的灵活性降低。如果要改变显示的数字,程序改动起来很麻烦。 所以要用51单片机中常用的一种方法:查表法。例如P0口输出段码时,我们可以把要显示的段码放在一个表格中,然后每次从这个表格里面取数,送到P0口即可。P2口输出位码时,可以把要用的位码放在另一个表格里,每次从此表中取数,送入P2口。这样,如果要改变显示的数字,只需要改变表格里面的数。  org 0000h  start: mov r7,#0ffh ;r7,r6查表时送入变址寄存器a (因自加1后为0,所以预置ffh)  mov r6,#0ffh  loop: lcall play1 ;调用显示段码子程序  lcall play2 ;调用显示位码子程序  lcall delay_1ms  cjne a,#80h,loop ;判断是否到了最左边的数,即第8个位码  ajmp start  play1: ;查表求段码子程序  ; mov a,r7  ; inc a  ; mov r7,a  inc r7 ;这2句和上面三条语句实现功能相同  mov a,r7 ;a在这里做变址寄存器  mov dptr,#table1 ;表首址送dptr,dptr做基址寄存器  movc a,@a+dptr ;基址寄存器加变址寄存器寻址  mov p0,a  ret  play2: ;查表求位码子程序(原理同play1)  mov a,r6  inc a  mov r6,a  mov dptr,#table2  movc a,@a+dptr  mov p2,a  ret  table1: db 08h,0abh,12h,22h,0a1h,24h,04h,0aah ;段码表  table2: db 01h,02h,04h,08h,10h,20h,40h,80h ;位码表  delay_1ms: mov r5,#02h ;延时1ms子程序  temp: mov r4,#0ffh  djnz r4,$  djnz r5,temp  ret  end  下载到板上验证得到预想结果。  --------------------------------------------------------------------------------  C51实现如下(参考了AS的例程):  #include <reg51.h>  #include <intrins.h> // 包含了左移函数_crol_()  void delayms(unsigned char ms); // 延时子程序  unsigned char data dis_digit; // 位选通值, 传送到P2口用于选通当前数码管的数值,  // 如等于0x01时,选通P2.0口数码管  unsigned char code dis_code[11]={0x08,0xab,0x12,0x22,0xa1, // 0,1,2,3, 4  0x24,0x04,0xaa,0x00,0x20, 0xff}; // 5,6,7,8,9, off  unsigned char data dis_buf[8]; // dis_buf 显于缓冲区基地址  unsigned char data dis_index; // 显示索引, 用于标识当前显示的数码管和缓冲区的偏移量  void main()  {  P0 = 0xff; // 关闭所有数码管  P2 = 0x00;  dis_buf[0] = dis_code[0];  dis_buf[1] = dis_code[1];  dis_buf[2] = dis_code[2];  dis_buf[3] = dis_code[3];  dis_buf[4] = dis_code[4];  dis_buf[5] = dis_code[5];  dis_buf[6] = dis_code[6];  dis_buf[7] = dis_code[7];  dis_digit = 0x01; // 首先选通P2.0  dis_index = 0; // 当前偏移量为0  while(1)  {  P0 = dis_buf[dis_index]; // 段码送P0口  P2 = dis_digit; // 选能位(即位码)  delayms(1); // 延时  dis_digit = _crol_(dis_digit, 1); // 位选通左移, 下次选通下一位  dis_index++; // 下一个段码  dis_index &= 0x07; // 见注释  }  }  void delayms(unsigned char ms) // 延时子程序(晶振12M)  {  unsigned char i;  while(ms--)  {  for(i = 0; i < 120; i++);  }  }  ★ 注释: 此句作用是8个数码管全部扫描完一遍之后,再回到第一个开始下一次扫描。写回一般形式:dis_index = dis_index & 0x07 。这种方法挺新,第一次见到,十六进制的07就是二进制的00000111,这样通过与操作可能控制循环了。比如dis_index 经第一次循环后值为00000001,和0x07与操作后值不变仍为0x01,第二次循环时,其值为0为0x02,与0x07后仍为0x02,一直到其值增为0x07时还是不变的,但再次循环后其值为0x80,再与0x07后就变成0x00了,这样又从初始循环了。此句可用 if (dis_index == 8) dis_index = 0 代替,效果一样。  ★ 通过C51用上述方法实现时,其段码放在了数组dis_code[11]中,再通过缓冲区数组dis_buf[]将程序中要调用的值装入,这样就可以用下标(偏移量)访问了。这样看上去有些繁锁,但其思路比较清楚,结构上也很明了,具有通用性,便于扩展。  ★ 另外只要把程序中的延时加长,如delayms(1000),下载到板上就可以看到实际上数码管是由低位到高位逐位显示的。  --------------------------------------------------------------------------------  若单单就实现这个功能而言,可以直接调入段码数组dis_code[11]中下标从0到7的值,而不必再设置缓冲数组dis_buf[],实现如下:  #include <reg51.h>  #include <intrins.h> //_crol_()用  void delayms(unsigned char ms); //延时子程序  unsigned char data dis_digit; //位选通值, 传送到P2口用于选通当前数码管的数值,  //如等于0x01时,选通P2.0口数码管  unsigned char code dis_code[11]={0x08,0xab,0x12,0x22,0xa1, // 0,1,2,3,4  0x24,0x04,0xaa,0x00,0x20, 0xff}; // 5,6,7,8,9,off  unsigned char data dis_index; //显示索引, 用于标识当前显示的数码管和缓冲区的偏移量  void main()  {  P0 = 0xff; // 关闭所有数码管  P2 = 0x00;  dis_index = 0; // 当前偏移量为0  dis_digit = 0x01; // 选通P2.0  while(1)  {  P0 = dis_code[dis_index]; // 段码送P0口  P2 = dis_digit; // 位码送P2口  delayms(1);  dis_digit = _crol_(dis_digit, 1); // 位选通左移, 下次选通下一位  dis_index++;  dis_index &= 0x07;  }  }  void delayms(unsigned char ms) // 延时子程序(晶振12M)  {  unsigned char i;  while(ms--)  {  for(i = 0; i < 120; i++);  }  }  ★ 通本来是想通过以下方式实现一次循环的:  for (dis_index = 0; dis_index < 8; dis_index++)  {  P0 = dis_code[dis_index]; // 段码送P0口  P2 = dis_index+1; // 位码送P2口  delayms(1);  }  可得到的总是错误的结果:第0位到第2位这三位显示的是三个8,第3位显示的是7,高四位没有显示。加长延时逐位观察也没有发现错误的规律,对Keil的调试也不熟悉,先把问题留到这,待找出原因后再补上。  [2006.5.2] 找出原因啦,补上:  今天又看了一下,找到上面的错误出在哪了。当时是想用dis_index的值做为位码的,即第一位显示0时,段码为dis_code[0], 即dis_index值为0, 此时位码值为1。第二位显示1时,段码为dis_code[1],即dis_index值为1,此时位码值为2。所以就简单用了个加1运算,将P0口的偏移值与P2口的位码联系起来。但仔细想一下位码的原理,上述方法显然是错的,只要再验证一步就明白了,即当第3位显示2时,段码为dis_code[2], dis_index值为2,加1后为3,按上述方法时就将这个3作为了位码,而正确的位码应该是4 (00000100B)。所以出错。实际上这个对应关系是有的,但不是简简单单的加1,位码应该是2的dis_index次幂。即:  0--1  1--2  2--4  3--8  4--16 ……  幂次运算函数flaot pow(float x, float y)包含在math.h中, 返回值为xy (float型):  for (dis_index = 0; dis_index < 8; dis_index++)  {  P0 = dis_code[dis_index]; // 段码送P0口  P2 = (char) pow(2, dis_index); // 位码送P2口  delayms(255);  }  再次下载到板上发现仍有问题, 即延时很小的时候显示混乱,但加大延时时间(如程序中的值)可以观查到数码管是按位正确显示的。另外用这种方法产生的代码量也很大(从写入速度看,很明显)。这里仅提出了一个思路,只在此实验中适用,意义不大,到此为止。  [补充结束]  --------------------------------------------------------------------------------  AS中绐出的例程是利用定时中断做的延时,参考修改到我的板上,程序如下:  #include <reg51.h>  #include <intrins.h> // 包含了左移函数_crol_()  unsigned char data dis_digit; // 位选通值, 传送到P2口用于选通当前数码管的数值,  // 如等于0x01时,选通P2.0口数码管  unsigned char code dis_code[11]={0x08,0xab,0x12,0x22,0xa1, // 0,1,2,3,4  0x24,0x04,0xaa,0x00,0x20, 0xff}; // 5,6,7,8,9,off  unsigned char data dis_buf[8]; // dis_buf 显于缓冲区基地址  unsigned char data dis_index; // 显示索引, 用于标识当前显示的数码管和缓冲区的偏移量  void main()  {  P0 = 0xff; //关闭所有数码管  P2 = 0x00;  TMOD = 0x01; // 00000001B 定时计数器0工作在方式1,16位定时器/计数器  TH0 = 0xFC;  TL0 = 0x17; // 预置初值 FC17H=64535D, 216-64535=1001us=1ms  IE = 0x82; // 10000010B T0溢出中断允许  dis_buf[0] = dis_code[0x0];  dis_buf[1] = dis_code[0x1];  dis_buf[2] = dis_code[0x2];  dis_buf[3] = dis_code[0x3];  dis_buf[4] = dis_code[0x4];  dis_buf[5] = dis_code[0x5];  dis_buf[6] = dis_code[0x6];  dis_buf[7] = dis_code[0x7];  dis_digit = 0x01; // 选通第0位数码管  dis_index = 0; // 偏移初值为0  TR0 = 1; // 启动T0  while(1); // 循环等待中断  }  void timer0() interrupt 1 // 定时器0中断服务程序, 用于数码管的动态扫描  {  TH0 = 0xFC; // 发生中断定时/计数器重装初值  TL0 = 0x17; // 感觉此处(及上)应该是0x18,而不是17,分析如下  P2 = 0x00; // 先关闭所有数码管  P0 = dis_buf[dis_index]; // 段码送P0口  P2 = dis_digit; // 位码送P2口  dis_digit = _crol_(dis_digit,1); // 位选通值左移, 下次中断时选通下一位数码管  dis_index++;  dis_index &= 0x07; // 8个数码管全部扫描完一遍之后,再回到第一个开始下一次扫描  }  ★ 定时器/计数器的输入脉冲周期与机器周期一样, 为时钟振荡频率的1/12。晶振用12M时,输入脉冲周期间隔为1us。机器周期为 1us。设T0的初值为X,计算初值的方法:本例中定时器用方式1,是16位的定时器,即最大值为216=65536,超过此值将发生溢出,引起中断,进入中断处理程序。这里要让其延时1ms,即1000us, 则有式216-X=1000,可得X=64536,换算为16进制为FC18,即初值TH0=0xFC,TL0=0x18。即定时器由64536开始计数,经1000次计数后值为65536,将发生定时中断,再进入中断处理子程序后,重新装和初值,如此循环下去。  而在上例中其装入的初值并非FC18(64536),而是FC17(64535)。我想大概认为其计数范围在0~65565的原因吧,我也想过这个问题,是用216-计数初值=中断间隔 呢,还是用(216-1)-计数初值=中断间隔呢? 随手查了几本书, 说法不一,不过用前者的较多, 我自己也认为前者比较合理, 因为在计算机中16位的二进制不能表示65536, 在各位均为1时表示的值为65535, 即65535H=1111111111111111B, 也可以说65536是溢出得到的。而何时响应中断就成了关键,拿上例来说,如设初值为64535(FC17),则计数到65535时,已经计数为1000个,即1ms,但此时并未发生溢出,因此也没有触发中断。而是在下一个计数后才发生。确切值应为1001us。若初值为64536(FC18),则恰好为所需值,所以上例中的初值应该用FC18而不是FC17。这仅仅是我自己的一点看法,至于是不是这样,还有待进一步考证。  --------------------------------------------------------------------------------  最终下载到实验板上结果:  ######################################补充########################################  用Proteus仿真结果如下(某一状态的截图):  ★ 该电路段码是按与板上接法对应的,即按前面的段码表次序连接。另外这个八位的仿真数码管最左端是第一位,最右端是第八位,与板上的顺序相反,所以接为了统一,该图以板为准连接。上图不加上拉电阻也可仿真出结果,只是P0口高电平显示为灰,即高阻。
2023-04-05 05:51:201

1PS=多少秒??

ps表示马力,功率单位,最大功率一般用马力 (PS)或千瓦(kw)来表示,1马力等于0.735千瓦至于你那个和秒相等的情况就不知所云了
2023-04-05 05:51:288

120000ms等于多少分钟

120000÷1000÷60=2分钟 1ms=0.001s 如果您认可我的答案,请点击下面的“选为满意回答”按钮,谢谢!
2023-04-05 05:52:011

我的单片机用的11.0592M的晶振,想写一个大概延时1MS的子程序,应该怎样写?(用C语言)

void delay(uint n){uint i,j;for(i=n;i>0;i--){for(j=110;j>0;j--);}}当n=1是延时大约是1ms,就是说n等于都少就延时多少ms,当然n的值不超过uint的最大值。头文件下请定义宏#define uchar unsigned char#define uint unsigned int
2023-04-05 05:52:106

数码管动态扫描中的delay 函数有什么作用?

延时
2023-04-05 05:52:274

1ps等于多少ns

1ps等于10^-3ns。1ps (皮秒) 1皮秒=00000000000001秒=10^_12秒。1ms (毫秒) 1毫秒=0001秒=10^_3秒 (millisecond)。1μs (微秒) 1微秒=0000001=10^_6秒 (microsecond)。1ns (纳秒) 1纳秒=00000000001秒=10^_9秒 (nanosecond)。1fs (飞秒) 1飞秒=0000000000000001秒=10^_15秒。时间单位的换算关系:(1)一天=1440分钟 ,1小时=60分钟 ,1分钟=60秒。(2)一刻=15分钟,一字=5分钟(闽南广东地区用法)。时钟各指针的角度关系:(1)普通钟表相当于圆,其时针或分针走一圈均相当于走过360°角。(2)钟表上的每一个大格对应的角度是:30°。(3)时针每走过1分钟对应的角度应为:0.5°
2023-04-05 05:52:331

采用6MHz的晶振,定时1ms,用定时器方式0时的初值应为多少

治好了我多年的脊椎病
2023-04-05 05:52:513

1ms与1s有什么关系?

我已经解答,耐心等待回,请先给我采纳
2023-04-05 05:53:063