跪求一交通灯控制系统C程序

跪求一交通灯控制系统C程序,第1张

//晶振:110592 T1-250微溢出一次

/变量的定义:show_val_sn,show_val_ew:显示值0-59

state_val_sn,state_val_ew:状态值 南北反向0-绿灯亮;1-黄灯亮;2-红灯亮

T1_cnt:定时器计数溢出器

cnt_sn,cnt_ew:倒计时的数值

init_sn[3],int_ew[3]倒计时

leg_seg_code:数码管七段码/

#include<reg51h>

sbit SN_green=P3^2;//南北方向绿灯

sbit SN_yellow=P3^1;//南北方向黄灯

sbit SN_red=P3^0;//南北方向红灯

sbit EW_green=P3^5;

sbit EW_yellow=P3^4;

sbit EW_red=P3^3;

unsigned char data cnt_sn,cnt_ew;

unsigned int data T1_cnt;

unsigned char data state_val_sn,state_val_ew;

char code led_seg_code[]={0x3f,0x06,0x05,0x04,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

char code init_sn[3]={14,4,9};

char code init_ew[3]={9,14,4};

//-------------------------------------

void delay(unsigned int i)//延时

{

while(i=0);

}

//---------------------------------------

void led_show(unsigned int u,unsigned int v)

{

unsigned char i;

i=u%10;//暂存个数

P0=led_seg_code[i];

P2=0xbf;

delay(100);//延时

i=u%100/10;//暂存十位

P0=led_seg_code[i];

P2=0x7f;

delay(100);//延时

i=v%10;//暂存个位

P0=led_seg_code[i];

P2=0xfe;

delay(100);//延时

i=v%100/10;//暂存十位

P0=led_seg_code[i];

P2=0xfd;

delay(100);//延时

}

//----------------------------------------

void timer()interrupt 3 //T1中断

{

T1_cnt++;

if(T1_cnt>3999)//如果计数>3999,计时1s

{

T1_cnt=0;

if(cnt_sn!=0)//南北方向计时

{cnt_sn--;}

else

{state_val_sn++;

if(state_val_sn>2)state_val_sn=0;

cnt_sn=init_sn[state_val_sn];

switch(state_val_sn)//根据状态值,刷新各信号灯的状态

{

case 0:SN_green=0;//南北方向绿灯

SN_yellow=1;//南北方向黄灯

SN_red=0;//南北方向红灯

break;

case 1:SN_green=1;//南北方向绿灯

SN_yellow=0;//南北方向黄灯

SN_red=1;//南北方向红灯

break;

case 2:SN_green=1;//南北方向绿灯

SN_yellow=1;//南北方向黄灯

SN_red=0;//南北方向红灯

break;

}

}

if(cnt_ew!=0)//东西方向计时器

{cnt_ew--;}

else

{state_val_ew++;

if(state_val_ew>2)state_val_ew=0;

cnt_ew=init_ew[state_val_ew];

switch(state_val_ew)//根据状态值,刷新各信号灯的状态

{case 0:EW_green=1;

EW_yellow=1;

EW_red=0;

break;

case 1:EW_green=0;

EW_yellow=1;

EW_red=1;

break;

case 2:EW_green=1;

EW_yellow=0;

EW_red=1;

break;

}

}

}

}

//-------------------------------------

void main()

{

//初始化各变量

cnt_sn=init_sn[0];

cnt_ew=init_ew[0];

T1_cnt=0;

state_val_sn=0;//启动后,默认工作在序号位1的状态

state_val_ew=0;//初始化各灯的状态

SN_green=0;//南北方向绿灯亮

SN_yellow=1;//南北方向黄灯灭

SN_red=1;//南北方向红灯亮

EW_green=1;//东西方向绿灯灭

EW_yellow=1;//东西方向黄灯灭

EW_red=0;//东西方向红灯亮

//初始化51的寄存器

TMOD=0x20;//用T1计时8位自动装载定时模式

TH1=0x19;//0x4b;//500微秒溢出一次, 250=(256-x)12/110592->x=2304

TL1=0x19;

EA=1;//开中断

ET1=1;

TR1=1;//开定时器T1

while(1)

{

led_show(cnt_sn,cnt_ew);

}

}

/------结束---------------/

#include<reg51h>

#define uchar unsigned char

#define uint unsigned int

sbit RED_A=P3^0; //东西向指示灯

sbit YELLOW_A=P3^1;

sbit GREEN_A=P3^2;

sbit RED_B=P3^3; //南北向指示灯

sbit YELLOW_B=P3^4;

sbit GREEN_B=P3^5;

sbit KEY1=P1^0;

sbit KEY2=P1^1;

sbit KEY3=P1^2;

//延时倍数,闪烁次数, *** 作类型变量

uchar Flash_Count=0,Operation_Type=1,LEDsng,LEDsns,LEDewg,LEDews,discnt;

uint Time_Count=0,time;

uchar ledtab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff};

