找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 10080|回復(fù): 28
收起左側(cè)

單片機(jī)+1602+DS1302+DS18B20迷你時鐘設(shè)計

  [復(fù)制鏈接]
ID:70481 發(fā)表于 2014-12-16 17:08 | 顯示全部樓層 |閱讀模式
程序 LCD1602液晶時鐘.zip (51.17 KB, 下載次數(shù): 102)
由于已經(jīng)工作了,很少上51hei論壇打理帖子,對不起各位

程序較早寫的,待優(yōu)化的地方較多,僅供大家參考

該作品僅供大家討論學(xué)習(xí)用,切勿用在商業(yè)用途。


第一個版本的資料

阻焊層.pdf (6.39 KB, 下載次數(shù): 32)
電路原理圖.pdf (43.22 KB, 下載次數(shù): 78)
絲印層.pdf (9.33 KB, 下載次數(shù): 17)
原理圖負(fù)片.pdf (22.86 KB, 下載次數(shù): 24)
測試源程序keil編譯.zip (1.14 KB, 下載次數(shù): 75)

第一個版本

3D顯示效果圖(正面)(沒有3D模型只能顯示這樣,大家見諒)
200145d32413cmm17nlmzu.jpg.thumb.jpg
3D顯示效果圖(反面) (沒有3D模型只能顯示這樣,大家見諒)
200145ysp2alsahxzxw6ea.jpg.thumb.jpg
自制切割機(jī)
200018v7nnff1vhoont21h.jpg.thumb.jpg

做好絲印層(就這個我用熱轉(zhuǎn)印做的)打好孔,裁好PCB
200021dupf1ipcp7oufzda.jpg.thumb.jpg

PCB反面(PCB我經(jīng)過了化學(xué)鍍錫處理)
200024xvdlebxypffdyy0b.jpg.thumb.jpg

焊接好PCB板
200031h7rrxi5sxszz3it5.jpg.thumb.jpg

ATMEL的AT89S52
200041lqg3cd2g9c427hei.jpg.thumb.jpg

DS1302就在單片機(jī)中間
200035z90ns2b4espbbate.jpg.thumb.jpg

在DS1302的上方也預(yù)留DS18B20的接口
200038am53131gq2733ddc.jpg.thumb.jpg

安裝液晶顯示器效果
200044q2yy7r08mhac5027.jpg.thumb.jpg
200026e1p23tgz184c5xu4.jpg.thumb.jpg
200048mhqqxgxlghqvt7jl.jpg.thumb.jpg

200051dd6ll6myltm6omnw.jpg.thumb.jpg
第二個版本
更新了蜂鳴器、ISP、可控制背光,優(yōu)化了PCB布局
145956dl0z4fraqgq0jaah.jpg.thumb.jpg
150000dqvvplsvz92xzguu.jpg.thumb.jpg
150003kh4mmxynmerbs4er.jpg.thumb.jpg
150006jezz9gsgge9h179i.jpg.thumb.jpg
150009rqlskerzykvoyibf.jpg.thumb.jpg
150012tt9xw8rz5m8v28pp.jpg.thumb.jpg
150015v9qlssp0f7llf79v.jpg.thumb.jpg
150018y5fvizintvkinxco.jpg.thumb.jpg
整體的效果
150023tjqw2kjmkeefkgnq.jpg.thumb.jpg
關(guān)閉背光的效果
150030sdq466ypsnn4udu6.jpg.thumb.jpg
程序已完工,程序運(yùn)行(程序等資料過一段時間發(fā)出)
現(xiàn)在附件發(fā)的程序是測試程序,大家注意下
150034rwrhz6dzjprh8kwz.jpg.thumb.jpg







相關(guān)帖子

回復(fù)

使用道具 舉報

