⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 单片机应用技术讲座(17)源程序.txt

📁 常用子程序-61个-4.2M.rar
💻 TXT
📖 第 1 页 / 共 2 页
字号:
单片机应用技术讲座(17)源程序

例1:
主程序通信参数的初始化:
         M_Address   DATA  76H
         Syn       DATA   0EBH
         ORG  0000H
         AJMP  MAIN
         ORG   0023H
         AJMP  Serial-com
  MAIN:.......
         ORL   SCON, #50H
         MOV  TMOD,#21H ;
         MOV  PCON, #80H
         MOV  TH1,  #0E6H;定义通信速率
         CLR   ET1            ;禁止定时器中断
....... 略
         SETB  EA
         SETB  ES             ;开中断
         SETB  TR1           ;启动定时器1 
.......略。
  上述代码中,“M_Address   EQU   76H”是伪指令定义,定义地址为76H,“Syn”同步字的定义同上。在单片机的中断系统那一讲里,我们曾向读者介绍,89C51单片机的串行通信口的中断入口地址是0023H,因此在0023H地址处安排跳转指令  AJMP  Serial-com,当中断发生时执行Serial-com中断子程序的任务。
串行ADC TLC2543与单片机的接口源程序


进行AD采样的51汇编程序如下:
;管脚定义   
 CLK    EQU      P1.3  
 DIN    EQU      P1.1  
 DOUT   EQU      P1.2  
 CS      EQU     P1.0  
MOV     R1,#00H ;0通道方式/通道数据 
 CLR    CLK ;
 SETB   CS ; 
 CLR    CS ; 
 MOV     R4,#08 ; 
 MOV    A, R1 ; 
LOOP1:  
 MOV    C,DOUT ;读转换结果 
 RLC    A ;A寄存器左移,移入结果数据位,移出方式/通道控制位 
 MOV     DIN,C ;输出方式/通道位 
 SETB   CLK ;设置I/O时钟为高 
 CLR    CLK ;清I/O时钟 
 DJNZ   R4,LOOP1 ;R4不为0,则返回LOOP1 
 MOV     R2,A ;转换结果的高8位放到R2中 
 MOV     A,#00H ;复位A寄存器 
 MOV     R4,#04 ;再读低4位 
LOOP2:  
 MOV     C,DOUT ;读转换结果 
 RLC    A ;A寄存器左移,移入结果数据位 
 SETB   CLK ;设置I/O时钟为高 
 CLR    CLK ;清I/O时钟 
 DJNZ   R4,LOOP2 ;R4不为0,则返回LOOP2 
 MOV     R3,A ;转换结果的低4位放到R3中 
 SETB   CS ; 
STOP:AJMP STOP


介绍一种4×4键盘程序的设计源程序
附:源程序KeyBord.asm
		K0		equ 01h
		K1		equ 02h
		K2		equ 03h
		K3		equ 04h
		K4		equ 05h
		K5		equ 06h
		K6		equ 07h
		K7		equ 08h
		K8		equ 09h
		K9		equ 0ah
		Ka		equ 0bh
		Kb		equ 0ch
		Kc		equ 0dh
		Kd		equ 0eh
		Ke		equ 0fh
		Kf		equ 010h
		
;***************************************************************变量定义
	KeyData		equ 30h         ;存放键码
	KeyClick		equ KeyData+1   ;去抖动延时变量
 	KeyDBClick		equ KeyClick+1  ;连击延时变量
	KeyMode		equ KeyDBClick+1;键译程序的任务指针
;***************************************************************常量定义
	Click20mS		equ 2           ;20mS延时(主程序执行时间=10mS)
	DBClick3S		equ 0		  ;连击延时3S
	DBClick100mS		equ 10		  ;连击间隔时间100mS	
	KeyPort		equ p1		  ;键盘连接的端口
	KeyAnlData  		equ  0f0h	  ;掩膜码
