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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機人員計數器+時鐘程序設計

[復制鏈接]
跳轉到指定樓層
樓主
設計要求:
1、實現0―9999范圍計數。
2、要求使用紅外發光二極管、光電管檢測;
3、12864顯示:進門人數,出門人數,房間里人數;
4、要求光電發射管與接收管有1米以上的間距

程序已通過清翔電子開發板完美測試    (可采用光敏、紅外、熱釋電紅外計數)

液晶端口
     DATA:P0.0~P0.7
         RS:P3.5
        RW:P3.6
         EN:P3.4
       PSB:P3.7

1302端口
     DAT:P1.1
     CLK:P1.0
     RST:P1.2

獨立按鍵端口:P3.0~P3.3


單片機源程序如下:
  1. /******************************************************************
  2. /
  3. /  名稱:人員計數器+時鐘(12864顯示)
  4. /
  5. ******************************************************************/

  6. #include <reg52.h>                       //調用單片機頭文件
  7. #include <intrins.h>
  8. #include "12864.c"               
  9. #define uchar unsigned char  //無符號字符型 宏定義   變量范圍0~255
  10. #define uint  unsigned int   //無符號整型 宏定義     變量范圍0~65535

  11. sbit hw_jin=P1^0;   //紅外傳感器IO口定義
  12. sbit hw_chu=P1^1;   //紅外傳感器IO口定義

  13. sbit sda=P1^3;             //數據線
  14. sbit clk=P1^4;             //時鐘線
  15. sbit rst=P1^2;             //使能

  16. sbit mode=P3^0;      //設置鍵
  17. sbit s1  =P3^1;      //加鍵
  18. sbit s2  =P3^2;      //減鍵
  19. sbit yes =P3^3;             //調整確認鍵
  20. sbit speak=P2^3;

  21. sbit ACC0=ACC^0;         //累加器A低位
  22. sbit ACC7=ACC^7;         //累加器A高位

  23. uchar dis,temp,a,h,m,n;       //設置參數用
  24. uchar set_num=80;             //設置倒計時數的啟始值
  25. uint num;                     //總數
  26. uint jin,chu;                              //進   出
  27. uchar sec,min,hour,day,mouth,year,week;
  28. bit flag;

  29. /***************寫數據********************/
  30. void write_byte(uchar dat)
  31. {
  32.         ACC=dat;
  33.         rst=1;
  34.         for(a=8;a>0;a--)
  35.         {
  36.          sda=ACC0;
  37.          clk=0;
  38.          clk=1;
  39.          ACC=ACC>>1;
  40.         }
  41. }

  42. /******************讀數據********************/
  43. uchar read_byte()
  44. {
  45.         rst=1;
  46.         for(a=8;a>0;a--)
  47.         {
  48.          ACC7=sda;
  49.          clk=1;
  50.          clk=0;
  51.          ACC=ACC>>1;
  52.         }
  53.         return (ACC);
  54. }

  55. /*********向1302芯片寫函數,指定寫入地址,數據*********/
  56. void write_1302(uchar add,uchar dat)
  57. {
  58.         rst=0;
  59.         clk=0;
  60.         rst=1;
  61.         write_byte(add);
  62.         write_byte(dat);
  63.         clk=1;
  64.         rst=0;
  65. }

  66. /*********從1302讀數據函數,指定讀取數據來源地址*******/
  67. uchar read_1302(uchar add)
  68. {
  69.         uchar temp;
  70.         rst=0;
  71.         clk=0;
  72.         rst=1;
  73.         write_byte(add);
  74.         temp=read_byte();
  75.         clk=1;
  76.         rst=0;
  77.         return(temp);
  78. }

  79. /****************BCD碼轉十進制函數,輸入BCD,返回十進制*******/
  80. uchar BCD(uchar m)
  81. {
  82. uchar x;
  83. x=m>>4;
  84. return(x=x*10+(m&=0x0f));
  85. }

  86. /********1302芯片初始化子函數********/
  87. void ds1302_init()
  88. {
  89. rst=0;
  90. clk=0;
  91. write_1302(0x8e,0x00); //允許寫,禁止寫保護
  92. delay(30);
  93. write_1302(0x8e,0x80); //打開寫保護
  94. }

  95. /***********************1ms延時函數*****************************/
  96. void delayms(uint q)
  97. {
  98.         uint i,j;
  99.         for(i=0;i<q;i++)
  100.                 for(j=0;j<120;j++);
  101. }

  102. /*************定時器0初始化程序***************/
  103. void time_init()         
  104. {
  105.         EA  =1;                  //開總中斷
  106.         TMOD=0X01;               //定時器0、工作方式1
  107.         ET0 =1;                  //開定時器0中斷
  108.         TR0 =1;                  //允許定時器0定時
  109. }

  110. /******************紅外計數**********************/           
  111. void hw_jin_dis()                   //紅外計數
  112. {
  113.   if(hw_jin==0)                     //計數
  114. {
  115.    delayms(1);                     //消抖動
  116.     if(hw_jin==1)                                   //仿真時修改hw_jin==0 可以直觀看到計數
  117.     {                              //確認
  118.           jin++;              
  119.          if(jin>=9999)  jin=9999; //最大計9999
  120.          num=jin-chu;             //計算總人數
  121.           if(dis==0)
  122.          {
  123.                    lcd_pos(0,2);
  124.                lcd_wdat(table[jin%10000/1000]);
  125.                lcd_wdat(table[jin%1000/100]);
  126.                lcd_wdat(table[jin%100/10]);
  127.                lcd_wdat(table[jin%10]);                                                                 
  128.            lcd_pos(2,2);
  129.                lcd_wdat(table[num%10000/1000]);
  130.                lcd_wdat(table[num%1000/100]);
  131.                lcd_wdat(table[num%100/10]);
  132.                lcd_wdat(table[num%10]);
  133.          }
  134.     }                        
  135. }
  136. }

  137. /******************紅外計數**********************/           
  138. void hw_chu_dis()                //紅外計數
  139. {
  140.   if(hw_chu==0)                 //計數
  141. {
  142.    delayms(1);                  //消抖動
  143.    if(hw_chu==1)                                //仿真時修改hw_chu==0 可以直觀看到計數
  144.     {                           //確認
  145.       if(jin>chu)          chu++;
  146.       if(chu>=9999) chu=9999;
  147.       num=jin-chu;             //計算總人數
  148.        if(dis==0)
  149.       {
  150.             lcd_pos(1,2);
  151.             lcd_wdat(table[chu%10000/1000]);
  152.             lcd_wdat(table[chu%1000/100]);
  153.             lcd_wdat(table[chu%100/10]);
  154.             lcd_wdat(table[chu%10]);
  155.         lcd_pos(2,2);
  156.             lcd_wdat(table[num%10000/1000]);
  157.             lcd_wdat(table[num%1000/100]);
  158.             lcd_wdat(table[num%100/10]);
  159.             lcd_wdat(table[num%10]);
  160.       }
  161.     }                        
  162. }
  163. }

  164. void time_display()
  165. {
  166.   lcd_pos(2,6);
  167.   lcd_wdat(table[sec/10]);
  168.   lcd_wdat(table[sec%10]);
  169.   lcd_pos(1,6);
  170.   lcd_wdat(table[min/10]);
  171.   lcd_wdat(table[min%10]);
  172.   lcd_pos(0,6);
  173.   lcd_wdat(table[hour/10]);
  174.   lcd_wdat(table[hour%10]);
  175.   lcd_pos(3,1);
  176.   lcd_wdat(table[year/10]);
  177.   lcd_wdat(table[year%10]);
  178.   lcd_pos(3,3);
  179.   lcd_wdat(table[mouth/10]);
  180.   lcd_wdat(table[mouth%10]);
  181.   lcd_pos(3,5);
  182.   lcd_wdat(table[day/10]);
  183.   lcd_wdat(table[day%10]);
  184. }
  185. void key()
  186. {
  187. if(mode==0)                           //第一次判斷"模式"按鍵按下
  188. {
  189.   delay(5);                            //延時消抖
  190.   if(mode==0){TR0=0;n++;}while(!mode);}                                                           
  191.   if(n>6) {TR0=1;n=0;}

  192. if(n!=0)
  193. {
  194.    if(s1==0)                            //調整+鍵
  195. {
  196.         delay(30);
  197. if(s1==0)
  198. {
  199.   TR0=0;
  200.    switch(n)
  201.   {
  202.         case 1:sec++;                          //設置鍵按動1次,調秒
  203.                    if(sec==60)        sec=0;                   //秒超過59,再加1,就歸零               
  204.                     lcd_pos(2,6);
  205.            lcd_wdat(table[sec/10]);
  206.            lcd_wdat(table[sec%10]);
  207.                    temp=(sec)/10*16+(sec)%10;      //十進制轉換成DS1302要求的DCB碼
  208.                    write_1302(0x8e,0x00);          //允許寫,禁止寫保護
  209.                    write_1302(0x80,temp);          //向DS1302內寫秒寄存器80H寫入調整后的秒數據BCD碼
  210.                    write_1302(0x8e,0x80);          //打開寫保護
  211.                    break;
  212.   case 2:min++;                                                   //設置鍵按動2次,調分
  213.                    if(min==60)        min=0;                           //分數據加到60時自動變成0
  214.                    lcd_pos(1,6);
  215.            lcd_wdat(table[min/10]);
  216.            lcd_wdat(table[min%10]);
  217.                    temp=(min)/10*16+(min)%10;      //十進制轉換成DS1302要求的DCB碼
  218.                    write_1302(0x8e,0x00);          //允許寫,禁止寫保護
  219.                    write_1302(0x82,temp);          //向DS1302內寫分寄存器82H寫入調整后的分數據BCD碼
  220.                    write_1302(0x8e,0x80);          //打開寫保護
  221.                    break;
  222.         case 3:hour++;
  223.                    if(hour==24) hour=0;                           //時數據加到24時自動變成0
  224.                    lcd_pos(0,6);
  225.            lcd_wdat(table[hour/10]);
  226.            lcd_wdat(table[hour%10]);
  227.                    temp=(hour)/10*16+(hour)%10;    //十進制轉換成DS1302要求的DCB碼
  228.                    write_1302(0x8e,0x00);          //允許寫,禁止寫保護
  229.                    write_1302(0x84,temp);          //向DS1302內寫小時寄存器84H寫入調整后的小時數據BCD碼
  230.                    write_1302(0x8e,0x80);          //打開寫保護
  231.                       break;
  232.         case 4:day++;                                                   //設置鍵按動5次,調天
  233.                    if(day==32)        day=1;                           //天數據加到32時自動變成1
  234.                    if(mouth==2){if(day==30)        day=1;}
  235.                    if(mouth==4){if(day==31)        day=1;}
  236.                    if(mouth==6){if(day==31)        day=1;}
  237.                    if(mouth==9){if(day==31)        day=1;}
  238.                    if(mouth==11){if(day==31)day=1;}
  239.                      lcd_pos(3,5);
  240.            lcd_wdat(table[day/10]);
  241.            lcd_wdat(table[day%10]);
  242.                    temp=(day)/10*16+(day)%10;      //十進制轉換成DS1302要求的DCB碼
  243.                    write_1302(0x8e,0x00);          //允許寫,禁止寫保護
  244.                    write_1302(0x86,temp);          //向DS1302內寫日期寄存器86H寫入調整后的日期數據BCD碼
  245.                    write_1302(0x8e,0x80);          //打開寫保護                   write_1602com(yh+10);
  246.                    break;
  247.         case 5:mouth++;                                                   //設置鍵按動6次,調月
  248.                    if(mouth>=13)        mouth=1;           //月數據加到12時自動變成1
  249.            lcd_pos(3,3);
  250.            lcd_wdat(table[mouth/10]);
  251.            lcd_wdat(table[mouth%10]);                  
  252.                    temp=(mouth)/10*16+(mouth)%10;  //十進制轉換成DS1302要求的DCB碼
  253.                    write_1302(0x8e,0x00);          //允許寫,禁止寫保護
  254.                    write_1302(0x88,temp);          //向DS1302內寫月份寄存器88H寫入調整后的月份數據BCD碼
  255.                    write_1302(0x8e,0x80);          //打開寫保護
  256.                    break;
  257.         case 6:year++;                                                   //設置鍵按動7次,調年
  258.                    if(year==100)         year=0;           //年數據加到100時自動變成0
  259.                    lcd_pos(3,1);
  260.            lcd_wdat(table[year/10]);
  261.            lcd_wdat(table[year%10]);
  262.            temp=(year)/10*16+(year)%10;    //十進制轉換成DS1302要求的DCB碼
  263.                    write_1302(0x8e,0x00);          //允許寫,禁止寫保護
  264.                    write_1302(0x8c,temp);          //向DS1302內寫年份寄存器8cH寫入調整后的年份數據BCD碼
  265.                    write_1302(0x8e,0x80);          //打開寫保護
  266.                    break;
  267.    }
  268. }
  269. while(!s1);
  270. }
  271. }

  272. if(n!=0)
  273. {
  274. if(s2==0)                            //調整+鍵
  275. {
  276.         delay(30);
  277. if(s2==0)
  278. {
  279.   TR0=0;
  280.    switch(n)
  281.   {
  282.         case 1:sec--;                          //設置鍵按動1次,調秒
  283.                    if(sec==-1)        sec=59;                   //秒減到0時就歸59               
  284.                     lcd_pos(2,6);
  285.            lcd_wdat(table[sec/10]);
  286.            lcd_wdat(table[sec%10]);
  287.                    temp=(sec)/10*16+(sec)%10;      //十進制轉換成DS1302要求的DCB碼
  288.                    write_1302(0x8e,0x00);          //允許寫,禁止寫保護
  289.                    write_1302(0x80,temp);          //向DS1302內寫秒寄存器80H寫入調整后的秒數據BCD碼
  290.                    write_1302(0x8e,0x80);          //打開寫保護
  291.                    break;
  292.   case 2:min--;                                                   //設置鍵按動2次,調分
  293.                    if(min==-1)        min=59;                           //分數據減到0時自動變成59
  294.                    lcd_pos(1,6);
  295.            lcd_wdat(table[min/10]);
  296.            lcd_wdat(table[min%10]);
  297.                    temp=(min)/10*16+(min)%10;      //十進制轉換成DS1302要求的DCB碼
  298.                    write_1302(0x8e,0x00);          //允許寫,禁止寫保護
  299.                    write_1302(0x82,temp);          //向DS1302內寫分寄存器82H寫入調整后的分數據BCD碼
  300.                    write_1302(0x8e,0x80);          //打開寫保護
  301.                    break;
  302.         case 3:hour--;
  303.                    if(hour==-1) hour=23;                           //時數據減到0時自動變成23
  304.                    lcd_pos(0,6);
  305.            lcd_wdat(table[hour/10]);
  306.            lcd_wdat(table[hour%10]);
  307.                    temp=(hour)/10*16+(hour)%10;    //十進制轉換成DS1302要求的DCB碼
  308.                    write_1302(0x8e,0x00);          //允許寫,禁止寫保護
  309.                    write_1302(0x84,temp);          //向DS1302內寫小時寄存器84H寫入調整后的小時數據BCD碼
  310.                    write_1302(0x8e,0x80);          //打開寫保護
  311.                       break;
  312.         case 4:day--;                                                   //設置鍵按動5次,調天
  313.                    if(day==0)        day=31;                           //天數據減到0時自動變成31
  314.                    if(mouth==2){if(day==-1)        day=29;}
  315.                    if(mouth==4){if(day==-1)        day=30;}
  316.                    if(mouth==6){if(day==-1)        day=30;}
  317.                    if(mouth==9){if(day==-1)        day=30;}
  318.                    if(mouth==11){if(day==-1)day=30;}
  319.                      lcd_pos(3,5);
  320.            lcd_wdat(table[day/10]);
  321.            lcd_wdat(table[day%10]);
  322.                    temp=(day)/10*16+(day)%10;      //十進制轉換成DS1302要求的DCB碼
  323.                    write_1302(0x8e,0x00);          //允許寫,禁止寫保護
  324.                    write_1302(0x86,temp);          //向DS1302內寫日期寄存器86H寫入調整后的日期數據BCD碼
  325.                    write_1302(0x8e,0x80);          //打開寫保護                   write_1602com(yh+10);
  326.                    break;
  327.         case 5:mouth--;                                                   //設置鍵按動6次,調月
  328.                    if(mouth==0)        mouth=12;           //月數據減到0時自動變成12
  329.            lcd_pos(3,3);
  330.            lcd_wdat(table[mouth/10]);
  331.            lcd_wdat(table[mouth%10]);                  
  332.                    temp=(mouth)/10*16+(mouth)%10;  //十進制轉換成DS1302要求的DCB碼
  333.                    write_1302(0x8e,0x00);          //允許寫,禁止寫保護
  334.                    write_1302(0x88,temp);          //向DS1302內寫月份寄存器88H寫入調整后的月份數據BCD碼
  335.                    write_1302(0x8e,0x80);          //打開寫保護
  336.                    break;
  337.         case 6:year--;                                                   //設置鍵按動7次,調年
  338.                    if(year==-1)         year=99;           //年數據減到0時自動變成99
  339.                    lcd_pos(3,1);
  340.            lcd_wdat(table[year/10]);
  341.            lcd_wdat(table[year%10]);
  342.            temp=(year)/10*16+(year)%10;    //十進制轉換成DS1302要求的DCB碼
  343.                    write_1302(0x8e,0x00);          //允許寫,禁止寫保護
  344.                    write_1302(0x8c,temp);          //向DS1302內寫年份寄存器8cH寫入調整后的年份數據BCD碼
  345.                    write_1302(0x8e,0x80);          //打開寫保護
  346.                    break;
  347.   }
  348. }
  349. while(!s2);
  350. }
  351. }

  352. if(n!=0)
  353. {
  354.   if(yes==0)                        //調整值確認鍵按下,保存設置的參數,直接退出調整狀態,進入走時。
  355. {
  356.         delay(30);
  357.   if(yes==0)
  358.   {
  359.      n=0;
  360.          TR0=1;                      //打開定時器
  361.          temp=(sec)/10*16+(sec)%10;
  362.          write_1302(0x8e,0x00);
  363.          write_1302(0x80,0x00|temp); //秒數據寫入DS1302
  364.          write_1302(0x8e,0x80);
  365.          delay(100);
  366.          time_display();       
  367.   }
  368.   while(!yes);                                   //松開按鍵檢測
  369. }
  370. }
  371. ……………………

  372. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
計數器 時鐘.rar (26.66 KB, 下載次數: 32)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:578583 發表于 2019-7-28 10:12 | 只看該作者
謝謝樓主分享,收藏先
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产亚洲精品久久久久动 | 色又黄又爽网站www久久 | 欧美精品在欧美一区二区少妇 | 久久亚洲国产精品日日av夜夜 | 国产精品国产三级国产aⅴ中文 | 久久午夜电影 | 国产午夜精品理论片a大结局 | 狠狠操网站 | 亚洲a在线观看 | 免费不卡av | 殴美黄色录像 | 懂色av一区二区三区在线播放 | 蜜臀久久 | 成人免费毛片片v | 国产免费一区二区 | 国产特一级黄色片 | 中文字幕在线免费视频 | 精品国产乱码久久久久久牛牛 | 欧美国产日韩在线观看 | 欧美视频1| 91视频进入 | 久久三级av| 精品日韩一区二区三区av动图 | 免费久久精品 | 久久久美女 | 在线观看av网站永久 | 性一交一乱一透一a级 | 青草视频在线 | 日韩av第一页 | 久久久久久91香蕉国产 | 在线播放国产一区二区三区 | 视频一区在线观看 | 亚洲欧洲在线观看视频 | 国产日韩一区二区三免费高清 | 精品国产乱码久久久久久丨区2区 | 日韩精品视频中文字幕 | 日韩一区二 | 亚洲 自拍 另类 欧美 丝袜 | www成年人视频 | 人操人人 | 国产成人a亚洲精品 |