ID:70481 發(fā)表于 2014-12-16 17:10 | 顯示全部樓層
源碼預(yù)覽:
  1. //#include <at89x52.h>          
  2. #include <intrins.h>
  3. #include <STC89C5xRC.H>

  4. #define DataPort P0

  5. unsigned char code one[] = "20  /  /  ";                 //固定字符
  6. unsigned char code two[] = "  :  :  ";                //固定字符
  7. unsigned char code wendu[] = {0x18, 0x1a, 0x05, 0x04, 0x04, 0x05, 0x02, 0x00};//溫度符號
  8. unsigned char code week_char[] = "MON TUE WED THU FRI STA SUN"; //星期字符串
  9. unsigned char miao, fen, shi, ri, yue, nian, week;
  10. unsigned int tp;
  11. bit time_flag, temp_flag;

  12. /******************************
  13. LCD1602
  14. 4PIN----RS
  15. 5PIN----RW
  16. 6PIN----EN
  17. *****************************/
  18. sbit beep = P1^0;                //蜂鳴器
  19. sbit DQ = P3^7;                        //18B20端口
  20. sbit RS = P2^4;                        //1602寄存器選擇
  21. sbit RW = P2^5;                        //1602讀寫控制
  22. sbit EN = P2^6;                        //1602使能端
  23. sbit key1 = P3^1;                //菜單鍵
  24. sbit key2 = P3^2;                //加
  25. sbit key3 = P3^3;                //減
  26. sbit RST = P3^5;                //1302復(fù)位
  27. sbit SDA = P3^4;                //1302數(shù)據(jù)
  28. sbit SCK = P3^6;                //1302時鐘                  

  29. void delay_us(unsigned char t)
  30. {
  31.   while(--t);
  32. }

  33. /***********ms延時程序***********/
  34. void delay_ms(unsigned int ms)
  35. {
  36.         unsigned int a, b;
  37.         for(a = ms; a > 0; a--)
  38.                 for(b = 110; b > 0; b--);
  39. }

  40. /********蜂鳴器響一聲**********/
  41. void beepplay()
  42. {
  43.         beep = 0;
  44.         delay_ms(60);
  45.         beep = 1;
  46. }

  47. /*********LCD判忙*************/
  48. void lcd_busy()
  49. {
  50.         DataPort = 0xff;
  51.         RS = 0;
  52.         RW = 1;
  53.         EN = 1;
  54.         delay_ms(1);
  55.         while(DataPort & 0x80);
  56.         EN = 0;
  57. }

  58. /**********LCD寫數(shù)據(jù)************/
  59. void write_date(unsigned char dat)
  60. {
  61.         lcd_busy();
  62.         RS = 1;
  63.         RW = 0;
  64.         DataPort = dat;
  65.         delay_ms(2);
  66.         EN = 1;
  67.         delay_ms(2);
  68.         EN = 0;
  69. }

  70. /*********LCD寫指令***********/
  71. void write_com(unsigned char com)
  72. {
  73.         lcd_busy();
  74.         RS = 0;
  75.         RW = 0;
  76.         DataPort = com;
  77.         delay_ms(2);
  78.         EN = 1;
  79.         delay_ms(2);
  80.         EN = 0;
  81. }

  82. /*********LCD初始化*************/
  83. void initLCD()
  84. {
  85.         unsigned char i;
  86.         delay_ms(5);                //延時啟動,等待電壓穩(wěn)定
  87.         write_com(0x38);        //設(shè)置16*2顯示,5*7點(diǎn)陣,8位數(shù)據(jù)口
  88.         write_com(0x0c);        //設(shè)置開顯示,不顯示光標(biāo)
  89.         write_com(0x06);        //寫一個字符地址指針加1
  90.         write_com(0x01);        //清屏
  91.         delay_ms(1);                //第一行起始地址0x80,第二行起始地址0xc0
  92.         write_com(0x81);          //第一行首空一個字符,開始寫入第一行固定字符
  93.        
  94.         for(i = 0; i < 10; i++)
  95.                 write_date(one[ i]);
  96.         delay_ms(1);
  97.         write_com(0xc2);        //第二行首空兩個字符,開始寫入第二行的固定字符
  98.        
  99.         for(i = 0; i < 8; i++)
  100.                 write_date(two[ i]);

  101.         write_com(0xcd);        //顯示地址
  102.         write_date('.');         //顯示"."
  103.         write_date(0x20);         //0x20顯示就是空  
  104. //        write_date('C');         //顯示C
  105.        
  106.         write_com(0x40);
  107.         for(i = 0; i < 8; i++)
  108.                 write_date(wendu[ i]);
  109.         write_com(0xcf);
  110.         write_date(0x00);
  111. }

  112. /*********10轉(zhuǎn)BCD**********/                   
  113. unsigned char toBCD(unsigned char dat)
  114. {
  115.         unsigned char tmp;
  116.         tmp=(((dat / 10) * 16)+(dat % 10));
  117.         return(tmp);       
  118. }

  119. /**********DS1302寫一個字節(jié)*********/          
  120. void writebyte(unsigned char dat)
  121. {
  122.         unsigned char i;
  123.         for(i = 0; i < 8; i++)
  124.         {
  125.                 SDA = dat & 0x01;
  126.                 SCK = 1;
  127.                 _nop_();_nop_();
  128.                 SCK = 0;
  129.                 dat >>= 1;          
  130.         }
  131. }

  132. /********寫DS1302寄存器********/         
  133. void write1302(unsigned char dizhi,shuju)
  134. {
  135.         RST = 0;
  136.         SCK = 0;
  137.         RST = 1;
  138.         writebyte(dizhi);        //寫入的地址
  139.         writebyte(shuju);        //寫入的數(shù)據(jù)
  140.         SCK = 1;
  141.         RST = 0;
  142. }

  143. /*******讀取DS1302寄存器********/
  144. unsigned char read1302(unsigned char dizhi)
  145. {
  146.         unsigned char i, dat, tmp;
  147.         RST = 0;
  148.         SCK = 0;
  149.         RST = 1;
  150.         writebyte(dizhi | 0x01);
  151.         for(i = 8; i > 0; i--)
  152.         {
  153.                 dat >>= 1;
  154.                 if(SDA)
  155.                         dat |= 0x80;
  156.                 SCK=1;
  157.                 _nop_();_nop_();
  158.                 SCK=0;
  159.         }
  160.         RST = 0;
  161.         tmp = dat >> 4;
  162.         tmp = ((tmp * 10)+(dat &= 0x0f));
  163.         return(tmp);
  164. }

  165. /*******DS18B20初始化*********/
  166. void init1820()
  167. {
  168.         DQ = 1;
  169.         _nop_();_nop_();
  170.         DQ = 0;
  171.         delay_us(200);
  172.         delay_us(200);
  173.         DQ = 1;
  174.         delay_us(80);
  175.         DQ = 1;
  176. }

  177. /*******向DS18B20中讀出一個字節(jié)*********/
  178. unsigned char readonebyte_18b20()
  179. {
  180.         unsigned char i=0, dat=0;
  181.         for(i = 8; i > 0; i--)
  182.         {
  183.                 DQ = 0;
  184.                 dat >>= 1;
  185.                 DQ = 1;
  186.                 if(DQ)
  187.                         dat |= 0x80;
  188.                 delay_us(25);
  189.         }
  190.         return(dat);
  191. }

  192. /******向DS18B20中寫入一個字節(jié)*******/
  193. void writeonebyte_18b20(unsigned char dat)
  194. {
  195.         unsigned char i=0;   
  196.         for(i = 8; i > 0; i--)   
  197.         {
  198.                 DQ = 0;  
  199.                 DQ = dat & 0x01;
  200.                 delay_us(25);
  201.                 DQ = 1;
  202.                 dat >>= 1;
  203.         }
  204.         delay_us(25);
  205. }

  206. /*********讀取溫度*********/
  207. unsigned int readtemp(void)
  208. {
  209.         unsigned int xx, tempL=0, tempH=0;
  210.         init1820();
  211.         writeonebyte_18b20(0xcc);
  212.         writeonebyte_18b20(0x44);
  213.         delay_us(100);
  214.         init1820();
  215.         writeonebyte_18b20(0xcc);
  216.         writeonebyte_18b20(0xbe);
  217.         tempL = readonebyte_18b20();
  218.         tempH = readonebyte_18b20();
  219.         tempH <<= 8;
  220.         xx = tempL | tempH;
  221.         return(xx);       
  222. }

  223. /********顯示函數(shù)*********/
  224. void display(unsigned char dizhi, dat)
  225. {
  226.         unsigned char a, b;
  227.         a = dat / 10;         //取得十位數(shù)字
  228.         b = dat % 10;                                        //取得個位數(shù)字
  229.         write_com(dizhi);                        //設(shè)定顯示的地址
  230.         write_date(a + 0x30);        //數(shù)字+0x30得到該數(shù)字的LCD1602顯示碼
  231.         write_date(b + 0x30);
  232. }

  233. /***********溫度顯示函數(shù)**************/
  234. void display_wendu(unsigned char dizhi, dat)
  235. {
  236.          write_com(dizhi);
  237.          write_date(dat);
  238. }

  239. /**********顯示周字符**********/
  240. void display_week(unsigned char week)
  241. {
  242.         unsigned char i;
  243.         write_com(0x8d);        //設(shè)置星期顯示地址
  244.         switch(week)
  245.         {
  246.                 case 1:        for(i = 0; i < 3; i++)
  247.                                 write_date(week_char[ i]);break;
  248.                 case 2: for(i = 4; i < 7; i++)
  249.                                 write_date(week_char[ i]);break;
  250.                 case 3: for(i = 8; i < 11; i++)
  251.                                 write_date(week_char[ i]);break;
  252.                 case 4: for(i = 12; i < 15; i++)
  253.                                 write_date(week_char[ i]);break;
  254.                 case 5: for(i = 16; i < 19; i++)
  255.                                 write_date(week_char[ i]);break;
  256.                 case 6: for(i = 20; i < 23; i++)
  257.                                 write_date(week_char[ i]);break;
  258.                 case 7: for(i = 24; i < 27; i++)
  259.                                 write_date(week_char[ i]);break;
  260.         }
  261. }

  262. /*********按鍵掃描********/
  263. void keyscan()
  264. {
  265.         unsigned char num;
  266.         if(key1 == 0)                                //判斷key1是不是按下
  267.         {
  268.                 delay_ms(20);                //按鍵消抖
  269.                 if(key1 == 0)                         //再次檢測key1是否按下
  270.                 {
  271.                         beepplay();                       
  272.                         while(!key1);        //等待key1釋放
  273.                         num++;
  274.                         switch(num)
  275.                         {
  276.                                 case 1: TR0 = 0;                                                                                //關(guān)閉中斷
  277.                                                 temp_flag = 0;
  278.                                                 time_flag = 0;
  279.                                                 write1302(0x8e, 0x00);                                                //允許寫入DS1302
  280.                                                 write1302(0x80, 0x80);                                                //時間暫停
  281.                                                 write_com(0x0f);                                                                        //設(shè)置光標(biāo)閃爍
  282.                                                 write_com(0xc9);break;                                                //秒鐘閃爍地址
  283.                                 case 2: write_com(0xc6);break;                                //分閃爍地址
  284.                                 case 3: write_com(0xc3);break;                                //時閃爍地址
  285.                                 case 4: write_com(0x8f);break;                                //星期閃爍地址
  286.                                 case 5: write_com(0x8a);break;                                //日閃爍地址
  287.                                 case 6: write_com(0x87);break;                                //月閃爍地址
  288.                                 case 7: write_com(0x84);break;                                //年閃爍地址
  289.                                 case 8: write_com(0x0c);                                                        //設(shè)置光標(biāo)不閃爍
  290.                                                 write1302(0x90,0xa9);                                                        //充電
  291.                                                 write1302(0x8c, toBCD(nian));
  292.                                                 write1302(0x86, toBCD(ri));
  293.                                                 write1302(0x88, toBCD(yue));
  294.                                                 write1302(0x8a, toBCD(week));
  295.                                                 write1302(0x84, toBCD(shi));
  296.                                                 write1302(0x82, toBCD(fen));
  297.                                                 write1302(0x80, toBCD(miao));                         //寫入秒
  298.                                                 write1302(0x8e, 0x80);                                                        //禁止寫入DS1302
  299.                                                 num = 0;TR0 = 1;break;                                                                //定時器打開計數(shù)清零
  300.                         }
  301.                 }
  302.         }
  303.    if(num != 0)           //i>0,按鍵key2,key3無效
  304.    {
  305.                 if(key2 == 0)
  306.                 {
  307.                         delay_ms(20);
  308.                         if(key2 == 0)
  309.                         {
  310.                                 beepplay();
  311.                                 while(!key2);  //等待釋放
  312.                                 switch(num)
  313.                                 {
  314.                                         case 1: miao++;if(miao >= 60)miao = 0;        //秒++
  315.                                                         display(0xc8, miao);                        //顯示秒
  316.                                                         write_com(0xc9);break;                //因為顯示地址指針自動加1,重新定義秒的地址
  317.                                         case 2: fen++;if(fen == 60)fen = 0;                //分++
  318.                                                         display(0xc5, fen);                        //顯示當(dāng)前調(diào)入分?jǐn)?shù)據(jù)
  319.                                                         write_com(0xc6);break;
  320.                                         case 3: shi++;if(shi == 24)shi = 0;
  321.                                                         display(0xc2, shi);
  322.                                                         write_com(0xc3);break;
  323.                                         case 4: week++;if(week == 8)week = 1;
  324.                                                         display_week(week);
  325.                                                         write_com(0x8f);break;
  326.                                         case 5: ri++;if(ri == 32)ri = 1;
  327.                                                         display(0x89, ri);
  328.                                                         write_com(0x8a);break;
  329.                                         case 6: yue++;if(yue == 13)yue = 1;
  330.                                                         display(0x86, yue);
  331.                                                         write_com(0x87);break;
  332.                                         case 7: nian++;if(nian == 100)nian = 0;
  333.                                                         display(0x83, nian);
  334.                                                         write_com(0x84);break;
  335.                                 }
  336.                         }
  337.                 }
  338.                 if(key3==0)                           //按鍵0有效,判斷key3按下是不是0
  339.                 {
  340.                         delay_ms(20);           //按鍵消抖
  341.                         if(key3==0)
  342.                         {
  343.                                 beepplay();           //調(diào)用蜂鳴器響一聲
  344.                                 while(!key3);  //等待釋放key3
  345.                                 switch(num)
  346.                                 {
  347.                                         case 1: miao--;if(miao == 255 | miao > 60)miao = 59;        //減1,減到0再減1就是255
  348.                                                         display(0xc8, miao);
  349.                                                         write_com(0xc9);break;
  350.                                         case 2: fen--;if(fen == 255)fen = 59;
  351.                                                         display(0xc5, fen);
  352.                                                         write_com(0xc6);break;
  353.                                         case 3: shi--;if(shi == 255)shi = 23;
  354.                                                         display(0xc2, shi);
  355.                                                         write_com(0xc3);break;
  356.                                         case 4: week--;if(week == 0)week = 7;
  357.                                                         display_week(week);
  358.                                                         write_com(0x8f);break;
  359.                                         case 5: ri--;if(ri == 0)ri = 31;
  360.                                                         display(0x89, ri);
  361.                                                         write_com(0x8a);break;
  362.                                         case 6: yue--;if(yue == 0)yue = 12;
  363.                                                         display(0x86, yue);
  364.                                                         write_com(0x87);break;
  365.                                         case 7: nian--;if(nian == 255)nian = 99;
  366.                                                         display(0x83, nian);
  367.                                                         write_com(0x84);break;
  368.                                 }
  369.                         }
  370.                 }
  371.         }                       
  372. }

  373. /***********更新時間***********/
  374. void update_time()
  375. {
  376.         if(time_flag == 1)
  377.         {
  378.                 time_flag = 0;
  379.                 miao = read1302(0x81);                //讀秒
  380.                 fen = read1302(0x83);                        //讀分  
  381.                 shi = read1302(0x85);                        //讀時  
  382.                 ri = read1302(0x87);                        //讀日  
  383.                 yue = read1302(0x89);                        //讀月  
  384.                 week = read1302(0x8b);                //讀周  
  385.                 nian = read1302(0x8d);                //讀年

  386.                 display(0xc8, miao);                        //更新秒
  387.                 display(0xc5, fen);                        //更新分
  388.                 display(0xc2, shi);                        //更新時
  389.                 display(0x89, ri);                        //更新日
  390.                 display(0x86, yue);                        //更新月
  391.                 display(0x83, nian);                        //更新年
  392.                 display_week(week);                 //更新周
  393.         }
  394. }

  395. /**********更新溫度*********/
  396. void update_temp()
  397. {
  398.         unsigned int temp;
  399.         if(temp_flag == 1)
  400.         {       
  401.                 temp_flag = 0;
  402.                 temp = readtemp();
  403.                 tp = temp;
  404.                 if(tp & 0x8000)
  405.                         tp = (~tp)+1;
  406.                 tp = ((tp * 5) >> 3);
  407.                 if(temp & 0x8000)
  408.                 {
  409.                         display_wendu(0xcb, '-');
  410.                         display_wendu(0xcc, (tp % 100 / 10) + 0x30);
  411.                         display_wendu(0xce, (tp % 10) + 0x30);
  412.                 }
  413.                 else
  414.                 {
  415.                         if((tp / 100 % 10) == 0)
  416.                                 display_wendu(0xcb, 0x20);
  417.                         else
  418.                                 display_wendu(0xcb, (tp / 100 % 10) + 0x30);
  419.                         display_wendu(0xcc, (tp % 100 / 10) + 0x30);
  420.                         display_wendu(0xce, (tp % 10) + 0x30);
  421.                 }          
  422.         }
  423. }

  424. /********定時器初始化************/
  425. void init_Time0()
  426. {
  427.         TMOD = 0x01;        //設(shè)置定時器工作模式
  428.         TH0 = 0;
  429.   TL0 = 0;
  430.         EA = 1;                //開總中斷
  431.         ET0 = 1;                //開定時器0中斷
  432.         TR0 = 1;                //啟動定時器
  433. }

  434. /**********主函數(shù)*************/
  435. void main()
  436. {
  437.         initLCD();                         //初始化LCD
  438.         init_Time0();                //初始化定時器          
  439.         while(1)
  440.         {
  441.                 keyscan();                //鍵盤掃描
  442.                 update_time();         //更新時間
  443.                 update_temp();        //更新溫度
  444.         }                                                                  
  445. }                                               

  446. /************中斷程序***************/
  447. void Time0()interrupt 1                                 //中斷程序不易過多
  448. {
  449.         static unsigned char x, y;
  450.         TH0 = (65536-10000) / 256;                         //賦值10ms
  451.         TL0 = (65536-10000) % 256;                 
  452.         x++;
  453.         if(x == 10)
  454.         {
  455.                 x = 0; y++;
  456.                 time_flag = 1;
  457.                 if(y == 5)
  458.                 {
  459.                         y = 0;
  460.                         temp_flag = 1;       
  461.                 }
  462.         }       
  463. }
