51单片机交通灯程序

关于51单片机交通灯程序的讨论正在各大平台持续发酵,我们精心筛选了最新资讯 ,希望能为您带来实质性的帮助。

参考《51单片机C语言创新教程》温子祺等著 。

源码转自:《51单片机C语言创新教程》。

/*实验名称:交通灯实验

*描述:交通灯实验要求红灯亮15秒,绿灯亮10秒,黄灯亮5秒 ,

当红灯切换为绿灯或者绿灯切换为红灯,

?要实现灯闪烁。红灯、绿灯 、黄灯的点亮持续时间可以通过串口来修改,

?并在下一个循环中更新数值 。

*作者:温子祺

*修改日期:2010/5/4

*说明:代码注释与讲解详见《51单片机C语言创新教程》温子祺等著 ,北京航空航天大学出版社

*/

#include?"stc.h"

typedef?unsigned?char?UINT8;

typedef?unsigned?int UINT16;

typedef?unsigned?long?UINT32;

typedef?charINT8;

typedef?int?INT16;

typedef?longINT32;

#define?TIMER0_INITIAL_VALUE?5000

#define?HIGH?1

#define?LOW0

#define?ON?1

#define?OFF0

#define?SEG_PORT?P0

#define?LS164_DATA(x){if((x))P0_4=1;else?P0_4=0;}?

#define?LS164_CLK(x)?{if((x))P0_5=1;else?P0_5=0;}?

#define?NORTH_R_LIGHT(x)?{if((x))P2_0=0;else?P2_0=1;}

#define?NORTH_Y_LIGHT(x)?{if((x))P2_1=0;else?P2_1=1;}

#define?NORTH_G_LIGHT(x)?{if((x))P2_2=0;else?P2_2=1;}

#define?SOUTH_R_LIGHT(x)?{if((x))P2_3=0;else?P2_3=1;}

#define?SOUTH_Y_LIGHT(x)?{if((x))P2_4=0;else?P2_4=1;}

#define?SOUTH_G_LIGHT(x)?{if((x))P2_5=0;else?P2_5=1;}

#define?TRAFFIC_STATUS_1?0

#define?TRAFFIC_STATUS_2?1

#define?TRAFFIC_STATUS_3?2

#define?UART_MARKER0xEE

UINT8Timer0IRQEvent=0;

UINT8Time1SecEvent=0;

UINT8Time500MsEvent=0;

UINT8TimeCount=0;

UINT8SegCurPosition=0;

UINT8LightOrgCount[4]={15,5,15,5};

UINT8LightCurCount[4]={15,5,15,5};

UINT8TrafficLightStatus=0;

code?UINT8SegCode[10]?={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};

UINT8SegBuf[4]?={0};

code?UINT8SegPosition[4]={0x07,0x0b,0x0d,0x0e};

typedef?struct?_LIGHT_VAL

{

UINT8?Head;?

UINT8?val[4];?

}LIGHT_VAL;

typedef?union?_LIGHT_VAL_EX

{

LIGHT_VAL?lv;

UINT8p[5];?

}LIGHT_VAL_EX;

void?LS164Send(UINT8?byte)

{

UINT8?j;

for(j=0;j<=7;j++)

{

if(byte&(1<<(7-j)))

{

LS164_DATA(HIGH);

?}

?else

?{

LS164_DATA(LOW);

?}

LS164_CLK(LOW);?

LS164_CLK(HIGH);

}

}

void?RefreshDisplayBuf(UINT8?s1) ?//刷新显示缓存

{

SegBuf[0]?=?s1%10;

SegBuf[1]?=?s1/10;

SegBuf[2]?=?s1%10;

SegBuf[3]?=?s1/10;

}

void?SegDisplay(void)

{

UINT8t;

t?=?SegCode[SegBuf[SegCurPosition]];?

SEG_PORT?|=?0x0f;

LS164Send(t);?

SEG_PORT?=?(SEG_PORT|0x0f)?&?SegPosition[SegCurPosition];

if(++SegCurPosition>=4)?

{

SegCurPosition=0;

}

}

