单片机 实物 AT89C52RC day01 内容: LED 蜂鸣器 独立按键, 矩形按键模块
1.關(guān)于 單片機(jī)? ?AT89C51? 與單片機(jī)? ?AT89C52? 的區(qū)別
1、內(nèi)部FLASH容量不同
AT89C51和AT89C52是單片機(jī)的兩種型號(hào),AT89C52是AT89C51的各個(gè)方面的升級(jí)版,AT89C51 有 4K 字節(jié)的內(nèi)部FLASH PERAM,而AT89C52 的內(nèi)部FLASH PERAM 相比AT89C51?增加了1倍,其容量達(dá)到8K。
2、隨機(jī)存取數(shù)據(jù)存儲(chǔ)器(RAM)不同
AT89C51 有128 字節(jié)的內(nèi)部 RAM,AT89C52 的內(nèi)部 RAM 擴(kuò)展為 256 字節(jié)。
3、中斷源數(shù)量不同
AT89C51有6個(gè)中斷源,AT89C52 除了具備 AT89C51 的定時(shí)器/計(jì)數(shù)器 T0 和定時(shí)器/計(jì)數(shù)器 T1,還額外增加了一個(gè)定時(shí)器/計(jì)數(shù)器 T2。
4、定時(shí)器數(shù)量不同
AT89C51C51有T0、T1兩個(gè)16位定時(shí)器,而AT89C52除了有AT89C51的T0、T1之外,還增加了T2這一16位定時(shí)器。
2.關(guān)于 單片機(jī)? LED? 模塊的編寫
? ? ? ? 1.需要知道的知識(shí):? 首先? LED 燈? 是低電平點(diǎn)亮? !
? ? ? ? 2.看實(shí)物單片機(jī)的 原理圖: (主要是 模塊對(duì)應(yīng)的引腳 )
?????????
? ? ? ? 3.編寫代碼
? ? ? ? LED.h 文件
????????
#include<reg52.h> #define uchar unsigned char #define uint unsigned int void LED_water_2();//流水燈 //第二種方式的流水燈 從右邊先亮 void LED_water();//流水燈 從左邊先亮 void delay_s(uint a);// 計(jì)時(shí) a秒 void delay(void); //標(biāo)準(zhǔn)的一秒,利用for 循環(huán)結(jié)構(gòu) void close_LED(int i);// 關(guān)閉 第 i 個(gè)燈 void play_LED(int i);// 開(kāi)啟 第 i 個(gè)燈LED.c?
????????
#include "led.h" sbit led1=P2^0;//LED1 的引腳 sbit led2=P2^1;//LED2 的引腳 sbit led3=P2^2;//LED3 的引腳 sbit led4=P2^3;//LED4 的引腳 sbit led5=P2^4;//LED5 的引腳 sbit led6=P2^5;//LED6 的引腳 sbit led7=P2^6;//LED7 的引腳 sbit led8=P2^7;//LED8 的引腳 void delay(void) //標(biāo)準(zhǔn)的一秒,利用for 循環(huán)結(jié)構(gòu) {uint i,j;for(i=124;i>0;i--){for(j=1000;j>0;j--){}} }void delay_s(uint a)// 計(jì)時(shí) a秒 {int i;for(i=1;i<=a;i++){delay();} }void LED_water()//流水燈 從左邊先亮 {led1=0;delay();led2=0;delay();led3=0;delay();led4=0;delay();led5=0;delay();led6=0;delay();led7=0;delay();led8=0;delay();led1=1;led2=1;led3=1;led4=1;led5=1;led6=1;led7=1;led8=1;} // 這里有一個(gè)知識(shí)點(diǎn) // 引腳的位置 問(wèn)題 (順序) 大的在前面 // P2^7 P2^6 P2^5 P2^4 P2^3 P2^2 P2^1 P2^0 === P2void LED_water_2()//流水燈 //第二種方式的流水燈 從右邊先亮 {//0xff 右移 一位uint i;P2=0xff;for(i=0;i<8;i++){P2=P2>>1;//右移一位delay();//延時(shí)函數(shù) }P2=0xff; }void play_LED(int i) {if(i==1){led1=0;}if(i==2){led2=0;}if(i==3){led3=0;}if(i==4){led4=0;}if(i==5){led5=0;}if(i==6){led6=0;}if(i==7){led7=0;}if(i==8){led8=0;} }void close_LED(int i) {if(i==1){led1=1;}if(i==2){led2=1;}if(i==3){led3=1;}if(i==4){led4=1;}if(i==5){led5=1;}if(i==6){led6=1;}if(i==7){led7=1;}if(i==8){led8=1;} }4.編譯代碼,下載到芯片里面
3.單片機(jī)? 的?蜂鳴器? ?(我的單片機(jī)的蜂鳴器是 無(wú)源蜂鳴器? )
1.有源蜂鳴器? 與無(wú)源蜂鳴器的 區(qū)別
蜂鳴器的驅(qū)動(dòng)方式的區(qū)別
無(wú)源蜂鳴器是沒(méi)有正負(fù)之分的,類似于喇叭,只要在兩個(gè)腿上加載不同的頻率的電信號(hào)就可以實(shí)現(xiàn)發(fā)聲,根據(jù)不同的頻率所發(fā)出的聲音也是不一樣的。所以如果用直流信號(hào)無(wú)法令其鳴叫。無(wú)源蜂鳴器需要1.5~2.5kHz(與蜂鳴器種類有關(guān))的音頻信號(hào),這個(gè)音頻信號(hào)即一個(gè)高低變化頻率為1.5-2.5kHz的方波。實(shí)際上頻率小于1.5kHz也是有聲音的,只是不那么準(zhǔn)了,可能是嘟嘟聲。
有源蜂鳴器是有正負(fù)之分的,只需要在兩個(gè)腿上加上電壓信號(hào)就會(huì)發(fā)聲,發(fā)出的聲音音調(diào)單一、頻率固定。
有源蜂鳴器比無(wú)源蜂鳴器內(nèi)部多了振蕩結(jié)構(gòu),所以有源蜂鳴器在價(jià)格上稍微貴一點(diǎn)。
2.單片機(jī)? 的BEEP? 模塊? 原理圖
????? 板子上面帶有ULN2003D芯片 使它來(lái)驅(qū)動(dòng)蜂鳴器
???????P1^5輸出高? ULN2003D 輸出低 所以他們得邏輯關(guān)系是相反得!
3.代碼編寫
BEEP.h
#include<reg52.h>void play_BEEP();//打開(kāi)蜂鳴器 void Delay10us(unsigned char i); //@11.0592MHz 延遲大約是10微秒 void play_beep_s(int x);//打開(kāi)蜂鳴器 x 代表幾秒BEEP.c
#include "BEEP.h" sbit BEEP = P1^5; // 把P2得第5個(gè)針腳定義成BEEP void Delay10us(unsigned char i) //@11.0592MHz 延遲大約是10微秒 {i = i*2;while (--i); }void play_BEEP()//打開(kāi)蜂鳴器 {BEEP = 0; // 低電平 蜂鳴器就是高電平Delay10us(100); //持續(xù)1000微秒也就是1毫秒BEEP = 1;Delay10us(100); }void play_beep_s(int x)//打開(kāi)蜂鳴器 x 代表幾秒 {int a=x*1000; //1 ms *1000 * x = x 秒 while(a--){//形成一個(gè)方波的信號(hào) 所以是 1 和 0 的 信號(hào) BEEP = 0; // 低電平 蜂鳴器就是高電平Delay10us(100); //持續(xù)1000微秒也就是1毫秒BEEP = 1;Delay10us(100);} }4.代碼編譯, 下載到芯片?
4.單片機(jī)? 的獨(dú)立按鍵? (k1? --? k4)
1.首先按鍵原理? ? 按鍵一端 連接? 芯片的引腳? ? 一端連接? GED (接地 ),本來(lái)的時(shí)候引腳是輸出高電平的 , 當(dāng)我們的按鍵 按下去的時(shí)候? 這時(shí)候芯片的這引腳 接地了, 這時(shí)候這個(gè)引腳是為低電平 ,? 但是當(dāng)我們 按下的按鍵 回位之后,按鍵還是會(huì)變?yōu)?輸出高電平 ,? 但是這個(gè)引腳會(huì)有 小段時(shí)間內(nèi) 為低電平!
2.原理圖:
3.編寫代碼:
key.h
#include<reg52.h> #include "led.h" #include "BEEP.h"void key_panding();key.c
#include "key.h" sbit key1=P3^1;//獨(dú)立按鍵 key1 sbit key2=P3^0;//獨(dú)立按鍵 key2 sbit key3=P3^2;//獨(dú)立按鍵 key3 sbit key4=P3^3;//獨(dú)立按鍵 key4 void key_panding() {if(key1==0)//按下去了 引腳為 0 {while(key1==0);//消抖LED_water(); //流水燈}if(key2==0) //按下去了 引腳為 0 {while(key2==0);//消抖play_beep_s(2);//蜂鳴器響 2 秒}if(key3==0) //按下去了 引腳為 0 {while(key3==0);//消抖play_LED(1); //led1 亮}if(key4==0) //按下去了 引腳為 0 {while(key4==0);//消抖close_LED(1); //led1 滅}}4.代碼編譯,下載到芯片
5.單片機(jī)的? 矩形按鍵模塊
1.矩形按鍵的使用方法:
?沒(méi)有按鍵按下時(shí),X0~X3是低電平,Y0~Y3是高電平。
?某一個(gè)按鍵按下,設(shè)置其所在的行低電平,列就會(huì)變?yōu)榈碗娖健?/p>
1、判斷有無(wú)鍵被按下
? ? 方法是:將全部行線X0~X3置低電平,然后檢測(cè)列線的狀態(tài)。只要有一列的電平為低,則表示鍵盤中有鍵被按下,而且閉合的鍵位于低電平線與4根行線相交叉的4個(gè)按鍵之中。若所有列線均為高電平,則鍵盤中無(wú)鍵按下。
2、確定哪個(gè)鍵按下
? ? 方法是:在確認(rèn)有鍵按下后,依次將行線置為低電平,即在置某根行線為低電平時(shí),其他線為高電平(其實(shí)就是屏蔽其他行的按鍵狀態(tài),只有當(dāng)前檢測(cè)行的按鍵狀態(tài)有效);在確定某根行線位置為低電平后,再逐行檢測(cè)各列線的電平狀態(tài),若某列為低(說(shuō)明當(dāng)前檢測(cè)行有按鍵按下),則該列線與置為低電平的行線交叉處的按鈕就是閉合的按鍵。
2.原理圖:
3.代碼編寫
key16.h
#include <reg52.h>int key_16_pandaun();//判斷那個(gè)按鍵按下了key16.c
#include"key16.h" #include "key.h" 0 /* 7 key1 key2 key3 key4 6 key5 key6 key7 key8 5 key9 key10 key11 key12 4 key13 key14 key15 key163 2 1 0*/ //假如引腳接地 會(huì)變成 0 但是引腳自己為0 的時(shí)候 和接地一樣的 int key_16_pandaun()//返回 矩陣按鍵模塊 那個(gè)按鍵 被按 {int num=0;//先列P1=0x0f;//后面 3 2 1 0 的二進(jìn)制位 為 0if(P1!=0x0f)//看按鍵是否按下{Delay10us(100000);//消抖 10msif(P1!=0x0f){if(P1==0x07){//key 1 對(duì)應(yīng)著 3 7 num+=1;}else if(P1==0x0b){//k2 對(duì)應(yīng)著2 7 num+=2;}else if(P1==0x0d){//k2 對(duì)應(yīng)著2 7 num+=3;}else if(P1==0x0e){//k2 對(duì)應(yīng)著2 7 num+=4;} }}//在行P1=0xf0;if(P1!=0xf0)//看按鍵是否按下{Delay10us(100000);//消抖 10msif(P1!=0xf0){if(P1==0x70){//key 1 對(duì)應(yīng)著 3 7 num+=0;}else if(P1==0xb0){//k2 對(duì)應(yīng)著2 7 num+=4;}else if(P1==0xd0){//k2 對(duì)應(yīng)著2 7 num+=8;}else if(P1==0xe0){//k2 對(duì)應(yīng)著2 7 num+=12;}} } P1=0xff;return num; }?main.c
#include <reg52.h> #include <intrins.h> #include "led.h" #include "BEEP.h" #include "key.h" #include "key16.h"void main() {int a;while(1){a=0;a=key_16_pandaun();if(a==1){play_LED(1);}else if(a==2){play_LED(2); } else if(a==3){play_LED(3);} else if(a==4){play_LED(4);} else if(a==5){play_LED(5);} else if(a==6){play_LED(6);} else if(a==7){play_LED(7);} else if(a==8){play_LED(8);} else if(a==9){close_LED(1);} else if(a==10){close_LED(2);}else if(a==11){close_LED(3);}else if(a==12){close_LED(4);}else if(a==13){close_LED(5);}else if(a==14){close_LED(6);}else if(a==15){close_LED(7);}else if(a==16){close_LED(8);} }}6.編寫程序的時(shí)候添加頭文件? ? 的方式? (是添加頭文件的路徑? ,離頭文件最近 的文件夾)
7.程序添加文件的方式?
????????
????????
總結(jié)
以上是生活随笔為你收集整理的单片机 实物 AT89C52RC day01 内容: LED 蜂鸣器 独立按键, 矩形按键模块的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 制作统计图好用的软件
- 下一篇: c语言齿轮标准模数选择编程,齿轮模数选取