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

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

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=0n<40n++)

{ display()}

}

}

}

if(k2!=1)

{

delay(10)

if(k2!=1)

{

while(k2!=1)

{

key_to2()

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

{ display()}

}

}

}

if(k3!=1)

{

TR0=1   //启动定时器

Buzzer_Indicate=0

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

sec_dx=set_timedx

if(time==0)

{ P2=0X99sec_nb=sec_dx+5}

else { P2=0xC3sec_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=0Yellow_dx=!Yellow_dx}               

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

{  Green_nb=0Yellow_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=0x99time=!timesec_nb=set_timenbsec_dx=set_timenb+5}

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

{P2=0Xc3time=!timesec_dx=set_timedxsec_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=0n<50n++)

{

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=0j<msj++)

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

}

ORG 1000H

L:JNB P3.0,LP3

JNB P3.1,LP2 判断p3.1,p3.0口

如果P3.0为1的话,正州瞎差常运行交通灯

如果P3.1为1的话,正常运行交通灯

如果P3.1为0的话,依次点亮灯

如果P3.0为0的话,停止交通灯,只有黄灯闪烁

正常运行交通灯

LP1:

MOV P1,#61H

CLR P3.2

CLR P3.3

CLR P3.4

SETB P3.5 1,3 路口红灯亮,2,4 路口绿灯亮

LCALL DELAY1

MOV B,#04H 设置循环次数为4次

M:MOV P1,#51H

CLR P3.5

SETB P3.4 1,3路口红灯亮,2,4路口黄灯亮

LCALL DELAY2

MOV P1,#41H

CLR P3.41,3路口红灯亮,2,4路册皮口黄灯灭

LCALL DELAY2

DJNZ B,M

MOV P1,#0CH

SETB P3.2

SETB P3.3 1,3路口绿灯亮,2,4路口红灯亮

LCALL DELAY1

MOV B,#04H

N:MOV P1,#8AH

CLR P3.21,3路口黄灯亮,2,4路口红灯亮

LCALL DELAY2

MOV P1,#08H 1,3路口黄灯灭,2,4路口红灯亮

LCALL DELAY2

DJNZ B,N

AJMP L

黄灯闪

LP3: CLR P1.7

CLR P3.2

CLR P3.3

CLR P3.5

MOV P1,#92H

SETB P3.4 黄灯亮,其他的灯灭

LCALL DELAY2

MOV P1,#00H

CLR P3.4 所有的黄灯灭

LCALL DELAY2

AJMP L

循环亮

LP2: CLR P3.2

CLR P3.3

CLR P3.4

CLR P3.5

MOV A,#01H赋初值

MOV R0,#08 循环变量,循环7次,控制7个灯

LOOP:MOV P1,A 点亮第一个灯

LCALL DELAY2 延迟

RL A A的值加1,循环左移

DJNZ R0,LOOP RO的值减1不等于1则执行LOOP标号

SETB P3.2 P3.2灯亮

LCALL DELAY2 延迟

CLR P3.2 P3.2灯灭

SETB P3.3 下一个灯P3.3亮

LCALL DELAY2 延迟

CLRP3.3P3.3灯灭

SETB P3.4下一个灯P3.3亮

LCALL DELAY2 延迟

CLR P3.4 P3.4灯灭

SETB P3.5 P3.5灯亮

LCALL DELAY2 延迟

AJMP L

延神衡迟1

DELAY1 :

MOV R3,#200

DEL1: MOV R4,#250

DEL2: MOV R5,#50

DEL3: NOP 空 *** 作

DJNZ R5,DEL3

DJNZ R4,DEL2

DJNZ R3,DEL1 延长5秒

RET

延迟2

DELAY2 :

DEL4: MOV R3,#200

DEL5: MOV R4,#200

DEL6: NOP

DJNZ R4,DEL6

DJNZ R3,DEL5 延迟0.08秒

RET

END


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

原文地址:https://54852.com/yw/8267073.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存