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

📄 声控灯.asm

📁 新型楼道声控灯(毕业设计)
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;==========================================; company   菉亚(深圳)电子有限公司; file	    声控灯.asm; author    pizza <txt-210@163.com> ; build	    2010_3_19    17:43; complete  2010_3_21    19:50; history   < >; mcu	    AT89S52; fosc	    6MHz,   /12;==========================================;工程说明:本系统对光信号和声音信号的采集,通过;          比较器将采集来的信号转化为能被单片机;          识别的高低电平。单片机对这两个电平的;          判断。如果没有光和有声音,单片机就控;          制继电器导通。导通时间可以随时通过按;          键设定,数码管显示导通的时间。导通时;          间最大99s,最小0s.其他情况下单片机均;          不对继电器输出 。;          在本实验中,出于安全的考虑,避开了去 ;          接触220v交流电,而用一只直径0.5cm的发;          光二极管去观察输出的有无,在实际应用;          中可以外加电路(继电器),用单片机的;          P1.5口控制,在protel电路图中有讲述接法,;          而且提供了将220v交流点降至单片机所需的;          工作电压5v。;          两个按键是用来调节灯亮后的延时时间,操作如下:;          1:长按botton1四秒左右,进入调节功能,这时数码;             管闪烁,数码管显示延时时间。;          2:接着1进行,短击button2延时时间加1,按住不放,;             2s后延时时间以每秒加4次的速度进行操作。;          3:接着1或者2进行,短击button1一次,切换button2;             位减1功能。;          4: 接着3进行,短击button2延时时间减1,按住不放,;             2s后延时时间以每秒减4次的速度进行操作。;          5: 接着上述各项,再次长按botton1四秒左右,退出;             延时时间设定。;          6: 在设定状态下,如果20s无键动作,将自动退出设定。;=======================================================;【工程名称】:寄存器定义register;【功能说明】:按实际情况定义寄存器名称,;              方便程序的维护和更改;=======================================================;-------振荡频率FOSC  equ  6000000       ;6MHZ;=====================================================   ;//字符笔画代码表;     a;   f   b;     g;   e   c;     d;==================;//断定义s_a    equ 11111110bs_b    equ 11111101bs_c    equ 11111011bs_d    equ 11110111bs_e    equ 11101111bs_f    equ 11011111bs_g    equ 10111111bs_h    equ 01111111b;====================;//字符定义;-------0seg_0 equ s_a & s_f & s_e & s_b & s_c & s_d;-------1seg_1 equ s_b & s_c;-------2seg_2 equ s_a & s_g & s_e & s_b & s_d;-------3seg_3 equ s_a & s_g & s_b & s_c & s_d;-------4seg_4 equ s_f & s_g & s_b & s_c ;-------5seg_5 equ s_a & s_f & s_g & s_c & s_d;-------6seg_6 equ s_a & s_f & s_e & s_g & s_c & s_d;-------7seg_7 equ s_a & s_b & s_c;-------8seg_8 equ s_a & s_f & s_e & s_g & s_b & s_c & s_d ;-------9seg_9 equ s_a & s_f & s_g & s_b & s_c & s_d;-------aseg_a equ s_a & s_f & s_e & s_g & s_b & s_c ;-------bseg_b equ s_a & s_f & s_e & s_c & s_d & s_d;-------cseg_c equ s_a & s_f & s_e;-------c(大写)seg_c_ equ s_a & s_f & s_e & s_d;-------dseg_d equ s_e & s_g & s_b & s_c & s_d;-------eseg_e equ s_a & s_f & s_e & s_g & s_d;-------fseg_f equ s_a & s_f & s_e & s_g;-------gseg_g equ s_a & s_f & s_g & s_b & s_c & s_d;-------hseg_h equ s_f & s_e & s_g & s_b & s_c;-------iseg_i equ s_c ;-------jseg_j equ s_c & s_d;-------kseg_k equ s_f & s_e & s_g & s_b & s_d;-------lseg_l equ s_f & s_e & s_d;-------mseg_m equ s_a & s_g & s_e & s_c;-------nseg_n equ s_a & s_f & s_e & s_b & s_c ;-------oseg_o equ s_g & s_e & s_c & s_d;-------pseg_p equ s_a & s_f & s_e & s_g & s_b  ;-------qseg_q equ s_a & s_f & s_g & s_b & s_c ;-------rseg_r equ s_g & s_e;-------sseg_s equ s_a & s_f & s_g & s_c & s_d;-------tseg_t equ s_e & s_f & s_g & s_d;-------useg_u equ s_e & s_c & s_d;-------vseg_v equ s_e & s_c & s_d;-------wseg_w equ s_f & s_g & s_b & s_d;-------xseg_x equ s_f & s_e & s_g & s_b & s_c;-------yseg_y equ s_f & s_g & s_b & s_c & s_d;-------上半圆seg_0_ equ s_a & s_f & s_g & s_b;-------空格seg_   equ 0;-------下划线seg__  equ s_b&s_d;-------中划线seg___ equ s_g;-------上划线seg____ equ s_a;===============================disp_seg  equ  p2           ;数码管段定义light_in  equ  p1.0         ;光信息的采集端口sound_in  equ  p1.1         ;声音信息的采集端口com_1     equ  p3.0         ;数码管_1位定义com_2     equ  p3.1         ;数码管_2位定义led_out   equ  p1.4         ;发光二极管输出定义    (用于模拟白炽灯)lemp_out  equ  p1.5         ;实际白炽灯输出定义    (应用时需要加个继电器)key_in    equ  p1           ;按键所用的端口button_1  equ  2            ;按键—1定义  button_2  equ  3            ;按键-2定义key_in_reg equ 11110011b    ;按键常数定义nokey_js_reg0 equ 20        ;在设定时间时,如果无键按下, 20s之后,程序自动进入运行状态nokey_js_reg1 equ 8         ;在无采集信号时,数码管显示为00,此时如果无键按下和无信号启发,                            ;8s之后进入睡眠状态数码管无显示.直到有按键按下或者有信号输入,                            ;程序才开始运行,数码管才有显示;==========================================;-------以下需按具体情况定义sys_stat	equ 20h           ;标志位的设定    key_flg        equ  00h ;按键扫描程序使能标志位 1有效    disp_flg       equ  01h ;显示程序使能标志位     1有效    com_flg        equ  02h ;    sigel_dis_flg  equ  03h ;信号程序采集使能标志位 1有效    sec_500ms_flg  equ  04h ;500ms执行一次使能标志位1有效	  sec_1s_flg     equ  05h ;1s执行一次使能标志位   1有效	  sec_20s_flg    equ  06h ;20s执行一次使能标志位  1有效        key_set_flg    equ  07h ;延时时间长度设定使能标志位 1有效    dot_flg        equ  08h ;数码管点闪烁使能标志位 1有效    mode_add_sub   equ  09h ;按键功能加减标志位     1加0减    key_dj_flg     equ  0ah ;按键长击使能标志位     1有效    dot_pro_flg    equ  0bh ;    sleep_flg      equ  0ch ;睡眠使能标志位         1有效 (此款单片机其实没有睡眠功能)key			  equ 40h           ;按键寄存器 key_down	equ key+0         ;按键按下有效寄存器      key_up		equ key+1         ;按键松开有效寄存器key_keep	equ key+2         ;按键保持有效寄存器key_pre		equ key+3         ;按键中间参数寄存器key_cur		equ key+4         ;按键中间参数寄存器key_cnt		equ key+5         ;按键中间参数寄存器key_num   equ key+6         ;按键值第一时间记录寄存器key_buf   equ key+7         ;按键值缓冲寄存器k_delay   equ key+8         ;按键延时寄存器 (用于防抖)nokey_js  equ key+9         ;无键按下寄存器 key_jsq   equ key+10        ;长按寄存器 mode		equ 50h             ;模式寄存器sec_500ms_cnt	equ 51h       ;时间寄存器 sec_1s_cnt 	  equ sec_500ms_cnt+1;时间寄存器 sec_2s_cnt    equ sec_500ms_cnt+2;时间寄存器 sec_20s_cnt   equ sec_500ms_cnt+3;时间寄存器 led_1  equ   60h            ;数码管1缓冲寄存器  led_2  equ   led_1+1        ;数码管2缓冲寄存器led_all equ  led_1+2        ;2个数码管控制缓冲寄存器 (这里没有用到)disp_buf equ led_1+3        ;运行时间寄存器   disp_del equ led_1+4        ;设定延时时间寄存器;==================================================================;【工程名称】:开始执行;【功能说明】:程序从这里开始编译;==================================================================     org 0000h	  jmp	start       ;上电服务程序从这里开始跳转     org 0003h	  jmp	 int_0      ;外部中断0     org 000bh 	  jmp	 int_t0     ;定时计数中断0         org 0013h	  jmp	 int_1      ;外部中断1  	  org  001bh	  jmp  int_t1     ;定时计数中断1	  org  0023h	  jmp  int_uart   ;串口接受发送数据溢出中断     ;=====================================================;查表程序,输入a,输出a,led_code_tab:           mov dptr,#led_code ;指定查表启始地址      movc a,@a+dptr      ret;---------段数码管各划的数字排列表led_code: db seg_0,seg_1,seg_2,seg_3    ;0,1,2,3          db seg_4,seg_5,seg_6,seg_7    ;4,5,6,7          db seg_8,seg_9,seg_a,seg_b    ;8,9,a,b          db seg_c,seg_d,seg_e,seg_f    ;c,d,e,f;=====================================================;【工程名称】:中断函数;===================================================; --------外部中断0int_0:      push  acc        ;将ACC推入堆栈保护      push  psw        ;将PSW推入堆栈保护      clr   ie0        ;清除外部中断标志位      lcall int_0_      pop   psw      pop   acc      reti       ;---------定时器0中断int_t0:      push  acc        ;将ACC推入堆栈保护      push  psw        ;将PSW推入堆栈保护      clr   tf0        ;清除定时器0中断标志位      lcall int_t0_      pop   psw      pop   acc      reti;---------外部中断1int_1:      reti;---------定时器1中断int_t1:      reti   int_uart:      reti      ;===========================================init_ic:      lcall	init_sfr	    lcall	init_io 	    ;lcall	init_ram	    lcall	init_inc	    lcall	init_data	    ret;------初始化特殊功能寄存器init_sfr:      ret;------初始化io口init_io:      mov   a,#0ffh      mov   p0,a      mov   p1,a      mov   p2,a      mov   p3,a      ret;------初始化片内数据存储器init_ram:      mov   r0,#7fh      clr   ainit_ram_here:      mov   @r0,a      djnz  r0,init_ram_here      ret;------初始化定时器init_inc:      mov   tcon,#00    ;清除所以中断标志位      mov   th0,#0ech    ;计数初值的设定      mov   tl0,#77h          mov   tmod,#01h   ;定时器0工作方式1      setb  et0         ;允许定时器0中断            setb  it0         ;选择边沿触发方式      setb  ex0         ;允许外部中断0          setb  ea          ;开启中断总控制位      setb  px0         ;中断优先级设定      clr   pt0      ret ;------初始化数据init_data:

⌨️ 快捷键说明

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