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

📄 manwalk.c

📁 具有多重功能的C程序
💻 C
📖 第 1 页 / 共 2 页
字号:
//包括三路和四路倒计时程序。红灯倒计时到一秒时候转绿灯,而且三路测试完善,该部分程序完善。
//四路完成调试,程序完善。但是四路不稳定。8/26已修改完毕,不会出现此情况 copyright frome E:\PROJECT\first\Pro4\132.c
//释放延时程序。	
//增加了watchdog 程序。调试成功。200709151516
//2007//11//19/显示段函数又if  更改为 while 函数进行实验。无电源板,暂时停止。
	#include <reg51.H>
		#include <stdio.h>
		#define uchar unsigned char
		#define uint  unsigned int
		#define LOCALADDRESS  0x01     //本计数器地址
		#define     DCNT0   1  	//延时标志位 该延时取消 by jansion
  		#define 	DCNT1	5	//延时标志位
long uint data SysT0OverTimes=0,StartCountR_Start=0,StartCountR_End=0,StartCountG2_Start=0,StartCountG2_End=0,StartCountY_Start=0,StartCountY_End;
uchar code Led[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};  //十位LED灯段码,顺序对应0-9
uchar code LedG[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};  //个位LED灯段码,顺序对应0-9
uint data RTimes  =0;            //红灯计数值
uint data R2Times =0;
uint data G1Times =0;           //绿灯1计数值
uint data G2Times =0;           //绿灯2计数值,此处我们定义G1为直行绿灯,G2为左转绿灯。
uint data YTimes  =0;            //黄灯计数值
uint data YR2Times=0;			  //黄灯时间加上(上电红灯亮至左绿时间)
uchar data RAndGReady=0;        //上电开始工作,红绿灯信号采集过的标志位。
sbit CHKY=P2^0;					//检测位,CHKY=0表示黄灯亮,
sbit CHKG2=P2^1;           		//检测位,CHKG2=0表示左转绿灯亮,
sbit CHKG1=P2^2;           		//检测位,CHKG1=0表示直行绿灯亮,
sbit CHKR=P2^3 ;                //检测位,CHKR=0表示红灯亮,否则绿灯亮
sbit RLED_C=P2^7;               //红灯倒计时点亮控制信号。
sbit Dog_CS=P2^4;
bit InitOn=1,Flash_flg=0,LastROff=1,LastG1Off=1;LastG2Off=1,LastYOff=1;
bit DecSecond=0;               	//倒计时程序标志位
bit RR=0,GG1=0,GG2=0,YY=0;
bit  ROT=0;                   //红灯亮两次标志位
bit  RTS=0;					  //红灯亮两次标志位
bit	TFflag=1;
void Clrdog(void);
void msec(uint x) //this program is delay 1ms,
{                         // if x=50,it can delay 50ms;
uchar j;          //but it must be checked as the cpu
while(x--)
{
for(j=0;j<125;j++)
{;}
}
}
void ClrDog(void)
{
	Dog_CS = !Dog_CS;	
}
/**********************
MCU初始化子程序
***********************/
void  CPUInit(void)
{
	TMOD|=0x01;             //16-bit RTimes
	TH0=0x7D;
	TL0=0xdd; 		
	TR0=1;                  

	ET0 = 1;	
	EA = 1;

	P1 = 0;
	P0 = 0;


}
/***************************
中断子程序
返回参数:Flasf_flg
		  SysT0OverTimes
		  DecSecond
NOTE:     if crystal=4MHZ, TH0=0X7D,TL0=0XDD;
          if crystal=12MHZ,TH0=0X3C,TL0=0X0B0;65536-X=50000;
***************************/
void  T0_Int(void) interrupt 1 using 1  //T0 16位定时中断
{
	TH0=0x7D;				//每个周期3us            
	TL0=0xdd;         			//4MHz  对应100ms=99942us
								//	RLED_C=!RLED_C;	 该语句调试时用。
//	DEbug=!DEbug;			   //程序运行时debug除去。by janison
	SysT0OverTimes++;
	Flash_flg=1;
	if(!(SysT0OverTimes % 10))
	{
		DecSecond=1;
	}
}		
/*********************************
红灯信号延时检测子程序
返回参数:RR  红灯检测程序返回标志位,
		1:有信号。0:无信号。
***********************************/
bit ChekR()
{
    uint data i,j,k;
 	for(i=0;i<DCNT1;i++)
	{  //if(!CHKY||!CHKG){RR=0;return 0;}
	   if(!CHKR)
	   {
		for(j=0;j<DCNT0;j++);
		for(k=0;k<DCNT1;k++)
		 {
		  if(!CHKR)
		   {RR=1;
		    return 1;
		    }
		   }	
		  break;	  
	     }
	   }
	   RR=0;
	 return 0;		
}
 /*********************************
绿灯1信号延时检测子程序
返回参数:GG1  红灯检测程序返回标志位,
		1:有信号。0:无信号。
***********************************/
bit ChekG1()
{
      uint data i,k,j;	  //j取消 by jansion
 	for(i=0;i<DCNT1;i++)
	{  //if(!CHKR||!CHKY){GG=0;return 0;}
	   if(!CHKG1)
	   {
	  for(j=0;j<DCNT0;j++);		   //该延时取消 by jansion
		for(k=0;k<DCNT1;k++)
		 {
		  if(!CHKG1)
		   {GG1=1;
		    return 1;
		    }
		   }	
		  break;	  
	     }
	   }
	   GG1=0;
	 return 0;	 
}					   
 /*********************************
绿灯2,即左转绿灯信号延时检测子程序
返回参数:GG2  红灯检测程序返回标志位,
		1:有信号。0:无信号。
***********************************/
bit ChekG2()
{
      uint data i,k,j;					 //j取消 by jansion
 	for(i=0;i<DCNT1;i++)
	{  //if(!CHKR||!CHKY){GG=0;return 0;}
	   if(!CHKG2)
	   {
	    for(j=0;j<DCNT0;j++);			 //该延时取消 by jansion
		for(k=0;k<DCNT1;k++)
		 {
		  if(!CHKG2)
		   {GG2=1;
		    return 1;
		    }
		   }	
		  break;	  
	     }
	   }
	   GG2=0;
	 return 0;
}
 /*********************************
黄灯信号延时检测子程序
返回参数:YY  红灯检测程序返回标志位,
		1:有信号。0:无信号。
***********************************/
bit ChekY()
{
  		uint data i,k,j;		  //j取消 by jansion
 	for(i=0;i<DCNT1;i++)
	{  //if(!CHKR||!CHKG){YY=0;return 0;}
	   if(!CHKY)
	   {
	    for(j=0;j<DCNT0;j++);			 //该延时取消 by jansion
		for(k=0;k<DCNT1;k++)
		 {
		  if(!CHKY)
		   {YY=1;
		    return 1;
		    }
		   }	
		  break;	  
	     }
	   }
	   YY=0;
	 return 0;
}
/*四路makeoutimes函数*/
void MakeOutTimesf(void)
{
	//if(!CHKR)//红灯亮
	if(ChekR())
	{
		if(LastROff)//红灯开始亮	zwx默认为从红灯开始计数
		{			
			if(RAndGReady)//红绿信号都已计时(一个信号周期) 
			{
		        YTimes = SysT0OverTimes - StartCountY_Start;//黄灯最终秒数
				SysT0OverTimes=0;//??//           
            }

			StartCountR_Start = SysT0OverTimes;	
			if(RAndGReady<3)
			{
				RAndGReady++;				
			}
					
		}
		LastROff = 0;//红灯已经点亮
		if(ChekG2())
	{
	   if(LastG2Off)
	    {
			StartCountG2_Start= SysT0OverTimes;
			R2Times =StartCountG2_Start-StartCountR_Start;
		 }
			LastG2Off = 0;
	}
	else if(!ChekG2())
	{  if(!LastG2Off)
		{
			StartCountG2_End=SysT0OverTimes;
			G2Times =  StartCountG2_End - StartCountG2_Start;
		}
			LastG2Off= 1;
	}
	}
//	else if(!CHKG)
	else if(ChekG1())
//  else if(CHKR&&CHKY)
//	else if(!(ChekR()||ChekY()))
	{
       if(!LastROff)//红灯初次灭
		{				
			StartCountR_End = SysT0OverTimes;
			RTimes = StartCountR_End - StartCountG2_End;//红灯最终秒数
         }
		 LastROff = 1; 
		 LastG1Off = 0;
     }
 //   else if(!CHKY)
	else if(ChekY())
	{
       if(!LastG1Off)//绿灯初次灭
		{				
			StartCountY_Start = SysT0OverTimes;
			G1Times = StartCountY_Start - StartCountR_End;//绿灯最终秒数
         }
		 LastG1Off = 1;
		 
     }
}
/*三路makeouttimes函数*/
void MakeOutTimest(void)
{
	//if(!CHKR)//红灯亮
	if(ChekR())  //if(ChekR()&&(!(ChekG1())))
	{
		if(LastROff)//红灯开始亮	zwx默认为从红灯开始计数
		{			
			if(RAndGReady)//红绿信号都已计时(一个信号周期) 
			{
		        //YTimes = SysT0OverTimes - StartCountY_Start;//黄灯最终秒数 chang by jansion 200710180957 人行程序的makeout 函数修改
				G1Times= SysT0OverTimes - StartCountR_End;
				SysT0OverTimes=0;//??//           
            }

			StartCountR_Start = SysT0OverTimes;	
			if(RAndGReady<3)
			{
				RAndGReady++;				
			}
					
		}
		LastROff = 0;//红灯已经点亮
	}
//	else if(!CHKG)
	else if(ChekG1())
//  else if(CHKR&&CHKY)
//	else if(!(ChekR()||ChekY()))
	{
       if(!LastROff)//红灯初次灭
		{				
			StartCountR_End = SysT0OverTimes;
			RTimes = StartCountR_End - StartCountR_Start;//红灯最终秒数	RTimes = StartCountR_End - StartCountR_Start-3
         }
		 LastROff = 1; 
		 LastG1Off = 0;
     }
 //   else if(!CHKY)
/*	else if(ChekY())      change by jansion 200710180957 人行没有黄灯程序,若有则用三四通用程序,接线和三路外部接线一致。
	{
       if(!LastG1Off)//绿灯初次灭
		{				
			StartCountY_Start = SysT0OverTimes;
			G1Times = StartCountY_Start - StartCountR_End;//绿灯最终秒数
         }
		 LastG1Off = 1;
		 
     }*/
}
/***************************
倒计时显示子程序
入口参数:Time
相关参数:RAndGReady,InitOn
***************************/
void Display(uchar Time)
{
	if(RAndGReady>2)//已经正常开始计时
	{
		if(Time<200)
		{
			if(Time>9)
				P1 = Led[Time/10];//十位
			else
				P1 = 0;//十位不显示'0'
			P0 = LedG[Time%10];//个位
		}
		else
		{
			P1 = 00;//黒屏
			P0 = 00;//黒屏
		}
	}
	else//第一信号周期
	{
		if(InitOn)
		{
			P1 = 0x40;//十位
			P0 = 0x40;//个位			
			InitOn = 0;
		}
		else
		{
			P1 = 0x00;//十位
			P0 = 0x00;//个位			 //原来为80
			InitOn = 1;
		}
	}
}
/**************************
主函数
变量:TempS
**************************/		  
void main()
{ 
uchar data TempS=0;
uchar data rdrr  =0;//edit by jansion.用来存雨数。
uchar data rdrg  =0;//edit by jansion.用来存雨数。
CHKG2=1;//调试用
CPUInit();
Clrdog();				//watchdog函数;by jansion
/*for(i=0;i<125;i++)	closed by jansion
{
 P0=0x00;
 P1=0x00;
}
Display(0xff); //增加开机灭等功能。可要可不要。*/			//closed by jansion 914

msec(100);//delay 500 M-second,the test is ok.9/5 edit by jansion914
Clrdog();
msec(100);//edit by jansion914
Clrdog();
msec(100);//edit by jansion914
Clrdog();
msec(100);//edit by jansion914
Clrdog();
msec(100);//edit by jansion914
Clrdog();

⌨️ 快捷键说明

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