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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機程序:出入庫管理系統的編輯

[復制鏈接]
跳轉到指定樓層
樓主
ID:488971 發表于 2019-3-12 08:19 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
單片機源程序如下:
  1. #include <reg51.h>
  2. #include <intrins.h>

  3. #define uchar unsigned char
  4. #define uint  unsigned int
  5. #define DS1302_SECOND        0x80                //秒寄存器
  6. #define DS1302_MINUTE        0x82                //分寄存器
  7. #define DS1302_HOUR                0x84                //小時寄存器
  8. #define DS1302_WEEK                0x8A                //星期寄存器
  9. #define DS1302_DAY                0x86                //日寄存器
  10. #define DS1302_MONTH        0x88                //月寄存器
  11. #define DS1302_YEAR                0x8C                //年寄存器
  12. #define right           1                        //正確
  13. #define error           0                        //錯誤

  14. typedef struct SYSTEMTIME
  15. {
  16.     uchar Second;
  17.     uchar Minute;
  18.     uchar Hour;
  19.     uchar Week;
  20.     uchar Day;
  21.     uchar Month;
  22.     uchar Year;
  23.     uchar DateString[9];
  24.     uchar TimeString[9];
  25. }SYSTEMTIME;                                                //定義的時間類型

  26. sbit ACC0=ACC^0;
  27. sbit ACC7=ACC^7;
  28. sbit DQ=P1^0;                                                //DS1990A數據線引腳                                               
  29. sbit SDA=P1^1;                                                //2402數據線引腳
  30. sbit SCL=P1^2;                                                //2402時鐘線引腳
  31. sbit DS1302_RST=P1^3;                                //DS1302復位線引腳
  32. sbit DS1302_CLK=P1^4;                                //DS1302時鐘線引腳
  33. sbit DS1302_IO=P1^5;                                //DS1302數據線引腳
  34. sbit din=P2^0;                                                //MAX7221數據線引腳
  35. sbit load=P2^1;                                                //MAX7221控制線引腳
  36. sbit clk=P2^2;                                                //MAX7221時鐘線引腳
  37. sbit Lock=P2^3;                                                //電子鎖控制線引腳

  38. uchar code CrcTable[256]={
  39.     0,94,188,226,97,63,221,131,194,156,126,32,163,253,31,65,
  40.     157,195,33,127,252,162,64,30,95,1,227,189,62,96,130,220,
  41.     35,125,159,193,66,28,254,160,225,191,93,3,128,222,60,98,
  42.     190,224,2,92,223,129,99,61,124,34,192,158,29,67,161,255,
  43.     70,24,250,164,39,121,155,197,132,218,56,102,229,187,89,7,
  44.     219,133,103,57,186,228,6,88,25,71,165,251,120,38,196,154,
  45.     101,59,217,135,4,90,184,230,167,249,27,69,198,152,122,36,
  46.     248,166,68,26,153,199,37,123,58,100,134,216,91,5,231,185,
  47.     140,210,48,110,237,179,81,15,78,16,242,172,47,113,147,205,
  48.     17,79,173,243,112,46,204,146,211,141,111,49,178,236,14,80,
  49.     175,241,19,77,206,144,114,44,109,51,209,143,12,82,176,238,
  50.     50,108,142,208,83,13,239,177,240,174,76,18,145,207,45,115,
  51.     202,148,118,40,171,245,23,73,8,86,180,234,105,55,213,139,
  52.     87,9,235,181,54,104,138,212,149,203,41,119,244,170,72,22,
  53.     233,183,85,11,136,214,52,106,43,117,151,201,74,20,246,168,
  54.     116,42,200,150,21,75,169,247,182,232,10,84,215,137,107,53
  55. };                                                                        //校驗碼查詢表

  56. uchar code ID[]={
  57.     0x01,0x2c,0xc5,0xb8,
  58.     0x00,0x00,0x00,0x8b};                        //默認訪問者身份ID

  59. uchar code dispcode[]={       
  60.         0x7e,0x30,0x6d,0x79,
  61.         0x33,0x5b,0x5f,0x70,
  62.         0x7f,0x7b,0x77,0x1f,
  63.         0x4e,0x3d,0x4f,0x47};                        //共陰極顯示代碼
  64.        
  65. bit flag=0;
  66. uchar CRCbyte,num=200,da_ad=0x00;        //CRC校驗碼,2402存儲地址
  67. uchar SN[8],time[6];
  68. uchar buf[]={0,0,0,0,0,0,0,0};
  69. SYSTEMTIME time1;

  70. /******************函數聲明*******************/
  71. void Init_DS1302(void);                                //DS1302初始化
  72. void Init_DS1990(void);                                //DS1990初始化
  73. void Init_T0(void);                                        //定時器T0初始化
  74. void DS1302InputByte(uchar d);                //DS1302
  75. void Write_1302(uchar ucAddr, uchar ucDa);//DS1302寫數據
  76. void DS1302_SetProtect(bit flag);        //DS1302寫保護設定
  77. void DS1302_SetTime(uchar Address, uchar Value);//DS1302設置時間函數
  78. void DS1302_GetTime(SYSTEMTIME *Time);//DS1302時間轉換函數
  79. void DS1302_time(void);                                //DS1302時間顯示函數
  80. void Init_MAX7221(void);                        //MAX7221初始化
  81. void Write_7221(uchar com,uchar da);//MAX7221寫字節程序
  82. void Delay(uint i);                                        //延時函數
  83. void Writebyte(uchar dat);                        //向DS1990A寫一個字節函數
  84. void Record(void);                                        //記錄訪問時間
  85. void Start_bit(void);                                //I2C起始函數
  86. void Stop_bit(void);                                //I2C停止函數
  87. bit Compare(void);                                        //驗證身份函數
  88. bit Read1990(void);                                        //讀身份信息函數
  89. bit Write_8bit(uchar ch);                        //I2C總線寫8位數據函數
  90. uchar DS1302OutputByte(void);                //DS1302讀一個字節
  91. uchar Read1302(uchar ucAddr);                //DS1302讀數據
  92. uchar CRC(uchar j);                                        //DS1990A校驗位計算函數
  93. uchar Readbyte(void);                                //從DS1990A讀一個字節函數
  94. uchar Page_wr(uchar firstw_ad,uchar counter,uchar *firstr_ad);//I2C總線頁面寫函數
  95. /******************主函數*******************/
  96. void main()
  97. {
  98.         uchar i;
  99.         Init_MAX7221();
  100.         Init_DS1302();
  101.         Init_T0();
  102.         P2=0;
  103.         while (1)
  104.     {
  105.                 if(Compare()==1)                        //身份驗證一致
  106.                 {
  107.                         Lock=1;                                        //閉合繼電器       
  108.                         TR0=1;                                        //定時器T0啟動
  109.                         Record();                                //記錄訪問時間
  110.                         for(i=1;i<9;i++)
  111.                         {
  112.                                 Write_7221(i,0x01);
  113.                         }
  114.                         if(da_ad==248)
  115.                                 da_ad=0;                        //判斷存儲內容是否已經滿
  116.                         else
  117.                                 da_ad+=8;                        //修改2402存儲地址
  118.                         while(Compare());
  119.                 }
  120.                 else
  121.                 {
  122.                         DS1302_time();                        //顯示當前時間                       
  123.                 }
  124.     }
  125. }
  126. /**************T0定時器初始化******************/
  127. void Init_T0(void)
  128. {
  129.         TMOD=0x01;                                                //工作方式1
  130.         TH0=(65536-50000)/256;                        //定時時間為0.5ms
  131.         TL0=(65536-50000)%256;
  132.         EA=1;                                                        //開總中斷
  133.         ET0=1;                                                        //允許定時器T0中斷
  134. }
  135. /**************T0定時器服務程序******************/
  136. void timer0(void) interrupt 1
  137. {
  138.         TH0=(65536-50000)/256;                        //重載初值
  139.         TL0=(65536-50000)%256;
  140.         num--;
  141.         if(num==0)                                                //5秒定時到
  142.         {
  143.                 TR0=0;                                                //關定時器T0               
  144.                 num=200;                                        //重載時間計數器
  145.                 Lock=0;                                                //斷開繼電器
  146.         }
  147. }
  148. /**************DS1302一個寫字節******************/
  149. void DS1302InputByte(uchar d)                //實時時鐘寫入一字節(內部函數)
  150. {
  151.     uchar i;
  152.     ACC=d;
  153.     for (i=8;i>0;i--)
  154.     {
  155.         DS1302_IO=ACC0;                                //相當于匯編中的 RRC
  156.         DS1302_CLK=1;
  157.         DS1302_CLK=0;                                //發一個高跳變到低的脈沖
  158.         ACC=ACC>>1;
  159.     }
  160. }
  161. /**************DS1302讀一個字節******************/
  162. uchar DS1302OutputByte(void)                //實時時鐘讀取一字節(內部函數)
  163. {
  164.     uchar i;
  165.     for (i=8;i>0;i--)
  166.     {
  167.         ACC=ACC>>1;                                        //相當于匯編中的 RRC
  168.         ACC7=DS1302_IO;
  169.         DS1302_CLK=1;
  170.         DS1302_CLK=0;                                //發一個高跳變到低的脈沖
  171.     }
  172.     return(ACC);
  173. }
  174. /****************DS1302寫數據********************/
  175. void Write_1302(uchar ucAddr, uchar ucDa)
  176. {
  177.     DS1302_RST=0;
  178.     DS1302_CLK=0;
  179.     DS1302_RST=1;
  180.     DS1302InputByte(ucAddr);                //地址,命令
  181.     DS1302InputByte(ucDa);                        //寫1Byte數據
  182.     DS1302_CLK=1;
  183.     DS1302_RST=0;
  184. }
  185. /****************DS1302讀數據********************/
  186. uchar Read1302(uchar ucAddr)                //讀取DS1302某地址的數據
  187. {
  188.     uchar ucData;
  189.     DS1302_RST=0;
  190.     DS1302_CLK=0;
  191.     DS1302_RST=1;                                        //enable
  192.     DS1302InputByte(ucAddr|0x01);        //地址,命令
  193.     ucData=DS1302OutputByte();                //讀1Byte數據
  194.     DS1302_CLK=1;
  195.     DS1302_RST=0;
  196.     return(ucData);
  197. }
  198. /**************DS1302寫保護設定******************/
  199. void DS1302_SetProtect(bit flag)        //是否寫保護
  200. {
  201.     if (flag)
  202.         Write_1302(0x8E,0x10);                 //WP=1,不能寫入
  203.     else
  204.         Write_1302(0x8E,0x00);                //WP=0,可以寫入
  205. }
  206. /**************DS1302設置時間函數****************/
  207. void DS1302_SetTime(uchar Address, uchar Value)       
  208. {
  209.     DS1302_SetProtect(0);
  210.     Write_1302(Address, ((Value/10)<<4|(Value%10)));//高4位為十位,低4位為個位
  211. }
  212. /*****************DS1302初始化******************/
  213. void Init_DS1302(void)
  214. {
  215.     uchar Second=Read1302(DS1302_SECOND);
  216.     if (Second&0x80)                                //如果第七為1(表明沒有啟動), 則啟動時鐘
  217.         DS1302_SetTime(DS1302_SECOND,0);
  218. }
  219. /**************DS1302時間轉換函數***************/
  220. void DS1302_GetTime(SYSTEMTIME *Time)
  221. {
  222.     uchar ReadValue;
  223.     ReadValue=Read1302(DS1302_SECOND);
  224.     Time->Second=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);        //轉換秒
  225.     ReadValue=Read1302(DS1302_MINUTE);
  226.     Time->Minute=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);        //轉換分
  227.     ReadValue=Read1302(DS1302_HOUR);
  228.     Time->Hour=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);        //轉換時
  229.     ReadValue=Read1302(DS1302_DAY);
  230.     Time->Day=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);        //轉換日
  231.     ReadValue=Read1302(DS1302_WEEK);
  232.     Time->Week=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);        //轉換星期
  233.     ReadValue=Read1302(DS1302_MONTH);
  234.     Time->Month=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);        //轉換月
  235.     ReadValue=Read1302(DS1302_YEAR);
  236.     Time->Year=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);        //轉換年
  237. }
  238. /*****************MAX7221初始化***************/
  239. void Init_MAX7221(void)
  240. {
  241.     Write_7221(0x0c,0x01);                        //正常工作狀態,關斷模式
  242.         Write_7221(0x09,0x00);                        //譯碼選擇,非BCD碼
  243.         Write_7221(0x0a,0x0f);                        //亮度調節
  244.         Write_7221(0x0b,0x07);                        //顯示位數
  245. }
  246. /**************MAX7221寫字節程序*************/
  247. void Write_7221(uchar com,uchar da)
  248. {
  249.     uchar temp,i,j;
  250.     load=0;
  251.     clk=0;
  252.     for (i=0;i<8;i++)                                //發送命令
  253.     {
  254.         temp=com;
  255.         if ((temp&(0x80>>i))!=0)
  256.             din=1;
  257.         else din=0;
  258.         clk=1;
  259.         for (j=0;j<5;j++);
  260.         clk=0;
  261.     }
  262.     for (i=0;i<8;i++)                                //發送數據
  263.     {
  264.         temp=da;
  265.         if ((temp&(0x80>>i))!=0)
  266.             din=1;
  267.         else din=0;
  268.         clk=1;
  269.         for (j=0;j<5;j++);
  270.         clk=0;
  271.     }
  272.     load=1;
  273. }
  274. /**************時間顯示函數*******************/
  275. void DS1302_time(void)
  276. {
  277.         DS1302_GetTime(&time1);                        //獲取當前時間
  278.         buf[7]=(time1.Second)%10;
  279.         buf[6]=(time1.Second)/10;
  280.         buf[4]=(time1.Minute)%10;
  281.         buf[3]=(time1.Minute)/10;
  282.         buf[1]=(time1.Hour)%10;
  283.         buf[0]=(time1.Hour)/10;
  284.         Write_7221(0x08,dispcode[buf[7]]);
  285.         Write_7221(0x07,dispcode[buf[6]]);
  286.         Write_7221(0x06,0x01);
  287.         Write_7221(0x05,dispcode[buf[4]]);
  288.         Write_7221(0x04,dispcode[buf[3]]);
  289.         Write_7221(0x03,0x01);
  290.         Write_7221(0x02,dispcode[buf[1]]);
  291.         Write_7221(0x01,dispcode[buf[0]]);
  292. }
  293. /**************I2C起始函數*******************/
  294. void Start_bit(void)
  295. {
  296.     SCL=1;_nop_();
  297.     SDA=1;_nop_();
  298.     SDA=0;_nop_();
  299.     SCL=0;_nop_();
  300. }
  301. /***************I2C停止函數******************/
  302. void Stop_bit(void)
  303. {
  304.     SDA=0;_nop_();
  305.     SCL=1;_nop_();
  306.     SDA=1;_nop_();
  307. }
  308. /***********I2C總線寫8位數據函數*************/
  309. bit Write_8bit(uchar ch)
  310. {
  311.     uchar i=8;
  312.     bit fan_w;
  313.     SCL=0;_nop_();
  314.     while (i--)
  315.     {
  316.         SDA=(bit)(ch&0x80);_nop_();
  317.         ch<<=1;
  318.         SCL=1;_nop_();
  319.         SCL=0;_nop_();
  320.     }
  321.     SDA=1;_nop_();
  322.     SCL=1;_nop_();
  323.     fan_w=SDA;
  324.     SCL=0;_nop_();
  325.     return(fan_w);
  326. }
  327. /************I2C總線頁面寫函數**************/
  328. uchar Page_wr(uchar firstw_ad,uchar counter,uchar *firstr_ad)
  329. {
  330.     uchar *ufirstr_ad;
  331.     ufirstr_ad=firstr_ad;
  332.     Start_bit();                                                //啟動I2C
  333.     if (Write_8bit(0xA0)!=0)                        //發送2402器件地址
  334.     {
  335.         Stop_bit();                                                //無應答,返回
  336.         return(0);
  337.     }
  338.     if (Write_8bit(firstw_ad)!=0)                //寫入數據的存儲地址
  339.     {
  340.         Stop_bit();                                                //無應答,返回
  341.         return(0);
  342.     }
  343.     while (counter--)                                        //寫入數據
  344.     {
  345.         if (Write_8bit(*ufirstr_ad)!=0)        //無應答,返回
  346.         {
  347.             Stop_bit();
  348.             return(0);
  349.         }
  350.         ufirstr_ad++;                                        //準備下一數據
  351.     }
  352.     Stop_bit();
  353.     return(1);                                                        //寫數據成功
  354. }
  355. /*****************延時函數******************/
  356. void Delay(uint i)
  357. {
  358.     while (i--);
  359. }
  360. /***********DS1990A校驗位計算函數***********/
  361. uchar CRC(uchar j)
  362. {
  363.     uchar i,crc_data=0;
  364.     for (i=0;i<j;i++)                                        //查表校驗
  365.         crc_data=CrcTable[crc_data^SN[i]];
  366.     return(crc_data);
  367. }
  368. /*************DS1990A初始化函數*************/
  369. void Init_DS1990(void)
  370. {
  371.     uchar i,x=0;
  372.     DQ=0;                                                                //置低
  373.     Delay(60);                                                        //延時480us
  374.     DQ=1;                                                                //釋放
  375.     Delay(10);                                                        //延時85us
  376.     for (i=0;i<10;i++)
  377.     {
  378.         if (DQ==0)                                                //如果拉低
  379.         {
  380.             flag=1;
  381.             break;
  382.         }
  383.     }
  384.     Delay(20);
  385. }
  386. /***********從DS1990A讀一個字節函數*********/
  387. uchar Readbyte(void)
  388. {
  389.     uchar i=0;
  390.     uchar temp=0;
  391.     for (i=0;i<8;i++)
  392.     {
  393.         DQ=0;
  394.         temp>>=1;
  395.         DQ=1;
  396.         _nop_();
  397.         if (DQ)temp|=0x80;
  398.         Delay(8);
  399.     }
  400.     return(temp);
  401. }
  402. /**********向DS1990A寫一個字節函數**********/
  403. void Writebyte(uchar dat)
  404. {
  405.     uchar i=0,send;
  406.     for (i=0;i<8;i++)
  407.     {
  408.         DQ=0;
  409.         send=dat&0x01;
  410.         if (send==0x01)
  411.         {
  412.             DQ=1;
  413.             Delay(15);
  414.         }
  415.         else
  416.         {
  417.             Delay(15);
  418.             DQ=1;
  419.         }
  420.         dat>>=1;
  421.     }
  422.     Delay(8);
  423. }
  424. /*************讀身份信息函數****************/
  425. bit Read1990(void)
  426. {
  427.     uchar i;
  428.         Init_DS1990();
  429.     if (flag==1)
  430.     {
  431.         while (DQ==0);
  432.         flag=0;
  433.         Writebyte(0x33);
  434.         for (i=0;i<8;i++)
  435.                         SN[i]=Readbyte();
  436.         CRCbyte=CRC(7);
  437.         if (CRCbyte==SN[7])
  438.                 {
  439.                         return(right);       
  440.                 }
  441.         else
  442.                         return(error);
  443.     }
  444.         else
  445.                 return(error);
  446. }
  447. /****************驗證身份函數***************/
  448. bit Compare(void)
  449. {
  450.     uchar i;
  451.         if (Read1990()==1)                                                //若身份驗證正確返回1,錯誤返回0
  452.     {
  453.                 for (i=0;i<8;i++)
  454.         {
  455.                         if (SN[i]!=ID[i])return(error);
  456.                 }
  457.                 return(right);
  458.         }
  459.         else
  460.                 return(error);
  461. }
  462. /****************記錄訪問時間***************/
  463. void Record(void)
  464. {
  465.         DS1302_GetTime(&time1);                                        //獲取訪問時間
  466.         time[0]=time1.Second;                                        //將訪問時間信息存入緩沖區
  467.         time[1]=time1.Minute;
  468.         time[2]=time1.Hour;
  469.         time[3]=time1.Day;
  470.         time[4]=time1.Month;
  471.         time[5]=time1.Year;
  472.         while(Page_wr(da_ad,6,time)==0);                //等待寫入成功
  473. }