void displaysn()

{

LEDsng=((time-Time_Count)/20)%10;

LEDsns=((time-Time_Count)/20)/10;

LEDewg=0x10;

LEDews=0x10;

}

void displayew()

{

LEDewg=((time-Time_Count)/20)%10;

LEDews=((time-Time_Count)/20)/10;

LEDsng=0x10;

LEDsns=0x10;

}

//定时器0 中断函数

void T0_INT() interrupt 1

{

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

switch(Operation_Type)

{

case 1: //东西向绿灯与南北向红灯亮

if((Time_Count%20)==0)displayew();

RED_A=0;YELLOW_A=0;GREEN_A=1;

RED_B=1;YELLOW_B=0;GREEN_B=0;

if(++Time_Count!=time) return;

Time_Count=0;

Operation_Type=2;

break;

case 2: //东西向黄灯开始闪烁,绿灯关闭

LEDewg=0x0;

LEDews=0x0;

if(++Time_Count!=8) return;

Time_Count=0;

YELLOW_A=~YELLOW_A;GREEN_A=0;

if(++Flash_Count!=10) return; //闪烁

Flash_Count=0;

Operation_Type=3;

break;

case 3: //东西向红灯与南北向绿灯亮

if((Time_Count%20)==0)displaysn();

RED_A=1;YELLOW_A=0;GREEN_A=0;

RED_B=0;YELLOW_B=0;GREEN_B=1;

if(++Time_Count!=time) return;

Time_Count=0;

Operation_Type=4;

break;

case 4: //南北向黄灯开始闪烁,绿灯关闭

LEDsng=0x0;

LEDsns=0x0;

if(++Time_Count!=8) return;

Time_Count=0;

YELLOW_B=~YELLOW_B;GREEN_A=0;

if(++Flash_Count!=10) return; //闪烁

Flash_Count=0;

Operation_Type=1;

break;

}

}

void t1_isr() interrupt 3

{

TR1=0;

TH1=(65536-3000)/256;

TL1=(65536-3000)%256;

TR1=1;

switch(discnt)

{

case 0:

P2=0x02;

P0=ledtab[LEDewg];

break;

case 1:

P2=0x01;

P0=ledtab[LEDews];

break;

case 2:

P2=0x08;

P0=ledtab[LEDsng];

break;

case 3:

P2=0x04;

P0=ledtab[LEDsns];

break;

default:discnt=0;break;

}

discnt++;

discnt&=0x03;

}

void delay()

{

uint i;

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

}

//主程序

void main()

{

TMOD=0x11; //T0 方式1

EA=1;

ET0=1;

TR0=1;

TH1=(65536-3000)/256;

TL1=(65536-3000)%256;

TR1=1;

ET1=1;

time=100;

Time_Count=100;

Time_Count=0;

Operation_Type=1;

while(1)

{

if(KEY1==0) //按一下加1S

{

delay();

if(KEY1==0)

{

while(KEY1==0);

TR0=0;

time+=20;

LEDsng=(time/20)%10;

LEDsns=(time/20)/10;

LEDewg=0x10;

LEDews=0x10;

}

}

if(KEY2==0) //按一下减1S

{

delay();

if(KEY2==0)

{

while(KEY2==0);

TR0=0;

time-=20;

if(time==0)time=20;

LEDewg=(time/20)%10;

LEDews=(time/20)/10;

LEDsng=0x10;

LEDsns=0x10;

}

}

if(KEY3==0) //启动

{

delay();

if(KEY3==0)

{

while(KEY2==0);

TR0=1;

Time_Count=0;

}

}

}

}