;*************************************************************************
KeyBord:
		mov a,KeyMode
		cjne a,#0,key_bo1
		;read port for key
		mov KeyData,#0
		mov r2,#04d
		mov r3,#01d
	scan:
		mov a,r3
		cpl a
		mov KeyPort,a
		mov a,KeyPort
		anl a,#KeyAnlData
		cjne a,#KeyAnlData,key_bo12
		mov a,r3
		rl a
		mov r3,a
		djnz r2,scan
		ret
		
	key_bo12:	
		mov KeyClick,#Click20mS
		mov KeyMode,#01
		ret		
	;****************************
	key_bo1:				
		cjne a,#1,key_bo2
		;jb Click20mS
		djnz KeyClick,key_bo1_end
		;count KeyData
		mov KeyData,#0
		mov r2,#04d
		mov r3,#01d
	scan1:
		mov a,r3
		cpl a
		mov KeyPort,a
		mov a,KeyPort
		anl a,#KeyAnlData
		cjne a,#KeyAnlData,key_bo24
		mov a,r3
		rl a
		mov r3,a
		djnz r2,scan1
		mov KeyMode,#0
		setb beep;12.10
	key_bo1_end:
		ret
	key_bo24:	
		;*** beep 
		clr Beep ;打开蜂鸣器
		;****count KeyData
		call CountKeyData
		mov KeyClick,KeyDubClick ;3s	
		mov KeyMode,#02
	key_bo22:
		ret
	;*****************************
	key_bo2:	
		cjne a,#2,key_bo3
		djnz KeyClick,key_bo32
		;********setb KeyData.6=1
		mov a,KeyData
		setb acc.6
		;**** d7 =1
		setb acc.7
		;************
		mov KeyData,a
		;**** 
		mov KeyDubClick,#DBClick100mS
		sjmp key_bo33
	key_bo32:
		;***** 判别释放
		;;;;!!!!!!!!!!!!
		mov r2,#04d
		mov r3,#01d
	scan2:
		mov a,r3
		cpl a
		mov KeyPort,a
		mov a,KeyPort
		anl a,#KeyAnlData
		cjne a,#KeyAnlData,key_bo3;没有释放
		mov a,r3
		rl a
		mov r3,a
		djnz r2,scan2
		;***** use KeyData
		mov a,KeyData
		setb acc.7
		mov KeyData,a
		mov KeyDubClick,#DBClick3S
	key_bo33:
		mov KeyMode,#0
	key_bo3:	
		ret		

;***********************************	
CountKeyData:
		cpl a
		add a,r3
		mov r4,a
		mov a,r4
		cjne a,#97h,no_1
		mov KeyData,#K0
	no_1:
		cjne a,#57h,no_2
		mov KeyData,#k1
	no_2:
		cjne a,#37h,no_3
		mov KeyData,#k2
	no_3:
		cjne a,#93h,no_4
		mov KeyData,#k3
	no_4:
		cjne a,#53h,no_5
		mov KeyData,#k4
	no_5:
		cjne a,#33h,no_6
		mov KeyData,#k5
	no_6:
		cjne a,#91h,no_7
		mov KeyData,#k6
	no_7:
		cjne a,#51h,no_8
		mov KeyData,#k7
	no_8:
		cjne a,#31h,no_9
		mov KeyData,#k8
	no_9:
		cjne a,#90h,no_10
		mov KeyData,#k9
	no_10:
		cjne a,#23h,no_11
		mov KeyData,#ka
	no_11:
		cjne a,#21h,no_12
		mov KeyData,#kb
	no_12:
		cjne a,#50h,no_13
		mov KeyData,#Kc
	no_13:
		cjne a,#30h,no_14
		mov KeyData,#Kd
	no_14:
		cjne a,#27h,no_15
		mov KeyData,#Kf
	no_15:
		ret	
;***************************************************
		proc KeyJmp  ;用户键功能处理程序
KeyJmp:
		;*****************
		mov a,KeyData
		jbc acc.7 ,use_k1
		ret
use_k1:
		jbc acc.6 ,use_k_3s
		;*** click do		
		mov KeyData,#0
		;单击处理。。。
use_k_3s:	;delay 3s click do
		mov KeyData,#0
		;** DubClick Kc 0.1s 
		;连击处理。。。
key_jmpend:
		ret
		end



程序使用说明
(1) 为了便于修改各按键对应的功能,以及提高键扫描的效率,在程序的开头定义了一个键值表,只需改动K0-Kf的上下位置即可(右边的十进制代码,不能改动!)。在用户的键散转处理程序中,用#K0-#Kf代替按键值。
   		K0	equ 01h
		K1	equ 02h
		K2	equ 03h
		K3	equ 04h
		K4	equ 05h
		K5	equ 06h
		K6	equ 07h
		K7	equ 08h
		K8	equ 09h
		K9	equ 0ah
		Ka	equ 0bh
		Kb	equ 0ch
		Kc	equ 0dh
		Kd	equ 0eh
		Ke	equ 0fh
		Kf	equ 010h

