您好,欢迎访问三七文档
;实战四《简易四路抢答器》;该抢答器供不多于4个参赛队或者个人的抢答比赛场合使用。每个参赛队的座位前;安装1只抢答按钮开关(用板上的S9、S10、S11、S12)和一个信号灯(D4、D5、D6、D7)。;主持人座位前装一只复原开关(板上S3)、1只蜂鸣器(板上BUZ1)和一个抢答器工作状态;指示灯(D10),每当主持人口头发出号令之后.哪个队先按下座位上的按钮开关,该座位的信;号灯就先被点亮,同时封锁其他按钮开关的活动.并且熄灭主持人座位上的状态指示灯和发出;三声类似于电话振铃的提示声,以声明此次抢答动作已经完成.在主持人确认后,按下复原按钮;,状态指示灯重新点亮,并且同时发出笛-笛-声,为下一次抢答作好准备.;PIC单片机学习网陈学乾程序文件名:MCD-INTBUZ.ASM;*********************************************************************;程序清单;*********************************************************************tmr0equ1h;定义定时器/计数器0寄存器地址statusequ3h;定义状态寄存器地址option_regequ81h;定义选项寄存器地址option_tempequ0a6h;(在BACK1)定义选项寄存器的备份寄存器的地址intconequ0bh;定义中断控制寄存器地址portcequ7h;定义端口RC的数据寄存器地址triscequ87h;定义端口RC的方向控制寄存器地址portbequ06h;定义端口RB的数据寄存器地址trisbequ86h;定义端口RB的方向控制寄存器地址cequ0;定义进位标志位的位地址zequ2;定义0标志位的位地址wequ0;定义传送目标寄存器为W的指示位fequ1;定义传送目标寄存器为RAM的指示位t0ifequ2;定义TMR0中断标志位的位地址t0ieequ5;定义TMR0中断使能位的位地址inteequ4;定义外部中断使能位的位地址intfequ1;定义外部中断标志位的位地址countequ20h;定义一个计数器变量count1equ24h;定义一个计数器变量count2equ25h;定义一个计数器变量count3equ27h;定义一个计数器变量count4equ28h;定义一个计数器变量portb_bequ21h;为PORTC定义一个备份寄存器w_tempequ7fh;为W在体0和体1定义2个备份寄存器;w_tempequ0ffh;(若是16F873/4,则需保留FFH单元)status_tempequ23h;为STATUS定义一个备份寄存器rp0equ5h;定义状态寄存器中的页选位RP0;******************复位向量和中断向量***********************org000h;nop;设置一条ICD必须的空操作指令gotomain;org0004h;gotoserv;跳转到中断服务子程序;*******************主程序************************************mainbsfstatus,rp0;movlw0;movwftrisc;设置RC口全部为输出movlw0ffh;movwftrisb;设置RB口全部为输入movlw02h;设置选项寄存器:上拉电阻启用;INT下降沿触发movwfoption_reg;分频器给TMR0;分频比1:8bcfstatus,rp0;movlw90h;movwfintcon;开发INT中断clrfportc;RC口灯全灭loopmovfportb,w;读取RB口数据iorlwb'11100001';送RB口的数到备份寄存器并将除S9、S10、S11、S12以外的位全部送1movwfportb_b;xorlw0ffh;没有键按下转LOOP继续检测btfscstatus,z;gotoloop;calldelay10ms;防抖动廷时movfportb,w;iorlwb'11100001';xorwfportb_b,0;再次读取RB口的数据,与前一次读的数相同则键值有效btfscstatus,z;gotoloop;comfportb_b,w;取反以便使被按下按键的位为1,其它位为0movwfportc;送RC口显示calltone3t;调用发声三次子程序loop1comfportb,w;检测按键是否有松开andlwb'00011110';btfscstatus,z;gotoloop;松开了返回gotoloop1;没松开继续检测;*********************中断服务子程序*****************************serv;********************保存护现场部分*******************************movwfw_temp;保护Wswapfstatus,w;保护STATUSclrfstatus;选择体0movwfstatus_temp;将STATUS存入体0的备份寄存器;*********************调查中断源**********************************btfscintcon,intf;检查不是INT中断,返回gotointserv;是!转到INT中断处理部分gotoretfie0;;*********************INT中断处理部分******************************intservclrfportc;令全部灯熄灭bsfportc,7;点亮D10,表示就绪calltone630;调用高音子程序calldelay;调用1S廷时子程序calltone630;调用低音子程序bcfintcon,intf;清除INT中断标志位;*************************恢复现场部分*****************************retfie0swapfstatus_temp,w;恢复STATUSmovwfstatus;swapfw_temp,f;恢复Wswapfw_temp,w;retfie;中断返加;*************************低音调发生子程序(500HZ/50MS)*************tone500movlw.50;循环次数寄存器赋初值movwfcount;50=500HZx0.05Sx2t5lopbcfintcon,t0if;清除TRM0溢出中断标志位movlw.131;给TMR0装入初值256-125=131movwftmr0;启动定时器t5herebtfssintcon,t0if;定时器溢出否gotot5here;否!循环栓测movlwb'01000000';只将BIT6置位xorwfportc,f;只将RC6(BUZ)脚电平反转,其余不变decfszcount,f;循环次数递减,为0,跳一步gotot5lop;不为0,跳回return;返回;**************************高音调发生子程序(630HZ/50MS)*****************tone630movlw.63;循环次数寄存器赋初值movwfcount1;63=630HZx0.05Sx2t6lopbcfintcon,t0if;清除TRM0溢出中断标志位movlw.157;给TMR0装入初值157=256-99movwftmr0;启动定时器t6herebtfssintcon,t0if;定时器溢出否gotot6here;否!循环栓测movlwb'01000000';只将BIT6置位xorwfportc,f;只将RC6(BUZ)脚电平反转,其余不变decfszcount1,f;循环次数递减,为0,跳一步gotot6lop;不为0,跳回return;返回;*********************发声1S子程序(1S=10x(50ms+50ms)***********tonelsmovlw.10;循环次数寄存器赋初值movwfcount2;t1lopcalltone500;调用低音子程序calltone630;调用高音子程序decfszcount2,f;循环次数递减,为0,跳一步gotot1lop;不为0,跳回return;返回;*********************TMR0廷时子程序1S(1S=16x256x(256-12)US)********delaybsfstatus,rp0;设置文件寄存器体1movfoption_reg,w;保护选项寄存器内容movwfoption_temp;movlw07h;重设选项寄存器;上拉电阻启用,INT下降沿触发movwfoption_reg;分频器给TRM0;分频比值设为1:256bcfstatus,rp0;恢复到文件寄存器体0movlw.16;循环利用TMROP定时16次movwfcount3;溢出次数寄存器d1lopbcfintcon,t0if;清除TMR0溢出中断标志位bcfintcon,t0ie;清除TMR0溢出中断使能位movlw.12;给TMR0装入初值12=256-244movwftmr0;启动定时器herebtfssintcon,t0if;用查询法检测TMR0溢出否gotohere;否!返回decfszcount3,f;是!溢出次数减1,为0,跳一步gotod1lop;否!循环利用TMR0bsfstatus,rp0;设置文件寄存器体1movfoption_temp,w;恢复选项寄存器内容movwfoption_reg;bcfstatus,rp0;恢复到文件寄存器体0return;返回;*************************断续发声3次报警子程序***********************tone3tmovlw.3;循环次数寄存器赋初值movwfcount4;t3lopcalltonels;调用发声1S子程序calldelay;调用廷时1S子程序decfszcount4,f;循环次数递减,为0,跳一步gotot3lop;不为0,跳回return;返回;**************************软件廷时10MS子程序****************************delay10msmovlw.13;将外层循环参数值送到30Hmovwf30h;lp0movlw0ffh;将内层循环参数值送到31Hmovwf31h;lp1decfsz31h,1;变量31H内容递减,若为0则跳跃gotolp1;跳转到LP1decfsz30h,1;变量30H内容递减,若为0则跳跃gotolp0;跳转到LP0return;返回主程序end;源程序结束;***************************************************;进入该实战演练的工序流程如下:;1.创建源文件和编辑源文件;在此介绍一种不同于前面讲的创建源文件的方法,用Windows附件中的”记事本”;这个为大家所熟知和好用的文件编辑器,并且可以方便的加入中文注释.不过有两点需要注意,一是注释前面的;分号”;”必须用西文半角输入;二是必须用”.asm”扩展名存储到事先建立的一个专用子目录下.;2.打开MPLAB集成开发环境:首先在WINDOWS环境下,选用开始程序MicrochipMPLABMPLAB命令,启动MPLAB;并进入MPLAB的桌面.;3.创建项目:选用菜单FileNew或ProjectNewProject,在事先建立的一个专用子目录下创建一个新项目,将;用记事本创建的源文件加入到该项目中.;4.建立项目中的目标文件:选择菜单ProjectBuildAll(项目建立所有文件),MPLAB将自动调用MPASM将项目;文件管理下的源文件(.asm)汇编成
本文标题:《简易四路抢答器》
链接地址:https://www.777doc.com/doc-6076816 .html