173 2438 5004
KEROS加密芯片——品牌直销 | 免费样品 | 技术支持
当前位置:网站首页 > 资讯中心 正文 资讯中心

51单片机模拟交通灯加中断

htxw 2023-03-14 资讯中心 8 ℃

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

Proteus仿真原理图:

程序如下:

#include reg51.h

#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;n40;n++)

{ display();}

}

}

}

if(k2!=1)

{

delay(10);

if(k2!=1)

{

while(k2!=1)

{

key_to2();

for(n=0;n40;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=5time==0)  //东西黄灯闪

{  Green_dx=0;Yellow_dx=!Yellow_dx;}               

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

{  Green_nb=0;Yellow_nb=!Yellow_nb;}            

if(sec_dx==0sec_nb==5)

sec_dx=5;

if(sec_nb==0sec_dx==5)

sec_nb=5;

if(time==0sec_nb==0)

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

if(time==1sec_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;n50;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;jms;j++)

for(k=0;k124;k++);

}

用单片机定时中断控制交通灯

ORG 0000H

SJMP A3 ;四盏红灯亮

A3:MOV SP,#60H

MOV A, #24H

MOV P1, A

CLR P3.4

CLR P3.3

SETB P3.5

SETB P3.2 ;显示5秒

MOV R4,#05H

LOOP1: MOV R2,#03H

LCALL LP ;调显示子程序

DJNZ R4,LOOP1

MOV R4,#00H

MOV R2,#03H

LCALL LP ;东西绿灯亮,南北红灯亮

A2:MOV A,#0CH

CLR P3.5

MOV P1,A

SETB P3.3

CLR P3.4

SETB P3.2 ;显示20秒

MOV R4,#14H

LOOP2 :MOV R2,#03H

LCALL LP ;调显示子程序

DJNZ R4,LOOP2

MOV R4,#00H

MOV R2,#03H

LCALL LP ;调显示子程序

SETB P3.2

CLR P3.3 ; 显示5秒

MOV R4 ,#05H ;东西黄灯亮,南北红灯亮

LOOP9:MOV A,#14H

MOV P1 ,A

CLR P3.5

SETB P3.4

MOV R2,#02H

LCALL LP ;调显示子程序

MOV R2,#01H ;定时

LCALL DELAY ;调延时子程序,南北红灯亮

MOV A ,#04H

MOV P1 ,A

CLR P3.4

CLR P3.5

MOV R2,#01H ;定时

LCALL DELAY ;调延时子程序

DJNZ R4,LOOP9

MOV R4,#00H

MOV R2,#03H

LCALL LP ;调显示子程序,东西红灯亮,南北绿灯亮

A8:MOV A, #61H

MOV P1,A

CLR P3.4

CLR P3.3

CLR P3.2

SETB P3.5 ; 显示20秒

MOV R4,#14H

LOOP3:MOV R2,#03H

LCALL LP ;调显示子程序

DJNZ R4,LOOP3

MOV R4,#00H

MOV R2,#03H

LCALL LP ;调显示子程序

SETB P3.5

MOV R4 ,#05H

LOOP10:MOV R2,#02H

LCALL LP ;调显示子程序,东西红灯亮,南北黄灯亮

A0:MOV A,#0A2H

MOV P1,A

CLR P3.4

CLR P3.3

CLR P3.2

MOV R2,#01H ;定时

LCALL DELAY ;调延时子程序,东西红灯亮

MOV A,#20H

MOV P1,A

CLR P3.4

CLR P3.3

CLR P3.2

MOV R2,#01H ;定时

LCALL DELAY ;调延时子程序

DJNZ R4,LOOP10

MOV R4,#00H

MOV R2,#03H

LCALL LP ;调显示子程序

LJMP A2 ;延时子程序

DELAY:PUSH 2

PUSH 1

PUSH 0

DELAY1: MOV 1,#00H

DELAY2:MOV 0,#0B2H

DJNZ 0,$

DJNZ 1,DELAY2

DJNZ 2,DELAY1

POP 0

POP 1

POP 2

DJNZ R2 ,DELAY

RET ;显示子程序

xian: MOV A,R4

MOV B,#10

DIV AB

MOV R6,A

MOV DPTR,#TAB

MOV A,B

MOVC A,@A+DPTR

MOV SBUF,A

MOV R7,#0FH

H55S:DJNZ R7,H55S

MOV A,R6

MOVC A,@A+DPTR

MOV SBUF,A

MOV R7,#0FH

H55S1:DJNZ R7,H55S1

LCALL DELAY

RET

这是交通灯的子程序。它主要是被调用控制各个方向灯亮灭情况和时间。

TAB:DB 0fch,60h,0dah,0f2h,66h,0b6h,0beh,0e0h

DB 0feh,0f6h,0eeh,3eh,9ch,7ah,9eh,8eh ;查表子程序

END

单片机中断实验交通灯的实验原理

交通灯控制系统设计实验

一.设计目的

1. 通过本次课程设计进一步熟悉和掌握单片机的结构及工作原理,巩固和加深“单片机原理与应用”课程的基本知识,掌握电子设计知识在实际中的简单应用。

2. 综合运用“单片机原理与应用”课程和先修课程的理论及生产实际知识去分析和解决电子设计问题,进行电子设计的训练。

3. 学习电子设计的一般方法,掌握AT89C52芯片以及简单电子设计过程和运行方式,培养正确的设计思想和分析问题、解决问题的能力,特别是总体设计能力。

4. 通过计算和绘制原理图、布线图和流程图,学会运用标准、规范、手册、图册和查阅有关技术资料等,培养电子设计的基本技能。

5. 通过完成一个包括电路设计和程序开发的完整过程,了解开发单片机应用系统全过程,为今后从事的工作打基础。

二.设计要求

1.利用单片机的定时器定时,实现道路的红绿灯交替点亮和熄灭。

2.以AT89C52单片机为核心,设计一个十字路口交通灯控制系统。用单片机控制LED灯模拟交通信号灯显示。假定东西、南北方向方向通行(绿灯)时间为25秒,缓冲(黄灯)时间5秒,停止(红灯)时间35秒。

3.南北方向、东西方向车道除了有红、黄、绿灯指示外,每一种灯亮的时间都用显示器进行显示(采用计时的方法)。

三.实验原理

1.基本原理

主体电路:交通灯自动控制模块。这部分电路主要由80C51单片机的I/O端口、定时计数器、外部中断扩展等组成。

本设计先是从普通三色灯的指示开始进行设计,用P1口作为输出。程序的初始化是东西南北方向的红灯全亮。然后南北方向红灯亮,东西方向绿灯亮,60秒后东西方向黄灯闪亮5秒后南北方向绿灯亮,东西方向红灯亮。重复执行。倒计时用到定时器T0,用P2口作为LED的显示。二位一体的LED重复执行60秒的倒计时。作为突发事件的处理,本设计主要用到外部中断EX0。用一模拟开关作为中断信号。实际中可以接其它可以产生中断信号的信号源。

用单片机模拟控制交通灯

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

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

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

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

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

单片机交通灯利用51系列设计的程序中,能用到哪几种中断源?求大神啊!!

如果你用到按键可能会涉及外部中断,当然不用中断也可识别按键,那样实时性不是很好

如果你只是个交通灯,一个定时器中断就搞定了

例如:void timerA()interrput 0

{

T++;

if(T xxx)

{

T = 0;

交通灯变化;

}

}

如果你还是懒甚至定时器都可以不用直接:

void main()

{

while(1)

{

状态一;

delay();

状态二

delay();

}

}

51单片机模拟交通灯加中断的介绍就聊到这里吧,感谢您花时间阅读,谢谢。

本文标签:51单片机模拟交通灯加中断

<