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

📄 file11.asm

📁 单片机学习系统附的实验源代码
💻 ASM
字号:
;该信号源可以产生 多种波形,包括:占空比为1:1的方波,频率可调节(1 -- 50 Hz)
;调制波,载波频率为1k,备调制频率   (1 --  50 Hz)
;高频信号 :  高电平 5V, 低电平  0V   频率 500K;
;按键1选择 输出波形方式 1 ->非载波(LED3亮,LED1指示输出情况)  2 -> 载波(LED2亮,LED1指示输出);
;按键2选择 输出频率  
;按键3  启动\停止

        beep   bit  p3.7
                
        led1   bit  p1.0
        led2   bit  p1.1
        led3   bit  p1.2
        led4   bit  p1.3
        led5   bit  p1.4
        led6   bit  p1.5
        led7   bit  p1.6
        led8   bit  p1.7

        s1     bit  p0.0
        s2     bit  p0.1
        s3     bit  p0.2
        s4     bit  p0.3
        s5     bit  p0.4
        s6     bit  p0.5
        s7     bit  p0.6
        s8     bit  p0.7

                t_l         equ  41h              ;定时初值低位
                t_h         equ  42h              ;定时初值高位
                mode        equ  43h              ;输出方式
                fre         equ  44h              ;输出频率
                dis_h       equ   45h             ;显示高位
                dis_l       equ   46h             ;显示低位
                intcout     equ   47h             ;需要定时的次数

                start          bit    00h
                flag           bit    01h
                outmode        bit    02h
                outh           bit    03h

	led_data   equ  p2
	
	key1   bit   p3.3
	key2   bit   p3.4
	key3   bit   p3.5
	key    equ   46h

;   ******************       以上预定义部分

	org 00h                  
	jmp main                

                org 0bh
                jmp tim0                 ;定时器T0中断服务程序
	
	org 1bh
	jmp tim1                 ;定时器T1中断服务程序
	
	org 030h

   main:mov sp,#30h
        clr beep
	lcall rest
        lcall timer               ;设置定时器工作方式
     lp:lcall process             ;分析命令
        lcall out
        jnb start,lp
        lcall display
        clr beep
        jmp lp

; *********  初始化  ************
rest:	mov a,#00h              ;寄存器初始化
	mov b,#00h          
        mov fre,#00h
        setb outmode            ;带调制输出
        clr  outh               ;输出低电平
        mov mode,#01h           ;工作模式 1
	mov p0,#0               ;禁止数码管
	mov p2,#255             ;
	mov p1,0ffh             ;禁止 LED
        clr beep                ;禁止蜂鸣器
        clr start               ;清除开始标志
        mov dis_h,#00h          ;清除频率值
        mov dis_l,#00h          ;
       ret                      ;返回

;***********  定时器T1中断服务程序  ****************

tim1: mov th1,t_h                ;定时20ms
      mov tl1, t_l               ;
      mov r0,intcout
      djnz r0,tin1
      cpl flag      
 tin1:clr flag
      reti

;***********  定时器T0中断服务程序  ****************

tim0: mov th0,0fch                ;定时1ms
      mov tl0, 17h                ;
      jnb flag,t_end              ;flag运行标志,=1标示允许输出
      jnb outh,t_end              ;outh 表示输出高电平的状态
      cpl p1.0
t_end:reti

; *************  波形输出  ****************************
;  根据用户的输入指令,读入相应的数据,以产生不同频率的波形
;  数据表格存在 data_tab中

out:         jnb start,o_end              ; 开关状态,关闭则返回
             jb outmode,out12
             clr tr0                      ;模式0,非载波输出
             jnb flag,out11               ;查看定时器T1工作状态
             setb p1.0                    ;定时器T1前半周期,输出高电平
     out11:  clr p1.0                     ;定时器T1后半周期,输出低电平
             jmp o_end                    ;返回
     out1:   jnb flag,out12               ;工作方式1
             setb tr0                     ;定时器前半周期,定时器T0输出
   out12:    clr p1.0                     ;定时器后半周期,输出低电平 

   o_end: ret                             ;返回

;  ************  读入数据  *****************************
indata:      mov a,fre 
             mov b,#3
             mul ab
             mov a,b
             mov dptr,#data_tab             ;数据表头
             movc a,@a+dptr                 ;读取数据
             mov t_h,a                      ;保存数据高位
             inc dptr                       ;找下一个
             movc a,@a+dptr                 ;读取第二个数据
             mov t_l,a                      ;保存低位
             inc dptr
             movc a,@a+dptr
             mov intcout,a
           ret                              ;返回
