0

关于投票
查表程序设计

查表在程序中应用十分广泛,以设计一流水灯为例

介绍设计方法

一。在ROM(程序存储器)将数据建表

TAB1:  DB 0FEH,0FDH,0FBH,0F7H            ; 设定数据

              DB 0EFH,0DFH,0BFH,07FH             
              DB 0FEH,0FDH,0FDH,0FDH            
              DB 0EFH,0DFH,0BFH,07FH            
              DB 01H   

                                       
  二。取表中数据           
  

                     MOV DPTR, #TAB1            ; 指向设定数据表位址
                     CLR A                                     ; 使偏移量为0
                     MOVC A,@A+DPTR          ; 取出设定数据

三。应用范例

                  ORG 00H
START:   MOV DPTR, #TAB1           ; 指向设定数据表位址
LOOP:     CLR A                                    ; 使偏移量为0
               MOVC A,@A+DPTR             ; 取出设定数据
               CJNE A,#01,LOOP1              ; 01为结束字符
               JMP START                            ; 结束返回
LOOP1: MOV P0,A                              ; 没结束则取出数据送到P0

               MOV R3,#250                         ; 改变R3(1-255),改变延时间的长短
               CALL T_100M                        ; 转延时子程序
               INC DPTR                                ; 取下一位数据
               JMP LOOP                             ; 循环


            ; ****延时子程序****
T_100M:

              MOV R4,#200
          D1: MOV R5,#249
              DJNZ R5,$
              DJNZ R4,D1
              DJNZ R3,T_100M
              RET

 

TAB1:  DB 0FEH,0FDH,0FBH,0F7H            ; 设定数据

              DB 0EFH,0DFH,0BFH,07FH             
              DB 0FEH,0FDH,0FDH,0FDH            
              DB 0EFH,0DFH,0BFH,07FH            
              DB 01H 

end

     

系统分类: 单片机
用户分类: 51单片机
标签: A51
来源: 原创
发表评论 阅读全文(841) | 回复(0)

0

关于投票
通用延时子程序

            ;通用延时子程序(晶振12M)

        
     ;----------------------------------------------
     ;      通用X*100US延时子程序
     ;          055
     ;----------------------------------------------


    ;=======(X*100US)=======
    T_01M:      MOV R5,#X
    T_U1:       CALL T_100U
                DJNZ R5,T_U1
                RET


    ;=======100US=======
    T_100U:     MOV R6,#47
                DJNZ R6,$
                RET   
        

     ;----------------------------------------------
     ;      通用X*1MS延时子程序
     ;           055

     ;---------------------------------------------- 
        
      ;=======(X*1MS)=======
   
    T_1M:       MOV R5,#X
                MOV R6,#5
    TM1:        MOV R7,#98
    TM2:        DJNZ R7,$
                DJNZ R6,TM1
                DJNZ R5,T_1M
                RET
 
        
     ;----------------------------------------------
     ;      通用X*100MS延时子程序
     ;          055

     ;----------------------------------------------


    ;=======(X*100MS)=======
    T_100M:     MOV R5,#X
    TM3:        MOV R6,#250
    TM4:        MOV R7,#200
    TM5:        DJNZ R7,TM5
                DJNZ R6,TM4
                DJNZ R5,TM3
                RET
              

 

系统分类: 单片机
用户分类: 51单片机
标签: 延时
来源: 原创
发表评论 阅读全文(545) | 回复(0)

0

关于投票
定时器初值的计算

一。10MS定时器初值的计算:

1.晶振12M

12MHz除12为1MHz,也就是说一秒=1000000次机器周期。10ms=10000次 机器周期。

 65536-10000=55536(d8f0)

TH0=0xd8,TL0=0xf0 

2.晶振11.0592M

11.0592MHz除12为921600Hz,就是一秒921600次机器周期,10ms=9216次机器周期

 65536-9216=56320(dc00)

TH0=0xdc,TL0=0x00

二。50MS定时器初值的计算:

1.晶振12M

12MHz除12为1MHz,也就是说一秒=1000000次机器周期。50ms=50000次 机器周期。

 65536-50000=15536(3cb0)

TH0=0x3c,TL0=0xb0

2.晶振11.0592M

11.0592MHz除12为921600Hz,就是一秒921600次机器周期,50ms=46080次机器周期

 65536-46080=19456(4c00)

TH0=0x4c,TL0=0x00

三。使用说明

以12M晶振为例:每秒钟可以执行1000000次机器周期个机器周期。而T 每次溢出
最多65536 个机器周期。我们尽量应该让溢出中断的次数最少(如50ms),这样对主程序的
干扰也就最小。

系统分类: 单片机
用户分类: 51单片机
标签: 定时初值
来源: 原创
发表评论 阅读全文(531) | 回复(0)

0