#include <reg51h>

#define uint unsigned int

#define uchar unsigned char

#define BLKN 2 //列锁存器数

sbit G = P1^7; //P17为显示允许控制信号端口

sbit RCLK = P2^0; //P20为输出锁存器时钟信号端

sbit SCLR = P2^1; //P21为移位寄存器清○端

void delay(uint); //延时函数

uchar data display[32]; //显示缓存

uchar code BMP[][32]={{16,0,16,0,37,248,36,64,120,64,8,64,16,64,32,64,124,64,0,64,0,64,12,64,112,64,3,252,0,0,0,0},

{16,0,19,240,32,16,41,240,120,16,19,252,32,64,122,72,1,80,0,224,25,80,102,76,0,64,1,192,0,0,0,0},

{4,64,4,64,63,248,4,64,127,252,1,0,31,240,17,16,31,240,17,16,31,240,8,32,16,16,32,8,0,0,0,0}}; //字模表'红‘’绿‘‘黄’

void main()

{

register uchar i,j;

SCON=0x00; //串口工作模式0:移位寄存器方式

TMOD=0x01; //定时器T0工作方式1:16位方式

P1=0x3f; //P1端口初值:允许接收、锁存、显示

TR0=1; //启动定时器T0

ET0=1; //允许定时器T0中断

EA=1; //开启总中断;

while(1)

{

delay(2000);

for(j=0;j<3;j++)

{

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

{

display[i]=~BMP[j][i];

if (i%2) delay(100);

}

delay(10000);

}

}

}

void delay(uint x)

{

register uchar i,j;

for (i=x;i>0;i--)

for (j=120;j>0;j--);

}

void leddisplay(void) interrupt 1 using 1

{

register uchar i, j=BLKN;

TH0 =(65536-100)/256; //设定显示屏刷新率每秒60帧

TL0 =(65536-100)%256;

i = P1; //读取当前显示的行号

i = ++i & 0x0f; //行号加1,屏蔽高4位

while(j)

{

j--;

SBUF = display[iBLKN + j]; //送显示数据

while (!TI);

TI = 0;

} //完成一行数据的发送

G = 1; //消隐(关闭显示)

P1 &= 0xf0; //行号端口清○

RCLK = 1; //显示数据打入输出锁存器

P1 |= i; //写入行号

RCLK = 0; //锁存显示数据

G = 0; //打开显示

}

// 51单片机控制交通灯要求用汇编语言,仿真实例,可以参考一下

SNF   EQU  00H             ; 南北通行标志位

EWF   EQU  01H            ; 东西通行标志位

URF   EQU  02H             ; 紧急事件标志位

ORG   0000H

LJMP  MAIN                 ; 上电转主程序

ORG   000BH                ; 定时中断入口

LJMP  DSZD                  

ORG   0003H                ; 紧急中断入口

LJMP  URZD

ORG   0030H

MAIN: LCALL INIT           ; 调用初始化子程序

LOOP: LCALL DIS            ; 循环执行显示子程序

AJMP  LOOP

;   初始化程序

INIT: SETB   SNF            

SETB   EWF        

SETB   URF        

MOV   R2,#20              ; 定时器中断20次为1s

MOV   TMOD,#01H      ; 初始化定时器

MOV   TL0,#0B0H

MOV   TH0,#3CH

SETB  EA                      ; 开定时中断与紧急中断

SETB  ET0

SETB  TR0

SETB  EX0

SETB  IT0                    ; 设置中断程控方式

MOV   DPTR,#TAB      ; 数值首地址放入DPTR中

MOV   40H,#40           ; 东南西北通行时间设置

MOV   41H,#40

