历史上的今天
返回首页

历史上的今天

今天是:2025年01月10日(星期五)

正在发生

2018年01月10日 | 超声波测离程序

2018-01-10 来源:eefocus

;*采用 AT89C52  12MHz晶振             *
;测距范围5CM-2M,堆栈在4FH以上,20H用于标志
;显示缓冲单元在40H-43H,使用内存44H、45H、46H用于计算距离


CS1     BIT     P2.3
CS2     BIT     P2.4
D_I     BIT     P3.6   ;4
R_W     BIT     P2.5   ;5
E       BIT     P2.6   ;6
DB0_DB7 EQU     P0
X       EQU     22H ;页地址
Y       EQU     23H ;列地址  
COM     EQU     24H
DAT     EQU     24H
COUNT   EQU     25H       ;代码倒计数单元         
CODE0   EQU     26H     ;表格起始地址,赋0值后与DPTR合成查表指针地址
MUL_    EQU     26H  ;显示数字时,暂存单元(要显示的数是几就在里面存几)  
VOUT    EQU     P3.5    ; 红外脉冲输出端口
                  ORG     0000H
                  AJMP    START
                  ORG     0013H
                  LJMP    PINT1
                  ORG     000BH
                  LJMP    INTT0
               ORG     001BH
        LJMP    INTT1
               ORG     0030H
            START: MOV   SP,#4FH
                   ACALL INT
                   SETB  CS1
                SETB  CS2
                   ACALL CLEAR
       ACALL SY
       MOV      R0,#40H     ;40H-43H为显示数据存放单元(40H为最高位)
                   MOV      R7,#0BH
       CLEARDISP:  MOV      @R0,#00H
                   INC     R0
                   DJNZ    R7,CLEARDISP
                   MOV      20H,#00H
                   MOV      TMOD,#21H     ;T1为8位自动重装模式,T0为16位定时器
                   MOV      TH0,#00H      ;65毫秒初值
                   MOV      TL0,#00H
                   MOV      TH1,#0F2H     ;40KHZ初值
                   MOV      TL1,#0F2H
                   MOV      P0,#0FFH
                   MOV      P1,#0FFH
                   MOV      P2,#0FFH
                   MOV      P3,#0FFH
                   MOV      R4,#04H       ;超声波肪冲个数控制(为赋值的一半)
       SETB    PX1
                   SETB    ET0
                   SETB    EA
                   SETB    TR0           ;开启测距定时器
            START1: LCALL  DISPLAY
                    JNB    00H,$         ;收到反射信号时标志位为1
                    CLR    EA
                    LCALL  WORK          ;计算距离子程序
                    SETB   EA
                    CLR    00H
                    SETB   TR0          ;重新开启测距定时器
                    MOV     R2,#0FFH      ;测量间隔控制(约4*100=400MS)
                    LCALL  DISPLAY
                    DJNZ   R2,$
                    SJMP   START1
;**********中断程序* 
;T0中断,65毫秒中断一次
INTT0:    CLR     EA
                CLR     TR0
                MOV      TH0,#00H
                MOV      TL0,#00H
                SETB    ET1
                SETB    EA
                SETB    TR0       ;启动计数器T0,用以计算超声来回时间
                SETB    TR1       ;开启发超声波用定时器T1
OUT:            RETI
;T1中断,发超声波用
INTT1:          CPL     VOUT
                DJNZ    R4,RETIOUT
                CLR     TR1        ;超声波发送完毕,关T1
                CLR     ET1        ;
                MOV      R4,#04H
                SETB    EX1        ;开启接收回波中断
RETIOUT:        RETI
;外中断0,收到回波时进入
PINT1:          CLR     TR0        ;关计数器
                CLR     TR1
     CLR     ET1
                CLR     EA         ;
                CLR     EX1        ;
                MOV      44H,TL0    ;将计数值移入处理单元
                MOV      45H,TH0    ;
                SETB    00H        ;接收成功标志
                RETI
