📄 声控灯.asm
字号:
;==========================================; 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 + -