|
源代码
- #include<reg51.h>
- #include<intrins.h>
- #include<absacc.h>
- #define COM8255 XBYTE[0x70ff] //定义并设置控制口的地址
- #define PA8255 XBYTE[0x70fc] //定义并设置PA口地址
- #define PB8255 XBYTE[0x70fd] //定义并设置PB口地址
- #define PC8255 XBYTE[0x70fe] //定义并设置PC口地址
- #define uchar unsigned char
- #define uint unsigned int
- uint shi,ge,num;
- int temp=10;
- uint arrow_j,arrow_j_1;
- uint i_inter;
- uint t=4,x=1,y=1,k,m;
- uchar code Tab_1[]={0x7f,0xbf,0xdf,0xe0}; //arrow
- uchar code Tab_2[]={0x18,0x3c,0x7e,0x18}; //arrow
- uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳极0-9字形代码
- sbit led_1=P3^0; //LED显示(十位)
- sbit led_2=P3^1; // LED显示(个位)
- sbit led_3=P3^5; //黄灯
- sbit led_5=P3^3;
- sbit led_4=P3^2;
- void delay(uint z)
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=10;y>0;y--);
- }
- void arrow() //点阵箭头显示函数
- {
- for(arrow_j=0;arrow_j<4;arrow_j++)
- {
- PA8255=Tab_1[arrow_j];
- PB8255=Tab_2[arrow_j];
- delay(1);
- }
-
- }
- main()
- {
- P2=0x00;
- COM8255=0x80;
- led_3=0; //黄灯灭
- num=0;
- PC8255=0x00;
- IT1=1; //外部中断1的中断请求触发方式为脉冲触发
- EX1=1; //开放外部中断1
- IT0=1; //外部中断0的中断请求触发方式为电平方式
- EX0=1;
- PX1=1; //设置中断优先级,外部中断1优先
- PX0=1;
- TMOD=0x01; //定时器方式,模式1,16位
- TH0=15536/256; //设置定时起点
- TL0=15536%256;
- EA=1; //开放所有中断
- ET0=1; //开放定时器/计数器0中断
- TR0=1;
- //启动定时器/计数器0
- while(1) //等待中断
- {
- x=1;
- y=1;
- shi=temp/10;
- ge=temp%10;
- P1=0xff;
- led_1=1;
- led_2=0;
- P1=table[shi];
- delay(15);
- P1=0xff;
- led_1=0;
- led_2=1;
- P1=table[ge];
- delay(15);
- arrow();
- }
- }
- void T0_time() interrupt 1 //定时中断
- {
- TH0=15536/256; //重新设置定时起点
- TL0=15536%256;
- num++;
- if(num==10) //十秒结束,重设,可以修改倒计时
- {
- num=0;
- temp--;
- if(temp+1==0)
- {
- if(PC8255<2)
- {
- PC8255=PC8255+1;
- }
- else
- {
- PC8255=0x00;
- }
- temp=10;
- }
- }
- }
- void inter() interrupt 2 //夜间行驶中断函数(外部1中断)
- {
- delay(2000);
- while(y==1) //为了第二次按下按钮跳出中断
- {
- led_3=1; //黄灯亮
- for(i_inter=0;i_inter<150;i_inter++) //延时显示倒计时,同时点阵扫描显示
- {
- P1=0xff;
- led_1=1;
- led_2=0;
- P1=table[shi];
- delay(15);
- if(i_inter==75)
- led_3=0;
- P1=0xff;
- led_1=0;
- led_2=1;
- P1=table[ge];
- delay(15);
- arrow(); //箭头函数
- }
- PA8255=0xff;
- PB8255=0xff;
- temp--;
- if(temp+1==0)
- {
- if(PC8255<2)
- {
- PC8255=PC8255+1;
- }
- else
- {
- PC8255=0x00;
- }
- temp=10;
- }
- shi=temp/10;
- ge=temp%10;
- if(led_5==0) //等待第二次按下按钮
- {
- y=0;
- while(led_5==0);
- }
- }
- }
- void inter1() interrupt 0 //紧急情况中断函数设计
- {
- delay(1000);
- k=PA8255;
- m=PC8255;
- while(x==1)
- {
- PC8255=0xff;
- PA8255=0x00;
- P1=0xff;
- if(led_4==0)
- {
- delay(10000);
- if(led_4==0) //等待第二次按下按钮
- {
- x=0;
- while(led_4==0);
- }
- }
- }
- PA8255=k;
- PC8255=m;
- }
复制代码
|
|