c51单片机c语言交通灯的程序

c51单片机c语言交通灯的程序,第1张

Proteus仿真原理图:

程序如下:

#include <reg51h>

#define uchar unsigned char

#define uint  unsigned int

uchar data buf[4];

uchar data sec_dx=20;//东西数默认

uchar data sec_nb=30;//南北默认值

uchar data set_timedx=20;

uchar data set_timenb=30;

int n;

uchar data b;//定时器中断次数

sbit  k1=P1^6;//定义5组开关

sbit  k2=P1^7;

sbit  k3=P2^7;

sbit  k4=P3^0;

sbit  k5=P3^1;

sbit Yellow_nb=P2^5;       //南北黄灯标志

sbit Yellow_dx=P2^2;       //东西黄灯标志

sbit Green_nb=P2^4;

sbit Green_dx=P2^1;

sbit Buzz=P3^7;

bit Buzzer_Indicate;

bit time=0;//灯状态循环标志

bit   set=1;//调时方向切换键标志

uchar code table[11]={       //共阴极字型码

0x3f,  //--0

0x06,  //--1

0x5b,  //--2

0x4f,  //--3

0x66,  //--4

0x6d,  //--5

0x7d,  //--6

0x07,  //--7

0x7f,  //--8

0x6f,  //--9

0x00   //--NULL

};

//函数的声明部分

void delay(int ms);//延时子程序

void key();//按键扫描子程序

void key_to1();//键处理子程序

void key_to2();

void key_to3();

void display();//显示子程序

void logo();   //开机LOGO

void Buzzer();

//主程序

void main()

{

TMOD=0X01;

TH0=0XD8;

TL0=0XF0;

EA=1;

ET0=1;

TR0=1;

EX0=1;

EX1=1;

logo();

P2=0Xc3;// 开始默认状态,东西绿灯,南北黄灯

sec_nb=sec_dx+5;

while(1)

{     

key(); //调用按键扫描程序

display(); //调用显示程序

Buzzer();

}   

}

//函数的定义部分

void key()    //按键扫描子程序

{

if(k1!=1)

{

delay(10);

if(k1!=1)

{

while(k1!=1)

{

key_to1();

for(n=0;n<40;n++)

{ display();}

}

}

}

if(k2!=1)

{

delay(10);

if(k2!=1)

{

while(k2!=1)

{

key_to2();

for(n=0;n<40;n++)

{ display();}

}

}

}

if(k3!=1)

{

TR0=1;   //启动定时器

Buzzer_Indicate=0;

sec_nb=set_timenb;  //从中断回复,仍显示设置过的数值

sec_dx=set_timedx;

if(time==0)

{ P2=0X99;sec_nb=sec_dx+5; }

else { P2=0xC3;sec_dx=sec_nb+5; }

}     

if(k4!=1)

{

delay(5);

if(k4!=1)

{

while(k4!=1);

set=!set;

}

}

if(k5!=1)

{

delay(5);

if(k5!=1)

{

while(k5!=1)

key_to3();

}

}

}

void display() //显示子程序

{

buf[1]=sec_dx/10; //第1位 东西秒十位

buf[2]=sec_dx%10; //第2位 东西秒个位

buf[3]=sec_nb/10; //第3位 南北秒十位

buf[0]=sec_nb%10; //第4位 南北秒个位

P1=0xff;                                // 初始灯为灭的

P0=0x00;

P1=0xfe;                              //片选LCD1

P0=table[buf[1]];

delay(1);

P1=0xff;

P0=0x00;

P1=0xfd;                           //片选LCD2

P0=table[buf[2]];

delay(1);

P1=0xff;

P0=0x00;

P1=0Xfb;              //片选LCD3

P0=table[buf[3]];

delay(1);

P1=0xff;

P0=0x00;

P1=0Xf7;

P0=table[buf[0]];               //片选LCD4

delay(1);

}

void time0(void) interrupt 1 using 1  //定时中断子程序

