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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

自作的1602數字時鐘(帶溫度帶單片機程序帶電路圖)

[復制鏈接]
跳轉到指定樓層
樓主


單片機源程序
  1. #include <REG51.H>
  2. #include <intrins.h>
  3. //#include "LCD1602.h"
  4. //#include "DS1302.h"
  5. #define uint unsigned int
  6. #define uchar unsigned char
  7. sbit  DS1302_CLK = P1^7;              //實時時鐘時鐘線引腳
  8. sbit  DS1302_IO  = P1^6;              //實時時鐘數據線引腳
  9. sbit  DS1302_RST = P1^5;              //實時時鐘復位線引腳
  10. sbit  wireless_1 = P3^0;
  11. sbit  wireless_2 = P3^1;
  12. sbit  wireless_3 = P3^2;
  13. sbit  wireless_4 = P3^3;
  14. sbit  ACC0 = ACC^0;
  15. sbit  ACC7 = ACC^7;
  16. char hide_sec,hide_min,hide_hour,hide_day,hide_week,hide_month,hide_year;  //秒,分,時到日,月,年位閃的計數
  17. sbit Set = P2^0;       //模式切換鍵
  18. sbit Up = P2^1;        //加法按鈕
  19. sbit Down = P2^2;      //減法按鈕
  20. sbit out = P2^3;       //立刻跳出調整模式按鈕
  21. sbit DQ = P1^0;        //溫度傳送數據IO口
  22. char done,count,temp,flag,up_flag,down_flag;
  23. uchar temp_value;      //溫度值
  24. uchar TempBuffer[5],week_value[2];


  25. void show_time();   //液晶顯示程序
  26. /***********1602液晶顯示部分子程序****************/


  27. //Port Definitions**********************************************************
  28. sbit LcdRs                = P2^5;
  29. sbit LcdRw                = P2^6;
  30. sbit LcdEn          = P2^7;
  31. sfr  DBPort         = 0x80;                //P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.數據端口

  32. //內部等待函數**************************************************************************
  33. unsigned char LCD_Wait(void)
  34. {
  35.         LcdRs=0;
  36.         LcdRw=1;        _nop_();
  37.         LcdEn=1;        _nop_();
  38.                                                 
  39.         LcdEn=0;
  40.         return DBPort;               
  41. }
  42. //向LCD寫入命令或數據************************************************************
  43. #define LCD_COMMAND                        0      // Command
  44. #define LCD_DATA                        1      // Data
  45. #define LCD_CLEAR_SCREEN        0x01      // 清屏
  46. #define LCD_HOMING                  0x02      // 光標返回原點
  47. void LCD_Write(bit style, unsigned char input)
  48. {
  49.         LcdEn=0;
  50.         LcdRs=style;
  51.         LcdRw=0;                _nop_();
  52.         DBPort=input;        _nop_();//注意順序
  53.         LcdEn=1;                _nop_();//注意順序
  54.         LcdEn=0;                _nop_();
  55.         LCD_Wait();        
  56. }

  57. //設置顯示模式************************************************************
  58. #define LCD_SHOW                        0x04    //顯示開
  59. #define LCD_HIDE                        0x00    //顯示關         

  60. #define LCD_CURSOR                        0x02         //顯示光標
  61. #define LCD_NO_CURSOR                0x00    //無光標                     

  62. #define LCD_FLASH                        0x01    //光標閃動
  63. #define LCD_NO_FLASH                0x00    //光標不閃動

  64. void LCD_SetDisplay(unsigned char DisplayMode)
  65. {
  66.         LCD_Write(LCD_COMMAND, 0x08|DisplayMode);        
  67. }

  68. //設置輸入模式************************************************************
  69. #define LCD_AC_UP                        0x02
  70. #define LCD_AC_DOWN                        0x00      // default

  71. #define LCD_MOVE                        0x01      // 畫面可平移
  72. #define LCD_NO_MOVE                        0x00      //default

  73. void LCD_SetInput(unsigned char InputMode)
  74. {
  75.         LCD_Write(LCD_COMMAND, 0x04|InputMode);
  76. }

  77. //初始化LCD************************************************************
  78. void LCD_Initial()
  79. {
  80.         LcdEn=0;
  81.         LCD_Write(LCD_COMMAND,0x38);           //8位數據端口,2行顯示,5*7點陣
  82.         LCD_Write(LCD_COMMAND,0x38);
  83.         LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR);    //開啟顯示, 無光標
  84.         LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);   //清屏
  85.         LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE);       //AC遞增, 畫面不動
  86. }

  87. //液晶字符輸入的位置************************
  88. void GotoXY(unsigned char x, unsigned char y)
  89. {
  90.         if(y==0)
  91.                 LCD_Write(LCD_COMMAND,0x80|x);
  92.         if(y==1)
  93.                 LCD_Write(LCD_COMMAND,0x80|(x-0x40));
  94. }

  95. //將字符輸出到液晶顯示
  96. void Print(unsigned char *str)
  97. {
  98.         while(*str!='\0')
  99.         {
  100.                 LCD_Write(LCD_DATA,*str);
  101.                 str++;
  102.         }
  103. }






  104. /***********DS1302時鐘部分子程序******************/
  105. typedef struct __SYSTEMTIME__
  106. {
  107.         unsigned char Second;
  108.         unsigned char Minute;
  109.         unsigned char Hour;
  110.         unsigned char Week;
  111.         unsigned char Day;
  112.         unsigned char Month;
  113.         unsigned char  Year;
  114.         unsigned char DateString[11];
  115.         unsigned char TimeString[9];
  116. }SYSTEMTIME;        //定義的時間類型
  117. SYSTEMTIME CurrentTime;


  118. #define AM(X)        X
  119. #define PM(X)        (X+12)                      // 轉成24小時制
  120. #define DS1302_SECOND        0x80          //時鐘芯片的寄存器位置,存放時間
  121. #define DS1302_MINUTE        0x82
  122. #define DS1302_HOUR                0x84
  123. #define DS1302_WEEK                0x8A
  124. #define DS1302_DAY                0x86
  125. #define DS1302_MONTH        0x88
  126. #define DS1302_YEAR                0x8C

  127. void DS1302InputByte(unsigned char d)         //實時時鐘寫入一字節(內部函數)
  128. {
  129.     unsigned char i;
  130.     ACC = d;
  131.     for(i=8; i>0; i--)
  132.     {
  133.         DS1302_IO = ACC0;                   //相當于匯編中的 RRC
  134.         DS1302_CLK = 1;
  135.         DS1302_CLK = 0;
  136.         ACC = ACC >> 1;
  137.     }
  138. }

  139. unsigned char DS1302OutputByte(void)         //實時時鐘讀取一字節(內部函數)
  140. {
  141.     unsigned char i;
  142.     for(i=8; i>0; i--)
  143.     {
  144.         ACC = ACC >>1;                                 //相當于匯編中的 RRC
  145.         ACC7 = DS1302_IO;
  146.         DS1302_CLK = 1;
  147.         DS1302_CLK = 0;
  148.     }
  149.     return(ACC);
  150. }

  151. void Write1302(unsigned char ucAddr, unsigned char ucDa)        //ucAddr: DS1302地址, ucData: 要寫的數據
  152. {
  153.     DS1302_RST = 0;
  154.     DS1302_CLK = 0;
  155.     DS1302_RST = 1;
  156.     DS1302InputByte(ucAddr);               // 地址,命令
  157.     DS1302InputByte(ucDa);               // 寫1Byte數據
  158.     DS1302_CLK = 1;
  159.     DS1302_RST = 0;
  160. }

  161. unsigned char Read1302(unsigned char ucAddr)        //讀取DS1302某地址的數據
  162. {
  163.     unsigned char ucData;
  164.     DS1302_RST = 0;
  165.     DS1302_CLK = 0;
  166.     DS1302_RST = 1;
  167.     DS1302InputByte(ucAddr|0x01);        // 地址,命令
  168.     ucData = DS1302OutputByte();         // 讀1Byte數據
  169.     DS1302_CLK = 1;
  170.     DS1302_RST = 0;
  171.     return(ucData);
  172. }



  173. void DS1302_GetTime(SYSTEMTIME *Time)  //獲取時鐘芯片的時鐘數據到自定義的結構型數組
  174. {
  175.         unsigned char ReadValue;
  176.         ReadValue = Read1302(DS1302_SECOND);
  177.         Time->Second = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
  178.         ReadValue = Read1302(DS1302_MINUTE);
  179.         Time->Minute = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
  180.         ReadValue = Read1302(DS1302_HOUR);
  181.         Time->Hour = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
  182.         ReadValue = Read1302(DS1302_DAY);
  183.         Time->Day = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);        
  184.         ReadValue = Read1302(DS1302_WEEK);
  185.         Time->Week = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
  186.         ReadValue = Read1302(DS1302_MONTH);
  187.         Time->Month = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
  188.         ReadValue = Read1302(DS1302_YEAR);
  189.         Time->Year = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);        
  190. }

  191. void DateToStr(SYSTEMTIME *Time)    //將時間年,月,日,星期數據轉換成液晶顯示字符串,放到數組里DateString[]
  192. {   if(hide_year<2)                 //這里的if,else語句都是判斷位閃爍,<2顯示數據,>2就不顯示,輸出字符串為 2007/07/22
  193.     {                              
  194.           Time->DateString[0] = '2';
  195.           Time->DateString[1] = '0';         
  196.           Time->DateString[2] = Time->Year/10 + '0';
  197.           Time->DateString[3] = Time->Year%10 + '0';
  198.         }
  199.           else
  200.             {
  201.               Time->DateString[0] = ' ';
  202.               Time->DateString[1] = ' ';                 
  203.               Time->DateString[2] = ' ';
  204.               Time->DateString[3] = ' ';
  205.                 }
  206.         Time->DateString[4] = '/';
  207.         if(hide_month<2)
  208.         {
  209.           Time->DateString[5] = Time->Month/10 + '0';
  210.           Time->DateString[6] = Time->Month%10 + '0';
  211.         }
  212.           else
  213.           {
  214.             Time->DateString[5] = ' ';
  215.             Time->DateString[6] = ' ';
  216.           }
  217.         Time->DateString[7] = '/';
  218.         if(hide_day<2)
  219.         {
  220.           Time->DateString[8] = Time->Day/10 + '0';
  221.           Time->DateString[9] = Time->Day%10 + '0';
  222.         }
  223.           else
  224.           {
  225.             Time->DateString[8] = ' ';
  226.             Time->DateString[9] = ' ';            
  227.           }
  228.         if(hide_week<2)
  229.         {
  230.           week_value[0] = Time->Week%10 + '0';  //星期的數據另外放到 week_value[]數組里,跟年,月,日的分開存放,因為等一下要在最后顯示
  231.         }
  232.           else
  233.           {
  234.             week_value[0] = ' ';
  235.           }
  236.           week_value[1] = '\0';

  237.         Time->DateString[10] = '\0'; //字符串末尾加 '\0' ,判斷結束字符
  238. }

  239. void TimeToStr(SYSTEMTIME *Time)  //將時,分,秒數據轉換成液晶顯示字符放到數組 TimeString[];
  240. {   if(hide_hour<2)
  241.     {
  242.           Time->TimeString[0] = Time->Hour/10 + '0';
  243.           Time->TimeString[1] = Time->Hour%10 + '0';
  244.         }
  245.           else
  246.             {
  247.               Time->TimeString[0] = ' ';
  248.               Time->TimeString[1] = ' ';
  249.                 }
  250.         Time->TimeString[2] = ':';
  251.     if(hide_min<2)
  252.         {
  253.           Time->TimeString[3] = Time->Minute/10 + '0';
  254.           Time->TimeString[4] = Time->Minute%10 + '0';
  255.         }
  256.           else
  257.             {
  258.               Time->TimeString[3] = ' ';
  259.               Time->TimeString[4] = ' ';
  260.                }
  261.         Time->TimeString[5] = ':';


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

復制代碼


下載:
數字時鐘電路圖 keil程序.zip (104.06 KB, 下載次數: 59)


評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:270886 發表于 2018-1-3 16:47 | 只看該作者
樓主謝謝了,學習了
回復

使用道具 舉報

板凳
ID:339500 發表于 2018-8-1 15:52 | 只看該作者
學習研究中
回復

使用道具 舉報

地板
ID:339500 發表于 2018-8-1 15:53 | 只看該作者
研究中..........................
回復

使用道具 舉報

5#
ID:386381 發表于 2018-8-17 18:06 來自手機 | 只看該作者
謝謝樓主分享
回復

使用道具 舉報

6#
ID:386381 發表于 2018-8-17 18:08 來自手機 | 只看該作者
學習了謝謝分享
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 九九热这里只有精品在线观看 | 国产成人精品视频 | 日韩av网址在线观看 | 91资源在线 | 久久精品美女 | 在线观看国产精品一区二区 | 欧美精品99 | 国产99热 | 欧美日韩精品亚洲 | 日韩视频观看 | 一区二区精品视频 | 国产精品一二区 | 天天干狠狠 | 亚州精品成人 | 亚洲精品一区二区在线观看 | 午夜影院在线播放 | 国产成人精品一区二区三区四区 | 北条麻妃99精品青青久久 | 国产成人一区二区 | av国产精品 | 91精品久久久久久久久 | 成人综合视频在线 | 久久综合一区 | 国产精品视频观看 | 一区二区高清 | 久草免费在线视频 | 奇米影视在线 | 欧美日韩在线观看一区 | 一级黄色录像片子 | 午夜小影院| 亚洲精品视频观看 | 久久精品国产一区 | h视频在线免费看 | 国产精品久久久久久久久婷婷 | 亚洲啪啪 | 欧美区日韩区 | 综合精品久久久 | 国产精品一区二区不卡 | 成人欧美一区二区三区在线观看 | 国产精品99999 | 成人亚洲精品久久久久软件 |