|
单片机门禁系统实物图,lcd12864液晶显示:
单片机源程序如下:
- #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
|
评分
-
查看全部评分
|