標(biāo)題:
單片機(jī)智能交通燈矩陣按鍵共陰數(shù)碼管仿真程序
[打印本頁]
作者:
夢不虛存
時間:
2022-12-30 20:37
標(biāo)題:
單片機(jī)智能交通燈矩陣按鍵共陰數(shù)碼管仿真程序
智能交通燈,顯示時間可以通過矩陣開關(guān)輸入調(diào)節(jié)
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
1.png
(54.96 KB, 下載次數(shù): 25)
下載附件
2022-12-30 21:35 上傳
單片機(jī)源程序如下:
#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() //帶返回值的子函數(shù)
{
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,故所記次數(shù)應(yīng)為46080,計時器每隔50000微秒發(fā)起一次中斷。
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,故所記次數(shù)應(yīng)為46080,計時器每隔50000微秒發(fā)起一次中斷。
TL0=(65536-46080)%256;//46080的來歷,為50000*11.0592/12
pp++;
if(pp==20)
{
pp=0;
if(miao>0)
miao--;
else
{
miao=N;
flag=!flag;
}
}
}
復(fù)制代碼
Keil代碼與Proteus仿真下載:
交通燈矩陣按鍵共陰數(shù)碼管.zip
(107.86 KB, 下載次數(shù): 24)
2022-12-30 20:37 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1