📄 ex7_6.c
字号:
//程序:ex7_6.c
//功能:交通灯远程控制程序单片机程序,晶振为11.059MHz
#include<reg51.h>
#define uchar unsigned char
void delay0_5s(); //0.5秒延时程序,参见任务9程序ex4_3.c
void delay_t(unsigned char t); //0.5秒~128秒延时, 参见任务9程序ex4_3.c
void main() //主函数
{
TMOD=0x21; //设置定时器0方式1(延时0.5秒函数),定时器1方式2
TH1=0xf4;
TL1=0xf4; //设置串行口波特率为2400bit/s,
TR0=1;
TR1=1; //启动定时器
SCON=0x50; //串行口方式1、允许接收
PCON=0x00;
EA=1; //开总中断允许位
ES=1; //开串行口中断
while(1)
{
P1=0xf3; //A道绿灯,B道红灯
delay_t (10); //延时5秒
for(k=0;k<3;k++) //A道绿灯闪烁,B道红灯
{
P1=0xfb;
delay0_5s(); //延时0.5s
P1=0xf3;
delay0_5s(); //延时0.5s
}
P1=0xeb; //A道黄灯,B道红灯
delay_t(4); //延时2s
P1=0xde; //A道红灯,B道绿灯
delay_t(10); //延时0.5s
for(k=0;k<3;k++) //A道红灯,B道绿灯闪烁
{
P1=0xdf;
delay0_5s(); //延时0.5s
P1=0xde;
delay0_5s(); //延时0.5s
}
P1=0xdd; //A道红灯,B道黄灯
delay_t(4); //延时2s
}
}
//函数名:serial
//功能:串行口中断函数,接收主机命令,控制交通灯显示状态
//形式参数:无
//返回值:无
void serial()interrupt 4 //串行口中断类型号是4
{
unsigned char i;
EA=0; //关中断
if(RI==1) //接收到数据
{
RI=0; //软件清除中断标志位
if(SBUF==0x01) //判断是否01H亮灯命令
{
SBUF=0x01; //将收到的01H命令回发给主机
while(!TI); //查询发送
TI=0 ; //发送成功,由软件清TI
i=P1; //保护现场,保存P1口状态
P1=0xdb ; //P1口控制的两路红灯全亮
while(SBUF!=0x02) // 判断是否02H命令
{
while(!RI) ; //等待接收下一个命令
RI=0; //软件清除中断标志位
}
SBUF=0x02; //将收到的02H命令回发给主机
while(!TI); //查询发送
TI=0 ; //发送成功,由软件清TI
P1=i; //恢复现场,送回P1口原来状态
EA=1; //开中断
}
else
{
EA=1;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -