/**1位数码管上先显示零,按下SW0键(外中断1)蜂鸣器发出"答"的一声,数码管递增加数, 到9回零;按下SW1键(外中断0)蜂鸣器发出"笛"的一声,数码管递减减数,到0回9,用外中 断和定时器编程实现?***********/
#include"stc.h"/*包含STC单片机头文件*/ #include"top51.h"/*包含TOP51开发板头文件*/ #include"delay.h"/*包含爱晶电子提供延时函数头文件*/ //#include "buzzer.h"/*爱晶电子提供的蜂鸣器头文件*/
sbit sw0=P3^3; sbit sw1=P3^2;
/*0-F共阴字形码表*/ uchar code sz[17]={0x3f , 0x06 , 0x5b , 0x4f , 0x66 , 0x6d ,0x7d , 0x07 , 0x7f , 0x6f , 0x77 , 0x7c , 0x39 , 0x5e , 0x79 , 0x71 , 0x00};
uchar num,tt0,i;/*局部变量定义*/ void main()/*主函数*/ { top51_init();/*TOP51开发板初始化*/ COL0=1;/*选中4位数码管的最右边一位,并使SW0-SW2可作为独立按键使用*/
IT1=1;/*设定外部中断触发方式:IT1=0为低电平触发;IT1=1为下降沿触发*/ IT0=1;/*设定外部中断触发方式:IT0=0为低电平触发;IT1=0为下降沿触发*/ PX0=1;/*设定中断0优先级高优先级*/ PX1=1;/*使能中断1也为高优先级*/ PT0=0;/*使能T0为低优先级*/
TMOD=0X01;//置T0的工作模式01 TH0=(65536-50000)/256; TL0=(65536-50000)%256; EX0=1;//开INT0禁止、允许位 EX1=1;//开INT1禁止、允许位 ET0=1;//开T0禁止、允许位 EA=1;//开全局中断 //TR0=1;
while(1) { if (SW0==0) { //TR0=1;//delay20ms(); while(sw1==1) { num++; if(num>9) num=0; } } if(sw1==0) { //TR0=1;//delay20ms(); while(sw0==1) { num--; if(num<1) num=9; } } P0=sz[num]; } }
void timer0_routine() interrupt 1 { TH0=(65536-50000)/256; TL0=(65536-50000)%256; tt0++; if(tt0==20) tt0=0; }
/*---高优先级中断服务程序---*/ void int1_routine() interrupt 2 { TR0=1; for(i=50;i>0;i--) { BZ=1;//蜂鸣器发出答的一声桑? delay500us(); BZ=0; delay500us(); } }
/*---高优先级中断服务程序---*/ void init0_routine() interrupt 0 { TR0=1; for(i=50;i>0;i--) { BZ=1;//蜂鸣器发出嘀的一声, delayms(1); BZ=0; delayms(1); } }
|