关于投票
1602测试程序的编写方法

  
LCD1602应用已很普遍,本文介绍 利用LCD1602使用说明书,编写测试程序的编程方法。       

   1602使用说明附后;

1.接口定义
 参阅使用说明中:《接口信号定义》  

如LCD1602和MCU连接如下
                       4  (RS)     ---------------------P2.4
                        5 (R/W) ---------------------P2.3                       

                        6(E)        ---------------------P2.5
                        7-14             ----------------=---P0.0-P0.7


    接口定义如下:
    RS  BIT P2.4
    RW  BIT P2.3
    E   BIT P2.5
    DAT EQU P0

2.写入地址
    参阅使用说明中:3.RAM地址映射图
    说明:从图可见1602:第一项地址:00-0FH
                        第二项地址:40H-4FH
    如我们要显示字符,必须设置数据指针。
    设置方法见使用说明中4.2.1。指令码+地址
    如:我们要在第一项第一列中显示字符:80H(指令)+00H(地址)=10000000B
    程序可写入:MOV A,#10000000B
    如:我们要在第二项第十列中显示字符:80H(指令)+4AH(地址)=11001010B
    程序可写入:MOV A,#11001010B

3.指令的编写
    1602共有11条指令,参阅使用说明中:4.指令说明
    第一条指令:显示模式的设置,我们用1602
    程序可写入:MOV A,#00111000B,表示设置是16*2,5*7点阵,8位数据接口。
    其它指令的编写在程序中说明

4.LCD送入显示的是ASCII码(查表可知)

5.测试程序(有说明)
;=========================================;
;       LCD1602显示驱动测试程序
;                   NJF-1602
;                   12MHZ
;                  间接方式    
;=========================================;
              
               RS EQU P2.4          ;接口定义
               RW EQU P2.3
               E EQU P2.5
               DAT EQU P0

               ORG 0000H
               JMP MAIN
               ORG 0040H

               ;*****主程序

   MAIN:       MOV SP,#60H
               CALL CSH_LCM          ;启动
               MOV A,#11001111B      ;显示第二项16列(最后一个字)
               CALL WR_LCM           ;写入指令
               MOV A,#45H            ;送ASCII“E”
               CALL WR_DATA          ;写入数据
               JMP $

               ;*****启动

   CSH_LCM:    MOV A,#00111000B       ;参阅使用说明中:4.1.1(16*2,5*7点阵,8位数据接口)
               CALL WR_LCM            ;写入指令
               MOV A,#00001110B       ;参阅使用说明中:4.1.2上(开显示,显示光标不闪耀)
               CALL WR_LCM            ;写入指令
        MOV A,#00000110B       ;参阅使用说明中:4.1.2下(N=1当读或写一个字符后地址
                                      ;指针加一,光标加一。S=0写一字符,屏示动)
               CALL WR_LCM            ;写入指令
               RET

               ;*****写入指令

   WR_LCM:     CALL RD_BF             ;判LCD忙
               CLR E                  ;注意:E设低电平主要是为后产生一高电平脉冲
               CLR RS                 ;参阅使用说明中:1.2节  RS="L"
               CLR RW                 ;RS=L
               SETB E                 ;E=高脉冲
               MOV DAT,A              ;d0-d7指令码
               CLR E                  ;允许端恢复低电平
               RET

               ;*****判LCD忙          ;说明:MCU处理一个指令,仅需若干个uS,而LCD得化40uS
                                      ;-1.64ms,所以当写读时,先查LCD是否忙?
                                      ;参阅使用说明中:2-状态字说明
              
   RD_BF:      PUSH ACC               ;ACC入栈
   BF_LOOP:    SETB RW                ;RW-H
               CLR RS                 ;RS-L
               SETB E                 ;E=H
               MOV A,DAT              ;读数据
               CLR E                  ;允许端恢复低电平
               JB ACC.7,BF_LOOP       ;参阅使用说明中:2-状态字说明:对控制器读写之前,必须
                                      ;进行读写检测,确保ACC.7=0
               POP ACC                ;ACC出栈
               CALL DEAY              ;转延时
               RET

               ;*****写入数据
              
   WR_DATA:    CALL RD_BF             ;判LCD忙
               CLR E                  ;拉低电平
               SETB RS                ;参阅使用说明中:1-4   RS="H"
               CLR RW                 ;RW=L
               SETB E                 ;E=高电平
               MOV DAT,A              ;写入数据
               CLR E                  ;允许端恢复低电平
               RET
 
               ;*****延时2.5MS
              
   DEAY:       MOV R6,#5
   LD1:        MOV R7,#250
               DJNZ R7,$
               DJNZ R6,LD1
               RET
               END

pdf

系统分类: 单片机
用户分类: 51单片机
标签: LCD1602
来源: 原创
发表评论 阅读全文(791) | 回复(1)
总共 , 当前 /