void?TimerInit(void)

{

TH1?=?0;

TL1?=?0;?

TH0?=?(65536-TIMER0_INITIAL_VALUE)/256;

TL0?=?(65536-TIMER0_INITIAL_VALUE)%256;?//定时1MS

TMOD?=?0x51; /*01010001?T1计数,T0定时*/

}

void?Timer0Start(void)

{

TR0?=?1; //启动计时器1?

?ET0?=?1;

}

void?Timer0Stop(void)

{

TR0?=?0; //启动计时器1?

ET0?=?0;

}

void?PortInit(void)

{

?P0=P1=P2=P3=0xFF;

}

void?UartInit(void)

{

SCON=0x40;

T2CON=0x34;

RCAP2L=0xD9;

RCAP2H=0xFF;

REN=1;

ES=1;

}

void?UartSendByte(UINT8?byte)

{

SBUF=byte;

while(TI==0);

TI=0;

}

void?UartPrintfString(INT8?*str)

{

while(str?&&?*str)

{

UartSendByte(*str++);

}

}

void?main(void)

{

UINT8?i=0;

PortInit();

TimerInit();

Timer0Start();

UartInit();

RefreshDisplayBuf(LightCurCount[0]);

EA=1;

NORTH_R_LIGHT(ON);

SOUTH_G_LIGHT(ON);

while(1)

{

if(Timer0IRQEvent)

{?

Timer0IRQEvent=0;

TimeCount++;

if(TimeCount>=200)

{

TimeCount=0;

if(LightCurCount[0])

{

TrafficLightStatus=0;

}

else?if(LightCurCount[1])

{

TrafficLightStatus=1;

}

else?if(LightCurCount[2])

{?

TrafficLightStatus=2;

}

else?if(LightCurCount[3])

{

TrafficLightStatus=3;

}

else?

{

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

{

LightCurCount[i]=LightOrgCount[i];

}

TrafficLightStatus=0;

}

switch(TrafficLightStatus)

{

case?0:

{

NORTH_R_LIGHT(ON);

SOUTH_R_LIGHT(OFF);

NORTH_G_LIGHT(OFF);

SOUTH_G_LIGHT(ON);

NORTH_Y_LIGHT(OFF);

SOUTH_Y_LIGHT(OFF);

}

break;

case?1:

{

if(LightCurCount[1]%2)

{

?NORTH_R_LIGHT(ON);

SOUTH_G_LIGHT(ON);

}

else

{

?NORTH_R_LIGHT(OFF);

SOUTH_G_LIGHT(OFF);

}

NORTH_Y_LIGHT(ON);

SOUTH_Y_LIGHT(ON);

}

break;

case?2:

{

NORTH_R_LIGHT(OFF);

SOUTH_R_LIGHT(ON);

NORTH_G_LIGHT(ON);

SOUTH_G_LIGHT(OFF);

NORTH_Y_LIGHT(OFF);

SOUTH_Y_LIGHT(OFF);

}

break;

case?3:

{

if(LightCurCount[3]%2)

{

?NORTH_G_LIGHT(ON);

SOUTH_R_LIGHT(ON);

}

else

{

?NORTH_G_LIGHT(OFF);

SOUTH_R_LIGHT(OFF);

}

NORTH_Y_LIGHT(ON);

SOUTH_Y_LIGHT(ON);

}

break;

default:break;

}

RefreshDisplayBuf(LightCurCount[TrafficLightStatus]);

LightCurCount[TrafficLightStatus]--;

}

SegDisplay();

}

}

}

void?UartIRQ(void)interrupt?4?

