找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6489|回复: 3
收起左侧

RC522门禁系统单片机源程序 很稳定 有实物

  [复制链接]
ID:161768 发表于 2017-6-5 18:23 | 显示全部楼层 |阅读模式
单片机门禁系统实物图,lcd12864液晶显示:
0.png
0.png

单片机源程序如下:
  1. #include "include.h"
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. unsigned char i;
  5. unsigned int temp;
  6. unsigned char table[4];
  7. uchar code table1[]="℃";
  8. /////////////////////18b20////////////////////////////////////
  9. void Delay1(unsigned char a1,b1,c1)
  10. {
  11. unsigned char a,b,c;
  12. for(a=0;a<a1;a++)
  13. for(b=0;b<b1;b++)
  14. for(c=0;c<c1;c++);
  15. }
  16. void init_ds()
  17. {

  18.         dss = 1;                     //DQ复位,不要也可行。
  19.         Delay1(1,1,1);                  //稍做延时  10us
  20.         dss = 0;                    //单片机拉低总线
  21.         Delay1(6,1,63); //600  us      //精确延时,维持至少480us
  22.         //Delay(1,1,15); //20us
  23.         dss = 1;                    //释放总线,即拉高了总线
  24.         Delay1(5,1,63); //500us               //此处延时有足够,确保能让DS18B20发出存在脉冲。
  25. }
  26. unsigned char tempreadbyte()//由时序图知,向DS18B20写入数据时,写0和写1的时序恰好相反
  27. {                   //所以如下程序用if和else分别写入0和1;而当从DS18B20读数据时,
  28.         uchar i   = 0;
  29.         uchar dat = 0;
  30.         for(i=8;i>0;i--)
  31.            {
  32.            dss = 0;                  //将总线拉低,要在1us之后释放总线
  33.                                    //单片机要在此下降沿后的15us内读数据才会有效。
  34.            _nop_();                 //至少维持了1us,表示读时序开始
  35.            dat >>= 1;               //让从总线上读到的位数据,依次从高位移动到低位。
  36.            dss = 1;                  //释放总线,此后DS18B20会控制总线,把数据传输到总线上
  37.            Delay1(1,1,1);        //延时10us,此处参照推荐的读时序图,尽量把控制器采样时间放到读时序后的15us内的最后部分
  38.            if(dss)                   //控制器进行采样
  39.            {
  40.             dat |= 0x80;            //若总线为1,即DQ为1,那就把dat的最高位置1;若为0,则不进行处理,保持为0
  41.            }        
  42.            Delay1(1,1,8);       //20us        //此延时不能少,确保读时序的长度60us。
  43.        }
  44.         return (dat);
  45. }
  46. void tempwritebyte(unsigned char dat)//由时序图知,向DS18B20写入数据时,写0和写1的时序恰好相反
  47. {                            //所以如下程序用if和else分别写入0和1;而当从DS18B20读数据时,
  48.         uchar i = 0;
  49.         for(i=8;i>0;i--)
  50.         {
  51.            dss = 0;                        //拉低总线
  52.            _nop_();                       //至少维持了1us,表示写时序(包括写0时序或写1时序)开始
  53.            dss = dat&0x01;                 //从字节的最低位开始传输
  54.                                          //指令dat的最低位赋予给总线,必须在拉低总线后的15us内,
  55.                                          //因为15us后DS18B20会对总线采样。
  56.            Delay1(1,1,15);               //必须让写时序持续至少60us
  57.            dss = 1;                        //写完后,必须释放总线,
  58.            dat >>= 1;
  59.            Delay1(1,1,1);         
  60.         }
  61. }

  62. void tempchange()
  63. {
  64.         get_temp();
  65.         init_ds();
  66.         delay_ms(1);
  67. //        tempwritebyte(0xcc);
  68. //        tempwritebyte(0x44);

  69.         lcdDingwei(4,5);//换行
  70.         table[0]=temp/100+'0';                   //温度的使用
  71.         table[1]=temp/10%10+'0';
  72.         table[2]='.';
  73.         table[3]=temp%10+'0';
  74.     for(i=0;i<4;i++)
  75.     lcdTransferData(table[i],1);
  76.         for(i=0;i<2;i++)
  77.     lcdTransferData(table1[i],1);
  78. }
  79. void get_temp()
  80. {
  81.                 float tt;
  82.                 uchar a,b;
  83.                 init_ds();                //初始化
  84.                 tempwritebyte(0xcc);          //忽略ROM指令
  85.                 tempwritebyte(0x44);          //温度转换指令
  86.                 init_ds();                 //初始化
  87.                 tempwritebyte(0xcc);          //忽略ROM指令
  88.                 tempwritebyte(0xbe);          //读暂存器指令
  89.                 a = tempreadbyte();           //读取到的第一个字节为温度LSB
  90.                 b = tempreadbyte();           //读取到的第一个字节为温度MSB
  91.                 temp = b;                      //先把高八位有效数据赋于wendu
  92.                 temp <<= 8;                    //把以上8位数据从wendu低八位移到高八位
  93.                 temp = temp|a;                //两字节合成一个整型变量
  94.                 tt = temp*0.0625;              //得到真实十进制温度值
  95.                                                 //因为DS18B20可以精确到0.0625度
  96.                                                 //所以读回数据的最低位代表的是0.0625度
  97.                 temp = tt*10+0.5;               //放大十倍
  98.                                                 //这样做的目的将小数点后第一位也转换为可显示数字
  99.                                                 //同时进行一个四舍五入操作。
  100. //return temp;
  101. }
  102. ///////////////////////////////////////////////////////////////////
  103. void delay_ms( INT16U tms )
  104. {
  105.     INT16U i;

  106.     while( tms-- )
  107.     {
  108.             for( i = 0; i < 300; i ++ )
  109.             {
  110.             nop();
  111.             nop();
  112.             nop();
  113.             nop();
  114.             nop();
  115.             nop();
  116.             }
  117.     }
  118. }

  119. void init_led( void )
  120. {
  121.     P1 = 0x00;
  122.     delay_ms(200);
  123.     P1 = 0Xff;
  124. }

  125. void init_port( void )
  126. {
  127. //    P0M1 = 0x00;
  128. //    P0M0 = 0xff;

  129.     P3M1 &= ~0x10;
  130.     P3M0 |= 0x10;
  131.     //
  132.     //        P1M1=0x00;
  133.     //        P1M0=0x00;
  134.     //
  135.     //        P2M1=0x00;
  136.     //        P2M0=0xff;
  137.     //
  138.     //        P30=1;
  139.     //        P3M1=0x41;
  140.     //        P3M0=0xa2;
  141.     //
  142.     //        P4M1=0x02;
  143.     //        P4M0=0x00;
  144.     BEEP_OFF;
  145.     LED_OFF;
  146. }

  147. void init_par( void )
  148. {
  149.     BEEP_OFF;
  150.     LED_OFF;
  151. }

  152. void init_wdt( void )         //2.7S
  153. {
  154.     //        WDT_CONTR = 0xC1;
  155.     //        WDT_CONTR = 0x3E;
  156. }

  157. void feed_wdt( void )
  158. {
  159.     //        WDT_CONTR = 0x3E;
  160. }

  161. void init_all(void)
  162. {
  163.     EA = 0;

  164.     init_timer();
  165.     init_uart();
  166.     init_port();
  167.     init_rc522();
  168.     init_par();
  169.     init_wdt();
  170.     init_led();

  171.     EA = 1;
  172. }

  173. void main(void)
  174. {
  175.     if((PCON&0x10)==0) //如果POF位=0
  176.     {
  177.        PCON=PCON|0x10;  //将POF位置1
  178.        IAP_CONTR=0x60;  //软复位,从ISP监控区启动
  179.     }
  180.     else
  181.     {
  182.        PCON=PCON&0xef;  //将POF位清零
  183.     }

  184.     lcdInitinal();
  185.     lcdMsg("watch dog",1,0);
  186.     lcdMsg("rfid-rc522",2,0);
  187.         lcdMsg("ds18b20",3,0);
  188.     lcdMsg("Pending update",4,0);
  189.     delay_ms(3000);

  190. <blockquote>/*<span class="Apple-tab-span" style="white-space:pre">        </span>while(row1==0)
复制代码

所有资料51hei提供下载:
http://www.51hei.com/bbs/dpj-86940-1.html




评分

参与人数 2黑币 +10 收起 理由
yida1698 + 5 赞一个!
maybea + 5 同是新人的奖励,好帖

查看全部评分

回复

使用道具 举报

ID:228989 发表于 2017-8-23 16:50 | 显示全部楼层
社区有你才精彩 感谢分享
回复

使用道具 举报

ID:542293 发表于 2019-5-28 20:56 | 显示全部楼层
这几条调这个头都大了
回复

使用道具 举报

ID:514795 发表于 2019-5-28 23:48 | 显示全部楼层
我来学习一下,谢谢分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表