復制代碼

所有資料51hei提供下載:
出入管理系統.zip (62.01 KB, 下載次數: 8)



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

使用道具 舉報

沙發
ID:1 發表于 2019-3-12 14:49 | 只看該作者
本帖需要重新編輯補全電路原理圖,源碼,詳細說明與圖片即可獲得100+黑幣(帖子下方有編輯按鈕)
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 韩日在线视频 | 日韩在线视频观看 | 久草视频在线播放 | 欧美一级欧美一级在线播放 | 欧美日韩不卡在线 | 欧美精品久久 | 久久久久一区 | 天堂中文在线观看 | 91精品国产综合久久久久久首页 | 亚洲中午字幕 | 亚洲免费大片 | 国产一区二区三区高清 | 久久久久久国 | 欧美日韩在线精品 | 91精品国产91久久久久久密臀 | 久久99精品久久久久婷婷 | 91精品久久久久久久久 | 亚洲精品亚洲人成人网 | 午夜免费网站 | 国产一级片 | 欧美精品一区二区三区四区 在线 | 日韩精品一区二区三区在线观看 | 成人免费黄色片 | 黄瓜av | 欧美精品 在线观看 | 丝袜 亚洲 欧美 日韩 综合 | 国产精品久久久久免费 | 亚洲天天干 | 中文字幕一区在线观看视频 | 高清黄色 | 日日夜夜草 | 丝袜一区二区三区 | 亚洲精品在线免费看 | 久久精品国产一区 | 精品国产乱码久久久久久久久 | a级片网站 | 中文在线a在线 | 亚洲精品成人免费 | 日韩免费在线 | 99一级毛片| 男女污污动态图 |