📄 new.c
字号:
#include <reg52.h>
/************************************************************************************************************
端口定义:
P1口的3个口控制交通灯,输出
P2口的四个端口P2.0 2.1 2.2 2.3控制数码管,输出
P0口的 0.4口用作启动开关 输入
P0口的四个端口P0.0 0.1 0.2 0.3作为输入开关用,用以调节红绿灯的亮灭时间 输入
初始值 红绿灯亮2秒(2000毫秒)
可调节红绿灯亮灭的时间,每次调节必须等到一个周期 即左边的绿灯亮完红灯重新开始为起始点
*************************************************************************************************************/
sbit P10=P1^0;//输出交通灯
sbit P11=P1^1;//输出交通灯
sbit P12=P1^2;//输出交通灯
sbit P00=P0^0;//输入开关
sbit P01=P0^1;//输入开关
sbit P02=P0^2;//输入开关
sbit P03=P0^3;//输入开关
sbit P04=P0^4;//启动开关
void Initial(void);//系统初始化;
int check(void);//判断是否改变 交通灯亮灭时间 返回参数
void delay_ms(unsigned int i);//延时程序,单位毫秒
/*
初始化状态
先对要输入的口P00~P04写1,表示要输入
P10 11 12口输出0,交通灯全灭
P2口输出0X0F,显示在数码管中
*/
void Initial(void)//系统初始化
{
P00=1;
P01=1;
P02=1;
P03=1;
P04=1;//输入端口先写1
P10=0;
P11=0;
P12=0;//交通灯先灭
P2=0X0f;//计数灯先为F
}
/******************************************************************************************
P03 使能开关,当其打开时,才判断其他时间选择开关的值
三位值 高位到低位 P02 P01 P00
******************************************************************************************/
int check(void) //判断是否改变 交通灯亮灭时间 返回参数
{
int count,P0,P1,P2;
P0=~P00;
P1=~P01;
P2=~P02;
count=P2 * 4+P1 * 2+P0;
if(P03==1)
return -1;
else
return count;
}
/*****************************************************************************************************
未核实 精确延时时间 from 51系列单片机设计实例 (第二版) 楼然苗 北京航空航天大学出版社
******************************************************************************************************/
void delay_ms(unsigned int i)//延时1毫秒程序
{
unsigned int j;
while(i--)
for(j=0;j<120;j++);
}
/****************************************************************************************************
修改延时时间
返回值 左边红灯(P1.0)亮时间增减量 左边绿灯(P1.3)时间增减量 数码管显示值
右边绿灯亮时间增减量 右边红灯时间增减量
option (timel) (timer)
0 1(3) 0(2) 1
1 2(4) 0(2) 2
2 3(5) 0(2) 3
3 4(6) 0(2) 4
4 0(2) 1(3) 5
5 0(2) 2(4) 6
6 0(2) 3(5) 7
7 0(2) 4(6) 8
-1 0(2) 0(2) 0
****************************************************************************************************/
void main(void)
{
/*
变量说明:
option 返回的交通灯亮灭参数check(void) 用来调节数码管输出
timel 根据check(void)的值,调节后左边红灯(右边绿灯)的亮的时间
timer 根据check(void)的值,调节后右边红灯(左边绿灯)的亮的时间
*/
int option,timel, timer;//
Initial();
while(P04==1);//等到按下开关 电路开始运作
/***********************调试输入输出端口********************************
while(1)
{if(P00==0)
P10=1;
else
P10=0;
if(P01==0)
P11=1;
else
P11=0;
if(P04==0)
P12=1;
else
P12=0;
}
**********************************************************************/
/***********************调试check函数********************************
while(1)
{
int b;
b=check();
switch(b)
{
case -1:P10=0;P11=0;P12=0;break;
case 0:P10=1;P11=0;P12=0;break;
case 1:P10=0;P11=1;P12=0;break;
case 2:P10=1;P11=1;P12=0;break;
case 3:P10=0;P11=0;P12=1;break;
case 4:P10=1;P11=0;P12=1;break;
case 5:P10=0;P11=1;P12=1;break;
case 6:P10=1;P11=1;P12=1;break;
default :P10=0;P11=0;P12=0;break;
}
}
**********************************************************************/
/**/
for(;;)
{
P10=1;//先亮左边红灯,右边绿灯
P11=0;//黄灯灭
P12=0;//灭左边绿灯,右边红灯
option=check();//读入交通灯亮灭时间参数
P2=(option+1);
if(option>=0)//参照上面的表
{
if(option<4)
{
timel=2+option+1;
timer=2;
}
else
{
timer=option-1;
timel=2;
}
}
else
{
timel=2;
timer=2;
}
delay_ms(timel*1000);//延时,延时时间根据读入参数定
P10=0;//灭左边红灯和右边绿灯
P11=1;//黄灯亮 // 黄
delay_ms(300); // 灯
P11=~P11; // 闪
delay_ms(300); // 烁
P11=~P11; // 两
delay_ms(300); // 次
P11=0;//黄灯灭
P12=1;//亮左边绿灯,右边红灯
delay_ms(timer*1000);
P12=0;//左边绿灯,右边红灯灭
P11=1;//黄灯亮 // 黄
delay_ms(300); // 灯
P11=~P11; // 闪
delay_ms(300); // 烁
P11=~P11; // 两
delay_ms(300); // 次
P11=0;//黄灯灭
}
/**/
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -