

學了LED指示燈的基本控制,或許我們可以給自己增加點難度,加上繼電器和蜂鳴器給上個設計稍微增加點難度,設計如下:
設計內容:
1.讓八只LED燈整體閃爍三次,間隔為1秒鐘;
2.LED燈從左到右逐漸點亮,間隔為0.5秒,等全部點亮后繼電器打開,一秒后關閉;
3.LED燈從左到右逐漸熄滅,間隔為0.5秒,等全部熄滅后蜂鳴器打開,一秒后關閉,
細心做題的朋友們或許已經發現,我們在做第一個小設計的時候并沒有打開繼電器,蜂鳴器這些外設啊,但為什么都開始作業了呢,這就是板子設計的問題了,我們想要讓他們上電后暫不作業需要先初始化他們,接下來咱們就寫一下如何初始化這塊板子,順便完成我們這次的設計,以后的話咱們也是每次設計都會用到這個初始化程式來初始話開發板,咱們先用最簡單直白的方式寫,然后再逐漸精煉代碼,這樣有助于我們了解原理并且找到適合自己的編程方法,也有助于我們形成自己的編程風格,


#include<stc15f2k60s2.h>
sbit HC138_A=P2^5;
sbit HC138_B=P2^6;
sbit HC138_C=P2^7;
void LED_Run();
void delayms(int ms);
void Allinit();
void main()
{
Allinit();
while(1)
{
LED_Run();
}
}
void LED_Run()
{
int i;
HC138_C=1;
HC138_B=0;
HC138_A=0;
for(i=0;i<3;i++)
{
P0=0X00;
delayms(1000);
P0=0XFF;
delayms(1000);
}
for(i=0;i<8;i++)
{
P0=(0XFF<<i);
delayms(500);
}
HC138_C=1;
HC138_B=0;
HC138_A=1;
P0=0X10;
delayms(50);
P0=0X00;
HC138_C=1;
HC138_B=0;
HC138_A=0;
for(i=0;i<8;i++)
{
P0=~(0XFF<<i);
delayms(500);
}
HC138_C=1;
HC138_B=0;
HC138_A=1;
P0=0X40;
delayms(50);
P0=0X00;
}
void delayms(int ms)
{
int i,j;
for(i=ms;i>0;i--)
for(j=845;j>0;j--);
}
void Allinit()
{
HC138_C=1;
HC138_B=0;
HC138_A=0;
P0=0XFF; //關LED
HC138_C=1;
HC138_B=0;
HC138_A=1;
P0=0X00; //關繼電器、蜂鳴器
}
這個代碼其實是可以優化的,代碼里用了太多的138譯碼器的高低電平賦值,我們稍微給它優化一下,我們可以把所有由138譯碼器控制的繼電器,蜂鳴器,數碼管,LED這些外設埠用一個switch陳述句來選擇控制,代碼如下:
#include<stc15f2k60s2.h>
sbit HC138_A=P2^5;
sbit HC138_B=P2^6;
sbit HC138_C=P2^7;
void LED_Run();
void delayms(int ms);
void Allinit();
void InitHC138(int n);
void main()
{
Allinit();
while(1)
{
LED_Run();
}
}
void InitHC138(int n)
{
switch(n)
{
case 4:
HC138_C=1;
HC138_B=0;
HC138_A=0;
break;
case 5:
HC138_C=1;
HC138_B=0;
HC138_A=1;
break;
case 6:
HC138_C=1;
HC138_B=1;
HC138_A=0;
break;
case 7:
HC138_C=1;
HC138_B=1;
HC138_A=1;
break;
}
}
void LED_Run()
{
int i;
InitHC138(4);
for(i=0;i<3;i++)
{
P0=0X00;
delayms(1000);
P0=0XFF;
delayms(1000);
}
for(i=0;i<8;i++)
{
P0=(0XFF<<i);
delayms(500);
}
InitHC138(5);
P0=0X10;
delayms(50);
P0=0X00;
InitHC138(4);
for(i=0;i<8;i++)
{
P0=~(0XFF<<i);
delayms(500);
}
InitHC138(5);
P0=0X40;
delayms(50);
P0=0X00;
}
void delayms(int ms)
{
int i,j;
for(i=ms;i>0;i--)
for(j=845;j>0;j--);
}
void Allinit()
{
InitHC138(4);
P0=0XFF; //關LED
InitHC138(5);
P0=0X00; //關繼電器、蜂鳴器
}
可能有些同學覺得這代碼還是顯得比較繁雜,還是不夠簡化,那我們把P0口的輸出跟138譯碼器做到同一個控制陳述句里吧,上代碼:
#include<stc15f2k60s2.h>
sbit HC138_A = P2^5;
sbit HC138_B = P2^6;
sbit HC138_C = P2^7;
void LED_Run();
void delayms(int ms);
void InitHC138(int n);
void Allinit();
void Output(unsigned char Tongdao,unsigned char dat);
void main()
{
Allinit();
while(1)
{
LED_Run();
}
}
void InitHC138(int n)
{
switch(n)
{
case 4:
P2 = (P2 & 0X1F)|0X80;
break;
case 5:
P2 = (P2 & 0X1F)|0XA0;
break;
case 6:
P2 = (P2 & 0X1F)|0XC0;
break;
case 7:
P2 = (P2 & 0X1F)|0XE0;
break;
}
}
void Output(unsigned char Tongdao,unsigned char dat)
{
InitHC138(Tongdao);
P0 = dat;
}
void LED_Run()
{
int i;
for(i=0;i<3;i++)
{
Output(4,0x00);delayms(1000);
Output(4,0xff);delayms(1000);
}
for(i=0;i<8;i++)
{
Output(4,(0XFF<<i));delayms(500);
}
Output(5,0x10);delayms(50);
Output(5,0x00);
for(i=0;i<8;i++)
{
Output(4,~(0XFF<<i));delayms(500);
}
Output(5,0x40);delayms(50);
Output(5,0x00);
}
void delayms(int ms)
{
int i,j;
for(i=ms;i>0;i--)
for(j=845;j>0;j--);
}
void Allinit()
{
Output(4,0xff); //關LED
Output(5,0x00); //關繼電器、蜂鳴器
}
這樣看著是不是就舒服多了,代碼是多種多樣的,每個人思路不一樣,寫出來的代碼就會略有差別,我這里還有另外一種寫的方式,可供大家參考:
#include<stc15f2k60s2.h>
void allinit();
void delayms(int ms);
void LED_Run();
void main()
{
allinit();
while(1)
{
LED_Run();
}
}
void LED_Run()
{
int i;
for(i=0;i<3;i++)
{
P2=0X80;P0=0X00;
delayms(1000);
P2=0X80;P0=0XFF;
delayms(1000);
}
for(i=0;i<8;i++)
{
P2=0X80;P0=0XFF<<i;
delayms(500);
}
P2=0XA0;P0=0X10;delayms(50);
P2=0XA0;P0=0X00;
for(i=0;i<8;i++)
{
P2=0X80;P0=~(0XFF<<i);
delayms(500);
}
P2=0XA0;P0=0X40;delayms(50);
P2=0XA0;P0=0X00;
}
void delayms(int ms)
{
int i,j;
for(i=ms;i>0;i--)
for(j=845;j>0;j--);
}
void allinit()
{
P2=0XA0;P0=0X00;//關繼電器、蜂鳴器
P2=0X80;P0=0XFF;//關LED
P2=0XC0;P0=0XFF;//關數碼管位選
P2=0XFF;P0=0XFF;//關數碼管段選
}
以上幾種代碼本質上都是差不多的,所實作的功能也是一摸一樣,大家可以根據自己的愛好選擇一種適合自己的,
![]()
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/274812.html
標籤:其他