{

b++;

if(b==19)                        // 定时器中断次数

{      b=0;

sec_dx--;

sec_nb--;

if(sec_nb<=5&&time==0)  //东西黄灯闪

{  Green_dx=0;Yellow_dx=!Yellow_dx;}               

if(sec_dx<=5&&time==1)  //南北黄灯闪

{  Green_nb=0;Yellow_nb=!Yellow_nb;}            

if(sec_dx==0&&sec_nb==5)

sec_dx=5;

if(sec_nb==0&&sec_dx==5)

sec_nb=5;

if(time==0&&sec_nb==0)

{ P2=0x99;time=!time;sec_nb=set_timenb;sec_dx=set_timenb+5;}

if(time==1&&sec_dx==0)

{P2=0Xc3;time=!time;sec_dx=set_timedx;sec_nb=set_timedx+5;}

}

}

void key_to1()    //键盘处理子程序之+

{

TR0=0;          //关定时器

if(set==0)

set_timenb++;    //南北加1S

else

set_timedx++;    //东西加1S

if(set_timenb==100)

set_timenb=1;

if(    set_timedx==100)

set_timedx=1;   //加到100置1

sec_nb=set_timenb ;    //设置的数值赋给东西南北

sec_dx=set_timedx;

}

void key_to2()       //键盘处理子程序之-

{

TR0=0;         //关定时器

if(set==0)

set_timenb--;  //南北减1S

else

set_timedx--;  //东西减1S

if(set_timenb==0)

set_timenb=99;

if(    set_timedx==0 )

set_timedx=99;   //减到1重置99

sec_nb=set_timenb ;    //设置的数值赋给东西南北

sec_dx=set_timedx;

}

void key_to3()   //键盘处理之紧急车通行

{

TR0=0;

P2=0Xc9;

sec_dx=00;

sec_nb=00;

Buzzer_Indicate=1;

}

void int0(void) interrupt 0 using 1  //只允许东西通行

{

TR0=0;

P2=0Xc3;

Buzzer_Indicate=0;

sec_dx=00;

sec_nb=00;

}

void int1(void) interrupt 2 using 1       //只允许南北通行

{

TR0=0;

P2=0X99;

Buzzer_Indicate=0;

sec_nb=00;

sec_dx=00;

}

void logo()//开机的Logo  "- - - -"

{ for(n=0;n<50;n++)

{

P0=0x40;

P1=0xfe;

delay(1);

P1=0xfd;

delay(1);

P1=0Xfb;

delay(1);

P1=0Xf7;

delay(1);

P1 = 0xff;

}

}

void Buzzer()

{

if(Buzzer_Indicate==1)

Buzz=!Buzz;

else Buzz=0;

}

void delay(int ms)            //延时子程序

{

uint j,k;

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

for(k=0;k<124;k++);

}

;     一、如何查看交通事故现场图

      交通事故现场图为平面图,是利用图例和注记构成的,通过数据来科学、真实反映交通事故现场。交通事故现场图记录有地物、地貌符号,有道路边线、分道情况,车辆停放位置、人体倒卧位置、路面痕迹和散落物。当事人在查看交通事故现场图时应注意:现场方位是否正确,车辆停放位置及相关数据是否准确,有无制动距离和制动拖痕,起点和终点位置及数据是否准确,有无接触方位,人体倒卧位置及与车辆的关系数据是否正确,有无散落物的标注。如发现位置不当,数据不准,可以请求重新复核,也可当场向制图人员询问。

      根据有关规定,交通事故现场图绘制完毕后,勘查员、绘图员应签名或盖章,当事人在现场可要求本人签字,当事人不在现场或无能力签字的,应由见证人签名或盖章,无见证人或者当事人拒绝签字的,应当记录在案。

二、交通事故现场勘查程序

      各方当事人应如实向公安机关陈述事故经过,并交验驾驶证、行驶证、身份z。公安机关应向当事人公开事故现场图、现场照片、鉴定材料。

      车物损坏的,经物价部门评估后,以修为主,不能修复的可折价赔偿。

      在事故未调解前,公安机关可以指定肇事车方垫付死者或伤者的安葬费、抢救费,并预交事故的处理押金。交通事故当事方拒绝预付或无力预付抢救医疗费用的,公安交通管理部门可以扣留事故车辆至调解终结移送人民法院受理止。

      交通事故造成死亡的,死者亲属须在十日内将尸体火化。

      伤者住院治疗期间,未经公安机关批准,不得擅自转院或自购药品。经医院治愈拒绝出院的,费用由自己负责。伤者出院后,应主动到公安机关申请伤残评定。

这些人都在放屁,没有一个认真回答的!

