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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;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++);


参考技术A #include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
sbit spk=P3^0;
sbit k0=P3^2;
sbit k1=P3^7;
sbit k2=P3^6;
sbit red1=P0^0;
sbit yellow1=P0^1;
sbit green1=P0^2;
sbit red2=P0^3;
sbit yellow2=P0^4;
sbit green2=P0^5;
uchar shi,ge,temp=29,aa,i,bb,flag0=0,flag1=0;
uchar code table[]=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90; //数码管码
void delay(uint z);
void display();
void init() //初始化函数

P3=0xfe;
EA=1;
EX0=1;
EX1=1;
IT1=1;
IT0=1;
TMOD=0x11;
TH0=(65536-50000)/256;//定时初值50毫秒
TL0=(65536-50000)%256;
ET0=1;
TR0=1;

void main()//主函数

init();
while(1)

display();


void delay(uint z)//延时子函数

uint x,y;
for(x=0;x<z;x++)
for(y=0;y<110;y++);

void interrupt_0() interrupt 0//外部中断0,当k0按下时两路红的全亮

TR0=!TR0;
spk=1;
P1=0xff;
red1=0;
red2=0;
green1=1;
green2=1;
yellow1=1;
yellow2=1;
spk=0;


void interrup_1() interrupt 2//外部中断1,东西红灯亮或南北红灯亮

if(k1==0) //当中断触发时,检测到k1按下时东西红灯亮

TR0=!TR0;
P1=0xff;
red1=0;
red2=1;
green1=1;
green2=0;
yellow1=1;
yellow2=1;


if(k2==0)//当中断触发时,检测到k2按下时南北红灯亮

TR0=!TR0;
P1=0xff;
red1=1;
red2=0;
green1=0;
green2=1;
yellow1=1;
yellow2=1;



void timer0() interrupt 1//定时器,实现倒计时

TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
aa++;

if(aa==10)

aa=0;
temp--;


if(flag1==0)

if((temp>5)&&(temp<30)) P0=0xde;
if((temp<=5)&&(temp>=0)) P0=0xcf;

if(flag0==0)

if(temp==0)

temp=20;
flag1=1;



if(flag1==1)

if((temp>5)&&(temp<30)) P0=0xf3;
if((temp<=5)&&(temp>=0)) P0=0xf1;
flag0=1;
if(temp==0)

temp=29;
flag1=0;
flag0=0;




void display()//显示数码管倒计时

red1=0;
green2=0;
while(1)

P1=0xff;
shi=temp/10;
ge=temp%10;
P2=0x80;
P1=table[shi];
delay(10);
P1=0xff;
P2=0x40;
P1=table[ge];
delay(10);


追问

可不可以把硬件电路图给看看啊,ko,k1,spk,void delay(uint z);分别是干嘛用的

追答

spk是蜂鸣器,void delay(uint z);是延时函数的声明k0 k1k2是按键

本回答被提问者和网友采纳
参考技术B 如果你设计的五一单片机C语言交通灯的程序出不来,你肯定是有相应的错误,编译也是通过不了的,你应该仔细的阅读一下自己的程序 参考技术C #include <reg52.h>
#define uchar unsigned char
#define uint unsigned int

uint t1oc=20; //20*50000us=1s
uint count;

uchar tp[8];
uchar t1,t2,t3,t4;
uchar d1,d2,d3,d4;

//数码管显示代码
unsigned char code tab[]=
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,
0x40,0x80;
//0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
//0 1 2 3 4 5 6 7 8 9 A B C D E F - .

unsigned char code tab_p[]=
0xbf,0x86,0xdb,0xcf,
0xe6,0xed,0xfd,0x87,
0xff,0xef,0xf7,0xfc,
0xb9,0xde,0xf9,0xf1;//带小数点的16个数码

unsigned char code tab_w[]=
0x7F,0xBF,0xDF,0xEF,0xF7,0xfb,0xfd,0xfe;//位选择代码 从右到左

void delay1ms(unsigned int count) //延时1ms

unsigned char j;
for(;count>0;count--)
for(j=0;j<120;j++);


void led_ex(unsigned char dat,unsigned char N)

P0=dat;
P2=0x01<<N;
delay1ms(1);
P2=0x00;


void display(unsigned char num,unsigned char wei,bit p)

P3=tab_w[wei];
if(!p)
P1=tab_p[num];
else
P1=tab[num];
delay1ms(1);
P1=0x00;


//定时器0 50000us 12MHz
void initTimer(void)

TMOD=0x1;
TH0=0x3c;
TL0=0xb0;


//定时器0 定时中断
void timer0(void) interrupt 1

TH0=0x3c;
TL0=0xb0;
t1oc--;
if(t1oc==0)

t1oc=20; //20*50000us=1s
t1--;
if(t1==0)

t1=d1;
led_ex(0xFF,0);

tp[0]=t1%10;
tp[1]=t1/10;

t2--;
if(t2==0)

t2=d2;
led_ex(0x00,1);

tp[2]=t2%10;
tp[3]=t2/10;

t3--;
if(t3==0)

t3=d3;
led_ex(0x00,2);

tp[4]=t3%10;
tp[5]=t3/10;

t4--;
if(t4==0)

t4=d4;
led_ex(0x00,3);

tp[6]=t4%10;
tp[7]=t4/10;



void main()

unsigned char i;
initTimer();
TR0=1;
ET0=1;
EA=1;

d1= 60;
d2= 30;
d3= 50;
d4= 45;

t1=1;
t2=1;
t3=1;
t4=1;

while(1)

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

display(tp[i],i,i%2);


参考技术D

51单片机交通灯Proteus仿真和C语言程序。交通灯仿真




懂事电子设计 Vgz

以上是关于c51单片机c语言交通灯的程序的主要内容,如果未能解决你的问题,请参考以下文章

单片机Keil C51 C语言多文件如何使用全局位变量?跪拜!!

Arduino编程都用啥语言?c51还是啥?

请教C51单片机,C语言编程,怎样把一个四位数存入(读取)外部数据存储器?请举例说明。

C51单片机从串口接收数据多个字节的数据的C语言程序,谢谢

模拟交通灯 单片机C51,要电路图和程序

交通灯 C语言 单片机。中断函数问题