#include #include #defineuchar unsigned char #defineuint unsigned int uchari=0xfe;//显示位选初值 ucharge,shi,bai; uint count =887;//脉搏次数 uint t; uchar disp[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳数码管编码 ***itP0_0=P0^0; //黄灯 ***itP0_1=P0^1; //红灯 ***itP0_2=P0^2; //绿灯 ***itP2_4=P2^4; //按键 //***itP3_2=P3^2; ***itP3_6=P2^3; //蜂鸣器 bitBELL=0; //响铃标志 /**************************************/ /* / /* 软件延时函数 / /* / /**************************************/ voiddelay10ms(void) { uchar i,j; for(i=20;i>0;i--) for(j=248;j>0;j--); } /**************************************/ /* / /* 显示函数 / /* / /**************************************/ voiddisplay(uchar i,uchar number) { P2=i; P1=disp[number]; } /**************************************/ /* / /* 定时器0中断处理函数 / /* 用于定时一分钟 / /**************************************/ void timer0(void) interrupt 1 { TH0=0x3c; TL0=0xb0; t++; if(t==1200) { EA=0; t=0; bai=count/100; shi=(count%100)/10; ge= (count%100)%10; if(count<60)//设置最低值 { P0_0=0; P3_6=0; BELL=1; } else if(count>120) //设置最高值 { P0_1=0; P3_6=0; BELL=1; } else P0_2=0; EA=1; TR0=0; //开定时器0 ET0=0; //开定时器0中断 EX0=0; //开外部中断 } } /**************************************/ /* / /* 定时器1中断处理函数 / /* / /**************************************/ voidtimer1_int(void) interrupt 3 { TH1=-5000/256; TL1=-5000%256; bai=count/100; //提取三位数字 shi=(count%100)/10; ge= (count%100)%10; switch(i)//选择数码管位 { case 0xfe: display(i,ge);break; case0xfd: display(i,shi);break; case0xfb: display(i,bai);break; } i=i<<1; //流水效果 i=i|0x01; if(i==0xf7) //右移三位后置初值 i=0xfe; if(BELL) //蜂鸣器响 { P3_6=0; } } /**************************************/ /* / /* 初始化函数 / /* / /**************************************/ voidinit() { t=0; TMOD=0x11; //定时器0,1的定时方式1都打开 TH1=-5000/256; //定时器1定时5ms TL1=-5000%256; TH0=0x3c; //定时器0定时50ms TL0=0xb0; EA=1; //开总中断 ET1=1; //开定时器1中断 TR1=1; //开定时器1 TR0=1; //开定时器0 ET0=1; //开定时器0中断 IT0=1; //下降沿促发 EX0=1; //开中断0 } /**************************************/ /* / /* 按键软件处理函数 / /* / /**************************************/ voidkey() { if(P2_4==0) { delay10ms(); delay10ms(); if(P2_4==0) { // TR0=1; //开定时器0 // ET0=1; //开定时器0中断 // EX0=1; //开外部中断 init(); count=0; //显示清零 BELL=0; P0=0xff; } while(P2_4==0);//等待按键释放,如果键未释放则一直在此等待。不过此处开中断非计数可不写 } } voidmain() { //P3_2=0; init(); TR0=0; //关定时器0 ET0=0; //关定时器0中断 EX0=0; //P3_6=0; while(1) { key(); } } voidint0(void) interrupt 0 { count++; } #include ***it k0=p1^0; ***it k1=p1^1; ***it k2=p1^2; ***it k3=p1^3; ***it d0=p1^4; ***it d1=p1^5; ***it d2=p1^6; ***it d3=p1^7; ***it B0=p3^7; ***it l0=p2^0; ***it l1=p2^2; ***it l2=p2^3; ***it l3=p2^4; ***it kz=p3^0; unsigned char qiangdanum=0x3f; unsigned char codetable[]={0x3f,0xxx,0x5b,0x4f,0x66,0x7d,0x07,0x7f,ox6f}; unsigned char ge=0,shi=0; unsigned int num=0;time=0; void display(); void display(unsigned int); main() { TMOD=0X01; TH0=(65536-50000)/256; TL0=(65536-50000)%256; IT0=0; EA=1; ET0=1; EX0=1; {while(1) {display(); if(kz==0) TR0=1; if(num==20) {num=0; time++; if(time==60) time=0; } } } } void exter0() interrupt 0 {EA=0;l0=0; if(k0==0) {d0=0;qiangdanum=1;B0=1; } if(k1==0) {d1=0;qiangdanum=2;B0=1; } if(k2==0) {d2=0;qiangdanum=3;B0=1; } if(k3==0) {d3=0;qiangdanum=4;B0=1; } } void time0() interrupt 1 {num++; TH0=(65536-50000)/256; TL0=(65536-50000)%256; } void delay(unsigned int z) {unsigned int x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } void display(void) {shi=time/10; ge=time%10; p2=0xef; p0=table[ge]; delay(5); p2=0xf7; p0=table[shi]; delay(5); p2=0xFE; p0=table[qiangdanum]; delay(5); }
|