📄 manwalk.c
字号:
//包括三路和四路倒计时程序。红灯倒计时到一秒时候转绿灯,而且三路测试完善,该部分程序完善。
//四路完成调试,程序完善。但是四路不稳定。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 + -