文档详情

《简易四路抢答器》

油条
实名认证
店铺
DOC
68.50KB
约7页
文档ID:13285518
《简易四路抢答器》_第1页
1/7

实战四《简易四路抢答器》;该抢答器供不多于 4 个参赛队或者个人的抢答比赛场合使用每个参赛队的座位前;安装 1 只抢答按钮开关(用板上的 S9、S10、S11、S12)和一个信号灯(D4、D5、D6、D7)主持人座位前装一只复原开关(板上 S3)、1 只蜂鸣器(板上 BUZ1)和一个抢答器工作状态;指示灯(D10),每当主持人口头发出号令之后.哪个队先按下座位上的按钮开关,该座位的信;号灯就先被点亮,同时封锁其他按钮开关的活动.并且熄灭主持人座位上的状态指示灯和发出;三声类似于振铃的提示声,以声明此次抢答动作已经完成.在主持人确认后,按下复原按钮;,状态指示灯重新点亮,并且同时发出"笛-笛-"声,为下一次抢答作好准备.;PIC 单片机学习网 陈学乾 ;程序文件名:"MCD-INTBUZ.ASM";*********************************************************************;程序清单;*********************************************************************tmr0 equ 1h ;定义定时器/计数器 0 寄存器地址status equ 3h ;定义状态寄存器地址option_reg equ 81h ;定义选项寄存器地址option_temp equ 0a6h ;(在 BACK1)定义选项寄存器的备份寄存器的地址intcon equ 0bh ;定义中断控制寄存器地址portc equ 7h ;定义端口 RC 的数据寄存器地址trisc equ 87h ;定义端口 RC 的方向控制寄存器地址portb equ 06h ;定义端口 RB 的数据寄存器地址trisb equ 86h ;定义端口 RB 的方向控制寄存器地址c equ 0 ;定义进位标志位的位地址z equ 2 ;定义 0 标志位的位地址w equ 0 ;定义传送目标寄存器为 W 的指示位f equ 1 ;定义传送目标寄存器为 RAM 的指示位t0if equ 2 ;定义 TMR0 中断标志位的位地址t0ie equ 5 ;定义 TMR0 中断使能位的位地址inte equ 4 ;定义外部中断使能位的位地址intf equ 1 ;定义外部中断标志位的位地址count equ 20h ;定义一个计数器变量count1 equ 24h ;定义一个计数器变量count2 equ 25h ;定义一个计数器变量count3 equ 27h ;定义一个计数器变量count4 equ 28h ;定义一个计数器变量portb_b equ 21h ;为 PORTC 定义一个备份寄存器w_temp equ 7fh ;为 W 在体 0 和体 1 定义 2 个备份寄存器;w_temp equ 0ffh ;(若是 16F873/4,则需保留 FFH 单元)status_temp equ 23h ;为 STATUS 定义一个备份寄存器rp0 equ 5h ;定义状态寄存器中的页选位 RP0;******************复位向量和中断向量***********************org 000h ;nop ;设置一条 ICD 必须的空操作指令goto main ;org 0004h ;goto serv ;跳转到中断服务子程序;*******************主程序************************************mainbsf status,rp0 ;movlw 0 ;movwf trisc ;设置 RC 口全部为输出movlw 0ffh ;movwf trisb ;设置 RB 口全部为输入movlw 02h ;设置选项寄存器:上拉电阻启用;INT 下降沿触发movwf option_reg ;分频器给 TMR0;分频比 1:8bcf status,rp0 ;movlw 90h ;movwf intcon ;开发 INT 中断clrf portc ;RC 口灯全灭loopmovf portb,w ;读取 RB 口数据iorlw b'11100001' ;送 RB 口的数到备份寄存器并将除S9、S10、S11、S12 以外的位全部送 1movwf portb_b ;xorlw 0ffh ;没有键按下转 LOOP 继续检测btfsc status,z ;goto loop ;call delay10ms ;防抖动廷时movf portb,w ;iorlw b'11100001' ;xorwf portb_b,0 ;再次读取 RB 口的数据,与前一次读的数相同则键值有效btfsc status,z ;goto loop ;comf portb_b,w ;取反以便使被按下按键的位为 1,其它位为 0movwf portc ;送 RC 口显示call tone3t ;调用发声三次子程序loop1comf portb,w ;检测按键是否有松开andlw b'00011110' ;btfsc status,z ;goto loop ;松开了返回goto loop1 ;没松开继续检测;*********************中断服务子程序*****************************serv ;********************保存护现场部分*******************************movwf w_temp ;保护 Wswapf status,w ;保护 STATUSclrf status ;选择体 0movwf status_temp ;将 STATUS 存入体 0 的备份寄存器;********************* 调查中断源**********************************btfsc intcon,intf ;检查不是 INT 中断,返回goto intserv ;是!转到 INT 中断处理部分goto retfie0 ;;*********************INT 中断处理部分******************************intservclrf portc ;令全部灯熄灭bsf portc,7 ;点亮 D10,表示就绪call tone630 ;调用高音子程序call delay ;调用 1S 廷时子程序call tone630 ;调用低音子程序bcf intcon,intf ;清除 INT 中断标志位;*************************恢复现场部分*****************************retfie0swapf status_temp,w ;恢复 STATUSmovwf status ;swapf w_temp,f ;恢复 Wswapf w_temp,w ;retfie ;中断返加;*************************低音调发生子程序(500HZ/50MS)*************tone500movlw .50 ;循环次数寄存器赋初值movwf count ;50=500HZx0.05Sx2t5lop bcf intcon,t0if ;清除 TRM0 溢出中断标志位movlw .131 ;给 TMR0 装入初值 256-125=131movwf tmr0 ;启动定时器t5herebtfss intcon,t0if ;定时器溢出否goto t5here ;否!循环栓测movlw b'01000000' ;只将 BIT6 置位 xorwf portc,f ;只将 RC6(BUZ)脚电平反转,其余不变decfsz count,f ;循环次数递减,为 0,跳一步goto t5lop ;不为 0,跳回return ;返回;**************************高音调发生子程序(630HZ/50MS)*****************tone630movlw .63 ;循环次数寄存器赋初值movwf count1 ;63=630HZx0.05Sx2t6lop bcf intcon,t0if ;清除 TRM0 溢出中断标志位movlw .157 ;给 TMR0 装入初值 157=256-99movwf tmr0 ;启动定时器t6herebtfss intcon,t0if ;定时器溢出否goto t6here ;否!循环栓测movlw b'01000000' ;只将 BIT6 置位xorwf portc,f ;只将 RC6(BUZ)脚电平反转,其余不变decfsz count1,f ;循环次数递减,为 0,跳一步goto t6lop ;不为 0,跳回return ;返回;*********************发声 1S 子程序(1S=10x(50ms+50ms)***********tonelsmovlw .10 ;循环次数寄存器赋初值movwf count2 ;t1lopcall tone500 ;调用低音子程序call tone630 ;调用高音子程序decfsz count2,f ;循环次数递减,为 0,跳一步goto t1lop ;不为 0,跳回return ;返回;*********************TMR0 廷时子程序 1S(1S=16x256x(256-12)US)********delaybsf status,rp0 ;设置文件寄存器体 1movf 。

下载提示
相似文档
正为您匹配相似的精品文档