久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6923|回復: 3
打印 上一主題 下一主題
收起左側

RC522門禁系統單片機源程序 很穩定 有實物

  [復制鏈接]
跳轉到指定樓層
樓主
單片機門禁系統實物圖,lcd12864液晶顯示:



單片機源程序如下:
  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.zg4o1577.cn/bbs/dpj-86940-1.html




評分

參與人數 2黑幣 +10 收起 理由
yida1698 + 5 贊一個!
maybea + 5 同是新人的獎勵,好帖

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏4 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 在线观看av中文字幕 | 在线观看黄免费 | 一级h片| 四虎成人免费视频 | 亚洲国产一区二区视频 | 国产视频不卡一区 | 欧美国产一区二区 | 亚洲区在线 | 狠狠干网 | 国产成人免费视频网站高清观看视频 | 看毛片网站 | 天天干夜夜拍 | 欧美精品久久久久久久久久 | 亚洲国产成人精品女人久久久 | 91电影在线 | 精品国产鲁一鲁一区二区张丽 | 亚洲免费人成在线视频观看 | 亚洲精品电影网在线观看 | 久久综合伊人 | 欧美中文字幕 | 成人一级视频在线观看 | 亚洲精品乱码久久久久久9色 | 欧美一区在线视频 | 欧美mv日韩mv国产网站91进入 | 国产免费福利在线 | 一区二区三区亚洲 | 中文字幕国产 | 亚洲精品久久久一区二区三区 | 一级特黄a大片 | 日本久久一区二区三区 | 一区二区在线观看av | 成人网视频 | 国产九九精品视频 | 黄色a级一级片 | 日日天天 | 久草视频网站 | 国产伦一区二区三区 | 日韩欧美在线一区二区 | 天天操天天操 | 欧美另类日韩 | 九九精品在线 |