51单片机开发入门与典型实例
源代码在线查看: jt 21-4.c
/* 文件名:JT 21-4.c */
/* 程序功能:交通信号灯控制(改进)*/
#include /* 头文件 */
char count; /* 声明count为字符变量 */
bit flag; /* 声明flag为位变量 */
char sum =0; /* 声明sum为字符变量并赋初始值0 */
xhd( ); /* 信号灯函数xhd( ) */
/* ―――――――― 主函数(主程序) ―――――――――――*/
main( ) /* 主函数 */
{
TMOD=0x01; /* 设定T0为模式1 */
TH0=-(50000/256); /* 设定时器初始值50000 */
TL0=-(50000%256);
EA=1; /* 总允许中断 */
ET0=1; /* 允许定时器T0中断 */
TR0=1; /* 启动定时器工作 */
EX0=1; /* 允许外部中断0中断 */
PX0=1; /* 外部中断0为高优先级 */
P1=0xff; /* P1初始值,关闭所有信号灯 */
xhd( ); /* 调用信号灯函数 */
}
/* ――――――― 中断函数(中断服务程序) ―――――――― */
T0_srv( ) interrupt 1 using 1 /* 中断服务程序 */
{
TH0=-(50000/256); /* 重装定时器初始值 */
TL0=-(50000%256);
count++; /* count加1 */
if(count==20) /* 判断count是否等于20 */
{
count=0; /* count清0,以便从新计数 */
flag=1; /* 标志位为1 */
}
}
/* ―――――――― 信号灯函数(子程序) ―――――――― */
xhd( ) /* 信号灯函数 */
{
while(1) /* 无限循环 */
{
/* ―――――――――――――*/
P1_3=0; P1_2=0; /*东西红灯亮,南北绿灯亮 */
while( sum {
while( ! flag ); /* 等待1秒 */
flag=0; /* 标志位清0 */
sum++; /* sum加1 */
}
sum=0; /* sum清0,以便从新计数 */
/* ―――――――――――――*/
P1_2=1; P1_1=0; /* 南北绿灯灭,黄灯亮 */
while( sum {
while(! flag);
flag=0;
sum++;
}
sum=0;
/*―――――――――――――*/
P1_1=1; P1_0=0; /* 南北黄灯灭,红灯亮 */
P1_3=1; P1_5=0; /* 东西红灯灭,绿灯亮 */
while( sum {
while(! flag);
flag=0;
sum++;
}
sum=0;
/* ―――――――――――――*/
P1_5=1; P1_4=0; /*东西绿灯灭,黄灯亮 */
while( sum {
while(! flag);
flag=0;
sum++;
}
sum=0;
/* ――――――――――――― */
P1_4=1; P1_0=1; /* 东西黄灯灭,南北红灯灭 */
}
}
/* ―――――― 外部中断函数(外部中断服务程序)――――― */
int0_srv( ) interrupt 0 using 2
{
char a;
unsigned int i;
for (i=0;i if ( INT0==0)
{
a=P1; /* 保留P1状态*/
P1=0xff;
P1=0xf6; /* 使两边亮起红灯 */
while (INT0==0); /* 等待开关断开*/
P1=a; /* 恢复P1状态*/
}
}