找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 10255|回复: 28
收起左侧

单片机+1602+DS1302+DS18B20迷你时钟设计

  [复制链接]
ID:70481 发表于 2014-12-16 17:08 | 显示全部楼层 |阅读模式
程序 LCD1602液晶时钟.zip (51.17 KB, 下载次数: 102)
由于已经工作了,很少上51hei论坛打理帖子,对不起各位

程序较早写的,待优化的地方较多,仅供大家参考

该作品仅供大家讨论学习用,切勿用在商业用途。


第一个版本的资料

阻焊层.pdf (6.39 KB, 下载次数: 32)
电路原理图.pdf (43.22 KB, 下载次数: 78)
丝印层.pdf (9.33 KB, 下载次数: 17)
原理图负片.pdf (22.86 KB, 下载次数: 24)
测试源程序keil编译.zip (1.14 KB, 下载次数: 75)

第一个版本

3D显示效果图(正面)(没有3D模型只能显示这样,大家见谅)
200145d32413cmm17nlmzu.jpg.thumb.jpg
3D显示效果图(反面) (没有3D模型只能显示这样,大家见谅)
200145ysp2alsahxzxw6ea.jpg.thumb.jpg
自制切割机
200018v7nnff1vhoont21h.jpg.thumb.jpg

做好丝印层(就这个我用热转印做的)打好孔,裁好PCB
200021dupf1ipcp7oufzda.jpg.thumb.jpg

PCB反面(PCB我经过了化学镀锡处理)
200024xvdlebxypffdyy0b.jpg.thumb.jpg

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

ATMEL的AT89S52
200041lqg3cd2g9c427hei.jpg.thumb.jpg

DS1302就在单片机中间
200035z90ns2b4espbbate.jpg.thumb.jpg

在DS1302的上方也预留DS18B20的接口
200038am53131gq2733ddc.jpg.thumb.jpg

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

200051dd6ll6myltm6omnw.jpg.thumb.jpg
第二个版本
更新了蜂鸣器、ISP、可控制背光,优化了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
关闭背光的效果
150030sdq466ypsnn4udu6.jpg.thumb.jpg
程序已完工,程序运行(程序等资料过一段时间发出)
现在附件发的程序是测试程序,大家注意下
150034rwrhz6dzjprh8kwz.jpg.thumb.jpg







回复

使用道具 举报

ID:70481 发表于 2014-12-16 17:10 | 显示全部楼层
源码预览:
  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复位
  27. sbit SDA = P3^4;                //1302数据
  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写数据************/
  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);                //延时启动,等待电压稳定
  87.         write_com(0x38);        //设置16*2显示,5*7点阵,8位数据口
  88.         write_com(0x0c);        //设置开显示,不显示光标
  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转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写一个字节*********/          
  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);        //写入的数据
  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中读出一个字节*********/
  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中写入一个字节*******/
  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. /********显示函数*********/
  224. void display(unsigned char dizhi, dat)
  225. {
  226.         unsigned char a, b;
  227.         a = dat / 10;         //取得十位数字
  228.         b = dat % 10;                                        //取得个位数字
  229.         write_com(dizhi);                        //设定显示的地址
  230.         write_date(a + 0x30);        //数字+0x30得到该数字的LCD1602显示码
  231.         write_date(b + 0x30);
  232. }

  233. /***********温度显示函数**************/
  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);        //设置星期显示地址
  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;                                                                                //关闭中断
  277.                                                 temp_flag = 0;
  278.                                                 time_flag = 0;
  279.                                                 write1302(0x8e, 0x00);                                                //允许写入DS1302
  280.                                                 write1302(0x80, 0x80);                                                //时间暂停
  281.                                                 write_com(0x0f);                                                                        //设置光标闪烁
  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);                                                        //设置光标不闪烁
  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;                                                                //定时器打开计数清零
  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);                        //显示当前调入分数据
  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();           //调用蜂鸣器响一声
  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;        //设置定时器工作模式
  428.         TH0 = 0;
  429.   TL0 = 0;
  430.         EA = 1;                //开总中断
  431.         ET0 = 1;                //开定时器0中断
  432.         TR0 = 1;                //启动定时器
  433. }

  434. /**********主函数*************/
  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. }
复制代码
回复

使用道具 举报

ID:66137 发表于 2014-12-16 23:25 | 显示全部楼层
高手,这东西不错,等你发正式版的程序。。
回复

使用道具 举报

ID:48140 发表于 2014-12-17 11:36 来自触屏版 | 显示全部楼层
这东西真好可以好好学习一下。51hei有你更精彩!!
回复

使用道具 举报

ID:70614 发表于 2014-12-17 13:29 | 显示全部楼层
制作的真漂亮
回复

使用道具 举报

ID:70391 发表于 2014-12-20 17:42 | 显示全部楼层
不错的东西,学习了。谢谢分享。
回复

使用道具 举报