復(fù)制代碼
回復(fù)

使用道具 舉報

ID:66137 發(fā)表于 2014-12-16 23:25 | 顯示全部樓層
高手,這東西不錯,等你發(fā)正式版的程序。。
回復(fù)

使用道具 舉報

ID:48140 發(fā)表于 2014-12-17 11:36 來自手機(jī) | 顯示全部樓層
這東西真好可以好好學(xué)習(xí)一下。51hei有你更精彩!
回復(fù)

使用道具 舉報

ID:70614 發(fā)表于 2014-12-17 13:29 | 顯示全部樓層
制作的真漂亮
回復(fù)

使用道具 舉報

ID:70391 發(fā)表于 2014-12-20 17:42 | 顯示全部樓層
不錯的東西,學(xué)習(xí)了。謝謝分享。
回復(fù)

使用道具 舉報

ID:70391 發(fā)表于 2014-12-21 11:03 | 顯示全部樓層
配有實物圖,很好的東西,樓主很厲害,謝謝分享。
回復(fù)

使用道具 舉報

ID:73762 發(fā)表于 2015-3-5 10:05 | 顯示全部樓層
支持一個,謝謝樓主
回復(fù)

使用道具 舉報

ID:73949 發(fā)表于 2015-3-5 16:02 | 顯示全部樓層
學(xué)習(xí)學(xué)習(xí)!謝謝分享!
回復(fù)

