C51单片机程序设计题,要求用C语言做,模拟交通灯控制单片机电路,答案要详细具体。
(1)绘制电路原理图;
(2)单片机初始化时,三个指示灯同时闪烁2下,然后熄灭,请写出相应初始化程序;
(3)利用定时器T0完成定时50毫秒的功能,请写出相应的定时器初始化函数和中断服务函数;
(4)K1按下后,模拟开始,循环以下列方式亮灯:先红灯亮15秒,后绿灯亮30秒,在绿灯亮的最后3秒内,以闪烁方式显示,然后黄灯以闪烁方式亮3秒。请写出相应的按键函数;
(5)K2按下后,模拟结束,三个指示灯同时闪烁3下,然后全亮,请写出相应的按键函数。
附:主函数程序供参考
#include<>
sbit K1 P0^0;
sbit K2 P0^1;
sbit RLED P0^2;
sbit YLED P0^3;
sbit GLED P0^4;
main()
{
Init();//单片机初始化
Init_Timer0();//定时器初始化
while(1)
{
if(K1= =0)
M_Start();//模拟开始
if(K2= =0)
M_End();//模拟结束
}
} 展开
晚上随手写,也未调试,权当看看
程序有不严谨地方还得调试修改
#include <REGX51.H>
#define STATUS_1S 1
#define STATUS_2S 2
#define STATUS_3S 3
#define STATUS_4S 4
#define STATUS_5S 5
#define STATUS_15S 15
#define STATUS_28S 28
#define STATUS_29S 29
#define STATUS_30S 30
unsigned char flag,status,status_temp=1,status_temp_;
sbit K1 = P0^0;
sbit K2 = P0^1;
sbit RLED = P0^2;
sbit YLED = P0^3;
sbit GLED = P0^4;
void Init(void)
{
ET0=1;
TR0=1;
RLED=0; //亮
YLED=0;
GLED=0;
while(status_temp)
{
switch (status)
{
case STATUS_1S: //1S
{
RLED=1; //灭,闪一次
YLED=1;
GLED=1;
} break;
case STATUS_2S: //1S
{
RLED=0; //亮,闪一次
YLED=0;
GLED=0;
} break;
case STATUS_3S: //1S
{
RLED=1; //灭
YLED=1;
GLED=1;
status_temp=0;
} break;
}
}
status_temp=1;
ET0=0;
TR0=0;
}
void Init_Timer0(void)
{
TMOD=0x01;
// ET0=1;
// TR0=1;
EA=1;
TH0=0X3C;
TL0=0XB0; // 未计算,偷楼上的
}
void M_Start(void)
{
TH0=0X3C;
TL0=0XB0;
ET0=1;
TR0=1;
RLED=0; //红亮
while(status_temp)
{
switch (status)
{
case STATUS_1S:
{
if(status_temp_==1)
{
YLED=0;
}
} break;
case STATUS_2S:
{
if(status_temp_==1)
{
YLED=1;
}
} break;
case STATUS_3S:
{
if(status_temp_==1)
{
YLED=0;
status_temp_=0;
}
} break;
case STATUS_15S: //15S灭,绿亮
{
RLED=1;
GLED=0;
} break;
case STATUS_28S:
{
GLED=1;
} break;
case STATUS_29S:
{
GLED=0;
} break;
case STATUS_30S:
{
GLED=1;
status=0;
status_temp_=1;
} break;
}
}
ET0=0;
TR0=0;
status=0;
status_temp=1;
YLED=1;
}
void M_End(void)
{
TH0=0X3C;
TL0=0XB0;
ET0=1;
TR0=1;
RLED=0; //亮 1次
YLED=0;
GLED=0;
while(status_temp)
{
switch (status)
{
case STATUS_1S: //1S
{
RLED=1; //灭一次
YLED=1;
GLED=1;
} break;
case STATUS_2S: //1S
{
RLED=0; //亮二次
YLED=0;
GLED=0;
} break;
case STATUS_3S: //1S
{
RLED=1; ////灭二次
YLED=1;
GLED=1;
} break;
case STATUS_4S: //1S
{
RLED=0; ////亮三次
YLED=0;
GLED=0;
} break;
case STATUS_5S: //1S
{
RLED=1; ////灭三次
YLED=1;
GLED=1;
status_temp=0;
} break;
}
}
status_temp=1;
ET0=0;
TR0=0;
}
main()
{
Init();//单片机初始化
Init_Timer0();//定时器初始化
while(1)
{
if(K1==0)
M_Start();//模拟开始
if(K2==0)
M_End();//模拟结束
}
}
void interrupt_time0() interrupt 1 //核对头文件,一致就好
{
TH0=0X3C;
TL0=0XB0;
flag++;
if(flag==20)
{
status++;
flag=0;
}
}
2024-11-29 广告
void Init_Timer0();
{
TMOD=0x01;
ET0=1;
TR0=1;
EA=1;
TH0=0X3C;
TL0=0XB0;
}
void start_test()
{
while(1)
{
if ( counter>19) { led = ~led;flag++; counter = 0};
if (flag== 3) break;
}
}
void main()
{
Init_Timer0(); //设置定时器和中断
start_test(); //初始化
while(1)
{
if(K1= =0)
M_Start();//模拟开始
if(K2= =0)
M_End();//模拟结束
}
}
void display_time() //用上动态显示的方法。
{
}
void interrupt_time() interrupt 1
{
TH0=0X3C;
TL0=0XB0;
counter++;
}
就这么多了,你这个很容易!
分太少了,就懒得写太详细了,参考一下网上的也可以啊,好多地方都有类似的
#define uint unsigned int
sbit K1=P0^0;
sbit K2=P0^1;
sbit RLED=P0^2;
sbit YLED=P0^3;
sbit GLED=P0^4;
uint num;
void delayms(uint xms);
void Init();
void Init_Timer0();
void M_Start();
void M_End();
void main()
{
Init();//单片机初始化
Init_Timer0();//定时器初始化
while(1)
{
if(K1==0)
TR0=1;
M_Start();//模拟开始
if(K2==0)
TR0=0;
M_End();//模拟结束
}
}void Init()
{
RLED=0;
YLED=0;
GLED=0;
delayms(500);
RLED=1;
YLED=1;
GLED=1;
delayms(500);
RLED=0;
YLED=0;
GLED=0;
delayms(500);
RLED=1;
YLED=1;
GLED=1;
delayms(500);
}
void Init_Timer0()
{
TMOD=0x01;
EA=1;
ET0=1;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
}
void T0_time0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
num++;
}
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void M_Start()
{
if (num<=300)
{
RLED=0;
YLED=1;
GLED=1;
}
else if (num<=840)
{
RLED=1;
YLED=1;
GLED=0;
}
else if (num<=900)
{
RLED=1;
YLED=1;
GLED=1;
delayms(500);
RLED=1;
YLED=1;
GLED=0;
delayms(500);
}
else if (num<=960)
{
RLED=1;
YLED=0;
GLED=1;
delayms(500);
RLED=1;
YLED=1;
GLED=1;
delayms(500);
}
else num=0;
}
void M_End()
{
uint i;
for(i=0;i<3;i++)
{
RLED=0;
YLED=0;
GLED=0;
delayms(500);
RLED=1;
YLED=1;
GLED=1;
delayms(500);
}
for(;;)
{
RLED=0;
YLED=0;
GLED=0;
}
}
2012-05-14