;**************显示程序*********              
; 40H为最高位,43H为最低位,先扫描高位
DISPLAY:  ; MOV CODE0,40H
          ;ACALL DSP1
          MOV MUL_,41H
    ACALL DSP2
          MOV MUL_,42H
    ACALL DSP3
          MOV MUL_,43H
    ACALL DSP4
    RET
;*********距离计算程序 (=计数值*17/1000CM)          
WORK:     PUSH  ACC
          PUSH  PSW
          PUSH  B
          MOV    PSW, #18H
          MOV    R3,  45H
          MOV    R2,  44H
          MOV    R1,  #00D
          MOV    R0,  #17D
          LCALL MUL2BY2
          MOV    R3,  #03H
          MOV    R2,  #0E8H
          LCALL DIV4BY2
          LCALL DIV4BY2
          MOV    40H, R4
          MOV    A,40H
          JNZ   JJ0
          MOV    40H,#0AH    ;最高位为零,不点亮
JJ0:      MOV    A,  R0
          MOV    R4, A
          MOV    A,  R1
          MOV    R5, A
          MOV    R3,  #00D
          MOV    R2,  #100D
          LCALL DIV4BY2
          MOV    41H, R4
          MOV    A,41H
          JNZ   JJ1
          MOV    A,40H    ;次高位为0,先看最高位是否为不亮
          SUBB  A,#0AH
          JNZ   JJ1
          MOV    41H,#0AH ;最高位不亮,次高位也不亮
JJ1:      MOV    A,  R0
          MOV    R4, A
          MOV    A,  R1
          MOV    R5, A
          MOV    R3,  #00D
          MOV    R2,  #10D
          LCALL DIV4BY2
          MOV    42H, R4
          MOV    A,42H
          JNZ   JJ2
          MOV    A,41H    ;次次高位为0,先看次高位是否为不亮
          SUBB  A,#0AH
          JNZ   JJ2
          MOV    42H,#0AH ;次高位不亮,次次高位也不亮
JJ2:      MOV    43H, R0
          POP   B
          POP   PSW
          POP   ACC
          RET
;***********两字节无符号数乘法程序                
; R7R6R5R4 <= R3R2 * R1R0
MUL2BY2:  CLR   A
          MOV    R7,  A
          MOV    R6,  A
          MOV    R5,  A
          MOV    R4,  A
          MOV    46H, #10H
MULLOOP1: CLR   C
          MOV    A,   R4
          RLC   A
          MOV    R4,  A
          MOV    A,   R5
          RLC   A
          MOV    R5,  A
          MOV    A,   R6
          RLC   A
          MOV    R6,  A
          MOV    A,   R7
          RLC   A
          MOV    R7,  A
          MOV    A,   R0
          RLC   A
          MOV    R0,  A
          MOV    A,   R1
          RLC   A
          MOV    R1,  A
          JNC   MULLOOP2
          MOV    A,   R4
          ADD   A,   R2
          MOV    R4,  A
          MOV    A,   R5
          ADDC  A,   R3
          MOV    R5,  A
          MOV    A,   R6
          ADDC  A,   #00H
          MOV    R6,  A
          MOV    A,   R7
          ADDC  A,   #00H
          MOV    R7,  A
MULLOOP2: DJNZ  46H, MULLOOP1
          RET
;*********四字节/两字节无符号数除法程序        
;R7R6R5R4/R3R2=R7R6R5R4(商)...R1R0(余数)
DIV4BY2:  MOV    46H,  #20H
          MOV    R0,  #00H
          MOV    R1,  #00H
DIVLOOP1: MOV    A,   R4
          RLC   A
          MOV    R4,  A
          MOV    A,   R5
          RLC   A
          MOV    R5,  A
          MOV    A,   R6
          RLC   A
          MOV    R6,  A
          MOV    A,   R7
          RLC   A
          MOV    R7,  A
          MOV    A,   R0
          RLC   A
          MOV    R0,  A
          MOV    A,   R1
          RLC   A
          MOV    R1,  A
          CLR   C
          MOV    A,   R0
          SUBB  A,   R2
          MOV    B,   A
          MOV    A,   R1
          SUBB  A,   R3
          JC    DIVLOOP2
          MOV    R0,  B
          MOV    R1,  A