使用道具 舉報

ID:70614 發(fā)表于 2015-3-21 12:49 | 顯示全部樓層
真詳細(xì) 謝謝分享
回復(fù)

使用道具 舉報

ID:75864 發(fā)表于 2015-4-1 11:06 | 顯示全部樓層
學(xué)習(xí),樓主的動手能力真強(qiáng)大
回復(fù)

使用道具 舉報

ID:74143 發(fā)表于 2015-4-3 14:35 | 顯示全部樓層
頂一個。。。。
回復(fù)

使用道具 舉報

ID:61484 發(fā)表于 2015-4-14 22:09 | 顯示全部樓層
學(xué)習(xí)下
回復(fù)

使用道具 舉報

ID:72047 發(fā)表于 2015-4-17 04:48 | 顯示全部樓層
這個資料不錯,下載一下
回復(fù)

使用道具 舉報

ID:77523 發(fā)表于 2015-4-22 15:36 來自手機(jī) | 顯示全部樓層
我也做了1602得時鐘,可惜不能用,希望外做一次
回復(fù)

使用道具 舉報

ID:74992 發(fā)表于 2015-4-22 21:49 | 顯示全部樓層
給樓主頂帖,實在是不錯哦!
回復(fù)

使用道具 舉報

ID:77776 發(fā)表于 2015-4-23 21:09 | 顯示全部樓層
看著我也想做一個
回復(fù)