MOV   30H,#40           ; 通行时间初始化

MOV   31H,#60

MOV   P0,#4CH        ; 初始化时南北通行并把交通灯状态分别放在32H和33H中

MOV   32H,#4CH

MOV   P2,#15H

MOV   33H,#15H

RET

;   显示子程序

DIS:  MOV   P3,#0DFH       ; 选中南北方向的十位数码管

MOV   A,30H               ; 把显示数据送人数码管显示

MOV   B,#10

DIV   AB

MOVC  A,@A+DPTR

MOV   P1,A                 ;

LCALL D1MS

MOV   P3,#0EFH         ; 选中南北方向的个位数码管

MOV   A,B                  ; 送入数码管显示

MOVC  A,@A+DPTR    

MOV   P1,A

LCALL D1MS

MOV   P3,#7FH        ; 选中第东西方向的十位数码管

MOV   A,31H            ; 送入数码管显示

MOV   B,#10

DIV   AB

MOVC  A,@A+DPTR

MOV   P1,A

LCALL D1MS

MOV   P3,#0BFH       ; 选中第东西方向的个位数码管

MOV   A,B

MOVC  A,@A+DPTR

MOV   P1,A

LCALL D1MS

SETB  P30

SETB  P31

JNB   P30,DIS_S     ; 查询是否第一个按键按下

JNB   P31,DIS_E     ; 查询是否第二个按键按下

AJMP  DIS_R          ; 没有键按下则返回

DIS_S:LCALL D5MS           ; 按键去抖

JNB   P30,DIS_SN

AJMP  DIS_R

DIS_SN:MOV   40H,#50       ; 对通行时间从新分配,南北通行时间加长

MOV   41H,#30

AJMP  DIS_R

DIS_E:LCALL D5MS              ; 按键去抖

JNB   P31,DIS_EW

AJMP  DIS_R

DIS_EW:MOV   40H,#30       ; 东西通行时间加长

MOV   41H,#50

DIS_R:RET                

;   定时中断处理程序

DS_C: LJMP  DS_R            ; 接力跳转

DSZD: PUSH  ACC            ; 保护现场

PUSH  PSW

CLR   TR0                   ; 关定时器及中断标志位并重新赋值

CLR   TF0

MOV   TL0,#0B0H

MOV   TH0,#3CH

DJNZ  R2,DS_C           ; 判断1m时间是否到达

MOV   R2,#20            ; 到达重新赋值

DEC   30H                  ; 南北方向通行时间减一

MOV   A,30H             ; 把减一后的时间送入显示存储单元

;   南北通行到达最后4秒时黄灯闪烁

DS_10:CJNE  A,#4,DS_11     ; 如果通行时间剩余4秒

JNB   SNF,DS_11           ; 判断是否是南北通行

MOV   P0,#8AH      

MOV   32H, #8AH         ; 把交通灯状态存入存储单元(后面类似)

DS_11:CJNE  A,#3,DS_12      ; 不是剩余3秒,返回

JNB   SNF,DS_12            ; 不是南北通行时间,返回

MOV   P0,#88H

MOV   32H, #88H

DS_12:CJNE  A,#2,DS_13

JNB   SNF,DS_13

MOV   P0,#8AH

MOV   32H, #8AH

DS_13:CJNE  A,#1,DS_14

JNB   SNF,DS_14

MOV   P0,#88H

MOV   32H, #88H

;

DS_14:JNZ   DS_NE          ; 通行时间没有结束转向改变东西方向的数码管

CPL   SNF                  ; 如果通行时间结束则对标志位取反

JNB   SNF,DS_1          ; 判断是否南北通行

MOV   30H,40H          ; 是,点亮相应的交通灯

MOV   P0,#4CH

MOV   32H,#4CH       ; 存储交通灯状态

MOV   P2,#15H

MOV   33H, #15H      ; 存储交通灯状态

DS_NE:DEC   31H             ; 东西方向通行时间减一

MOV   A,31H             ; 把通行剩余时间送入显示存储单元

;   东西方向通行时间剩余4秒钟黄灯闪烁(程序注释与南北方向类似 略)