(2)键译程序使用的变量、常量说明
	;*******变量定义
	KeyData		;存放键码
	KeyClick		;去抖动延时变量
 	KeyDBClick		;连击延时变量
	KeyMode		;键译程序的任务指针
	;******常量定义
	Click20mS		;20mS延时(主程序执行时间=10mS)
	DBClick3S		;连击延时3S
	DBClick100mS		;连击间隔时间100mS	
	KeyPort		;键盘连接的端口
(3) 单击、连击的判别
   在KeyData变量的D6位代表:0=单击、1=连击;D7位代表此键码是否有效。(见图四)











(4)在主程序中蕴涵键译程序:include “KeyBord.asm”
(5)根据实际情况修改常量的数值。


作者联系信箱:E-mail:lj87c196@163.com
			 


程序说明:此文档是该系统操作运行的所有程序,所提供的程序均在DICE-51单片仿真机上调试仿真,并已经全部通过。
源程序:
              ORG  0000H
                 AJMP MAIN
              ORG 0003H
                 AJMP KEYS
              ORG    000BH
                 AJMP    PTT0
              ORG     001BH
                AJMP  PTT1            ;中断入口及优先级
  MAIN:      MOV SP,#60H
             CLR 5EH
             CLR 5FH                  ;清上、下限越限标志
             MOV A,#00H
             MOV  R7,#09H 
             MOV  R0,#28H 
  LP1:       MOV  @R0,A
             INC   R0
             DJNZ R7,LP1
             MOV  R7,#06H
             MOV  R0,#39H
 LP2:        MOV  @R0,A
           INC  R0
           DJNZ R7,LP2                ;清变量暂存单元
           MOV R7,#06H
           MOV R0,#50H
  LP3:     MOV @R0,A
           INC R0
           DJNZ R7,LP3                ;清显示缓冲区
           MOV 33H,#H
           MOV 34H,#H               ;赋Kp高、低字节
           MOV 35H,#H
           MOV 36H,#H               ;赋Ki高、低字节
           MOV 37H,#H
           MOV 38H,#H               ;赋Kd高、低字节
           MOV 42H,#H
           MOV 43H,#H               ;赋K高、低字节(风扇参数)
           MOV TMOD,#56H              ;T0方式2,T1方式1计数 
           MOV TL0,#06H
           MOV TH0,#06H               ;T0赋初值
		   MOV 25H,#28H			  ;设定值默认为40摄氏度
                 SETB TR0             ;键盘高优先级
                 SETB ET0
                 SETB EX0
                 SETB EA               ;开键盘、T0、T1中断
LOOP:       MOV R0,#56H
	    MOV R1,#55H
	    LCALL SCACOV		;调用标度转化-BCD转化子程序 
	    MOV R0,#53H                
            LCALL DIR
			NOP
			LCALL DLY10MS
			NOP
			LCALL DLY10MS
            AJMP  LOOP                 ;等待中断,循环显示当前温度                            

;****************************************************************************
  KEYS:         CLR EX0                     ;[键盘子程序]
                CLR EA
                PUSH PSW
                PUSH ACC                ;关中断,压栈
                LCALL   DLY10MS         ;消抖
    CC:         JB P3.2,AA
                SETB 5DH                ;置“显示设定温度”标志
		MOV A,25H		;取运算位的值(默认为40度)
		MOV B,#10		;进行BCD码转化
		DIV AB
		MOV 52H,A
		MOV A,B
		MOV 51H,A
                MOV R0,#50H
                LCALL DIR               ;显示设定温度
				NOP
				LCALL DLY10MS
				NOP
				LCALL DLY10MS
                JB P1.7,BB
		        MOV R1,#25H
                LCALL DAAD1             ;加一操作
				NOP
				LCALL DLY10MS
                AJMP CC
  BB:           JB P1.6,CC
                MOV R1,#25H
                LCALL DEEC1             ;减一操作
				NOP
				LCALL DLY10MS
                AJMP CC
  AA:           POP ACC                
                POP PSW
                SETB EX0
                SETB EA                 ;出栈,开中断

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -