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

Python015

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++)

}

我实训是做了这个项目,发给你看看,功能主要和交通灯的差不多,还可以显示具体的时间,跳转的时候,时间是倒计时的,当到0以后,下面灯转换

#include<reg51.h>

unsigned int shi,ge,js

void delay(unsigned char i)

sbit P2_0=P2^0

sbit P2_1=P2^1

unsigned int i=0

unsigned char key_press()

unsigned char key_scan()

unsigned int m=0m2=0n1=6n2=2

void TIMERO_1()

void TIMERO_0()

unsigned char led[4]={0xee,0xdb,0xf5,0xdb}

unsigned char code tabe[13]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x00}

unsigned char num

unsigned char key_scan()

{ unsigned char hang,lie,key

P3=0x0f

if(P3!=0x0f)

delay(100)

if(P3!=0x0f)

{

switch(P3&0x0f)

{

case 0x0e:hang=0break

case 0x0d:hang=1break

case 0x0b:hang=2break

//case 0x07:hang=3break

}

P3=0xf0

switch(P3&0xf0)

{

case 0xe0:lie=0break

case 0xd0:lie=1break

case 0xb0:lie=2break

case 0x70:lie=3break

}

while(P3!=0xf0)

key=hang*4+lie

}

// else

// key=12

return (key)

}

unsigned char key_press()

{

unsigned char temp,key_flag

P3=0x0f

delay(100)

temp=P3

if (temp!=0x0f)

{

key_flag=1

}

else

{

key_flag=0

}

return key_flag

}

void TIMERO_0() interrupt 1

{

TH0=0X3C

TL0=0XB0

m++

if(m==20)

{

m=0

n1--

shi=n1/10

ge=n1%10

}

if(n1==0)

{i=i+1

n2=3

TR1=1

TR0=0

}

//if(ge==0)

//{ge=2}

}

void TIMERO_1() interrupt 3

{

TH1=0X3C

TL1=0XB0

m2++

if(m2==20)

{

m2=0

n2--

shi=n2/10

ge=n2%10

}

if(n2==0)

{

i=i+1

n1=js

TR0=1

TR1=0

if(i== 4)

{

i=0

}

//if(ge==0)

//{ge=js}

}

}

void display(unsigned char a,b,c,d,e,f)

{

P2_1=1

P2_0=0

P0=0x20

P2_0=1

P2_1=0

P0=tabe[a]

delay(10)

P0=0x00

P2_1=1

P2_0=0

P0=0X10

P2_0=1

P2_1=0

P0=tabe[b]

delay(10)

P0=0x00

P2_1=1

P2_0=0

P0=0x08

P2_0=1

P2_1=0

P0=tabe[c]

delay(10)

P0=0x00

P2_1=1

P2_0=0

P0=0x04

P2_0=1

P2_1=0

P0=tabe[d]

delay(10)

P0=0x00

P2_1=1

P2_0=0

P0=0x02

P2_0=1

P2_1=0

P0=tabe[e]

delay(10)

P0=0x00

P2_1=1

P2_0=0

P0=0x01

P2_0=1

P2_1=0

P0=tabe[f]

delay(10)

P0=0x00

delay(10)

}

void main()

{

TMOD=0X11

TH0=0X3C

TL0=0XB0

TH1=0X3C

TL1=0XB0

ET1=1

ET0=1

EA=1

P1=0XFF

while(1)

{

P0=0

if(key_press())

{ num=key_scan()

if(num<=9)

{

shi=ge

ge=num

js=shi*10+ge

n1=js

}

if(num==10)

{

TR0=0

TR1=0

shi=ge

ge=num

}

if(num==11)

{

TR0=1

i=0

js=shi*10+ge

}

}

P1=led[i]

display(12,12,12,12,shi,ge)

}

}

void delay(unsigned char i )

{

unsigned char j, k

for(k=0k<ik++)

for(j=0j<255j++)

}

//看看用AT89s52行不?

//制作:晓军

#include <reg52.h>

#define ON 1

#define OFF 0

unsigned int t,t_Light

unsigned char flag

sbit SN_Green=P1^0

sbit SN_Yellow=P1^1

sbit SN_Red=P1^2

sbit EW_Green=P1^3

sbit EW_Yellow=P1^4

sbit EW_Red=P1^5

void init(void)

{

TMOD=0x01

EA=1

ET0=1

TR0=1

TH0=(65536-50000)/256

TL0=(65536-50000)%256

}

void main(void)

{

init()

while(1)

{

switch(flag)

{

case 1:

SN_Green=ON

SN_Yellow=OFF

SN_Red=OFF

EW_Green=OFF

EW_Yellow=OFF

EW_Red=ON

break

case 2:

SN_Green=OFF

SN_Yellow=ON

SN_Red=OFF

EW_Green=OFF

EW_Yellow=ON

EW_Red=OFF

break

case 3:

SN_Green=OFF

SN_Yellow=OFF

SN_Red=ON

EW_Green=ON

EW_Yellow=OFF

EW_Red=OFF

break

}

}

}

void timer(void) interrupt 1 using 0

{

TH0=(65536-50000)/256

TL0=(65536-50000)%256

t++

if(t==18)

{

t=0

t_Light++

if(t_Light<=30)

{

flag=1

}

else if(t_Light<=34)

{

flag=2

}

else if(t_Light<88)

{

flag=3

if(t_Light==88) t_Light=0

}

}

}