使用道具 舉報

ID:77689 發(fā)表于 2015-5-26 12:35 來自手機(jī) | 顯示全部樓層
樓主,給我發(fā)一份程序吧,謝謝了,我的編程能力不行,1719190054@qq.com
回復(fù)

使用道具 舉報

ID:83273 發(fā)表于 2015-6-28 22:57 | 顯示全部樓層
挺不錯的
回復(fù)

使用道具 舉報

ID:84732 發(fā)表于 2015-7-5 14:04 | 顯示全部樓層
我也照著做個看看
回復(fù)

使用道具 舉報

ID:85555 發(fā)表于 2015-7-14 14:12 | 顯示全部樓層
不錯。
回復(fù)

使用道具 舉報

ID:124081 發(fā)表于 2016-6-1 00:05 | 顯示全部樓層
明天仔細(xì)看看
回復(fù)

使用道具 舉報

ID:116662 發(fā)表于 2016-6-5 21:49 | 顯示全部樓層
樓主做工真漂亮,謝謝分享
回復(fù)

使用道具 舉報

ID:135369 發(fā)表于 2016-11-9 21:13 | 顯示全部樓層
學(xué)習(xí)了,正好我也要給女票做一個
回復(fù)

使用道具 舉報

ID:162718 發(fā)表于 2017-1-22 15:07 | 顯示全部樓層
時間是沒有問題的,但是溫度沒有用,自己寫這樣的程序也是出現(xiàn)這個問題,我把樓主的程序抄回去還是沒有辦法度溫度,溫度總是0.00,不知道什么原因,看了好多人都是這個問題,是不是什么地方出錯了。
回復(fù)