DS_20:CJNE  A,#4,DS_21  

JB    EWF,DS_21

MOV   P0,#51H

MOV   32H, #51H

DS_21:CJNE  A,#3,DS_22

JB    EWF,DS_22

MOV   P0,#41H

MOV   32H, #41H

DS_22:CJNE  A,#2,DS_23

JB    EWF,DS_23

MOV   P0,#51H

MOV   32H, #51H

DS_23:CJNE  A,#1,DS_24

JB    EWF,DS_24

MOV   P0,#41H

MOV   32H, #41H

;

DS_24:JNZ   DS_R             ; 东西方向时间没有结束,返回

CPL   EWF                  ; 对通行状态取反

JNB   EWF,DS_2         ; 东西方向通行时间到来,跳转

MOV   31H,#80          ; 东西方向通行结束,重新显示时间

MOV   P0,#89H          ; 点亮相应的交通灯

MOV   32H, #89H

MOV   P2,#29H

MOV   33H, #29H

AJMP  DS_R  

DS_1: MOV   30H,#80          ; 南北通行时间结束,重新对显示存储单元赋值  

MOV   P0,#89H             ; 执行转弯状态1

MOV   32H, #89H

MOV   P2,#26H

MOV   33H, #26H

AJMP  DS_NE          

DS_2: MOV   31H,41H         ; 东西方向开始通行,赋值予显示存储单元

MOV   P0,#61H            ; 点亮相应的交通灯

MOV   32H, #61H

MOV   P2,#15H

MOV   33H, #15H

DS_R: SETB  TR0

POP   PSW                  ; 恢复现场

POP   ACC

RETI

;   紧急中断处理程序

URZD: PUSH  ACC             ; 保护现场

PUSH  PSW

CLR   IE0                     ; 清除中断标志位

CLR   TR0                    ; 关定时器

CPL   URF                   ; 紧急事件标志位

JB    URF,UR_CON       ; 紧急结束;跳转

MOV   P0,#49H           ; 各路口灯全显示红灯亮

MOV   P2,#15H

AJMP  UR_R

UR_CON:SETB  TR0            ; 恢复正常交通

MOV   A,32H

MOV   P0,A

MOV   A,33H

MOV   P2,A

UR_R: POP   PSW             ; 恢复现场

POP   ACC

RETI    

;   查表指令0,1,2,3,4,5,6,7,8,9

TAB:  DB  3FH,  06H,  5BH,  4FH,  66H,  6DH

DB  7DH,  07H,  7FH,  6FH

;   延时5ms与1ms

D5MS:  MOV    R7,#5

D1MS:  MOV    R7,#10

MOV    R6,#50

L1:    DJNZ   R6,$

DJNZ   R7,L1

RET

END

//12M晶振

//共阴数码管

#include <reg51h>

sbit red=P1^0;

sbit green=P1^1;

sbit yellow=P1^2;

bit flag=1;

unsigned char code duan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

unsigned char code wei[ ]={0xfd,0xfe};

unsigned char time=35;

void main()

{

  void show_time();

  void show_light();

  EA=1;

  ET0=1;

  TMOD=0x01;

  TH0=(65536-50000)/256;

  TL0=(65536-50000)%256;

  TR0=1;

  red=0;

  while(1)

  {

      show_time();

      show_light();

  }

}

void show_time()

{

  void delay();

  unsigned char num=time,i;

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

  {

      P2=wei[i];

      P0=duan[num%10];

      delay();

      P0=0x00;

      num/=10;

  }

}

void delay()

{

  int i;

  for(i=1000;i;i--);

}

void show_light()

{

  if(flag)

  {

      if(!time)

      {

          flag=0;

          red=1;

          green=0;

          time=35;

      }

  }

  else

  {

      if(time>0&&time<4)

      {

          green=1;

          yellow=0;

      }       

      if(!time)

      {

          yellow=1;

          red=0;

          flag=1;

          time=35;

      }

  }

}

void dec_sec() interrupt 1