你就这么说

首先程序初始化,将软件计数器赋初值后,红灯开始计数倒计时,此时红外对管通过外部感应器判定是否有闯红灯的,若有则报警3秒,红灯倒计时结束,黄灯闪烁5秒后,将转入绿灯倒计时程序,绿灯时间可检测车流量并可通过双位数码管显示,绿灯倒计时完毕后,黄灯闪烁5秒,此时程序结束,或者重新转入红灯倒计时。

我的理解是这样的:不管东西还是南北向通行,所有红绿灯都是以秒为基本计时单位的,所以用定时器产生一秒的中断。当进入中断时我们在中断服务程序中做一下几件事,1、设置标志位S,用于判断哪路交通灯开启。2、如果需要我们在中断程序中加一个中断计数器N,记录进入中断的次数,这个样就可以用这个N控制交通灯亮的时间是多少秒。

别人的,程序有点小问题,仅供参考。

交通灯控制器

一 实验目的

1. 了解交通灯的亮灭规律。

2. 了解交通灯控制器的工作原理。

3. 熟悉VHDL语言编程,了解实际设计中的优化方案。

二 硬件需求

1.EDA/SOPC实验箱一台。

三 实验原理

交通灯的显示有很多方式,如十字路口、丁字路口等,而对于同一个路口又有很多不同的显示要求,比如十字路口,车子如果只要东西和南北方向通行就很简单,而如果车子可以左右转弯的通行就比较复杂,本实验仅针对最简单的南北和东西直行的情况。

要完成本实验,首先必须了解交通路灯的亮灭规律。本实验需要用到实验箱上交通灯模块中的发光二极管,即红、黄、绿各三个。依人们的交通常规,“红灯停,绿灯行,黄灯提醒”。其交通灯的亮灭规律为:初始态是两个路口的红灯全亮,之后东西路口的绿灯亮,南北路口的红灯亮,东西方向通车,延时一段时间后,东西路口绿灯灭,黄灯开始闪烁。闪烁若干次后,东西路口红灯亮,而同时南北路口的绿灯亮,南北方向开始通车,延时一段时间后,南北路口的绿灯灭,黄灯开始闪烁。闪烁若干次后,再切换到东西路口方向,重复上述过程。

在实验中使用8个七段码管中的任意两个数码管显示时间。东西路和南北路的通车时间均设定为20s。数码管的时间总是显示为19、18、17……2、1、0、19、18……。在显示时间小于3秒的时候,通车方向的黄灯闪烁。

四 实验内容

本实验要完成任务就是设计一个简单的交通灯控制器,交通灯显示用实验箱的交通灯模块和七段码管中的任意两个来显示。系统时钟选择时钟模块的1KHz时钟,黄灯闪烁时钟要求为2Hz,七段码管的时间显示为1Hz脉冲,即每1s中递减一次,在显示时间小于3秒的时候,通车方向的黄灯以2Hz的频率闪烁。系统中用S1按键进行复位。

五 实验步骤

完成交通灯控制器的实验步骤如下:

1.首先打开Quartus II软件,新建一个工程,并新建一个VHDL File。

2.按照自己的想法,编写VHDL程序。

3.对自己编写的VHDL程序进行编译并仿真。

4.仿真无误后,根据附录一的引脚对照表,对实验中用到时钟、七段码显示及交通灯模块的LED对应的FPGA引脚进行管脚绑定,然后再重新编译一次。

5.用下载电缆通过JTAG接口将对应的sof文件下载到FPGA中。

6.观察交通灯控制器的工作是否满足实验要求。

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

源代码如下

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

library ieee;

use ieeestd_logic_1164all;

use ieeestd_logic_arithall;

use ieeestd_logic_unsignedall;

--------------------------------------------------------------------

entity exp18 is

port( Clk : in std_logic; --时钟输入

Rst : in std_logic; --复位输入

R1,R2 : out std_logic; --红灯输出

Y1,Y2 : out std_logic; --黄灯输出

G1,G2 : out std_logic; --绿灯输出

Display : out std_logic_vector(7 downto 0); --七段码管显示输出

SEG_SEL : buffer std_logic_vector(2 downto 0) --七段码管扫描驱动

);

end exp18;

--------------------------------------------------------------------

architecture behave of exp18 is