使用道具 舉報

ID:71689 發(fā)表于 2017-2-1 21:01 | 顯示全部樓層
謝謝分享
回復(fù)

使用道具 舉報

ID:157769 發(fā)表于 2017-4-6 21:52 | 顯示全部樓層
bevispan 發(fā)表于 2017-1-22 15:07
時間是沒有問題的,但是溫度沒有用,自己寫這樣的程序也是出現(xiàn)這個問題,我把樓主的程序抄回去還是沒有辦法 ...

可以i嘗試用這段代碼,DS1302寫地址讀取時間函數(shù)。1602可以同時顯示溫度和時間

/*******************************************************************************
* 函 數(shù) 名         : Ds1302Read
* 函數(shù)功能                   : 讀取一個地址的數(shù)據(jù)
* 輸    入         : addr
* 輸    出         : dat
*******************************************************************************/

uchar Ds1302Read(uchar addr)
{
        uchar n,dat,dat1;
        RST = 0;
        _nop_();

        SCLK = 0;//先將SCLK置低電平。
        _nop_();
        RST = 1;//然后將RST(CE)置高電平。
        _nop_();

        for(n=0; n<8; n++)//開始傳送八位地址命令
        {
                DSIO = addr & 0x01;//數(shù)據(jù)從低位開始傳送
                addr >>= 1;
                SCLK = 1;//數(shù)據(jù)在上升沿時,DS1302讀取數(shù)據(jù)
                _nop_();
                SCLK = 0;//DS1302下降沿時,放置數(shù)據(jù)
                _nop_();
        }
        _nop_();
        for(n=0; n<8; n++)//讀取8位數(shù)據(jù)
        {
                dat1 = DSIO;//從最低位開始接收
                dat = (dat>>1) | (dat1<<7);
                SCLK = 1;
                _nop_();
                SCLK = 0;//DS1302下降沿時,放置數(shù)據(jù)
                _nop_();
        }

        /*RST = 0;
        _nop_();        //以下為DS1302復(fù)位的穩(wěn)定時間,必須的。
        SCLK = 1;
        _nop_();
        DSIO = 0;
        _nop_();
        DSIO = 1;
        _nop_();
        return dat;        */
        SCLK=1;//以下為溫度與時間共存必須代碼,原因現(xiàn)在不清楚,以后仔細(xì)分析。
        _nop_();
        SCLK=0;
        _nop_();
        RST=0;
        _nop_();
                RST=1;
        _nop_();
        _nop_();        
        DSIO = 0;
        _nop_();
        DSIO = 1;
        _nop_();
return dat;
}
回復(fù)

使用道具 舉報

ID:136641 發(fā)表于 2017-9-30 17:55 | 顯示全部樓層
手工厲害了我的哥
回復(fù)

使用道具 舉報

ID:437276 發(fā)表于 2018-12-3 17:13 | 顯示全部樓層
樓主的動手能力真強(qiáng)大,我還需鍛煉這方面的能力
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表