⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 traffic.txt

📁 基于单片机c51的开发程序,温度采集系统,开发
💻 TXT
字号:
#include<reg51.h>
#include<absacc.h>

#define uchar unsigned char
#define uint unsigned int

#define PA8155 XBYTE[0x7101]             //8155的PA口地址
#define PB8155 XBYTE[0x7102]             //8155的PB口地址
#define COM8155 XBYTE[0x7100]            //8155的P控制口地址
uchar t1,t11,t12,t2,t21,t22,t3,t4,x,m,k;
uint   p,n,i,j,q;
uchar flag1=0;                           //标志位初始化0

uchar code tab[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6};    //0~9的段码

void display(uchar t);
void disp();

//延时函数,送数码管各位数之间的延时
void delay(uint t)
{
	uint m;
	for(m=0;m<t;m++);
}      

//外部中断0子程序,每发生一次中断,东西路口灯亮时间加1或1
void as1() interrupt 0 using 1
{   
	uint z;
   	z=100;
	if(flag1==0)                   //标志位为0时间加1
		t3++;
	else 
		t3--;                  //否则时间减1
	t1=t3;
	t2=t4;
	while(z--)                     //显示当前时间值                     
	{
		disp();
	}
}

//外部中断1子程序,每发生一次中断,南北路口灯亮时间加1或1
void as2() interrupt 2 using 1
{
	uint z;
   	z=80;
	if(flag1==0)
		t4++;
	else 
		t4--;
	t1=t3;t2=t4;
	while(z--)
	{
		disp();
	}
} 

//主函数
//功能: 模拟交通灯中东西绿灯亮南北红灯亮,延时一段时间后,
//东西变为黄灯闪烁,南北红灯亮,再延时;之后转换为东西红灯亮,
//南北绿灯亮,延时一定时间后,东西红灯亮,南北黄灯闪烁,延时之后,重复执行。
//灯亮时间可控,初始化为绿灯亮时间为25S,红灯时间为30S,黄灯时间为5S。
//中断发生后,灯亮时间改变,黄灯时间等于红灯时间减去绿灯时间,
//灯亮时间在数码管上显示出来。
void main()
{
	uchar x;
	COM8155=0x03;                            //启动8155控制口
	t3=25;t4=30;                             //给绿灯红灯赋初值
	TMOD=0x51;                               //设置定时器0工作于方式1定时,定时器1工作于方式计数
	TH1=0;TL1=0;                             //赋计数初值
	TR1=1;                                   //启动定时器1
	EA=1;                                    //开总中断
	EX0=1;IT0=1;                             //开外部中断0,设置外部中断为脉冲触发方式
	EX1=1;IT1=1;                             //开外部中断1,设置外部中断为脉冲触发方式
	while(1)
	{
		if(TR0==1)                       //定时器0启动则模拟交通灯显示
		{
			if(t3>t4)                //若t3>t4则交换红绿灯的时间
			{x=t3;t3=t4;t4=x;}
			t1=t3;t2=t4;             //给两个路口灯的时间赋初值
			P1=0xDE;
			display(t3);             //在数码管上显示两路口灯的时间
			P1=0xBE;
			t1=t2=t4-t3;
			display(t1);
			P1=0x0ED;
			t1=t4;t2=t3;
			display(t3);
			P1=0x0BE;
			t2=t1=t4-t3;     
			display(t2);
			if(TR0==0)              //如果停止计时路口灯灭
				P1=0x0FF;
		 }
		 else                           //否则停止计时显示当前时间
		 {
		 	t1=t3;t2=t4;
		 	disp();
			if(TH1==0&&TL1>0)       
			{
				TH1=1;TL1=0;
				flag1=1;             //标志位置1
			}
			else if(TH1==1&&TL1>0)
			{
				TR0=1;TH1=2;TL1=0;   //启动计时
			}
		  }
	}
}

void display(uchar t)
{
	flag1=0;
	for(i=0;TR0&&i<t;i++)                       //显示时间
	{
		for(j=0;j<20;j++)                   //50us的循环次数
		{
			TH0=(65536-50000)/256;      //50us计数初值
			TL0=(65536-50000)%256;			
			while(!TF0){disp();}
			TF0=0;
		}
		if(TH1==2&&TL1>0)
		{
			TR0=0;TH1=0;TL1=0;          //停止计时
            		P1=0x0FF;
			break;
		}
		t1-=1;                              //灯亮时间减1
		t2-=1;
	}
}

void disp()
{
	PA8155=0X80;                               //数码管位码
   	t11=t1/10;                                 //求四个数码管上的数字 
   	t12=t1%10;
   	t21=t2/10;
   	t22=t2%10;
   	PB8155=tab[t11];                           //段码送显示数码管 
	delay(350);                                //各数码管之间的延时
   	PA8155/=2;
   	PB8155=tab[t12];
 	delay(350);  
   	PA8155/=2;
   	PB8155=tab[t21];
   	delay(350);  
   	PA8155/=2;
   	PB8155=tab[t22];
 	delay(350);  
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -