找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8102|回复: 28
打印 上一主题 下一主题
收起左侧

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

  [复制链接]
跳转到指定楼层
楼主
ID:70481 发表于 2014-12-16 17:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
程序 LCD1602液晶时钟.zip (51.17 KB, 下载次数: 100)
由于已经工作了,很少上51hei论坛打理帖子,对不起各位

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

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


第一个版本的资料

阻焊层.pdf (6.39 KB, 下载次数: 31)
电路原理图.pdf (43.22 KB, 下载次数: 76)
丝印层.pdf (9.33 KB, 下载次数: 15)
原理图负片.pdf (22.86 KB, 下载次数: 22)
测试源程序keil编译.zip (1.14 KB, 下载次数: 73)

第一个版本

3D显示效果图(正面)(没有3D模型只能显示这样,大家见谅)

3D显示效果图(反面) (没有3D模型只能显示这样,大家见谅)

自制切割机


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


PCB反面(PCB我经过了化学镀锡处理)


焊接好PCB板


ATMEL的AT89S52


DS1302就在单片机中间


在DS1302的上方也预留DS18B20的接口


安装液晶显示器效果





第二个版本
更新了蜂鸣器、ISP、可控制背光,优化了PCB布局








整体的效果

关闭背光的效果

程序已完工,程序运行(程序等资料过一段时间发出)
现在附件发的程序是测试程序,大家注意下








分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏9 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
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有你更精彩!!
回复

使用道具 举报

5#
ID:70614 发表于 2014-12-17 13:29 | 只看该作者
制作的真漂亮
回复

使用道具 举报

6#
ID:70391 发表于 2014-12-20 17:42 | 只看该作者
不错的东西,学习了。谢谢分享。
回复

使用道具 举报

7#
ID:70391 发表于 2014-12-21 11:03 | 只看该作者
配有实物图,很好的东西,楼主很厉害,谢谢分享。
回复

使用道具 举报

8#
ID:73762 发表于 2015-3-5 10:05 | 只看该作者
支持一个,谢谢楼主
回复

使用道具 举报

9#
ID:73949 发表于 2015-3-5 16:02 | 只看该作者
学习学习!谢谢分享!
回复

使用道具 举报

10#
ID:70614 发表于 2015-3-21 12:49 | 只看该作者
真详细 谢谢分享
回复

使用道具 举报

11#
ID:75864 发表于 2015-4-1 11:06 | 只看该作者
学习,楼主的动手能力真强大
回复

使用道具 举报

12#
ID:74143 发表于 2015-4-3 14:35 | 只看该作者
顶一个。。。。
回复

使用道具 举报

13#
ID:61484 发表于 2015-4-14 22:09 | 只看该作者
学习下
回复

使用道具 举报

14#
ID:72047 发表于 2015-4-17 04:48 | 只看该作者
這個資料不錯,下載一下
回复

使用道具 举报

15#
ID:77523 发表于 2015-4-22 15:36 来自手机 | 只看该作者
我也做了1602得时钟,可惜不能用,希望外做一次
回复

使用道具 举报

16#
ID:74992 发表于 2015-4-22 21:49 | 只看该作者
给楼主顶帖,实在是不错哦!
回复

使用道具 举报

17#
ID:77776 发表于 2015-4-23 21:09 | 只看该作者
看着我也想做一个
回复

使用道具 举报

18#
ID:77689 发表于 2015-5-26 12:35 来自手机 | 只看该作者
楼主,给我发一份程序吧,谢谢了,我的编程能力不行,1719190054@qq.com
回复

使用道具 举报

19#
ID:83273 发表于 2015-6-28 22:57 | 只看该作者
挺不错的
回复

使用道具 举报

20#
ID:84732 发表于 2015-7-5 14:04 | 只看该作者
我也照着做个看看
回复

使用道具 举报

21#
ID:85555 发表于 2015-7-14 14:12 | 只看该作者
不错。
回复

使用道具 举报

22#
ID:124081 发表于 2016-6-1 00:05 | 只看该作者
明天仔细看看
回复

使用道具 举报

23#
ID:116662 发表于 2016-6-5 21:49 | 只看该作者
楼主做工真漂亮,谢谢分享
回复

使用道具 举报

24#
ID:135369 发表于 2016-11-9 21:13 | 只看该作者
学习了,正好我也要给女票做一个
回复

使用道具 举报

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

使用道具 举报

26#
ID:71689 发表于 2017-2-1 21:01 | 只看该作者
谢谢分享
回复

使用道具 举报

27#
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;
}
回复

使用道具 举报

28#
ID:136641 发表于 2017-9-30 17:55 | 只看该作者
手工厉害了我的哥
回复

使用道具 举报

29#
ID:437276 发表于 2018-12-3 17:13 | 只看该作者
楼主的动手能力真强大,我还需锻炼这方面的能力
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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