
如用要獲得0.5秒的時間,而單片機的指令周期是1μs,0.5秒是1μs的5000000倍,所以在程序編寫中常用循環語句來完成時間的延長。而空循環一次操作需要2個機器周期的時間(注:這是在用無符號字符型變量作循環變量的情況下,同時是用變量減循環,具體可參看反匯編指令“DJNZ 存儲單元 ,目標地址”的說明 ),下面就是一個完成0.5秒延時的程序。
程序是用C51編寫的,由于C語言本身不依賴于硬件,便于在不同的單片機進行程序移植。C51與標準C語言主要語句是完全相同的,在程序編寫中有不同的地方,在本書的附錄中有較為詳細的敘述,請參看附錄B。
void delay05s(void) //延時0.5秒子程序
{
unsigned char i,j,k; //聲明三個無符號字符型變量i,j,k
for(i=5;i>0;i--) //外循環,每次循環約0.1s,共延時為5*0.1s=0.5s
for(j=200;j>0;j--)//每次循環約0.5ms,所以延時約為200*0.5ms=100ms=0.1s
for(k=250;k>0;k--);//最里面的循環,延時約為250*2us=500 us=0.5ms
}
完成發光二極管以1Hz的閃爍程序設計框圖如圖2-3所示。
LED亮 |
LED熄 |
程序開始 |
延時0.5秒 |
延時0.5秒 |
點亮一只發光二極管的完整的程序:(samp2-1.c)
#include "reg51.h" //包含頭文件
#define uchar unsigned char //為了書寫簡單,定義uchar表示無符號字符型
#define uint unsigned int //定義uint表示無符號整型
#define ulong unsigned long //定義ulong 表示無符號長型
sbit light=P2^0; //定義light變最表示P2.0端
void delay05s(void) //定義延時0.5秒子函數,函數名為delay05s
{
unsigned char i,j,k;//聲明i,j,k為無符號字符型變量
for(i=5;i>0;i--) //外循環,每次循環約0.1s,共延時為5*0.1s=0.5s
for(j=200;j>0;j--)//每次循環約0.5ms,所以延時約為200*0.5ms=100ms=0.1s
for(k=250;k>0;k--);//最里面的循環,延時約為250*2us=500 us=0.5ms
}
void main(void) //主函數
{
while(1) // * while循環,當條件為真時(只有0為假)執行下面的循環體,由于條件恒為真,所以構成無限次循環 */
{
light=0; //P2.0端輸出低電平,使LED亮
delay05s(); //延遲0.5秒
light=1; // P2.0端輸出高電平,使LED滅
delay05s(); //延遲0.5秒
}
}
2、跑馬燈
#include "reg51.h" //包含頭文件
#define uchar unsigned char
void delay05s(void) //延時0.5秒子程序
{
unsigned char i,j,k;
for(i=5;i>0;i--)
for(j=200;j>0;j--)
for(k=250;k>0;k--);
}
void main(void) //主函數
{
uchar i,j;
while(1) //無限循環
{
j=0x01;
/* j初始化為0X01,即0000 0001 */
for(i=0;i<8;i++) // for循環,條件為i<8,執行下面的循環體,完成8次循環
{
P2=~j;
/* ~j取反。j初始值為0X01,即0000 0001,將j各位取反后為1111 1110,輸出到端口信號為“0” 的LED就亮,為“1” LED熄滅 */
delay05s(); //延遲0.5秒
j=j<<1; /* j<<1為變量j中的值左移一位,最低位補“1” ,結果“0” 依次左移一位,發亮的LED也就左移一位*/
}
}
}
3 任意變幻的LED


控制程序如下(samp2-2.c):
#include "reg51.h" //包含頭文件
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
//定義顯示花樣數據的數組
uchar dispcode[8]={0x7e,0xbd,0xdb,0xe7,0xdb,0xbd,0x7e,0xff };
void delay05s(void) //延時0.5秒子程序
{
unsigned char i,j,k;
for(i=5;i>0;i--)
for(j=200;j>0;j--)
for(k=250;k>0;k--);
}
void main(void) //主函數
{
uchar i;
while(1) //無限循環
{
for(i=0;i<8;i++) //循環8次,實現顯示8個對應花樣
{
P2=dispcode[i]; /*數組dispcode中的各位數據就是LED所顯示花樣,
其中的0對就的LED亮,1對應的位LED滅 */
delay05s(); //延遲0.5秒
}
}
}
