8086 按开关灯亮 c语言程序,基于MCS-51的交通灯程序设计(c语言控制直行左转)...

#include #define uintunsigned int

#define ucharunsigned char

#defineOFF 0//定义灯泡开关

#defineON1

sbitew_zx_red = P1^0;   //东西直行红黄绿

sbitew_zx_yellow = P1^1;

sbitew_zx_green = P1^2;

sbitew_zz_red = P1^3;   //东西左转红黄绿

sbitew_zz_yellow = P1^4;

sbitew_zz_green = P1^5;

sbitsn_zx_red = P2^0;   //南北直行红黄绿

sbitsn_zx_yellow = P2^1;

sbitsn_zx_green = P2^2;

sbitsn_zz_red = P2^3;   //南北左转红黄绿

sbitsn_zz_yellow = P2^4;

sbitsn_zz_green = P2^5;

sbitseg_1 = P1^6;  //东西数码管位选开关

sbit seg_2 = P1^7;

sbitseg_3 = P2^6;  //南北数码管位选开关

sbit seg_4 = P2^7;

int time = 0; //计时器

int count = 0;

unsigned char SEG_CA[10] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90};

unsigned char SEG_CC[10] = {0x3f, 0x06, 0x5b, 0x1f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};

void delay()

{

int i;

for(i = 0; i < 10; i++);

}

void display_ew(unsigned int num)  //东西数字显示

{

P0 = SEG_CA[num/10];   //点亮数字高位

seg_1 = ON;

delay();

seg_1 = OFF;

P0 = SEG_CA[num%10];   //点亮数字低位

seg_2 = ON;

delay();

seg_2 = OFF;

}

void display_sn(unsigned int num)  //南北数字显示

{

P0 = SEG_CA[num/10];  //点亮数字高位

seg_3 = ON;

delay();

seg_3 = OFF;

P0 = SEG_CA[num%10];  //点亮数字低位

seg_4 = ON;

delay();

seg_4 = OFF;

}

void display_ew_shan(unsigned int num)  //东西3s 倒计时闪烁显示

{

if(count < 2000)

display_ew(num);

else

{

seg_1 = OFF;

seg_2 = OFF;

}

}

void display_sn_shan(unsigned int num)  //南北3s倒计时闪烁显示

{

if(count < 2000)

display_sn(num);

else

{

seg_3 = OFF;

seg_4 = OFF;

}

}

void init()

{

P0 = 0x00;

P1 = 0x00;

P2 = 0x00;

EA = 0;//关总中断

ET0 = 1;//开定时器0中断

TMOD = 0x02;//定时器0工作方式2

TL0 = 6;//定时250us

TH0 = 6;

EA = 1;   //开总中断

TR0 = 1;  //开始定时

}

void main()

{

init();

while(1)

{

/*************************************************************

开始东西直行绿灯亮,东西左转红灯亮27s,显示绿灯倒计时30s

南北直行、左转红灯亮50s,显示红灯倒计时50s

*************************************************************/

while(time%100 < 27)

{

ew_zx_green = ON;  //东西直行绿灯亮,显示27s

ew_zx_yellow = OFF;

ew_zx_red = OFF;

display_ew(30 - time);

ew_zz_red = ON;  //东西左转红灯亮

ew_zz_green = OFF;

ew_zz_yellow = OFF;

sn_zx_red = ON;  //南北直行红灯亮,显示时间50s

sn_zx_yellow = OFF;

sn_zx_green = OFF;

display_sn(50 - time);

sn_zz_red = ON;  //南北左转红灯亮,显示时间50s

sn_zz_yellow = OFF;

sn_zx_green = OFF;

}

/*************************************************************

东西直行黄灯亮3s, 倒计时开始闪烁

东西左转,南北方向不变

*************************************************************/

while(time%100 >= 27 && time%100 < 30)

{

ew_zx_yellow = ON;  //东西直行黄灯亮 ,显示时间3s

ew_zx_red = OFF;

ew_zx_green = OFF;

display_ew_shan(30 - time);

display_sn(50 - time);

}

/*************************************************************

东西左转绿灯亮17s,直行红灯亮 ,显示绿灯倒计时20s

南北方向不变

*************************************************************/

while(time%100 >= 30 && time%100 < 47)

{

ew_zz_green = ON;//东西左转绿灯亮,显示时间17s

ew_zz_red = OFF;

ew_zz_yellow = OFF;

display_ew(50-time);

ew_zx_red = ON;  //东西直行红灯亮

ew_zx_yellow =OFF;

ew_zx_green = OFF;

display_sn(50-time);  //南北继续显示倒计时

}

/*************************************************************

东西左转黄灯亮3s, 倒计时开始闪烁 3s

东西直行,南北方向不变

*************************************************************/

while(time%100 >= 47 && time%100 < 50)

{

ew_zz_yellow = ON;//东西左转黄灯亮,显示时间3s

ew_zz_red = OFF;

ew_zz_green = OFF;

display_ew_shan(50-time);

display_sn(50-time);  //南北继续显示倒计时

}

/*************************************************************

东西左转红灯亮50s,直行不变,显示倒计时50s

南北直行绿灯亮27,左转不变,显示绿灯倒计时30s

*************************************************************/

while(time%100 >=50 && time%100 < 77)

{

sn_zx_green = ON;//南北直行绿灯亮,显示时间27s

sn_zx_yellow = OFF;

sn_zx_red = OFF;

display_sn(80 - time);

ew_zz_red = ON;   //东西左转红灯亮,显示时间50s

ew_zz_yellow = OFF;

ew_zz_green = OFF;

display_ew(100 - time);

}

/*************************************************************

南北直行黄灯亮3s,左转不变,显示黄灯闪烁倒计时3s

东西不变

*************************************************************/

while(time%100 >= 77 && time%100 < 80)

{

sn_zx_yellow = ON; //南北直行黄灯亮,显示时间3s

sn_zx_red = OFF;

sn_zx_green = OFF;

display_sn_shan(80 - time);

display_ew(100 - time);

}

/*************************************************************

南北左转绿灯亮17s,直行不变,显示绿灯倒计时20s

东西不变

*************************************************************/

while(time%100 >=80 && time%100 <97)

{

sn_zz_green = ON;  //南北左转绿灯亮, 显示17s

sn_zz_red = OFF;

sn_zz_yellow = OFF;

display_sn(100-time);

sn_zx_red = ON; //南北直行红灯亮

sn_zx_yellow = OFF;

sn_zx_green = OFF;

display_ew(100 - time);//东西继续倒计时

}

/*************************************************************

南北左转黄灯亮17s,直行不变,显示黄灯闪烁倒计时3s

东西不变

*************************************************************/

while(time%100 >= 97 && time<=100)

{

sn_zz_yellow = ON;//南北左转黄灯亮, 显示时间3s

sn_zz_red = OFF;

sn_zz_green = OFF;

display_sn_shan(100 - time);

display_ew(100 - time);//东西继续倒计时

}

}

}

void timer0() interrupt 1

{

count++;

if(count == 4000)

{

time++;

count = 0;

}

if(time > 100)

time = 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值