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

}




C51单片机程序设计题,要求用C语言做,模拟交通灯控制单片机电路,答案要...
答:晚上随手写,也未调试,权当看看 程序有不严谨地方还得调试修改 include <REGX51.H> define STATUS_1S1 define STATUS_2S2 define STATUS_3S3 define STATUS_4S4 define STATUS_5S5 define STATUS_15S15 define STATUS_28S28 define STATUS_29S29 define STATUS_30S30 unsigned char flag,status,...

普中科技的51单片机例程,里面有个交通灯的程序,我看不懂,这段代码啥...
答:第【3】同理,还是假如这个数是123,直接对10取模,相当于123除以10的余数,所以这句是求个位数。同样的【6】【7】的值是和【2】【3】相同,直接赋过去就行(只看这一段程序也看不出什么,我也就只能看到这个程度了,如果是对语法不清楚,建议查看一下C语言编程相关章节,这段程序挺简单的还是...

求51单片机的C代码
答:给你参考,可以联系我 / 十字路口交通灯控制 C 程序 / define uchar unsigned char define uint unsigned int include <reg52.h> /***定义控制位***/ sbit Time_Show_LED2=P2^5;//Time_Show_LED2控制位 sbit Time_Show_LED1=P2^4;//Time_Show_LED1控制位 sbit EW_LED2=P2^3;...

求89C51单片机C语言用四个74hc595控制四个LED实现交通灯程序
答: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,...

跪求51单片机交通信号灯c语言程序设计
答:GPIO_TRAFFIC = 0xFF; //将所有的灯熄灭 RED00 = 1; GREEN00 = 1;GREEN11 = 0; //宝田路绿灯亮 GREEN10 = 0; //宝田路人行道绿灯亮 RED01 = 0; //前进路红灯亮 RED00 = 0; //前进路人行道红灯亮 } //--黄灯等待切换状态,5秒--// else if(S...

求高人帮忙单片机交通灯编程
答://以下代码经过Keil C51软件调试通过 include "reg51.h" //头文件包含 //宏定义 define uint unsigned int define uchar unsigned char define ON 0 //0的时候灯亮 define OFF 1 //1的时候灯亮 //管脚定义 //南北道 黄灯亮3秒 红灯亮 30秒 黄灯3秒 绿灯38秒 //东西道 黄灯亮3秒 绿灯...

利用mcs-51单片机指令系统设计一段交通灯轮流点亮的程序
答:;路口1的车直行时各路口灯亮情况3a3b2p绿3c红+4a4b4c3p全红+1c绿1a1b4p红+2c绿2a2b1p红 ROAD1:MOV DPTR,#7F00H ;置8155命令口地址;无关位为1)MOV A,#03H ;A口、B口输出,A口、B口为基本输入输出方式 MOVX @DPTR,A ;写入工作方式控制字 INC DPTR ;指向A口 MOV A,#...

交通灯C51程序设计问题 有一错误:error c129 如何解决 急!!!_百度...
答:试试看:include <reg51.h> include <absacc.h> include <intrins.h> define uchar unsigned char define uint unsigned int define PA8255 0x8000 define PB8255 0x8100 define PC8255 0x8200 define CTRL8255 0x8400 define S1 (P1 = 0x28)define S2 (P0 = 0x51)define ...

单片机的红绿灯控制程序如何写啊
答://--- //名称:LED模拟交通灯 //作者:彭伟《单片机C语言程序设计实训100例-基于8051+PROTEUS仿真》//--- //说明:东西向绿灯亮若干秒后,黄灯闪烁,闪烁5次后亮红灯 // 红灯亮后,南北向由红灯变为绿灯,若干秒后南北向黄灯闪烁 // 闪烁5次后亮红灯,东西向绿灯亮,如此重复 //-...

交通灯 C语言 单片机。中断函数问题
答:参考《51单片机C语言创新教程》温子祺等著。源码转自:《51单片机C语言创新教程》。/*实验名称:交通灯实验 描 述:交通灯实验要求红灯亮15秒,绿灯亮10秒,黄灯亮5秒,当红灯切换为绿灯或者绿灯切换为红灯,要实现灯闪烁。红灯、绿灯、黄灯的点亮持续时间可以通过串口来修改,并在下一个循环中更新...