DIVLOOP2: CPL   C
          DJNZ  46H,  DIVLOOP1
          MOV    A,   R4
          RLC   A
          MOV    R4,  A
          MOV    A,   R5
          RLC   A
          MOV    R5,  A
          MOV    A,   R6
          RLC   A
          MOV    R6,  A
          MOV    A,   R7
          RLC   A
          MOV    R7,  A
          RET
;**********************************************************汉字显示子程序************ 


DSP2:    SETB CS2
      CLR  CS1
         MOV X,#0BAH          
         MOV Y,#50H        
         MOV      DPTR,#DDB 
      ACALL DISP_
   RET
DSP3:    SETB CS2
      CLR  CS1
         MOV X,#0BAH          
         MOV Y,#58H        
         MOV      DPTR,#DDB   
   ACALL DISP_
   RET
DSP4:    SETB CS2
      CLR  CS1
         MOV X,#0BAH          
         MOV Y,#60H        
         MOV      DPTR,#DDB   
   ACALL DISP_
   RET
;************************8位字宽显示子程序:  (CODE0待设)**********************
DISP_:  MOV B,#10H    ;要显示的数是几就用几乘以16,得到基址起始地址  
        MOV A,MUL_
  MUL AB
   MOV CODE0,A
        MOV 39H,#02H
     MOV COUNT,#08H     
LP_:    MOV COM,X         ;设置页地址
     LCALL INST
     MOV COM,Y         ;设置列地址
     LCALL INST 
W_:     MOV A,CODE0          
        MOV C A,@A+DPTR
     MOV DAT,A
     LCALL DATA_  
     INC CODE0
     DJNZ COUNT,W_
     DJNZ 39H,LP1_
     RET
LP1_:   INC X
     MOV COUNT,#08H
     AJMP LP_
;***************************16位字宽显示子程序**********************   
DISP:   MOV 39H,#02H
     MOV CODE0,#00H
     MOV COUNT,#10H ;根据字宽及象素的不同而改变 DISP中的COUNT根据字高及象素改变CODE0    
LP:     MOV COM,X         ;设置页地址
     LCALL INST
     MOV COM,Y         ;设置列地址
     LCALL INST 
W:      MOV A,CODE0          
        MOV C A,@A+DPTR
     MOV DAT,A
     LCALL DATA_  
     INC CODE0
     DJNZ COUNT,W
     DJNZ 39H,LP1
     RET
LP1:    INC X
     MOV COUNT,#10H
     AJMP LP
;***********************以下为字符显示子程序块*************************
SY:     SETB CS1          ;开机   
     CLR  CS2
        MOV X,#0BAH          
        MOV Y,#40H         
        MOV      DPTR,#TAB1  ;
        CALL    DISP
        MOV X,#0BAH           
        MOV Y,#50H        
        MOV      DPTR,#TAB2  ;
        CALL    DISP
        MOV X,#0BAH          
        MOV Y,#60H        
        MOV      DPTR,#TAB3    ;
        CALL    DISP
        MOV X,#0BAH          
        MOV Y,#70H        
        MOV      DPTR,#TAB4  ;   
        CALL    DISP
  CLR CS1
  SETB CS2
        MOV X,#0BAH          
        MOV Y,#40H         
        MOV      DPTR,#TAB5  ;
        CALL    DISP
        MOV X,#0BAH          
        MOV Y,#70H         
        MOV      DPTR,#TAB6  ;
        CALL    DISP  
  RET
INST:   LCALL BUSY  ;写指令
        SETB E
     CLR D_I
     CLR R_W
     MOV DB0_DB7,COM
     CLR E
     RET
