標(biāo)題:
單片機(jī)可控跑馬燈Proteus仿真程序
[打印本頁(yè)]
作者:
123lhz
時(shí)間:
2020-3-8 00:02
標(biāo)題:
單片機(jī)可控跑馬燈Proteus仿真程序
可控跑馬燈仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.png
(18.72 KB, 下載次數(shù): 48)
下載附件
2020-3-8 13:28 上傳
單片機(jī)源程序如下:
#include<regx51.h> //加入頭文件
#define uchar unsigned char //宏定義用uchar來(lái)代替unsigned char
#define uint unsigned int //宏定義用uint來(lái)代替unsined int
uint code unm[]={0,1,3,5,7,9,15,60,100,200,300,400,500,600,700,800,900,1000,1100,1200,1300,1400,1500};
//用于調(diào)速的數(shù)組
uchar unm1[]={0xff,0xef,0xc7,0xab,0xef,0xef,0xef,0xff};
//用于顯示箭頭的數(shù)組
uchar m,n,j,y; //定義全局變量
uint l,g;
//==========延時(shí)子程序============
void delay(uint i)
{
uchar j; //定義局部變量
while(i--) //循環(huán)執(zhí)行空指令用于延時(shí)
for(j=0;j<120;j++);
}
//===========定時(shí)器初始化子程序===================
void init()
{
TMOD = 0x11; //設(shè)置定時(shí)器0、1都工作在方式1
TH0 = 0x00; //設(shè)置定時(shí)器0初值
TL0 = 0x00;
TH1 = 0xaa; //設(shè)置定時(shí)器1初值
TL1 = 0xbb;
EA = 1; //打開(kāi)總中斷
ET0 = 1; //打開(kāi)定時(shí)器0中斷
ET1 = 1; //打開(kāi)定時(shí)器1中斷
TR0 = 1; //啟動(dòng)定時(shí)器0
TR1 = 1; //啟動(dòng)定時(shí)器1
}
//=================================================
//函數(shù)名:ce_anjian ( )
//功能:檢測(cè)是否有按鍵按下,并返回是否有按鍵按下
//輸出參數(shù):key
//說(shuō)明:有按鍵按下,key=1;無(wú)鍵按下,key=0;
//=================================================
bit ce_anjian ( )
{
bit key=0; //定義局部變量
P1=0xf3; //輸出掃描信號(hào),將行置高電平,將列置低電平
if(P1!=0xf3) //讀入P1口數(shù)據(jù),與掃描信號(hào)比較判斷是否有鍵按下
key=1; //如果有鍵按下,key賦值為1
else
key=0; //如果沒(méi)有鍵按下,key賦值為0
return(key); //返回key值
}
//=================================================
//函數(shù)名:ce_jianzhi ( )
//功能:測(cè)按鍵值并去除按鍵按下和按鍵松開(kāi)時(shí)的抖動(dòng)
//調(diào)用函數(shù):doudong_ys();ce_anjian();
//說(shuō)明:鍵值y=i*2+j+1;
//=================================================
void ce_jianzhi ( )
{
uchar i,j,p; //定義局部變量
do
{
while(ce_anjian()==0); //是否有按鍵按下?若按鍵沒(méi)有按下,原地等待
//若按鍵按下,則返回值為1,則繼續(xù)往下執(zhí)行
delay(50); //調(diào)用去抖延時(shí)子程序
}while(ce_anjian()==0); //再次判斷是否有鍵按下?若沒(méi)有按下,返回0
for(i=0;i<2;i++)
{
P1=(0xfe<<i)|i; //循環(huán)掃描輸出行掃描信號(hào)
for(j=0;j<2;j++)
{
p=P1&0x0c; //讀取并保留鍵盤(pán)的列數(shù)據(jù),其余清0
if(p==0x08>>j) //是否有1或2列按鍵按下?
{
y=i*2+j+1; //計(jì)算鍵值
goto D1; //跳出循環(huán),使程序跳轉(zhuǎn)至D1
}
}
}
D1: delay(50); //調(diào)用去抖延時(shí)子程序
do
{
while(ce_anjian()==1); //判斷按鍵是否釋放,若按鍵沒(méi)有釋放,繼續(xù)判斷
//若按鍵有釋放,返回值為0,則繼續(xù)往下執(zhí)行
delay(50); //調(diào)用去抖延時(shí)子程序
}while(ce_anjian()==1); //再次判斷是否釋放,若按鍵沒(méi)有釋放,繼續(xù)判斷
}
//=======蜂鳴器鳴叫子程序==========
void mingjiao()
{
uchar t; //定義局部變量
for(t=0;t<50;t++)
{
P1_7=0;
}
P1_7=1; //停止鳴叫
}
//============主程序===============
void main()
{
init(); //調(diào)用定時(shí)器初始化子程序
n=5; //單片機(jī)一上電,速度設(shè)置在第5擋
while(1) //主程序無(wú)限循環(huán)執(zhí)行
{
l=unm[n]; //設(shè)置定時(shí)器的設(shè)定值
if(ce_anjian()==1) //快速判斷是否有按鍵按下
{
ce_jianzhi(); //若有按鍵按下,則側(cè)鍵值
switch(y)
{
case 1: {m=1;j=0x7f;mingjiao();}break; //鍵值為1,則P2口賦值0xfe,點(diǎn)亮P2.0LED
case 2: {m=2;j=0xfe;mingjiao();}break; //鍵值為2,則P2口賦值0xfd,點(diǎn)亮P2.1LED
case 3: {n=n+1;if(n==24)n=23;mingjiao();}break;//鍵值為3,則P2口賦值0xfb,點(diǎn)亮P2.2LED
case 4: {n=n-1;if(n==0)n=1;mingjiao();}break; //鍵值為4,則P2口賦值0xf7,點(diǎn)亮P2.3LED
default: break;
}
}
}
}
//=========定時(shí)器1中斷子程序=======
void t_1()interrupt 3
{
uchar a,k; //定義局部變量
TH1 = 0xaa; //設(shè)置定時(shí)器初值
TL1 = 0xbb;
switch(m) //判斷模式
{
case 1: //模式1
{
a=0x01; //顯示左移箭頭
for(k=0;k<8;k++)
{
P2=a;
P3=unm1[k];
delay(2);
a=a<<1;
if(a==0)a=0x01;
P0=j;
}
}break;
case 2: //模式2
{
a=0x80; //顯示右移箭頭
for(k=0;k<8;k++)
{
P2=a;
P3=unm1[k];
delay(2);
a=a>>1;
if(a==0)a=0x80;
P0=j; //跑馬燈右移
}
}
}
}
//=======定時(shí)器0中斷子程序=========
void t_0()interrupt 1
{
uchar b1,b2,b3,b4,b5,b6,b7,b8; //定義局部變量
if(++g<l) return; //如果g+1小于設(shè)定值l那么跳出中斷
g=0; //如果g+1大于設(shè)定值l則g清零
switch(m)
{
case 1:{ j=(j>>1)|0x80;
if(j==0xff)j=0x7f;}break;
case 2:{ j=(j<<1)|0x01;
if(j==0xff)j=0xfe;}break;
}
b1=unm1[0]; //箭頭移動(dòng)
b2=unm1[1];
b3=unm1[2];
b4=unm1[3];
b5=unm1[4];
b6=unm1[5];
b7=unm1[6];
b8=unm1[7];
unm1[0]=b2;
unm1[1]=b3;
unm1[2]=b4;
unm1[3]=b5;
unm1[4]=b6;
unm1[5]=b7;
unm1[6]=b8;
unm1[7]=b1;
}
復(fù)制代碼
所有資料51hei提供下載:
項(xiàng)目1.zip
(76.45 KB, 下載次數(shù): 25)
2020-3-8 00:01 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1