{

static?UINT8?cnt=0;

static?LIGHT_VAL_EX?LightValEx;

if(RI)

{?

RI=0;

?LightValEx.p[cnt++]=SBUF;

if(LightValEx.lv.Head?==?UART_MARKER)

{

if(cnt>=5)

{

for(cnt=1;cnt<5;cnt++)

{

LightOrgCount[cnt-1]=LightValEx.lv.val[cnt];?

LightCurCount[cnt-1]=LightValEx.lv.val[cnt];

}

cnt=0;

UartPrintfString("设置交通灯完成\r\n");

}

}

else

{

cnt=0;

}

}

}

void?Timer0IRQ(void)?interrupt?1?

{

ET0 =0;

TH0?=?(65536-TIMER0_INITIAL_VALUE)/256;

TL0?=?(65536-TIMER0_INITIAL_VALUE)%256;?//定时1MS

Timer0IRQEvent=1;

ET0 =1;

}

=====================================================================

坐等拿分!

到百度文库中找找,参考论文也比较多。你也可到“淘宝网”上找找:“51单片机交通灯控制系统C语言设计源程序送仿真图 ”,有现成的 ,有实物图、仿真、原理图 、源程序等,这款交通灯有以下功能。

1. 系统除基本交通灯功能外;

2. 还具有倒计时、显示时间设置;

3. 紧急情况处理、LED信息显示;

4. 时间可以根据具体情况手动控制等功能 。

本文已完

参考《51单片机C语言创新教程》温子祺等著。

源码转自:《51单片机C语言创新教程》。

/*实验名称:交通灯实验

*描述:交通灯实验要求红灯亮15秒,绿灯亮10秒 ,黄灯亮5秒 ,

当红灯切换为绿灯或者绿灯切换为红灯,

?要实现灯闪烁 。红灯 、绿灯、黄灯的点亮持续时间可以通过串口来修改,

?并在下一个循环中更新数值。

*作者:温子祺

*修改日期:2010/5/4

*说明:代码注释与讲解详见《51单片机C语言创新教程》温子祺等著 ,北京航空航天大学出版社

*/

#include?"stc.h"

typedef?unsigned?char?UINT8;

typedef?unsigned?int UINT16;

typedef?unsigned?long?UINT32;

typedef?charINT8;

typedef?int?INT16;

typedef?longINT32;

#define?TIMER0_INITIAL_VALUE?5000

#define?HIGH?1

#define?LOW0

#define?ON?1

#define?OFF0

#define?SEG_PORT?P0

#define?LS164_DATA(x){if((x))P0_4=1;else?P0_4=0;}?

#define?LS164_CLK(x)?{if((x))P0_5=1;else?P0_5=0;}?

#define?NORTH_R_LIGHT(x)?{if((x))P2_0=0;else?P2_0=1;}

#define?NORTH_Y_LIGHT(x)?{if((x))P2_1=0;else?P2_1=1;}

#define?NORTH_G_LIGHT(x)?{if((x))P2_2=0;else?P2_2=1;}

#define?SOUTH_R_LIGHT(x)?{if((x))P2_3=0;else?P2_3=1;}

#define?SOUTH_Y_LIGHT(x)?{if((x))P2_4=0;else?P2_4=1;}

#define?SOUTH_G_LIGHT(x)?{if((x))P2_5=0;else?P2_5=1;}

#define?TRAFFIC_STATUS_1?0

#define?TRAFFIC_STATUS_2?1

#define?TRAFFIC_STATUS_3?2

#define?UART_MARKER0xEE

UINT8Timer0IRQEvent=0;

UINT8Time1SecEvent=0;

UINT8Time500MsEvent=0;

UINT8TimeCount=0;

UINT8SegCurPosition=0;

UINT8LightOrgCount[4]={15,5,15,5};

UINT8LightCurCount[4]={15,5,15,5};

UINT8TrafficLightStatus=0;

code?UINT8SegCode[10]?={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};

UINT8SegBuf[4]?={0};

code?UINT8SegPosition[4]={0x07,0x0b,0x0d,0x0e};

typedef?struct?_LIGHT_VAL