DATA_:  LCALL BUSY  ;写数据
        SETB E
     SETB D_I
     CLR R_W
     MOV DB0_DB7,DAT
     CLR E
     RET
BUSY:   CLR D_I     ;测忙
        SETB R_W
BUSY1:  MOV DB0_DB7,#0FFH
        SETB E
     MOV A,DB0_DB7
     CLR E
     JB ACC.7,BUSY1
     RET
CLEAR:   MOV R4,#00H   ;清屏
CLEAR1: MOV A,R4
        ORL A,#0B8H
   MOV COM,A
  ACALL INST
   MOV COM,#40H
  ACALL INST
   MOV R3,#40H
CLEAR2: MOV DAT,#00H
        LCALL DATA_
  DJNZ R3,CLEAR2
  INC R4
  CJNE R4,#08H,CLEAR1
  RET
INT:    MOV COM,#0C0H ;初始化
        ACALL INST
   MOV COM,#3FH
  ACALL INST
  RET
DEL:  MOV R7,#02H
DEL1: MOV R6,#0FFH
DEL2: MOV R5,#0FFH
      DJNZ R5,$
      DJNZ R6,DEL2
   DJNZ R7,DEL1
   RET
DDB:
DB 000H,0E0H,010H,008H,008H,010H,0E0H,000H,000H,00FH,010H,020H,020H,010H,00FH,000H ; "0" 0
DB 000H,010H,010H,0F8H,000H,000H,000H,000H,000H,020H,020H,03FH,020H,020H,000H,000H ; "1" 1
DB 000H,070H,008H,008H,008H,088H,070H,000H,000H,030H,028H,024H,022H,021H,030H,000H ; "2" 2
DB 000H,030H,008H,088H,088H,048H,030H,000H,000H,018H,020H,020H,020H,011H,00EH,000H ; "3" 3
DB 000H,000H,0C0H,020H,010H,0F8H,000H,000H,000H,007H,004H,024H,024H,03FH,024H,000H ; "4" 4
DB 000H,0F8H,008H,088H,088H,008H,008H,000H,000H,019H,021H,020H,020H,011H,00EH,000H ; "5" 5
DB 000H,0E0H,010H,088H,088H,018H,000H,000H,000H,00FH,011H,020H,020H,011H,00EH,000H ; "6" 6
DB 000H,038H,008H,008H,0C8H,038H,008H,000H,000H,000H,000H,03FH,000H,000H,000H,000H ; "7" 7
DB 000H,070H,088H,008H,008H,088H,070H,000H,000H,01CH,022H,021H,021H,022H,01CH,000H ; "8" 8
DB 000H,0E0H,010H,008H,008H,010H,0E0H,000H,000H,000H,031H,022H,022H,011H,00FH,000H ; "9" 9
DB 000H,0E0H,010H,008H,008H,010H,0E0H,000H,000H,00FH,010H,020H,020H,010H,00FH,000H ; "0" 0
DB 000H,0E0H,010H,008H,008H,010H,0E0H,000H,000H,00FH,010H,020H,020H,010H,00FH,000H ; "0" 0
DB 000H,0E0H,010H,008H,008H,010H,0E0H,000H,000H,00FH,010H,020H,020H,010H,00FH,000H ; "0" 0
DB 000H,0E0H,010H,008H,008H,010H,0E0H,000H,000H,00FH,010H,020H,020H,010H,00FH,000H ; "0" 0
DB 000H,0E0H,010H,008H,008H,010H,0E0H,000H,000H,00FH,010H,020H,020H,010H,00FH,000H ; "0" 0
DB 000H,0E0H,010H,008H,008H,010H,0E0H,000H,000H,00FH,010H,020H,020H,010H,00FH,000H ; "0" 0
TAB1:
DB 000H,03EH,022H,0E2H,022H,03EH,000H,0FEH,022H,022H,022H,022H,022H,0E2H,002H,000H ; 
DB 040H,07FH,020H,03FH,011H,011H,000H,07FH,042H,042H,042H,042H,042H,043H,040H,000H ; "距" 0
TAB2:
DB 000H,004H,004H,0F4H,084H,0CCH,0ADH,096H,094H,0ACH,0CCH,084H,0F4H,006H,004H,000H ; 
DB 000H,000H,0FEH,002H,01AH,016H,012H,013H,012H,016H,01AH,072H,082H,07EH,000H,000H ; "离" 1
TAB3:
DB 008H,008H,0E8H,0A8H,0A9H,0AEH,0EAH,008H,008H,0C8H,00CH,00BH,0EAH,008H,008H,000H ; 
DB 000H,000H,07FH,004H,024H,044H,03FH,000H,000H,01FH,040H,080H,07FH,000H,000H,000H ; "前" 2
TAB4:
DB 008H,008H,008H,008H,008H,008H,0F9H,04AH,04CH,048H,048H,0C8H,008H,008H,008H,000H ; 
DB 040H,040H,020H,010H,00CH,003H,000H,000H,020H,040H,040H,03FH,000H,000H,000H,000H ; "方" 3
TAB5:         
DB 000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H ; 
DB 000H,000H,036H,036H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H,000H ; ":" 0
TAB6:
DB 0C0H,030H,008H,008H,008H,008H,038H,000H,008H,0F8H,0F8H,000H,0F8H,0F8H,008H,000H ; "C" 1
DB 007H,018H,020H,020H,020H,010H,008H,000H,020H,03FH,000H,03FH,000H,03FH,020H,000H ; "M" 2   
   
    END


