标题:
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.51hei.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.51hei.com/bbs/)
Powered by Discuz! X3.1