ID:70391 发表于 2014-12-21 11:03 | 显示全部楼层
配有实物图,很好的东西,楼主很厉害,谢谢分享。
回复

使用道具 举报

ID:73762 发表于 2015-3-5 10:05 | 显示全部楼层
支持一个,谢谢楼主
回复

使用道具 举报

ID:73949 发表于 2015-3-5 16:02 | 显示全部楼层
学习学习!谢谢分享!
回复

使用道具 举报

ID:70614 发表于 2015-3-21 12:49 | 显示全部楼层
真详细 谢谢分享
回复

使用道具 举报

ID:75864 发表于 2015-4-1 11:06 | 显示全部楼层
学习,楼主的动手能力真强大
回复

使用道具 举报

ID:74143 发表于 2015-4-3 14:35 | 显示全部楼层
顶一个。。。。
回复

使用道具 举报

ID:61484 发表于 2015-4-14 22:09 | 显示全部楼层
学习下
回复

使用道具 举报

ID:72047 发表于 2015-4-17 04:48 | 显示全部楼层
這個資料不錯,下載一下
回复

使用道具 举报

ID:77523 发表于 2015-4-22 15:36 来自触屏版 | 显示全部楼层
我也做了1602得时钟,可惜不能用,希望外做一次
回复

使用道具 举报

ID:74992 发表于 2015-4-22 21:49 | 显示全部楼层
给楼主顶帖,实在是不错哦!
回复

使用道具 举报

ID:77776 发表于 2015-4-23 21:09 | 显示全部楼层
看着我也想做一个
回复

使用道具 举报

ID:77689 发表于 2015-5-26 12:35 来自触屏版 | 显示全部楼层
楼主,给我发一份程序吧,谢谢了,我的编程能力不行,1719190054@qq.com
回复

使用道具 举报

ID:83273 发表于 2015-6-28 22:57 | 显示全部楼层
挺不错的
回复

使用道具 举报

ID:84732 发表于 2015-7-5 14:04 | 显示全部楼层
我也照着做个看看
回复

使用道具 举报

ID:85555 发表于 2015-7-14 14:12 | 显示全部楼层
不错。
回复

使用道具 举报

ID:124081 发表于 2016-6-1 00:05 | 显示全部楼层
明天仔细看看
回复

使用道具 举报

ID:116662 发表于 2016-6-5 21:49 | 显示全部楼层
楼主做工真漂亮,谢谢分享
回复

使用道具 举报

ID:135369 发表于 2016-11-9 21:13 | 显示全部楼层
学习了,正好我也要给女票做一个
回复

使用道具 举报

ID:162718 发表于 2017-1-22 15:07 | 显示全部楼层
时间是没有问题的,但是温度没有用,自己写这样的程序也是出现这个问题,我把楼主的程序抄回去还是没有办法度温度,温度总是0.00,不知道什么原因,看了好多人都是这个问题,是不是什么地方出错了。
回复

使用道具 举报

ID:71689 发表于 2017-2-1 21:01 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:157769 发表于 2017-4-6 21:52 | 显示全部楼层
bevispan 发表于 2017-1-22 15:07
时间是没有问题的,但是温度没有用,自己写这样的程序也是出现这个问题,我把楼主的程序抄回去还是没有办法 ...

可以i尝试用这段代码,DS1302写地址读取时间函数。1602可以同时显示温度和时间

/*******************************************************************************
* 函 数 名         : Ds1302Read
* 函数功能                   : 读取一个地址的数据
* 输    入         : 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;//数据从低位开始传送
                addr >>= 1;
                SCLK = 1;//数据在上升沿时,DS1302读取数据
                _nop_();
                SCLK = 0;//DS1302下降沿时,放置数据
                _nop_();
        }
        _nop_();
        for(n=0; n<8; n++)//读取8位数据
        {
                dat1 = DSIO;//从最低位开始接收
                dat = (dat>>1) | (dat1<<7);
                SCLK = 1;
                _nop_();
                SCLK = 0;//DS1302下降沿时,放置数据
                _nop_();
        }

        /*RST = 0;
        _nop_();        //以下为DS1302复位的稳定时间,必须的。
        SCLK = 1;
        _nop_();
        DSIO = 0;
        _nop_();
        DSIO = 1;
        _nop_();
        return dat;        */
        SCLK=1;//以下为温度与时间共存必须代码,原因现在不清楚,以后仔细分析。
        _nop_();
        SCLK=0;
        _nop_();
        RST=0;
        _nop_();
                RST=1;
        _nop_();
        _nop_();        
        DSIO = 0;
        _nop_();
        DSIO = 1;
        _nop_();
return dat;
}
回复

使用道具 举报

ID:136641 发表于 2017-9-30 17:55 | 显示全部楼层
手工厉害了我的哥
回复

使用道具 举报

ID:437276 发表于 2018-12-3 17:13 | 显示全部楼层
楼主的动手能力真强大,我还需锻炼这方面的能力
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表