;  ************ 工作协调子程序   **********************
process:  mov key,#00h                  ;设置键值
                lcall pro_key                    ;查询键盘
                mov a,key                        ;得到键值
                jz pro_end                        ;用户没有按键,直接返回
                cjne a,#1,pro1                  ;用户按 1 键
                mov key,#00h                  ;重新设置键值
                clr led3                             ;点亮LED3指示灯
                setb led2                          ;熄灭LED2指示灯
                inc  mode                          ;设置输出模式
                mov a,mode                      ;如果模式大于2
                cjne a,#2,pro_end                      ;修改为 0 
                mov mode,#00h                 ;模式不能大于2
        pro1:cjne a,#2,pro3                     ;功能2设置频率
                mov key,#00h                      ;清除键盘结果
                inc fre                                   ;频率自增
                mov a,fre                              ;显示频率值
                cjne a,#51,pro_end              ;限制频率不大于50
                mov fre,#00h                        ;
       pro3: mov a,#03h                         ;运行状态设置
                setb led3                             ;设置指示灯状态
                setb led2                             ;
                mov key,#00h                    ;清除键盘内容
                cpl start                            ;如果没有设置启动状态,设置
 pro_end:       ret                                       ;如果设置了启动状态

; *********  码型变换   *************
bcd:          mov b,#10
                 div ab
                 mov dis_h,a
                 mov dis_l,b
                 ret
;  **********   显示     **************
display:         mov a,fre
                 mov b,#10
                 div ab
                 mov dis_h,a
                 mov dis_l,b
                 mov dptr,#tab_nu
                 mov a,dis_h
                 movc a,@a+dptr
                 mov led_data,a
                 setb s2
                 clr    s1
                 lcall m_del
                 mov a,dis_l
                 movc a,@a+dptr
                 mov led_data,a
                 setb s1
                 clr    s2
                 lcall m_del
                 ret
;  ************  键盘程序  *****************************
pro_key:                                            ;键盘查询子程序
	setb key1                             ;首先输出低电平,检测高电平的到来
	setb key2                             ;不同电路,可能检测方式不一样
	setb key3
	jb key1,ke1                     ;如果用户没有按第一个键,到第下个处理部分,
	mov key,#1                       ;表示用户按了第一个键
	lcall delay20ms                ;软件延时,防止干扰
	jmp pro_key                      ;重新查询,直到用户释放按键
    ke1:jb key2,ke2                           ;处理第二个按键,如果没有到下一个处理部分
                mov key,#2                       ;以下和第一个处理单元相似。
	lcall delay20ms
	jmp pro_key
    ke2:jb key3,ke3
                mov key,#3
	lcall delay20ms
	jmp pro_key
    ke3:
                ret

;  ***********  设置定时器T1  ************
 timer:
	mov tmod,#11h               ;设置定时器T1为一个16位定时器 
        mov t_h,#0d8h
        mov t_l, #0efh
	mov th1,#0d8h                ;定时10ms
	mov tl1,#0efh                ;
        mov th0,#0fch                ;定时1ms
	mov tl0,#17h                 ;定时器T0
	setb ea                      ;
	setb et0                     ;
	clr tr0                      ;定时器T1停止工作
       ret                           ;返回

;************  定时20 ms  *************
delay20ms:  push psw         ; 保存原来的寄存器单元
            clr  psw.3              ; 设置新的寄存器
	setb psw.4             ; 
	mov r0,#2              ; 延时参数1 
	mov r1,#250          ; 延时参数2
	mov r2,#1              ; 延时参数3
    dl1:djnz r0,dl1                   ; 延时循环1
    	mov r0,#250          ; 重新设置循环数据
    dl2:djnz r1,dl1                   ; 开始第二道循环 
        mov r0,#240                  ;
        mov r1,#248                  ; 
    dl3:djnz r2,dl1                   ; 第三道循环
	nop                        ;  修正定时精度
	pop psw                ;  恢复原来的寄存器组
        ret                                 ;  返回
;***********  end  *******************
;  *******  显示定时 10 uS  ****************  
m_del:  push psw
	clr psw.3
	setb  psw.4
	mov r7,#4
  del1: nop
        djnz r7,del1
        pop psw
        ret

;  *******  data_tab 数据表格  **************
;             th1, tl1,intcount ......
;              ^    ^     ^
data_tab:  db 12h, 00h, 01h,00h,01h,02h
           db  00h

;***************************************************************************8
;这是数字显示表格,其中 带小数点的数字比不带小数点的数字大16
; 比如 0 的显示代码为 0;那么 0.的显示代码为 16;如此类推

tab_nu: 
             db 0c0h,  0f9h, 0a4h,  0b0h,  99h ,  92h ,  82h, 0f8h ; 数字0-7  不带小数点代码
             db 80h ,  90h,  88h ,  83h ,  0c6h,  0a1h,  86h, 8eh  ; 数字8-f  不带小数点代码
             db 40h ,  79h,  24h ,  30h ,  19h ,  12h ,  02h, 78h  ; 数字0-7  带小数点代码
             db 00h ,  10h,  08h ,  03h ,  46h ,  21h ,  06h, 0eh  ; 数字8-f  带小数点代码

      end              ;告诉编译器本程序到此结束,一定需要加上,否则编译通不过。

⌨️ 快捷键说明

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