signal Disp_Temp : integer range 0 to 15;

signal Disp_Decode : std_logic_vector(7 downto 0);

signal SEC1,SEC10 : integer range 0 to 9;

signal Direction : integer range 0 to 15;

signal Clk_Count1 : std_logic_vector(9 downto 0); --产生05Hz时钟的分频计数器

signal Clk1Hz : std_logic;

signal Dir_Flag : std_logic; --方向标志

begin

process(Clk)

begin

if(Clk'event and Clk='1') then

if(Clk_Count1<1000) then

Clk_Count1<=Clk_Count1+1;

else

Clk_Count1<="0000000001";

end if;

end if;

end process;

Clk1Hz<=Clk_Count1(9);

process(Clk1Hz,Rst)

begin

if(Rst='0') then

SEC1<=0;

SEC10<=2;

Dir_Flag<='0';

elsif(Clk1Hz'event and Clk1Hz='1') then

if(SEC1=0) then

SEC1<=9;

if(SEC10=0) then

SEC10<=1;

else

SEC10<=SEC10-1;

end if;

else

SEC1<=SEC1-1;

end if;

if(SEC1=0 and SEC10=0) then

Dir_Flag<=not Dir_Flag;

end if;

end if;

end process;

process(Clk1Hz,Rst)

begin

if(Rst='0') then

R1<='1';

G1<='0';

R2<='1';

G2<='0';

else --正常运行

if(SEC10>0 or SEC1>3) then

if(Dir_Flag='0') then --横向通行

R1<='0';

G1<='1';

R2<='1';

G2<='0';

else

R1<='1';

G1<='0';

R2<='0';

G2<='1';

end if;

else

if(Dir_Flag='0') then --横向通行

R1<='0';

G1<='0';

R2<='1';

G2<='0';

else

R1<='1';

G1<='0';

R2<='0';

G2<='0';

end if;

end if;

end if;

end process;

process(Clk1Hz)

begin

if(SEC10>0 or SEC1>3) then

Y1<='0';

Y2<='0';

elsif(Dir_Flag='0') then

Y1<=Clk1Hz;

Y2<='0';

else

Y1<='0';

Y2<=Clk1Hz;

end if;

end process;

process(Dir_Flag)

begin

if(Dir_Flag='0') then --横向

Direction<=10;

else --纵向

Direction<=11;

end if;

end process;

process(SEG_SEL)

begin

case (SEG_SEL+1) is

when "000"=>Disp_Temp<=Direction;

when "001"=>Disp_Temp<=Direction;

when "010"=>Disp_Temp<=SEC10;

when "011"=>Disp_Temp<=SEC1;

when "100"=>Disp_Temp<=Direction;

when "101"=>Disp_Temp<=Direction;

when "110"=>Disp_Temp<=SEC10;

when "111"=>Disp_Temp<=SEC1;

end case;

end process;

process(Clk)

begin

if(Clk'event and Clk='1') then --扫描累加

SEG_SEL<=SEG_SEL+1;

Display<=Disp_Decode;

end if;

end process;

process(Disp_Temp) --显示转换

begin

case Disp_Temp is

when 0=>Disp_Decode<="00111111"; --'0'

when 1=>Disp_Decode<="00000110"; --'1'

when 2=>Disp_Decode<="01011011"; --'2'

when 3=>Disp_Decode<="01001111"; --'3'

when 4=>Disp_Decode<="01100110"; --'4'

when 5=>Disp_Decode<="01101101"; --'5'

when 6=>Disp_Decode<="01111101"; --'6'

when 7=>Disp_Decode<="00000111"; --'7'

when 8=>Disp_Decode<="01111111"; --'8'

when 9=>Disp_Decode<="01101111"; --'9'

when 10=>Disp_Decode<="01001000"; --'='

when 11=>Disp_Decode<="00010100"; --'||'

when others=>Disp_Decode<="00000000"; --全灭

end case;

end process;

end behave;

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

说明:根据硬件不同对程序做适当调整

以上就是关于c51单片机c语言交通灯的程序全部的内容,包括:c51单片机c语言交通灯的程序、如何查看交通事故现场图,交通事故现场勘查程序、单片机交通灯程序流程图注解和介绍等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9343324.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-27
下一篇2023-04-27

发表评论

登录后才能评论

评论列表(0条)

    保存