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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

我的智能儀表課程設計 DS12887程序

[復制鏈接]
跳轉到指定樓層
樓主
內容:以AT89C51單片機為核心,設計一個具有實時時鐘功能和溫度測量功能的智能化測量儀器。要求具有實時時鐘顯示和校時功能,溫度測量顯示功能等。
硬件主要包括DS12887實時時鐘電路、555轉換電路、8只共陽LED數碼管及相應的顯示控制和驅動電路、鍵盤電路等。
編寫相程序,編程并控制DS12887芯片,獲得日期和時間值;利用按鍵可實現日期和時間初值的設置,以及測量值、日期和時間的顯示切換功能;根據溫度與頻率的關系顯示溫度。
做得不好,多包涵。

原理圖:


單片機源程序:
  1. #include <reg51.h>
  2. #include <stdio.h>
  3. #include <math.h>
  4. #include <absacc.h>
  5. #define uchar unsigned char
  6. #define uint unsigned int
  7. #define sec     XBYTE[0x7f00]
  8. #define seca    XBYTE[0x7f01]
  9. #define min     XBYTE[0x7f02]
  10. #define mina    XBYTE[0x7f03]
  11. #define hour    XBYTE[0x7f04]
  12. #define houra   XBYTE[0x7f05]
  13. #define day     XBYTE[0x7f06]
  14. #define date    XBYTE[0x7f07]
  15. #define month   XBYTE[0x7f08]
  16. #define year    XBYTE[0x7f09]
  17. #define A       XBYTE[0x7f0A]
  18. #define B       XBYTE[0x7f0B]
  19. #define C       XBYTE[0x7f0C]
  20. #define D       XBYTE[0x7f0D]

  21. uchar wendu[8];/*溫度數組*/
  22. uchar show[4][8];/*顯示數組,第一行存儲年月日數據,第二行存儲時分秒數據,第三行存儲溫度和頻率數據,第四行存儲農歷年月日數據*/
  23. uchar Buffer[8];/*中間寄存器*/
  24. uchar weixuan;
  25. uchar page=0;/*顯示頁面選擇*/
  26. uchar shanshuo=0;/*閃爍標志位   初始為不閃爍狀態*/
  27. uint nsec,nmin,nhour,nday,ndate,nmonth,nyear;/*更新后時間*/
  28. uint lyear,lmonth,ldate;/*農歷年月日*/
  29. uint t1_num,frequency,tempture;/*定時次數 頻率 溫度*/
  30. uint s3_num=0;/*閃爍(修改)位置選擇*/
  31. sbit s2=P1^5;
  32. sbit s3=P1^6;
  33. sbit s4=P1^7;
  34. sbit P3_5=P3^5;/*對T1引腳定義*/
  35. sbit key_on=P3^3;/*對INT1引腳定義*/
  36. uchar code table[13]={               /*數碼管段碼*/
  37. 0x03,0x9f,0x25,0x0d,0x99,0x49,
  38. 0x41,0x1F,0x01,0x09,0xff,0x39,0x63
  39. };

  40. void delay(uint z);/*延時函數*/
  41. void DS12887_init();/*時鐘芯片初始化函數*/
  42. void DS12887_read();/*讀時鐘芯片函數*/
  43. void DS12887_write();/*寫時鐘芯片函數*/
  44. void change();/*數據處理函數*/
  45. void display();/*位選及顯示函數*/
  46. void T0andT1_init();/*定時器T0,T1初始化函數*/
  47. void int0_init();/*INT0初始化函數*/
  48. void int1_init();/*INT1初始化函數*/
  49. void key_service();/*按鍵服務函數*/
  50. void flash();/*閃爍函數*/
  51. void add();/*加1函數*/
  52. void nongli();/*農歷處理函數*/
  53. void LED_duan(uchar i);/*段選函數*/

  54. void main()
  55. {        
  56.         uint n;
  57.          DS12887_init();/*時間初始化*/
  58.         DS12887_read();
  59.         int0_init();
  60.         T0andT1_init();
  61.         int1_init();
  62.         
  63.         while(1)
  64.         {   
  65.                 change();
  66.                 display();
  67.                 nongli();
  68.                 n++;
  69.                 if(n==20)
  70.                 {
  71.                         shanshuo=!shanshuo;
  72.                     n=0;
  73.                 }/*當循環20次時,閃爍標志位取反,即修改位置的數碼管能正常顯示對應段碼*/
  74.         }
  75. }


  76. /*初始化DS12887*/
  77. void DS12887_init()
  78. {
  79.   B=0x92;/*禁止芯片內部的更新周期操作*/
  80.   A=0x20;/*初始化A寄存器*/
  81.   sec=0x00;
  82.   min=0x30;
  83.   hour=0x08;
  84.   day=0x04;
  85.   date=0x08;        
  86.   month=0x06;        
  87.   year=0x17;/*寫入初始時間和日期 2017年6月8日周四 8點30分0秒*/
  88.   ACC=C;
  89.   ACC=D;/*通過讀寄存器來清零標志位*/
  90.   B=0x12; /*24小時制,BCD碼輸出,更新中斷允許,芯片工作*/
  91. }

  92. /*讀DS12887*/
  93. void DS12887_read()
  94. {
  95.         nsec=(sec/16)*10+sec%16;
  96.         nmin=(min/16)*10+min%16;
  97.         nhour=(hour/16)*10+hour%16;
  98.         nday=(day/16)*10+day%16;
  99.         ndate=(date/16)*10+date%16;
  100.         nmonth=(month/16)*10+month%16;
  101.         nyear=(year/16)*10+year%16;
  102. }

  103. /*寫DS12887*/
  104. void DS12887_write()
  105. {
  106.         sec=(nsec/10)*16+nsec%10;
  107.         min=(nmin/10)*16+nmin%10;
  108.         hour=(nhour/10)*16+nhour%10;
  109.         day=(nday/10)*16+nday%10;
  110.         date=(ndate/10)*16+ndate%10;
  111.         month=(nmonth/10)*16+nmonth%10;
  112.         year=(nyear/10)*16+nyear%10;

  113. }

  114. /*延時函數*/
  115. void delay(uint z)
  116. {
  117.         uint x,y;
  118.         for(x=z;x>0;x--)
  119.                 for(y=110;y>0;y--);/*延時z ms*/
  120. }

  121. /*時間數據處理*/
  122. void change()
  123. {

  124.         show[0][0] = 2;
  125.         show[0][1] = 0;
  126.         show[0][2] = nyear/10;
  127.         show[0][3] = nyear%10;
  128.         show[0][4] = nmonth/10;
  129.         show[0][5] = nmonth%10;
  130.         show[0][6] = ndate/10;
  131.         show[0][7] = ndate%10;  

  132.         show[1][0] = nhour/10;
  133.         show[1][1] = nhour%10;
  134.         show[1][2] = nmin/10;
  135.         show[1][3] = nmin%10;
  136.         show[1][4] = nsec/10;
  137.         show[1][5] = nsec%10;
  138.         show[1][6] = 10;
  139.         show[1][7] = nday%10;

  140.         show[2][0] = wendu[0];
  141.         show[2][1] = wendu[1];
  142.         show[2][2] = wendu[2];
  143.         show[2][3] = wendu[3];
  144.         show[2][4] = wendu[4];
  145.         show[2][5] = wendu[5];
  146.         show[2][6] = wendu[6];
  147.         show[2][7] = wendu[7];


  148.         show[3][0] = 2;
  149.         show[3][1] = 0;
  150.         show[3][2] = lyear/10;
  151.         show[3][3] = lyear%10;
  152.         show[3][4] = lmonth/10;
  153.         show[3][5] = lmonth%10;
  154.         show[3][6] = ldate/10;
  155.         show[3][7] = ldate%10;


  156. }

  157. /*段選函數*/
  158. void LED_duan(uchar i)
  159. {
  160.         
  161.         SBUF=table[i];/*段碼值先存入緩沖寄存器中*/
  162.         delay(1);/*數據串口傳輸時間*/
  163.         TI=0;/*數據發送完畢,數據串口傳輸位清零*/
  164. }


  165. /*位選及顯示函數*/
  166. void display()
  167. {
  168.         uchar i;
  169.         weixuan=0xfe;
  170.         for(i=0;i<8;i++)
  171.         {Buffer[i]=show[ page][i];}
  172.         flash();        
  173.          for(i=0;i<8;i++)            /*每次左移選通一位*/
  174.         {  
  175.         
  176.                 P1=weixuan;   
  177.                 LED_duan(Buffer[i]);
  178.                 weixuan=weixuan<<1;     /*位選擇,左移一位*/
  179.                 weixuan=weixuan|0x01;
  180.                 if(weixuan==0xff)
  181.                 weixuan=0xfe;
  182.                            
  183.         }        
  184.                         
  185. }

  186. /*外部中斷0初始化*/
  187. void int0_init()
  188. {
  189.         SCON = 0x00;/*串口使用方式0*/
  190.          IT0 = 0;/*外部中斷0的中斷觸發方式控制位*/
  191.         EX0 = 1;/*INT0開啟*/
  192.         EA = 1;/*CPU開中斷*/
  193. }
  194.         


  195. void int0_service() interrupt 0/*外部中斷0更新中斷*/
  196. {
  197.         if(A==0x20)/*時鐘信息可讀*/
  198.          {DS12887_read();
  199.           ACC=C;}
  200. }

  201. void T0andT1_init()/*定時器初始化*/
  202. {
  203.         SCON=0x00;/*串口工作方式0*/        
  204.         P3_5 = 0;/*選通溫度采集*/
  205.         TMOD=0x15;/*定時器1定時工作方式1,定時器0計數*/
  206.         TH0=0;
  207.         TL0=0;/*計數器裝載初值*/
  208.         TH1=(65536-50000)/256;
  209.         TL1=(65536-50000)%256;/*0.05s  定時器裝載初值*/
  210.         TR1=1;
  211.         TR0=1;/*定時器啟/停控制位置1*/
  212.         ET1=1;/*定時器1溢出中斷允許位*/
  213.         EA=1;/*中斷允許總控制位*/
  214.         
  215. }


  216. /*定時器中斷,采集溫度處理*/
  217. void t1_wendu(void) interrupt 3
  218. {
  219.         TR0=0;/*先讓T0、T1停止工作*/
  220.         TR1=0;/*啟停控制位*/
  221.         P3_5=0;/*選通溫度采集*/
  222.         t1_num++;
  223.         if(t1_num==20)/*定時1s*/
  224.         {
  225.                 t1_num = 0;
  226.                 frequency=TH0*256+TL0; /*計數*/
  227.                 tempture=(frequency)*11/62-113; /*溫度值轉化顯示數值*/   
  228.                 wendu[0] = tempture/10;
  229.                 wendu[1] = tempture%10;
  230.                 wendu[2] = 11;
  231.                 wendu[3] = 12;/*攝氏度符號*/
  232.                 wendu[4] = frequency/1000;
  233.                 wendu[5] = frequency%1000/100;
  234.                 wendu[6] = frequency%1000%100/10;
  235.                   wendu[7] = frequency%1000%100%10;
  236.                 TH0=TL0=0;   
  237.         }

  238.         TH1=(65536-50000)/256;
  239.         TL1=(65536-50000)%256;/*定時器重新裝載初值*/
  240.         TR0=1;
  241.         TR1=1;
  242. }


  243. void int1_init()
  244. {
  245.         SCON = 0x00;/*串口使用方式0*/
  246.          IT1 = 0;/*外部中斷1的中斷觸發方式控制位*/
  247.         EX1 = 1;/*INT1開啟*/
  248.         EA = 1;/*CPU開中斷*/
  249. }
  250.         


  251. void int1_service() interrupt 2/*外部中斷1判斷是否有鍵按下*/
  252. {
  253.         if(key_on == 0)/*有鍵按下時執行程序*/
  254.         {
  255.                 delay(10);/*延時10ms,按鍵消除抖動*/
  256.             if(key_on == 0)
  257.             {
  258.                         key_service();
  259.                            key_on= 1;
  260.                         while(key_on == 0);
  261.                 }
  262.         }
  263. }

  264. void key_service()/*按鍵服務程序*/
  265. {                                
  266.         if(s2==0)
  267.          {
  268.            page=(page+1)%4; /*page變量代表數碼管要顯示的內容 page=0數碼管顯示年月日 page=1數碼管顯示時分秒 page=2數碼管顯示溫度和頻率 page=3數碼管顯示農歷的年月日*/
  269.          
  270.          }

  271.     if(s3==0)
  272.          {         
  273.                 s3_num++;/*8個數碼管兩兩分為4組 s3_num代表閃爍位位置*/
  274.                 if(s3_num==5)
  275.                 s3_num=0;/*不選中數碼管*/
  276.          }

  277.      if(s4==0)
  278.         {
  279.                 add();
  280.         }
  281. }

  282. /*閃爍函數*/
  283. void flash()
  284. {        
  285.         
  286.         if((s3_num!=0)&&(page!=2)&&shanshuo==0)
  287.         {
  288.                 Buffer[(s3_num-1)*2]=10;
  289.                 Buffer[(s3_num-1)*2+1]=10;/*對所選中位置的數碼管給段碼0xff(全滅)*/
  290.         }
  291. }

  292. /*按鍵加1函數*/
  293. void add()
  294. {
  295.         uint m,n,y,c,w,d;
  296.         if(s4 == 0)/*修改數據程序*/
  297.         {
  298.                 if(page==0)
  299.                 {
  300.                         switch(s3_num)
  301.                         {
  302.                                 case 2: nyear++;
  303.                                         m = nyear;
  304.                                         if(m == 100)/*年變量達到100年*/
  305.                                                 {
  306.                                                         nyear=0;
  307.                                                 }
  308.                                         DS12887_write();
  309.                                         break;

  310.                                 case 3: nmonth++;
  311.                                         m = nmonth;
  312.                                         if(m==13) /*月變量達到12*/
  313.                                         {
  314.                                                         nmonth=1;
  315.                                         }
  316.                                         DS12887_write();
  317.                                         break;

  318.                                 case 4: ndate++;
  319.                                         m = ndate;
  320.                                         if(nmonth==1||nmonth==3||nmonth==5||nmonth==7||nmonth==8||nmonth==10||nmonth==12)
  321.                                         {
  322.                                                         if(m==32) /*大月日變量達到32*/
  323.                                                 {
  324.                                                                 ndate=1;
  325.                                                 }
  326.                                                 }
  327.                                                 if(nmonth==4||nmonth==6||nmonth==9||nmonth==11)
  328.                                         {
  329.                                                         if(m==31) /*小月日變量達到31*/
  330.                                                 {
  331.                                                                 ndate=1;
  332.                                                 }
  333.                                                 }
  334.                                                 if(nmonth==2)
  335.                                         {
  336.                                                         if((nyear%4==0&&nyear%100!=0)||(nyear%400==0))/*閏年*/
  337.                                                         {
  338.                                                                 if(m==30) /*閏年2月日變量達到30*/
  339.                                                             {
  340.                                                                         ndate=1;
  341.                                                             }
  342.                                                                
  343.                                                         }
  344.                                                         else
  345.                                                         {
  346.                                                                 if(m==29)/*非閏年2月日變量達到29*/
  347.                                                                 ndate=1;
  348.                                                         }        
  349.                                         }
  350.                                         DS12887_write();
  351.                                         break;
  352.                                     default: return;
  353.                                        
  354.                                 }
  355.                     /*利用蔡勒公式計算星期*/
  356.                         y=nyear;
  357.                         c=20;
  358.                         n=nmonth;
  359.                         d=ndate;
  360.                         if(n==1||n==2)
  361.                          {
  362.                             y--;
  363.                                 n=n+12;

  364.                          }
  365.                         w=y+y/4+c/4-2*c+13*(n+1)/5+d-1;
  366.                         while(w<0)
  367.                         {w=w+7;}
  368.                         nday=w%7;
  369.                         if(nday==0)
  370.                         nday=7;}
  371.                         DS12887_write();/*通過此段程序可實現星期隨年月日的改變而準確變化*/
  372.                    }


  373.                 else if(page==1)
  374.                 {
  375.                         switch(s3_num)
  376.                         {
  377.                                 case 1: nhour++;
  378.                                         m = nhour;
  379.                                         if(m==24) /*小時變量達到24*/
  380.                   
  381.                               …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼


全部資料下載地址:
智能儀表原理圖.doc (56 KB, 下載次數: 28)
新建 Microsoft Word 文檔.docx (19.47 KB, 下載次數: 50)


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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 在线观看视频一区 | 91久久爽久久爽爽久久片 | 精品欧美色视频网站在线观看 | 国产欧美一区二区三区免费 | 国产精品夜间视频香蕉 | 男女视频在线观看 | 91看片在线观看 | 国产精品嫩草影院精东 | 99精品电影 | 免费中文字幕日韩欧美 | 久久亚洲一区 | www九色| 日韩视频专区 | 免费国产视频在线观看 | 免费观看www7722午夜电影 | 国产精品久久久久久久久大全 | 国产精品久久久爽爽爽麻豆色哟哟 | 一区精品国产欧美在线 | 久久久精 | 精品videossex高潮汇编 | 欧美一区二区三区 | 国产精品久久久久久二区 | 99久久免费精品国产男女高不卡 | 亚洲人成一区二区三区性色 | 一区二区成人 | 久久夜色精品国产 | 黑人巨大精品欧美一区二区免费 | 国产成人网| 色欧美综合| 国产精品精品视频一区二区三区 | 午夜影院毛片 | 日韩欧美一区在线 | 午夜免费视频观看 | 国产在线观看网站 | 久久99精品国产自在现线小黄鸭 | 欧美激情va永久在线播放 | av看片网站 | 成人在线播放 | 亚洲人久久 | 青春草在线 | 国产精品久久久久一区二区三区 |