
//晶振: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点阵显示模块显示红绿黄灯、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)