欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
RC522門禁系統單片機源程序 很穩定 有實物
[打印本頁]
作者:
51黑電子迷
時間:
2017-6-5 18:23
標題:
RC522門禁系統單片機源程序 很穩定 有實物
單片機門禁系統實物圖,lcd12864液晶顯示:
0.png
(379.72 KB, 下載次數: 64)
下載附件
2017-6-5 18:20 上傳
0.png
(55.12 KB, 下載次數: 78)
下載附件
2017-6-5 18:23 上傳
單片機源程序如下:
#include "include.h"
#define uint unsigned int
#define uchar unsigned char
unsigned char i;
unsigned int temp;
unsigned char table[4];
uchar code table1[]="℃";
/////////////////////18b20////////////////////////////////////
void Delay1(unsigned char a1,b1,c1)
{
unsigned char a,b,c;
for(a=0;a<a1;a++)
for(b=0;b<b1;b++)
for(c=0;c<c1;c++);
}
void init_ds()
{
dss = 1; //DQ復位,不要也可行。
Delay1(1,1,1); //稍做延時 10us
dss = 0; //單片機拉低總線
Delay1(6,1,63); //600 us //精確延時,維持至少480us
//Delay(1,1,15); //20us
dss = 1; //釋放總線,即拉高了總線
Delay1(5,1,63); //500us //此處延時有足夠,確保能讓DS18B20發出存在脈沖。
}
unsigned char tempreadbyte()//由時序圖知,向DS18B20寫入數據時,寫0和寫1的時序恰好相反
{ //所以如下程序用if和else分別寫入0和1;而當從DS18B20讀數據時,
uchar i = 0;
uchar dat = 0;
for(i=8;i>0;i--)
{
dss = 0; //將總線拉低,要在1us之后釋放總線
//單片機要在此下降沿后的15us內讀數據才會有效。
_nop_(); //至少維持了1us,表示讀時序開始
dat >>= 1; //讓從總線上讀到的位數據,依次從高位移動到低位。
dss = 1; //釋放總線,此后DS18B20會控制總線,把數據傳輸到總線上
Delay1(1,1,1); //延時10us,此處參照推薦的讀時序圖,盡量把控制器采樣時間放到讀時序后的15us內的最后部分
if(dss) //控制器進行采樣
{
dat |= 0x80; //若總線為1,即DQ為1,那就把dat的最高位置1;若為0,則不進行處理,保持為0
}
Delay1(1,1,8); //20us //此延時不能少,確保讀時序的長度60us。
}
return (dat);
}
void tempwritebyte(unsigned char dat)//由時序圖知,向DS18B20寫入數據時,寫0和寫1的時序恰好相反
{ //所以如下程序用if和else分別寫入0和1;而當從DS18B20讀數據時,
uchar i = 0;
for(i=8;i>0;i--)
{
dss = 0; //拉低總線
_nop_(); //至少維持了1us,表示寫時序(包括寫0時序或寫1時序)開始
dss = dat&0x01; //從字節的最低位開始傳輸
//指令dat的最低位賦予給總線,必須在拉低總線后的15us內,
//因為15us后DS18B20會對總線采樣。
Delay1(1,1,15); //必須讓寫時序持續至少60us
dss = 1; //寫完后,必須釋放總線,
dat >>= 1;
Delay1(1,1,1);
}
}
void tempchange()
{
get_temp();
init_ds();
delay_ms(1);
// tempwritebyte(0xcc);
// tempwritebyte(0x44);
lcdDingwei(4,5);//換行
table[0]=temp/100+'0'; //溫度的使用
table[1]=temp/10%10+'0';
table[2]='.';
table[3]=temp%10+'0';
for(i=0;i<4;i++)
lcdTransferData(table[i],1);
for(i=0;i<2;i++)
lcdTransferData(table1[i],1);
}
void get_temp()
{
float tt;
uchar a,b;
init_ds(); //初始化
tempwritebyte(0xcc); //忽略ROM指令
tempwritebyte(0x44); //溫度轉換指令
init_ds(); //初始化
tempwritebyte(0xcc); //忽略ROM指令
tempwritebyte(0xbe); //讀暫存器指令
a = tempreadbyte(); //讀取到的第一個字節為溫度LSB
b = tempreadbyte(); //讀取到的第一個字節為溫度MSB
temp = b; //先把高八位有效數據賦于wendu
temp <<= 8; //把以上8位數據從wendu低八位移到高八位
temp = temp|a; //兩字節合成一個整型變量
tt = temp*0.0625; //得到真實十進制溫度值
//因為DS18B20可以精確到0.0625度
//所以讀回數據的最低位代表的是0.0625度
temp = tt*10+0.5; //放大十倍
//這樣做的目的將小數點后第一位也轉換為可顯示數字
//同時進行一個四舍五入操作。
//return temp;
}
///////////////////////////////////////////////////////////////////
void delay_ms( INT16U tms )
{
INT16U i;
while( tms-- )
{
for( i = 0; i < 300; i ++ )
{
nop();
nop();
nop();
nop();
nop();
nop();
}
}
}
void init_led( void )
{
P1 = 0x00;
delay_ms(200);
P1 = 0Xff;
}
void init_port( void )
{
// P0M1 = 0x00;
// P0M0 = 0xff;
P3M1 &= ~0x10;
P3M0 |= 0x10;
//
// P1M1=0x00;
// P1M0=0x00;
//
// P2M1=0x00;
// P2M0=0xff;
//
// P30=1;
// P3M1=0x41;
// P3M0=0xa2;
//
// P4M1=0x02;
// P4M0=0x00;
BEEP_OFF;
LED_OFF;
}
void init_par( void )
{
BEEP_OFF;
LED_OFF;
}
void init_wdt( void ) //2.7S
{
// WDT_CONTR = 0xC1;
// WDT_CONTR = 0x3E;
}
void feed_wdt( void )
{
// WDT_CONTR = 0x3E;
}
void init_all(void)
{
EA = 0;
init_timer();
init_uart();
init_port();
init_rc522();
init_par();
init_wdt();
init_led();
EA = 1;
}
void main(void)
{
if((PCON&0x10)==0) //如果POF位=0
{
PCON=PCON|0x10; //將POF位置1
IAP_CONTR=0x60; //軟復位,從ISP監控區啟動
}
else
{
PCON=PCON&0xef; //將POF位清零
}
lcdInitinal();
lcdMsg("watch dog",1,0);
lcdMsg("rfid-rc522",2,0);
lcdMsg("ds18b20",3,0);
lcdMsg("Pending update",4,0);
delay_ms(3000);
<blockquote>/*<span class="Apple-tab-span" style="white-space:pre"> </span>while(row1==0)
復制代碼
所有資料51hei提供下載:
http://www.raoushi.com/bbs/dpj-86940-1.html
作者:
飛時達發651
時間:
2017-8-23 16:50
社區有你才精彩 感謝分享
作者:
yaole1314
時間:
2019-5-28 20:56
這幾條調這個頭都大了
作者:
venjo
時間:
2019-5-28 23:48
我來學習一下,謝謝分享
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1