{

UINT8?Head;?

UINT8?val[4];?

}LIGHT_VAL;

typedef?union?_LIGHT_VAL_EX

{

LIGHT_VAL?lv;

UINT8p[5];?

}LIGHT_VAL_EX;

void?LS164Send(UINT8?byte)

{

UINT8?j;

for(j=0;j<=7;j++)

{

if(byte&(1<<(7-j)))

{

LS164_DATA(HIGH);

?}

?else

?{

LS164_DATA(LOW);

?}

LS164_CLK(LOW);?

LS164_CLK(HIGH);

}

}

void?RefreshDisplayBuf(UINT8?s1) ?//刷新显示缓存

{

SegBuf[0]?=?s1%10;

SegBuf[1]?=?s1/10;

SegBuf[2]?=?s1%10;

SegBuf[3]?=?s1/10;

}

void?SegDisplay(void)

{

UINT8t;

t?=?SegCode[SegBuf[SegCurPosition]];?

SEG_PORT?|=?0x0f;

LS164Send(t);?

SEG_PORT?=?(SEG_PORT|0x0f)?&?SegPosition[SegCurPosition];

if(++SegCurPosition>=4)?

{

SegCurPosition=0;

}

}

void?TimerInit(void)

{

TH1?=?0;

TL1?=?0;?

TH0?=?(65536-TIMER0_INITIAL_VALUE)/256;

TL0?=?(65536-TIMER0_INITIAL_VALUE)%256;?//定时1MS

TMOD?=?0x51; /*01010001?T1计数,T0定时*/

}

void?Timer0Start(void)

{

TR0?=?1; //启动计时器1?

?ET0?=?1;

}

void?Timer0Stop(void)

{

TR0?=?0; //启动计时器1?

ET0?=?0;

}

void?PortInit(void)

{

?P0=P1=P2=P3=0xFF;

}

void?UartInit(void)

{

SCON=0x40;

T2CON=0x34;

RCAP2L=0xD9;

RCAP2H=0xFF;

REN=1;

ES=1;

}

void?UartSendByte(UINT8?byte)

{

SBUF=byte;

while(TI==0);

TI=0;

}

void?UartPrintfString(INT8?*str)

{

while(str?&&?*str)

{

UartSendByte(*str++);

}

}

void?main(void)

{

UINT8?i=0;

PortInit();

TimerInit();

Timer0Start();

UartInit();

RefreshDisplayBuf(LightCurCount[0]);

EA=1;

NORTH_R_LIGHT(ON);

SOUTH_G_LIGHT(ON);

while(1)

{

if(Timer0IRQEvent)

{?

Timer0IRQEvent=0;

TimeCount++;

if(TimeCount>=200)

{

TimeCount=0;

if(LightCurCount[0])

{

TrafficLightStatus=0;

}

else?if(LightCurCount[1])

{

TrafficLightStatus=1;

}

else?if(LightCurCount[2])

{?

TrafficLightStatus=2;

}

else?if(LightCurCount[3])

{

TrafficLightStatus=3;

}

else?

{

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

{

LightCurCount[i]=LightOrgCount[i];

}

TrafficLightStatus=0;

}

switch(TrafficLightStatus)

{

case?0:

{

NORTH_R_LIGHT(ON);

SOUTH_R_LIGHT(OFF);

NORTH_G_LIGHT(OFF);

SOUTH_G_LIGHT(ON);

NORTH_Y_LIGHT(OFF);

SOUTH_Y_LIGHT(OFF);

}

break;

case?1:

{

if(LightCurCount[1]%2)

{

?NORTH_R_LIGHT(ON);

SOUTH_G_LIGHT(ON);

}

else

{

?NORTH_R_LIGHT(OFF);

SOUTH_G_LIGHT(OFF);

}

NORTH_Y_LIGHT(ON);

SOUTH_Y_LIGHT(ON);

}

break;

case?2:

{

NORTH_R_LIGHT(OFF);

SOUTH_R_LIGHT(ON);

NORTH_G_LIGHT(ON);

SOUTH_G_LIGHT(OFF);

NORTH_Y_LIGHT(OFF);

SOUTH_Y_LIGHT(OFF);

}

break;

case?3:

{

if(LightCurCount[3]%2)

{

?NORTH_G_LIGHT(ON);

SOUTH_R_LIGHT(ON);

}

else

{

?NORTH_G_LIGHT(OFF);

SOUTH_R_LIGHT(OFF);

}

NORTH_Y_LIGHT(ON);

SOUTH_Y_LIGHT(ON);

}

break;

default:break;

}

RefreshDisplayBuf(LightCurCount[TrafficLightStatus]);

LightCurCount[TrafficLightStatus]--;

}

SegDisplay();

}

}

}