推荐阅读

史海拾趣

ARCOLECTRICSWITCHES公司的发展小趣事

随着电子行业的不断发展,ARCOLECTRIC SWITCHES公司意识到单打独斗已经无法满足市场需求。因此,公司积极寻求与上下游企业的合作,共同打造完善的产业链。通过与供应商建立长期稳定的合作关系,确保原材料的稳定供应;与下游企业开展深度合作,共同研发新产品、开拓新市场。这种合作共赢的模式使得ARCOLECTRIC SWITCHES公司在行业中更具竞争力。

广东奥科公司的发展小趣事

广东奥科公司深知品质是企业生存和发展的关键。因此,公司始终将品质管理放在首位,从原材料采购到生产流程控制,再到产品出厂检验,每一个环节都严格把控品质。同时,公司还建立了完善的品质管理体系和持续改进机制,通过不断优化生产工艺和提升产品质量,确保每一款产品都能满足客户的期望和需求。

埃派克森微电子(Apexone)公司的发展小趣事

作为一家具有社会责任感的企业,埃派克森微电子在发展过程中始终关注社会公益事业。在四川汶川地震发生后,公司积极发起救援捐赠活动,通过中国扶贫基金会为灾区捐款10万元,帮助受灾民众度过难关。这一行动体现了埃派克森的社会责任感和人文关怀精神,也为公司在社会中树立了良好的形象。

这五个故事展示了埃派克森微电子在电子行业中的发展历程和取得的成就。从创新起步到专利技术的突破与商用,再到业绩的连续增长和国际化步伐的加快,以及积极履行社会责任的公益行动,都充分展现了埃派克森微电子的实力和担当。未来,随着科技的不断进步和市场需求的不断变化,埃派克森微电子将继续保持创新精神,不断提升产品性能和市场竞争力,为电子行业的发展做出更大的贡献。

Econais公司的发展小趣事

随着技术的不断成熟和市场的日益扩大,Econais开始将目光投向全球市场。公司积极参加各类国际展会和研讨会,与全球各地的客户和合作伙伴建立联系。同时,Econais还针对不同地区的市场需求,推出定制化的产品和解决方案。这些努力使得Econais在全球范围内的市场份额逐渐扩大。

弘凯光电(BRIGHTEK)公司的发展小趣事

