rfid 門卡系統(tǒng)和人體紅外感應(yīng)開發(fā)
今天忙了一天了,因為畢昇杯我發(fā)現(xiàn)如果不加把勁,可能寒假之前代碼搞不出了,今天突擊了兩個模塊,一個人體感應(yīng)模塊,和rfid刷卡模塊,這兩個模塊談不上自己編寫代碼,今天的任務(wù)也僅僅是看懂了代碼,現(xiàn)在我總結(jié)一下今天的所得
人體感應(yīng)模塊,開始的時候,問題出在兩個方面,第一個就是我竟然不小心把電源看錯了,因為圖上沒得標記,搞起我用電壓表測量輸出的電壓,結(jié)果發(fā)現(xiàn)輸出的結(jié)果總是4.46V,我開始因為是關(guān)照強度的問題,就把他放在一個黑盒子了,結(jié)果還是4.46V,于是糾結(jié)了好久才弄處理
第二個點,值得注意的地方,就是單片機檢測電平的變化,因為紅外感應(yīng)模塊本身就不難,我開始想用中斷,因為這樣的話,可以節(jié)省單片機的內(nèi)部的資源,其實這個想法昨晚上就有了,后來才知道,51單片機只能夠是低電平觸發(fā)中斷,這樣的話,原來的方案就不能實現(xiàn)
還是郭老師那句話好呀,51單片機在進行輸入的時候,要對其進行寫1 操作,這樣才能夠讀出管腳的I/O的變化,對于51單片機的管腳的知識,今天百度了一下,這里有幾篇比較好的文章推薦給大家
博客:這個是別個總結(jié)的,感覺很有用
IO口檢測高點平的問題,曾經(jīng)而困擾我不少時間,呵呵。
這幾天做一個項目,又有點暈呼了,查了不少資料,做了一個總結(jié),和大家分享~~
1、51單片機的I/O 口檢測高低電平是需要首先讓該端口置為1的。此時這個引腳才被設(shè)置為輸入。
2、如果是avr單片機,可以通過設(shè)置DDRx的值來設(shè)置輸入輸出(詳見數(shù)據(jù)手冊~~)
3、切忌要將單片機的檢測端口設(shè)置為輸入,否則可能影響被檢測模塊端口的電壓(如:被拉低電平至0v,或被拉高)
4、注意單片機一般是TTL電平模式的,因此高電平的最低應(yīng)該是2V,低電平的最高應(yīng)該是0.8V。(具體還是見數(shù)據(jù)手冊比較保險一點)
示例代碼:
#include
sbit led = P1^1;
sbit hongwai = P1^2;
typedef unsigned int uint ;
//延時函數(shù)
void delay(uint x)
{
uint i,j;
for (i = x;i>0;i--)
for(j = 110;j>0;j--);
}
main()
{
hongwai = 1;
while(1)
{
if(hongwai ==1)//檢測到高電平的話,延時一下
{
delay(20);
if(hongwai == 1)//再次檢測一下
{
led = 0;
}
}
else
led = 1;
}
}
步進電機:
其實以前我還在糾結(jié)為什么我的步進電機總要比其他人的壞的快,原來是沒有弄清楚步進電機的正極,因為步進電機通常是采用5根線,所以,紅色的那根通常是正極,步進電機的驅(qū)動很簡單,這里不做總結(jié)
rfid模塊:
從吃完中飯就回來弄這個模塊了,這個模塊比較小氣,代碼比較長,我今天下午可以說是把他從頭到腳打量了一下午,但是還是沒有結(jié)果,最后,問達鑫,因為達鑫做出來了,后來才知道,這個模塊的電壓一定要嚴格的限定在3.3v,我今天下午沒有弄出來的原因就是電源偏高,我在慶幸沒有把模塊燒壞,因為今天電源雖然說是3.3v,結(jié)果到最后才知道他有3.47V,導(dǎo)致模塊一直處于高電壓狀態(tài),這個模塊的電壓最好一定要等于3.3v
示例代碼:這里給出主程序
#include
#include"ICRead.h"
unsigned char status;
unsigned char RevBuffer[2];
unsigned char CardNum[4];
unsigned char Duanma[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
/*******************
系統(tǒng)初始化函數(shù)
*********************/
void InitializeSystem()
{
DZ=1;
P0=0;
DZ=0;
LED=1;
P0 = 0xFF;
LED=0;
PcdReset(); //RC522 restart;
PcdAntennaOff(); //關(guān)閉天線
PcdAntennaOn(); //開啟天線
M500PcdConfigISOType( 'A' );//設(shè)置RC632的工作方式;
}
void delay10ms()
{
unsigned char i,j;
for(i=123;i>0;i--)
for(j=10;j>0;j--);
}
void main()
{
unsigned char i,digitron;
InitializeSystem( );
status=PcdRequest(PICC_REQIDL,&RevBuffer[0]);
status=PcdAnticoll(CardNum);
if(status==MI_OK)
{
while(1)
{
digitron=0xfe;
for(i=0;i<4;i++)
{
delay10ms();
Wei=1;
P0=digitron;
digitron<<=1;
Wei=0;
Duan=1;
P0=Duanma[CardNum[i]%10];
Duan=0;
delay10ms();
}
}
}
}
明天還有串口通信,這兩個程序還是比較經(jīng)典的,明天加上串口通信,應(yīng)該就可以刷卡進門了,對了,因為51好像有一個銀行卡結(jié)賬的示例程序,明天看看,可不可以移植到我們的豬舍上來