霹靂燈、繼電器、蜂鳴器等實驗程序
大小:0.15 MB 人氣: 2017-09-06 需要積分:0
1、霹靂燈實驗程序
/* ch03-3-3.c - 霹靂燈實驗程序? *///==聲明區============================================
#include?
#define?LED?P1???// 定義LED接至Port 1
void delay(int);??// 聲明延遲函數?
//==主程序============================================
main()?????// 主程序開始?
{?unsigned char i;? ?// 聲明無號數字元變數i(占1Bytes) ?
?LED=0xfe;???// 初值=1111 1110,只有最右1燈亮?
?while(1)???// 無窮循環,程序一直跑?
?{?for(i=0;i<7;i++)// 左移7次?
??{?delay(100);?// 延遲100 5m=0.5s?
???LED=(LED<<1)|0x01;?// 左移1位,并設定最低位元為1?
??}????// 左移結束,只有最左1燈亮?
??for(i=0;i<7;i++)// 右移7次?
??{?delay(100);?// 延遲100 5m=0.5s?
???LED=(LED>>1)|0x80;?// 右移1位,并設定最高位元為1
??}????// 結束右移,只有最右1燈亮?
?}?????// while循環結束?
}??????// 主程序結束?
//==子程序=============================================
/* 延遲函數,延遲約x 5ms */
void delay(int x)??// 延遲函數開始?
{?int i,j;???// 聲明整數變數i,j?
?for (i=0;i
}??????// 延遲函數結束?
?
2、繼電器實驗程序
/* ch03-3-2.c - 繼電器實驗程序? *///==聲明區========================================
#include?
sbit?buzzer = P3^7;??//?聲明蜂鳴器的位置?
sbit?relay = P3^6;??//?聲明繼電器的位置??
void delay(int);???//?聲明延遲函數?
void pulse_BZ(int,int,int);?//?聲明蜂鳴器發聲函數?
void pulse_RL(int,int,int);?//?聲明繼電器控制函數?
//==主程序========================================
main()??????//?主程序開始?
{?while(1)????//?無窮循環,程序一直跑 */
?{?pulse_RL(10,2000,2000);?
??// 繼電器使燈亮滅各10次,各2000 0.5m=1s
??pulse_BZ(100,1,1);?
??// 蜂鳴器第1聲嗶,約100*(0.5m+0.5m)=0.1s
??delay(200);???//?延遲200 0.5ms=0.1s?
??pulse_BZ(100,1,1);?
??// 蜂鳴器第2聲嗶,約100*(0.5m+0.5m)=0.1s
??delay(200);???//?延遲200 0.5ms=0.1s?
?}??????//?while循環結束?
}???????//?主程序結束?
//==副程序=========================================
// 延遲函數開始,延遲約x*0.5ms/
void delay(int x)??//?延遲函數開始?
{?int i,j;???//?聲明整數變量i,j
?for (i=0;i
}?????//?延遲函數結束?
/* 蜂鳴器發聲函數,count=計數次數,TH=高態時間,TL=低態時間 */
void pulse_BZ(int count,int TH,int TL)?//?蜂鳴器發聲函數開始?
{?int i;???//?聲明整數變量i/
?for(i=0;i
??delay(TH);?//?延遲TH 0.5ms?
??buzzer=0;?//?輸出低態?
??delay(TL);?//?延遲TL 0.5ms?
?}????//?for循環結束?
}?????//?蜂鳴器發聲函數結束?
/* 繼電器控制函數,count=計數次數,TH=激磁時間,TL=消磁時間 */
void pulse_RL(int count,int TH,int TL)?//?繼電器控制函數開始?
{?int i;???//?聲明整數變量i?
?for(i=0;i
??delay(TH);?//?延遲TH 0.5ms?
??relay=0;?//?輸出低態,繼電器消磁(燈滅)?
??delay(TL);?//?延遲TL 0.5ms?
?}????//?for循環結束?
}?????//?繼電器控制函數結束?
?
3、蜂鳴器實驗程序
/* ch03-3-1.c - 蜂鳴器實驗程序? *///==聲明區====================================
#include?
sbit buzzer = P3^7 ;?// 聲明蜂鳴器的位置為Port 3之bit 7
void delay(int);??//?聲明延遲函數?
void pulse_BZ(int,int,int);?//?聲明蜂鳴器發聲函數?
//==主程序====================================
main()?????//?主程序開始?
{?while(1)???//?無窮循環,程序一直跑?
?{?pulse_BZ(100,1,1);?
??// 蜂鳴器發聲100 (0.5m+0.5m)=0.1s
??delay(1000);?//?延遲1000 0.5m=0.5秒?
?}?????//?while循環結束?
}??????//?主程序結束?
//==子程序=====================================
/* 延遲函數開始,延遲x 0.5ms */?
void delay(int x)??//?延遲函數開始?
{?int i,j;???//?聲明整數變量i,j
?for (i=0;i
}?????//?延遲函數結束?
/* 蜂鳴器發聲函數,count=計數次數,TH=高態時間,TL=低態時間 */
void pulse_BZ(int count,int TH,int TL)?//?蜂鳴器發聲函數開始?
{?int i;???//?聲明整數變數i
?for(i=0;i
??delay(TH);?//?延遲TH 0.5ms?
??buzzer=0;?//?輸出低態?
??delay(TL);?//?延遲TL 0.5ms?
?}????//?for循環結束?
}?????//?蜂鳴器發聲函數結束
?
4、秒表計C程序
//秒表程序#define XMS 2000? /* 定時中斷間隔 12MHz,1uS */?
#include
#include
#define uchar unsigned char
sbit?KEY1?=P3^3;? /* 啟動鍵 */
sbit?KEY2?=P3^4;? /* 停止鍵 */
sbit?KEY3?=P3^5;? /* 清除鍵*/
bit stop;
char buf[4]={0,0,0,0};
char low[4]={0xfe,0xfd,0xfb,0xf7};
char disppoint;
uchar ms;
code char seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};? /* 顯示段表*/
void delayms(int t)
{
uchar i;
while(t--)
?{
?i=100;
?while(i--);?
?}
}
void put_num(char c)
{
P0=seg[c&0x0f];
}
void timer0( ) interrupt 1 using 1? /*定時器中斷程序*/
{
EA=0;
//顯示:
TH0=-(XMS/256);?
TL0=-(XMS%256);
disppoint&=3;
put_num(buf[disppoint]);
//if(disppoint==2)P0&=~0x20; /* 小數點*/
P1=low[disppoint];
disppoint++;
if(stop){EA=1;return;}
//----
ms--;
if(ms==0)
?{
?ms=100;
?buf[3]++;
?if(buf[3]>9)
??{buf[3]=0;
??buf[2]++;
??if(buf[2]>9)
???{buf[2]=0;
???buf[1]++;
???if(buf[1]>9)
????{buf[1]=0;
????buf[0]++;
????if(buf[0]>9)buf[0]=0;
????}
???}
??}
?}
EA=1;
}
main()
{
TMOD=0x01;
TH0=-(XMS/256);?/* 5ms */
TL0=-(XMS%256);
TR0=1;
EA=1;
while(1)
?{
?EA=1;
?ET0=1;
?if(!KEY1 && stop!=0){stop=0;delayms(100);}
?if(!KEY2 && stop==0){stop=1;delayms(100);}
?if(!KEY3)
??{buf[0]=buf[1]=buf[2]=buf[3]=0;
??stop=1;
??delayms(100);}
?}
}
?
5、AT89S5x看門狗
#include
#include
#include
sfr AUXR??? = 0x8E;??//定義AT89S51擴展寄存器
sfr WDTRST? = 0xA6;
void clr_wdt();
main()
{
?AUXR = 0xff;??// 初始化看門狗相關寄存器
?while(1)???// 主循環
?{
??clr_wdt();??// 8191個機器周期內必須至少調用此程序一次
??????// 否則看門狗會溢出
??
??// 其它子程序?
??// ?
?}
}
void clr_wdt()
{
?WDTRST = 0x1E;??// 清除看門狗指令
?WDTRST = 0xE1;??//?
}
?
非常好我支持^.^
(0) 0%
不好我反對
(0) 0%