void?UartIRQ(void)interrupt?4?

{

static?UINT8?cnt=0;

static?LIGHT_VAL_EX?LightValEx;

if(RI)

{?

RI=0;

?LightValEx.p[cnt++]=SBUF;

if(LightValEx.lv.Head?==?UART_MARKER)

{

if(cnt>=5)

{

for(cnt=1;cnt<5;cnt++)

{

LightOrgCount[cnt-1]=LightValEx.lv.val[cnt];?

LightCurCount[cnt-1]=LightValEx.lv.val[cnt];

}

cnt=0;

UartPrintfString("设置交通灯完成\r\n");

}

}

else

{

cnt=0;

}

}

}

void?Timer0IRQ(void)?interrupt?1?

{

ET0 =0;

TH0?=?(65536-TIMER0_INITIAL_VALUE)/256;

TL0?=?(65536-TIMER0_INITIAL_VALUE)%256;?//定时1MS

Timer0IRQEvent=1;

ET0 =1;

}

=====================================================================

坐等拿分!

到百度文库中找找,参考论文也比较多。你也可到“淘宝网”上找找:“51单片机交通灯控制系统C语言设计源程序送仿真图”,有现成的 ,有实物图、仿真 、原理图、源程序等,这款交通灯有以下功能 。

1. 系统除基本交通灯功能外;

2. 还具有倒计时、显示时间设置;

3. 紧急情况处理 、LED信息显示;

4. 时间可以根据具体情况手动控制等功能 。

呈现51单片机交通灯程序的核心内容解析,若这些分析对您的工作或学习有所助益 ,建议您将本站加入书签以便后续查阅。

本文来自作者[fujianquanpiao]投稿,不代表必兴鼎立场,如若转载,请注明出处:https://bigthinkbxd.cn/xinwen/1927.html

(22)

