标题:
单片机智能交通灯矩阵按键共阴数码管仿真程序
[打印本页]
作者:
梦不虚存
时间:
2022-12-30 20:37
标题:
单片机智能交通灯矩阵按键共阴数码管仿真程序
智能交通灯,显示时间可以通过矩阵开关输入调节
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
1.png
(54.96 KB, 下载次数: 25)
下载附件
2022-12-30 21:35 上传
单片机源程序如下:
#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
sbit dula=P2^5;
sbit w1=P2^0;
sbit w2=P2^1;
sbit k1=P2^2;
sbit k2=P2^3;
sbit k3=P2^4;
sbit red1=P1^0;
sbit yellow1=P1^1;
sbit green1=P1^2;
sbit red2=P1^3;
sbit yellow2=P1^4;
sbit green2=P1^5;
uchar N=23; //定义时间为20s,可自由更改为0-99;
uchar miao;
bit flag=0;
bit flag1=0;
unsigned int pp;
uchar j,k;
uchar a=0,b=0;
uchar nn=0;
uchar q=0;
unsigned char keyvalue=0,m=0;
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
void delay(unsigned char i)
{
for(j=i;j>0;j--)
for(k=125;k>0;k--);
}
void display(uchar n)
{
uchar c,d;
c=n/10;
d=n%10;
P0=0x00;
dula=0;
P0=table[c];
dula=1;
w1=0,w2=1;
delay(5);
P0=0x00;
dula=0;
P0=table[d];
dula=1;
w2=0,w1=1;
delay(5);
}
void scankeys()
{
if(k1==0) //
{
delay(5);
if(k1==0)
{
TR0=1;
pp=0;
miao=N;
}
while(!k1);
}
if(k2==0) //
{
delay(5);
if(k2==0)
{
TR0=0;
pp=0;
miao=N;
}
while(!k2);
}
if(k3==0) //
{
delay(5);
if(k3==0)
{
flag1=!flag1;
}
while(!k3);
if(flag1==0)
{
TR0=1;
pp=0;
miao=N;
}
if(flag1==1)
{
a=b=N=0;
}
}
}
void KeyScan() //带返回值的子函数
{
P3 = 0xf0;
if( P3 != 0xf0)//判断是否有按键按下
{
delay(5);//软件消抖
if( P3!= 0xf0)//判断是否有按键按下
{ switch(P3)
{ case 0xe0:keyvalue=0,flag=1;break;
case 0xd0:keyvalue=1,flag=1;break;
case 0xb0:keyvalue=2,flag=1;break;
case 0x70:keyvalue=3,flag=1;break;
}
P3=0x0f;
switch(P3)
{ case 0x0e:keyvalue=keyvalue+0,flag=1;break;
case 0x0d:keyvalue=keyvalue+4,flag=1;break;
case 0x0b:keyvalue=keyvalue+8,flag=1;break;
case 0x07:keyvalue=keyvalue+12,flag=1;break;
}
while(P3!=0x0f);
q++;
}
}
}
void change() //按键解码
{
switch(keyvalue)
{
case 0:m=1;break;
case 1:m=2;break;
case 2:m=3;break;
case 4:m=4;break;
case 5:m=5;break;
case 6:m=6;break;
case 8:m=7;break;
case 9:m=8;break;
case 10:m=9;break;
case 13:m=0;break;
}
}
void main()
{
TMOD=0x01;
TH0=(65536-46080)/256;// 由于晶振为11.0592,故所记次数应为46080,计时器每隔50000微秒发起一次中断。
TL0=(65536-46080)%256;//46080的来历,为50000*11.0592/12
ET0=1; // 开定时器0中断
TR0=0;
EA=1;
miao=N;
while(1)
{
if(flag1==0)
{
if(miao>3)
{
if(flag==0)
{
red1=1,yellow1=1,green1=0;
red2=0,yellow2=1,green2=1;
}
if(flag==1)
{
red1=0,yellow1=1,green1=1;
red2=1,yellow2=1,green2=0;
}
}
else {
if(flag==0)
{
if(pp==10)
yellow1=0,green1=1;
}
if(flag==1)
{
if(pp==10)
yellow2=0,green2=1;
}
}
display(miao);
}
else
{
red1=1,yellow1=1,green1=1;
red2=1,yellow2=1,green2=1;
KeyScan();
change();
if(q==1)
a=m;
if(q==2)
b=m,q=0;
N=a*10+b;
display(N);
}
scankeys();
}
}
void time0() interrupt 1
{ TH0=(65536-46080)/256;// 由于晶振为11.0592,故所记次数应为46080,计时器每隔50000微秒发起一次中断。
TL0=(65536-46080)%256;//46080的来历,为50000*11.0592/12
pp++;
if(pp==20)
{
pp=0;
if(miao>0)
miao--;
else
{
miao=N;
flag=!flag;
}
}
}
复制代码
Keil代码与Proteus仿真下载:
交通灯矩阵按键共阴数码管.zip
(107.86 KB, 下载次数: 24)
2022-12-30 20:37 上传
点击文件名下载附件
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1