{

  static count=0;

  TH0=(65536-50000)/256;

  TL0=(65536-50000)%256;

  if(++count==20)

  {

      count=0;

      time--;

  }

}

#include <reg51h>

#include <stdioh>

#define uchar     unsigned char

#define uint      unsigned int

uchar h;

uint r=0;

uint s;

uchar code  dis[]={ 0Xc0,0Xf9, 0Xa4,0Xb0,0X99,0X92,0X82,0Xf8,0X80,0X90,0Xff,};

/0//1//2//3//4//5//6//7//8//9//NULL/

void delay(uint c)

{

uint i,j;

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

for(j=0;j<100;j++);

}

void t0(void) interrupt 0 using 1   //interrupt 1

{

delay(2);

if(INT0==0)

{

r++;

if(r==2)

{

r=0;

}

r%=2;

if(r==0)

{

P0=0xeb;

P1=0x00;

P2=0xff;

}while(1)

{

if(INT0==0|INT1==0|T0==0)

{

delay(2);

if(INT0==0|INT1==0|T0==0)

break;

}

};

}

}

void t1(void) interrupt 2 using 1   //interrupt 2

{

delay(2);

if(INT1==0)

{

r++;

if(r==2)

{

r=0;

}

r%=2;

if(r==0)

{

P0=0xdd;

P1=0x00;

P2=0xff;

}while(1)

{

if(INT1==0|INT0==0|T0==0)

{

delay(2);

if(INT1==0|INT0==0|T0==0)

break;

}

};

}

}

void t2(void) interrupt 1 using 1   //interrupt 3

{

TH0=0xff;

TL0=0xff;

delay(2);

if(T0==0)

{

P0=0xdb;

P1=0x00;

P2=0xff;

}while(1)

{

if(INT0==0|INT1==0)

{

delay(2);

if(INT0==0|INT1==0)

break;

}

};

}

void main(void)

{

TMOD=0x06;

TH0=0xff;

TL0=0xff;

TR0=1;

EA=1;

EX0=1;

EX1=1;

ET0=1;

while(1)

{

P0=0xeb;

for(h=28;h>0;h--)

{

for(s=248;s>0;s--)

{

P1=0x00;

P2=0xff;

P1=0x01;

P2=dis[h/10];

delay(1);

P1=0x00;

P2=0xff;

P1=0x02;

P2=dis[h%10];

delay(1);

P1=0x00;

P2=0xff;

P1=0x04;

P2=dis[(h+2)/10];

delay(1);

P1=0x00;

P2=0xff;

P1=0x08;

P2=dis[(h+2)%10];

delay(1);

}

}

delay(248);

P0=0xf3;

for(h=3;h>0;h--)

{

delay(392);

P0=0xf3;

delay(1);

P1=0x00;

P2=0xff;

P1=0xaa;

P2=dis[(h-1)%10];

delay(600);

P0=0xfb;

}

delay(248);

P0=0xdd;

for(h=38;h>0;h--)

{

for(s=248;s>0;s--)

{

P1=0x00;

P2=0xff;

P1=0x01;

P2=dis[(h+2)/10];

delay(1);

P1=0x00;

P2=0xff;

P1=0x02;

P2=dis[(h+2)%10];

delay(1);

P1=0x00;

P2=0xff;

P1=0x04;

P2=dis[h/10];

delay(1);

P1=0x00;

P2=0xff;

P1=0x08;

P2=dis[h%10];

delay(1);

}

}

delay(248);

P0=0xde;

for(h=3;h>0;h--)

{

delay(392);

P0=0xde;

delay(1);

P1=0x00;

P2=0xff;

P1=0xaa;

P2=dis[(h-1)%10];

delay(600);

P0=0xdf;

}

delay(248);

}

}

以上就是关于跪求一交通灯控制系统C程序全部的内容,包括:跪求一交通灯控制系统C程序、用51单片机编写城市道路交通灯c语言程序,有左转右转、单片机C语言红绿灯程序,要求:数码管显示时间倒计时、16*16LED点阵显示模块显示红绿黄灯、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址:https://54852.com/zz/9308640.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存