文章推荐

  • 浙江大学的详细地址是在哪?

    网上有关“浙江大学的详细地址是在哪?”话题很是火热,小编也是针对浙江大学的详细地址是在哪?寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临的问题,希望能够帮助到您。浙江大学共有五个校区:玉泉校区、西溪校区、华家池校区、之江校区、紫金港校区。玉泉校区地址是:杭州市西湖区浙大路38号西溪校

    2025年09月23日
    26310
  • 五营天气

    网上有关“五营天气”话题很是火热,小编也是针对五营天气寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临的问题,希望能够帮助到您。1.伊春机场离市区不远,约20分钟车程,出租约30元,有大巴车往返机场和市区。都是按飞机航班时间安排的,很方便,建议坐机场巴士。出租车管理不规范有宰人的。2.

    2025年09月23日
    27319
  • 关于生物竞赛的资料

    网上有关“关于生物竞赛的资料”话题很是火热,小编也是针对关于生物竞赛的资料寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临的问题,希望能够帮助到您。生物竞赛要看的书特多,首先建议买生物学的大学教材,每一个分支学科最好都有一本。《普通生物学》陈阅增先生编的,建议你买第一版,第二版图虽然多

    2025年09月24日
    21306
  • 手机自带的天气预报不准确怎么办

    网上有关“手机自带的天气预报不准确怎么办”话题很是火热,小编也是针对手机自带的天气预报不准确怎么办寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临的问题,希望能够帮助到您。如果您使用的是华为手机,手机天气预报数据不准确,请您按照以下方法排查:1.更新“天气”应用进入华为应用市场搜索“

    2025年09月25日
    17312
  • 霜降有哪些表现?

    网上有关“霜降有哪些表现?”话题很是火热,小编也是针对霜降有哪些表现?寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临的问题,希望能够帮助到您。霜降——天气渐冷,开始有霜。霜降一般是在每年公历的10月23日或24日。这时中国黄河流域一带出现初霜﹐大部分地区多忙于播种三麦等作物。我国古代

    2025年09月26日
    21305
  • 性价比高的电脑有哪些电脑排行榜前十名

    关于性价比高的电脑有哪些电脑排行榜前十名的讨论正在各大平台持续发酵,我们精心筛选了最新资讯,希望能为您带来实质性的帮助。电脑行业的竞争越来越大,大多数人对电脑的技术要求也越来越高,而现在性价比高的电脑也非常多了,小编今天给大家介绍电脑排行榜2017前十名的相关内容,大家可以看看哪些是性价比高的电脑

    2025年09月26日
    21310
  • 应采儿影视作品

    近期关于应采儿影视作品的讨论热度持续攀升,我们通过多方渠道收集整理了相关资讯,并进行了系统化的梳理。若这些内容恰好能为您提供参考,将是我们最大的荣幸。姓名:应采儿性别:女原名:丁文英文名:Cherrie生日:1983年6月20日星座:双子座国籍:中国地域:港台身高:175cm血型:

    2025年10月03日
    22304
  • 电脑突然重启?

    关于电脑突然重启?的讨论正在各大平台持续发酵,我们精心筛选了最新资讯,希望能为您带来实质性的帮助。电脑突然重启,你是否感到困惑?别担心,我们来一起分析分析。本文将为你分析电脑重启的原因,并提供解决方案,帮助你解决电脑重启的问题。软件或硬件不兼容电脑重启可能是由于某个程序或系统与其它东西不兼容,或者

    2025年10月03日
    18304
  • 干露露征婚门(干露露个人简介)

    相关文章:〖One〗、浴室征婚门是什么〖Two〗、干露露是谁〖Three〗、干露露是怎么火的〖Four〗、干露露的人物争议〖Five〗、干露露征婚门是真的吗?后续发展如何?浴室征婚门是什么“浴室征婚门”是指一段在2011年情人节期间流传于网络的视频事件。以下是关于该事

    2025年10月22日
    10302
  • 苏州国领优劣势?

    苏州国领优劣势?苏州国领优劣势?相关话题近期引发广泛关注,我们特别整理了多维度信息,希望能为您提供有价值的参考。正荣国领是由正荣地产打造的70年产权别墅项目,项目位于吴中区独墅湖生态公园北、东方大道东,地块容积率≤1.3,计容总建筑面积13.86万平方米。项目打造为以联排、双拼别墅为主的低密

    2025年10月25日
    7300

发表回复

本站作者才能评论

评论列表(3条)

  • 傅践权漂的头像
    傅践权漂 2025年10月02日

    我是必兴鼎的签约作者“fujianquanpiao”

  • 傅践权漂
    傅践权漂 2025年10月02日

    本文概览:关于51单片机交通灯程序的讨论正在各大平台持续发酵,我们精心筛选了最新资讯,希望能为您带来实质性的帮助。参考《51单片机C语言创新教程》温子祺等著。源码转自:《51单片机C语...

  • 傅践权漂
    用户100204 2025年10月02日

    文章不错《51单片机交通灯程序》内容很有帮助

联系我们

邮件:必兴鼎@gmail.com

工作时间:周一至周五,9:30-17:30,节假日休息

必兴鼎