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

📄 file6.asm

📁 单片机学习系统附的实验源代码
💻 ASM
字号:
;这是外部计数T/C1实验
;现象:LED1不停闪烁输出计数脉冲
;如果我们把P1.0(第1脚)和P3.5 T/C1 (第15脚)用导线直接相连
;我们就可以看到,在每次LED1闪烁一次以后,第一个数码管都会增加一次
;这里面显示的就是计数的结果(十六进制,并且数据没有经过译码)。
;用户可以自己参照实验3/5完成译码输出。

    beep   bit  p3.7
                
	segdata equ p0      ;数据 输出
	sege    equ p2.7    ;显示 选中
	segb    equ p2.6    ;位 选
	segd    equ p2.5    ;段 选
		
	int_data   equ  45h
	count_data equ  44h
	timer_data equ  43h
; *************   以上为预定义部分   ******************

	org 00h             ;定义代码开始,由于单片机初始化为pc = 0000H
                        ;因此,它执行的第一条指令必须从这里取得,
	jmp main            ;跳转到主程序开始处 
	
	org 1bh             ;定时计数器1中断入口地址
	jmp tim1            ;跳转到中断服务程序
	  
	org 030h            ;这才是主程序真正的代码开始处
                        ;也可以定义为不同的开始处,如 ORG 800H,
                        ; 那么主程序代码从800H 开始,
   main:mov sp,#30h     ;这一条不能放在rest子程序中,否则
        lcall rest      ;子程序不能正确返回,为什么?
        lcall pro_count ;计数程序开始
        jmp main        ;无限循环

;初始化程序
	    rest:	mov a,#00h
		mov b,#00h
		mov p0,#0
		mov p1,0ffh
		mov p2,#255
        clr beep
        ret                ;子程序返回

;中断服务程序   
tim1:push psw              ;现场保护
     clr tr1               ;停止计数操作,防止意外
     inc count_data        ;计数单元加1
     mov a,count_data      ;得到计数结果
     cjne a,#32,tlp1       ;如果没有计到32转移
     mov count_data,#00h   ;否则,将计数单元清零,重新计数
tlp1:mov th1,#255          ;写入计数初值高位
     mov tl1,#254          ;写入计数初值低位
     clr sege              ;选中显示
     mov segdata,#1
     setb segb
     nop
     clr segb
     mov a,count_data      ;取出计数结果
     mov dptr,#tab_nu      ;查表显示结果
     movc a,@a+dptr        ;查表结果在累加器a中
     mov segdata,a         ;输出显示
     setb segd
     nop
     clr segd
     setb beep             ;同时发出短音
     lcall delay           ;延时显示
     pop psw               ;现场恢复
     setb tr1              ;开始计数
     clr beep              ;停止发音
     reti                  ;中断返回
;////////  extern interrupt pro.. ///


;  ************   外部计数器程序
pro_count:
	mov count_data,#00h
	mov tmod,#50h           ;设置计数方式1,设置不同的计数方式,参见指导书
	setb ea                 ;允许总中断
	setb et1                ;允许定时计数1中断,修改这里可得到不同的计数结果
	mov th1,#255            ;计数初值,开始计数直到溢出,
	mov tl1,#254            ;从而产生中断
	setb it1                ;设置计数触发方式为下跳沿触发,clr it1则为低点平触发
                            ;修改这个参数看看结果如何
	setb tr1                ;开始计数操作 	
cl_p:clr ea                 ; 关闭所有中断  ? 为什么,到中断服务程序找答案
     lcall delay            ;软件延时
	 setb ea                ;允许所有中断 
     cpl p1.0               ;将P1,0取反,从而输出2Hz方波
	 jmp cl_p               ;反复输出,得到外部计数信号
	ret                     ;返回 
;******* count end    *****************

;*******  显示数码表  *****************
;this delay program for 250 ms delay
;used  r0, r1,r2 at psw.3 =0 and psw.4 = 0;

delay:  push psw     
        clr psw.3     
		setb psw.4       
		mov r0,#2    
		mov r1,#250 
		mov r2,#2    
    dl1:djnz r0,dl1 
        mov r0,#250 
    dl2:djnz r1,dl1
        mov r0,#240   
        mov r1,#248   
    dl3:djnz r2,dl1 
        nop        
	    pop psw      
       ret         
;*********   delay 250ms  end  *******************

;这是数码管的显示字符编码,如果你要加入更多代码,请从后面加入,
;具体说明见以前的相关说明

tab_nu: db 0c0h,0f9h, 0a4h, 0b0h, 99h , 92h , 82h, 0f8h 
        db 80h , 90h, 88h , 83h , 0c6h, 0a1h, 86h, 8eh 
        db 40h , 79h, 24h , 30h , 19h , 12h , 02h, 78h 
        db 00h , 10h, 08h , 03h , 46h , 21h , 06h, 0eh

      end             ; 告诉编译器代码到此结束,这一条指令必须要

⌨️ 快捷键说明

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