弘凯光电一直致力于技术创新和产品升级。公司拥有一支高效、创新的技术团队,通过对产品技术的深入研究和持续创新,不断推出具有竞争力的新产品。例如,公司的iCLed系列产品,凭借其独特的设计和卓越的性能,在智能座舱设计领域获得了广泛应用。这种对技术创新的不断追求,使得弘凯光电在电子行业中始终保持领先地位。

EnerSys公司的发展小趣事

为了进一步拓展市场并加强合作伙伴关系,EnerSys积极寻求与行业领先企业的合作。例如,EnerSys与Verkor携手打造美国锂电超级工厂,这一合作项目将有助于提高EnerSys在美国市场的竞争力,并加速全球清洁能源的转型。通过与合作伙伴的紧密合作,EnerSys在电子行业中的影响力逐渐增强。

问答坊 | AI 解惑

C语言编译过程总结详解(转载)

本来打算把编译部分的内容总结一下,偶然看到一位网友的文章写得很全面,故此稍加整理,以作备忘。         C语言的编译链接过程要把我们编写的一个c程序(源代码)转换成可以在硬件上运行的程序(可执行代码),需 ...…

查看全部问答>

移植ax88796 网卡驱动到vivi时遇到的问题,望大虾们帮帮忙!!!

在网上下了一个有tftp功能的vivi,但是要自己添加ax88796网卡的驱动,现将uboot-1.2.0中对应的ne2000的驱动copy到vivi下面,编译通过后,当在板子上运行的时候就出错了,后来通过prink的信息追踪到了下面的函数: static void dp83902a_poll(void ...…

查看全部问答>

关于字符串指针的初始化

如果要初始化一个字符串有两种写法: 1:char *p = \"hello\"; 2:char *p; p = \"hello\"; 这两种写法有没有错的,是否有区别。 谭浩强c程序设计p238说是一样的,大家讨论一下吧 …

查看全部问答>

怎样为pci寻找地址映射

怎样读取pci bar0中的地址,并且映射成可以使用的虚拟地址?2.6的内核。ioremap?ioportremap?dev_resource_start?…

查看全部问答>

不知算不上stm32vet6Z的硬件BUG

USART3映射方式2(映射到PD8,PD9)时,要先开启AFIO功能,再初始化相关外设后,USART才有效。      以下代码是正确的:      u32 backRcc = RCC->APB2ENR & (RCC_APB2Periph_GPIOB  | ...…

查看全部问答>

LM311峰值检测电路(TI)

   最近在做一个有关峰检测的电路,网上一搜就有,非常经典的就是那个LM311,刚好手头有啊!就按照datasheet搭了一个,测试后不行,然后我就怕是搭的不稳定就焊了一个电路,但是还是不行,我还是不死心,就按照结构图,运放+三极管用其他 ...…

查看全部问答>

zigbeez在智能家居中有成熟方案的公司有几家

我想搞一个智能家居系统,用zigbee技术,不知道这样的厂家多吗?做的好的有那几家?…

查看全部问答>

求助FPGA与2812通讯问题

小弟在此求助两个控制器通讯问题,说明:使用XINTF进行通讯,FPGA发送16位数到dsp数据总线,dsp通过周期中断读取数据总线上的数据,现在的问题是这样:有些数可以准确无误的传输过去,但我不能很准确的把握规律,大概0x5000一下的数可以传,没什么 ...…

查看全部问答>

PCB 中没有CES

我新安装的是MentorExpedition7.9.3,  打开Expedition PCB  后   ,打开一块板子,但是发现Expedition PCB  软件上面的CES是灰色的 ,不能使用,这是怎么回事啊???、、、、、哪位高手能帮忙解决一下啊?谢谢啦! ...…

查看全部问答>

按键的verilog问题

module key(clk,key_in,key_out); input clk; input[3:0]key_in;//按键输入 output[3:0]key_out; reg[3:0]dout1,dout2,dout3; reg[3:0]a; reg i; //assign key_out=a; always@(posedge clk)//按键消抖 begin        ...…

查看全部问答>