2019年12月21日 星期六
2019年12月5日 星期四
2019年12月3日 星期二
2019年12月2日 星期一
按鈕嗶聲實驗
/* ch4-3-4.c - 按鈕嗶聲實驗 */
//==宣告區=====================================
#include <reg51.h> // 包含8051暫存器之標頭檔
#define LED P2 // 定義LED連接到P2
sbit PB=P3^7; // 宣告PB接至P3^7
sbit buzzer=P3^1; // 宣告蜂鳴器接至P3^1
void delay500us(int x);// 宣告0.5ms延遲函數
void beep(char x); // 宣告beep嗶聲函數
//==主程式=====================================
main() // 主程式開始
{
LED=0xFF; // 關閉8個LED
PB=1; // 規劃PB為輸入埠
while(1) // 無窮迴圈,程式一直跑
{
if (!PB) // 若按下PB
{
if (LED==0xFF) LED = 0xFE; // 若LED全不亮,則點亮第1個LED
else LED=(LED<<1)|1; // 否則單燈左移
while(!PB); // 若仍按住PB,繼續等
beep(1); // 嗶一聲
} // if敘述結束
} // while迴圈結束
} // 主程式結束
/* 延遲函數(0.5ms) */
void delay500us(int x) // 延遲函數開始
{ int i,j; // 宣告變數i,j
for(i=0;i<x;i++) // 外部計數迴圈(x*0.5ms)
for(j=0;j<60;j++); // 內部計數迴圈(0.5ms)
} // 延遲函數結束
/* 嗶聲函數(1kHz) */
void beep(char x) // 嗶聲函數開始
{ char i,j; // 宣告變數i,j
for(i=0;i<x;i++) // 產生x個嗶聲
{ for(j=0;j<100;j++) // 重複吸放100次,(0.5ms+0.5ms)*100
{ buzzer=0;delay500us(1); // 蜂鳴器激磁0.5ms
buzzer=1;delay500us(1); // 蜂鳴器斷磁0.5ms
}
delay500us(200); // 靜音0.1s
}
}
//==宣告區=====================================
#include <reg51.h> // 包含8051暫存器之標頭檔
#define LED P2 // 定義LED連接到P2
sbit PB=P3^7; // 宣告PB接至P3^7
sbit buzzer=P3^1; // 宣告蜂鳴器接至P3^1
void delay500us(int x);// 宣告0.5ms延遲函數
void beep(char x); // 宣告beep嗶聲函數
//==主程式=====================================
main() // 主程式開始
{
LED=0xFF; // 關閉8個LED
PB=1; // 規劃PB為輸入埠
while(1) // 無窮迴圈,程式一直跑
{
if (!PB) // 若按下PB
{
if (LED==0xFF) LED = 0xFE; // 若LED全不亮,則點亮第1個LED
else LED=(LED<<1)|1; // 否則單燈左移
while(!PB); // 若仍按住PB,繼續等
beep(1); // 嗶一聲
} // if敘述結束
} // while迴圈結束
} // 主程式結束
/* 延遲函數(0.5ms) */
void delay500us(int x) // 延遲函數開始
{ int i,j; // 宣告變數i,j
for(i=0;i<x;i++) // 外部計數迴圈(x*0.5ms)
for(j=0;j<60;j++); // 內部計數迴圈(0.5ms)
} // 延遲函數結束
/* 嗶聲函數(1kHz) */
void beep(char x) // 嗶聲函數開始
{ char i,j; // 宣告變數i,j
for(i=0;i<x;i++) // 產生x個嗶聲
{ for(j=0;j<100;j++) // 重複吸放100次,(0.5ms+0.5ms)*100
{ buzzer=0;delay500us(1); // 蜂鳴器激磁0.5ms
buzzer=1;delay500us(1); // 蜂鳴器斷磁0.5ms
}
delay500us(200); // 靜音0.1s
}
}
按鈕切換式控制實驗
/* ch4-3-3.c - 按鈕切換式控制實驗 */
//==宣告區=====================================
#include <reg51.h> // 包含8051暫存器之標頭檔
sbit PB=P3^7; // 宣告PB接至P3^7
sbit LED=P2^0; // 宣告LED接至P2^0
void debouncer(void); // 宣告防彈跳函數
//==主程式=====================================
main() // 主程式開始
{
LED=1; // 關閉LED
PB=1; // 規劃PB為輸入埠
while(1) // 無窮迴圈,程式一直跑
{ if (!PB) // 若按下PB
{
debouncer();// 呼叫防彈跳函數(按下時)
LED=!LED; // 切換LED為反相
while(!PB); // 若仍按住PB,繼續等
debouncer();// 呼叫防彈跳函數(放開時)
} // if敘述結束
} // while迴圈結束
} // 主程式結束
/* 防彈跳函數,延遲約20ms */
void debouncer(void) // 防彈跳函數開始
{
int i; // 宣告整數變數i
for(i=0;i<2400;i++);// 計數2400次,延遲約20ms
} // 防彈跳函數結束
//==宣告區=====================================
#include <reg51.h> // 包含8051暫存器之標頭檔
sbit PB=P3^7; // 宣告PB接至P3^7
sbit LED=P2^0; // 宣告LED接至P2^0
void debouncer(void); // 宣告防彈跳函數
//==主程式=====================================
main() // 主程式開始
{
LED=1; // 關閉LED
PB=1; // 規劃PB為輸入埠
while(1) // 無窮迴圈,程式一直跑
{ if (!PB) // 若按下PB
{
debouncer();// 呼叫防彈跳函數(按下時)
LED=!LED; // 切換LED為反相
while(!PB); // 若仍按住PB,繼續等
debouncer();// 呼叫防彈跳函數(放開時)
} // if敘述結束
} // while迴圈結束
} // 主程式結束
/* 防彈跳函數,延遲約20ms */
void debouncer(void) // 防彈跳函數開始
{
int i; // 宣告整數變數i
for(i=0;i<2400;i++);// 計數2400次,延遲約20ms
} // 防彈跳函數結束
2019年12月1日 星期日
利用p3.2 p3.3中斷計時,而中斷2設定為最高 優先權
#include "reg51.h"
sbit led=P2^0;
sbit PB1=P3^2;
sbit PB2=P3^3;
int i=20;
int j=0;
char count=0;
char bcd[2]={0,0};
char code P0table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
char code P1table[]={0xfe,0xfd}; //0xfe才會從個位數開始數
void T0_int(void) interrupt 1
{
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
P0=P0table[ bcd[j] ];
P1=P1table[j];
j++;
if(j==2)
j=0;
}
void T1_int(void) interrupt 3
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
i--;
if(i==0)
{
i=20;
count++;
if(count==10)
{
count=0;
led=~led;
}
bcd[1]=count/10;
bcd[0]=count%10;
}
}
void int0_sw() interrupt 0
{
TR1=!TR1;//是關閉計時中斷1讓他不會顯示一直計數數字,而掃描一樣讓他持續的scan
while(!PB1);
}
void int1_rst(void ) interrupt 2
{
while(!PB2);
count=0;
bcd[1]=0;
bcd[0]=0;
}
void main()
{
IE=0x8f;
TMOD=0x11;
PT1=1;
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
TR0=1;
TR1=1;
while(1);
}
sbit led=P2^0;
sbit PB1=P3^2;
sbit PB2=P3^3;
int i=20;
int j=0;
char count=0;
char bcd[2]={0,0};
char code P0table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
char code P1table[]={0xfe,0xfd}; //0xfe才會從個位數開始數
void T0_int(void) interrupt 1
{
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
P0=P0table[ bcd[j] ];
P1=P1table[j];
j++;
if(j==2)
j=0;
}
void T1_int(void) interrupt 3
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
i--;
if(i==0)
{
i=20;
count++;
if(count==10)
{
count=0;
led=~led;
}
bcd[1]=count/10;
bcd[0]=count%10;
}
}
void int0_sw() interrupt 0
{
TR1=!TR1;//是關閉計時中斷1讓他不會顯示一直計數數字,而掃描一樣讓他持續的scan
while(!PB1);
}
void int1_rst(void ) interrupt 2
{
while(!PB2);
count=0;
bcd[1]=0;
bcd[0]=0;
}
void main()
{
IE=0x8f;
TMOD=0x11;
PT1=1;
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
TR0=1;
TR1=1;
while(1);
}
數到9 led切換
#include "reg51.h"
sbit led=P2^0;
int i=20;
int j=0;
char count=0;
char bcd[2]={0,0};
char code P0table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
char code P1table[]={0xfe,0xfd}; //0xfe才會從個位數開始數
void main()
{
IE=0x8a;
TMOD=0x11;
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
TR0=1;
TR1=1;
while(1);
}
void T0_int(void) interrupt 1
{
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
P0=P0table[ bcd[j] ];
P1=P1table[j];
j++;
if(j==2)
j=0;
}
void T1_int(void) interrupt 3
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
i--
if(i==0)
{
i=20;
count++;
if(count==10)
{
count=0;
led=~led;
}
bcd[1]=count/10;
bcd[0]=count%10;
}
}
sbit led=P2^0;
int i=20;
int j=0;
char count=0;
char bcd[2]={0,0};
char code P0table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
char code P1table[]={0xfe,0xfd}; //0xfe才會從個位數開始數
void main()
{
IE=0x8a;
TMOD=0x11;
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
TR0=1;
TR1=1;
while(1);
}
void T0_int(void) interrupt 1
{
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
P0=P0table[ bcd[j] ];
P1=P1table[j];
j++;
if(j==2)
j=0;
}
void T1_int(void) interrupt 3
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
i--
if(i==0)
{
i=20;
count++;
if(count==10)
{
count=0;
led=~led;
}
bcd[1]=count/10;
bcd[0]=count%10;
}
}
訂閱:
文章 (Atom)
algorithm
#include <iostream> #include <string.h> using namespace std; int main(int argc, char** argv) { for(int j=2;j<=100;j++)//j...
-
本文旨在補充《 超圖解Arduino互動設計入門 》第18章「RFID無線識別裝置與問答遊戲製作」單元,書本採用的RFID讀卡機模組是採用9600bps, TTL序列通訊介面,RFID的通訊頻率為125KHz。這種模組的接線和程式都很簡單,每當感測到RFID卡,讀卡機就把...
-
/* 多重按鈕開關 */ //==宣告區================================ #include // 定義8051暫存器之標頭檔,P2-17~19 #include "myio.h" // 自己寫的I/O程式庫 sbit PB...