實例64:用數碼管顯示動態檢測結果
# // 包含51單片機寄存器定義的頭文件
# //包含隨機函數rand()的定義文件
char i; //記錄中斷次數
int x; //隨機檢測的數據
char code Tab[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //數碼管顯示0~9的段碼表
/***********************************************************************
函數功能:快速動態掃描延時,延時約0.9毫秒
************************************************************************/
void delay(void)
{
int i;
for(i=0;i
;
}
/***********************************************************************
函數功能:4位數的數碼顯示器顯示
入口參數:k
出口參數:無
************************************************************************/
void ( int k)
{
P2=0xfe; //即P2=1111 1110B,P2.0引腳輸出低電平,數碼顯示器DS0接通電源
P0=Tab[k/1000]; //顯示千位
delay();
P2=0xfd ; //即P2=1111 1101B,P2.1引腳輸出低電平數碼管秒表c語言程序,數碼顯示器DS1接通電源
P0=Tab[(k00)/100]; //顯示百位
delay();
P2=0xfb; //即P2=1111 1011B,P2.2引腳輸出低電平,數碼顯示器DS2接通電源
P0=Tab[(k0)/10]; //顯示十位
delay();
P2=0xf7; //即P2=1111 0111B ,P2.3引腳輸出低電平,數碼顯示器DS3接通電源
P0=Tab[k];//顯示個位
delay();
P2=0xff; //關閉所有顯示器
}
void main(void) //主函數
{
TMOD=0x01; //使用定時器T0
TH0=(65536-46083)/256; //將定時器計時時間設定為46083×1.085微秒=50000微秒=50毫秒
TL0=(65536-46083)%256;
EA=1; //開啟總中斷
ET0=1; //定時器T0中斷允許
TR0=1; //啟動定時器T0開始運行
while(1)
{
(x); //調用檢測結果的顯示程序
}
}
/********************************************************
函數功能:定時器T0的中斷服務程序
*******************************************************/
void Time0(void) 1 using 1
{
TR0=0; //關閉定時器T0
i++; //每來一次中斷,i自加1
if(i==20) //夠20次中斷,即1秒鐘進行一次檢測結果采樣
{
x=rand()/10; //隨機產生一個從0到32767的整數,再將其除以10,獲得一個隨機4位數,模擬檢測結果
i=0; //將i清0,重新統計中斷次數
}
TH0=(65536-46083)/256; //重新給計數器T0賦初值
TL0=(65536-46083)%256;
TR0=1; //啟動定時器T0
}
實例65:數碼秒表設計
# // 包含51單片機寄存器定義的頭文件
char code Tab[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//數碼管顯示0~9的段碼表
char ; //記錄中斷次數
char ; //儲存秒
/***********************************************************************
函數功能:快速動態掃描延時,延時約0.6毫秒
************************************************************************/
void delay(void)
{
char i;
for(i=0;i
;
}
/***********************************************************************
函數功能:顯示秒
入口參數:k
出口參數:無
************************************************************************/
void ( char k)
{
P2=0xfb; //P2.6引腳輸出低電平, DS6點亮
P0=Tab[k/10]; //顯示十位
delay();
P2=0xf7; //P2.7引腳輸出低電平, DS7點亮
P0=Tab[k]; //顯示個位
delay();
P2=0xff; //關閉所有數碼管
}
void main(void) //主函數
{
TMOD=0x01; //使用定時器T0
TH0=(65536-46083)/256; //將定時器計時時間設定為46083×1.085微秒
//=50000微秒=50毫秒
TL0=(65536-46083)%256;
EA=1; //開啟總中斷
ET0=1; //定時器T0中斷允許
TR0=1; //啟動定時器T0開始運行
=0; //中斷次數初始化
=0;//秒初始化
while(1)
{
();//調用秒的顯示子程序
}
}
//********************************************************
//函數功能:定時器T0的中斷服務程序
//*******************************************************
void (void ) 1 using 1
{
TR0=0; //關閉定時器T0
++; //每來一次中斷,中斷次數自加1
if(==20) //夠20次中斷,即1秒鐘進行一次檢測結果采樣
{
=0; //中斷次數清0
++; //秒加1
if(==60)
=0; //秒等于60就返回0
}
TH0=(65536-46083)/256; //重新給計數器T0賦初值
TL0=(65536-46083)%256;
TR0=1; //啟動定時器T0
}
實例66:數碼時鐘設計
# // 包含51單片機寄存器定義的頭文件
char Tab[ ]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; // shape
char port[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
char ; //中斷次數計數變量
char ; //秒計數變量
char ; //分鐘計數變量
char hour; //小時計數變量
/
void delay(void) //延時函數,延時約0.6ms
{
char j;
for(j=0;j
;
}
/******************************************************************
函數功能:顯示秒的子程序
入口參數:s
********************************************************************/
void ( char s)
{
P2=0xbf; //P2.6引腳輸出低電平, DS6點亮
P0=Tab[s/10]; //顯示十位
delay();
P2=0x7f; //P2.7引腳輸出低電平, DS7點亮
P0=Tab[s]; //顯示個位
delay();
P2=0xff; //關閉所有數碼管
}
/******************************************************************
函數功能:顯示分鐘的子程序
入口參數:m
********************************************************************/
void ( char m)
{
P2=0xf7; // P2.3引腳輸出低電平,DS3點亮
P0=Tab[m/10];//顯示個位
delay();
P2=0xef; // P2.4引腳輸出低電平數碼管秒表c語言程序, DS4點亮
P0=Tab[m];
delay();
P2=0xdf; //P2.5引腳輸出低電平, DS5點亮
P0=0xbf; //分隔符“-”的段碼
delay();
P2=0xff; //關閉所有數碼管
}
/******************************************************************
函數功能:顯示小時的子程序
入口參數:h
********************************************************************/
void ( char h)
{
P2=0xfe; //P2.0引腳輸出低電平, DS0點亮
P0=Tab[h/10]; //顯示十位
delay();
P2=0xfd; //P2.1引腳輸出低電平, DS1點亮
P0=Tab[h]; //顯示個位
delay();
P2=0xfb; //P2.2引腳輸出低電平, DS2點亮
P0=0xbf; //分隔符“-”的段碼
delay();
P2=0xff; //關閉所有數碼管
}
/******************************************************************
函數功能:主函數
********************************************************************/
void main(void)
{
TMOD=0x01; //使用定時器T0
EA=1; //開中斷總允許
ET0=1; //允許T0中斷
TH0=(65536-46083)/256; //定時器高八位賦初值
TL0=(65536-46083)%256; //定時器低八位賦初值
TR0=1;
=0; //中斷計數變量初始化
=0; //秒計數變量初始化
=0; //分鐘計數變量初始化
hour=0; //小時計數變量初始化
while(1)
{
(); //調用秒顯示子程序
delay();
(); //調用分鐘顯示子程序
delay();
(hour);
delay();
}
}
/******************************************************************
函數功能:定時器T0的中斷服務子程序
********************************************************************/
void (void ) 1 using 1 //using Time0
{
++;
if(==20)
{
=0; //中斷計數變量清0
++; //秒計數變量加1
}
if(==60)
{
=0; //如果秒計滿60,將秒計數變量清0
++; //分鐘計數變量加1
}
if(==60)
{
=0; //如果分鐘計滿60,將分鐘計數變量清0
hour++; //小時計數變量加1
}
if(hour==24)
{
hour=0; //如果小時計滿24,將小時計數變量清0
}
TH0=(65536-46083)/256; //定時器重新賦初值
TL0=(65536-46083)%256;
}
實例67:用LED數碼管顯示計數器T0的計數值
# //包含51單片機寄存器定義的頭文件
sbit S=P3^2 ; //將S位定義為P3.2引腳
char Tab[ ]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //段碼表
char x;
/******************************************************************
函數功能: 延時約0.6ms
********************************************************************/
void delay(void)
{
char j;
for(j=0;j
;
}
/******************************************************************
函數功能:顯示計數次數的子程序
入口參數:x
********************************************************************/
void ( char x)
{
P2=0xf7; //P2.6引腳輸出低電平,DS6點亮
P0=Tab[x/10]; //顯示十位
delay();
P2=0xfb; //P2.7引腳輸出低電平,DS7點亮
P0=Tab[x]; //顯示個位
delay();
}
/*******************************************
函數功能:主函數
******************************************/
void main(void)
{
EA=1; //開放總中斷
EX0=1; //允許使用外中斷
IT0=1; //選擇負跳變來觸發外中斷
x=0;
while(1)
(x);
}
/**************************************************************
函數功能:外中斷T0的中斷服務程序
**************************************************************/
void int0(void) 0 using 0 //外中斷0的中斷編號為0
{
x++;
if(x==100)
x=0;
}
實例68:靜態顯示數字“59”
# //包含51單片機寄存器定義的頭文件
/*******************************************
函數功能:主函數
******************************************/
void main(void)
{
P0=0x92; //將數字5的段碼送P0口
P1=0x90;//將數字9的段碼送P1口
while(1) //無限循環,防止程序跑飛
;
}
***************** **鍵盤控制*********鍵盤控制*************** *************
實例69:無軟件消抖的獨立式鍵盤輸入實驗
# // 包含51單片機寄存器定義的頭文件
sbit S1=P1^4; //將S1位定義為P1.4引腳
sbit LED0=P3^0; //將LED0位定義為P3.0引腳
void main(void) //主函數
{
LED0=0; //P3.0引腳輸出低電平
while(1)
{
if(S1==0) //P1.4引腳輸出低電平,按鍵S1被按下
LED0=!LED0; //P3.0引腳取反
}
}