51单片机用矩形键盘控制交通信号灯和数码管显示?
2025-09-24 来源:bilibili
仿真视频

电路图

C语言程序
#include <reg51.h>
#define uint unsigned int
#define uchar unsigned char
//共阳数码管编码表
uchar code table[10] ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//函数声明
void delay(uint time); //延时函数
void display(uchar w); //
uchar getKey(); //读取键盘的数值
void delay0_5s();
void delay5s();
//主程序
void main()
{
uchar keyValue;
TMOD=0x10;
while(1)
{
keyValue = getKey(); //读取键盘值
display(keyValue); //数码管显示&LED亮灭
}
}
void delay(uint time)
{
uint i,j;
for(i = 0; i<time; ++i)
for(j = 0; j<110; ++j);
}
void display(uchar w)
{
int l,h;
//按键1按下,复位
if (w==0)
{
P1=0X00;
P0=0xff;
P3=0xff;
}
//按键2按下,交通灯正常运行
if(w==1)
{
unsigned char k;
P1=0x09; //东西绿灯亮5秒&南北红灯亮
delay5s();
for(k=0;k<5;k++) //东西黄灯闪烁&南北红灯
{
P1=0x11; //东西黄灯亮&南北红灯亮
delay0_5s();
P1=0x01; //东西黄灯灭&南北红灯亮
delay0_5s();
}
P1=0x24; //东西红灯亮&南北绿灯亮5秒
delay5s();
for(k=0;k<5;k++) //东西红灯&南北黄灯闪烁
{
P1=0x22; //东西红灯&南北黄灯亮
delay0_5s();
P1=0x20; //东西红灯&南北黄灯灭
delay0_5s();
}
}
//按键3按下, 东西绿灯亮&南北红灯亮
if(w==2)
{
P1=0X09;
}
//按键4按下,东西红灯亮&南北绿灯亮
if(w==3)
{
P1=0x24;
}
// 按键5按下,数码管60s计时
if (w==4)
{
for (l=0;l<6;l++)
{
P0=table[l];
for(h=0;h<10;h++)
{
P3=table[h];
delay0_5s();
delay0_5s();
}
}
}
//按键6按下所有路口绿灯;
if(w==5)
{
P1=0X0C;
}
//按键7按下所有路口黄灯;
if(w==6)
{
P1=0X12;
}
//按键8按下所有路口黄灯;
if(w==7)
{
P1=0X21;
}
}
uchar getKey()
{
uchar x , y ;
uchar result;
// 计算行数X的值
P2 = 0x0f; // 从P2口输出,写P2口
if (P2 != 0x0f)// 从P2口输入,P2口
{
// 读出的不是0x0f说明有按键被按下
delay(20);
// 判断在哪一行
switch (P2)
{
case 0x0e: x = 0; break;
case 0x0d: x = 1; break;
case 0x0b: x = 2; break;
case 0x07: x = 3; break;
default: break;
}
delay(10);
// 计算列数y的值
P2 = 0xf0;
if (P2 != 0xf0)
{
delay(20);
switch (P2)
{
case 0xe0:y = 0; break;
case 0xd0: y = 1;break;
case 0xb0: y = 2; break;
case 0x70: y = 3; break;
default: break;
}
// 计算出结果,确定哪个按键按下
}
}
result = x * 4 + y;
return result;
}
void delay0_5s() //0.5秒延时
{
unsigned char i;
for(i=0;i<10;i++)
{
TH1=0X3C;
TL1=0xb0;
TR1=1;
while(!TF1);
TF1=0;
}
}
void delay5s() //5秒延时
{
unsigned char i;
for(i=0;i<50;i++)
{
TH1=0X3C;
TL1=0xb0;
TR1=1;
while(!TF1);
TF1=0;
}
}
cut-off
#include <reg51.h>#define uint unsigned int #define uchar unsigned char//共阳数码管编码表uchar code table[10] ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //函数声明void delay(uint time); //延时函数void display(uchar w); //uchar getKey(); //读取键盘的数值void delay0_5s();void delay5s();//主程序void main(){
uchar keyValue;
TMOD=0x10;
while(1)
{
keyValue = getKey(); //读取键盘值
display(keyValue); //数码管显示&LED亮灭
}}void delay(uint time){
uint i,j;
for(i = 0; i<time; ++i)
for(j = 0; j<110; ++j);}void display(uchar w){
int l,h;//按键1按下,复位
if (w==0)
{
P1=0X00;
P0=0xff;
P3=0xff;
}//按键2按下,交通灯正常运行
if(w==1)
{
unsigned char k;
P1=0x09; //东西绿灯亮5秒&南北红灯亮
delay5s();
for(k=0;k<5;k++) //东西黄灯闪烁&南北红灯
{
P1=0x11; //东西黄灯亮&南北红灯亮
delay0_5s();
P1=0x01; //东西黄灯灭&南北红灯亮
delay0_5s();
}
P1=0x24; //东西红灯亮&南北绿灯亮5秒
delay5s();
for(k=0;k<5;k++) //东西红灯&南北黄灯闪烁
{
P1=0x22; //东西红灯&南北黄灯亮
delay0_5s();
P1=0x20; //东西红灯&南北黄灯灭
delay0_5s();
}
}//按键3按下, 东西绿灯亮&南北红灯亮
if(w==2)
{
P1=0X09;
}//按键4按下,东西红灯亮&南北绿灯亮
if(w==3)
{
P1=0x24;
}
// 按键5按下,数码管60s计时
if (w==4)
{
for (l=0;l<6;l++)
{
P0=table[l];
for(h=0;h<10;h++)
{
P3=table[h];
delay0_5s();
delay0_5s();
}
}
}//按键6按下所有路口绿灯;
if(w==5)
{
P1=0X0C;
}//按键7按下所有路口黄灯;
if(w==6)
{
P1=0X12;
}//按键8按下所有路口黄灯;
if(w==7)
{
P1=0X21;
}} uchar getKey(){
uchar x , y ;
uchar result;
// 计算行数X的值
P2 = 0x0f; // 从P2口输出,写P2口
if (P2 != 0x0f)// 从P2口输入,P2口
{
// 读出的不是0x0f说明有按键被按下
delay(20);
// 判断在哪一行
switch (P2)
{
case 0x0e: x = 0; break;
case 0x0d: x = 1; break;
case 0x0b: x = 2; break;
case 0x07: x = 3; break;
default: break;
}
delay(10);
// 计算列数y的值
P2 = 0xf0;
if (P2 != 0xf0)
{
delay(20);
switch (P2)
{
case 0xe0:y = 0; break;
case 0xd0: y = 1;break;
case 0xb0: y = 2; break;
case 0x70: y = 3; break;
default: break;
}
// 计算出结果,确定哪个按键按下
}
}
result = x * 4 + y;
return result;}
void delay0_5s() //0.5秒延时
{
unsigned char i;
for(i=0;i<10;i++)
{
TH1=0X3C;
TL1=0xb0;
TR1=1;
while(!TF1);
TF1=0;
}
}
void delay5s() //5秒延时
{
unsigned char i;
for(i=0;i<50;i++)
{
TH1=0X3C;
TL1=0xb0;
TR1=1;
while(!TF1);
TF1=0;
}
}
- 六大全新产品系列推出,MCX A微控制器家族迎来创新
- 意法半导体全新STM32C5系列,重新定义入门级微控制器性能与价值,赋能万千智能设备
- 从控制到系统:TI利用边缘AI重塑嵌入式MCU的边界
- 模组复用与整机重测在SRRC、CCC、CTA/NAL认证中的实践操作指南
- 有源晶振与无源晶振的六大区别详解
- 英飞凌持续巩固全球微控制器市场领导地位
- 使用 Keil Studio for Visual Studio Code开发 STM32 设备
- LoRa、LoRaWAN、NB-IoT与4G DTU技术对比及工业无线方案选型分析
- 意法半导体中国本地造STM32微控制器启动规模量产
- 蓝牙信道探测技术原理与开发套件实践




