找回密码
 立即注册

QQ登录

只需一步,快速开始

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

这个单片机程序怎么改成可调时间的啊?

[复制链接]
跳转到指定楼层
楼主
ID:297618 发表于 2018-3-31 17:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. #include "reg52.h"                         //此文件中定义了单片机的一些特殊功能寄存器
  2. #include"ds1302.h"        

  3. typedef unsigned int u16;          //对数据类型进行声明定义
  4. typedef unsigned char u8;

  5. sbit LSA=P2^2;
  6. sbit LSB=P2^3;
  7. sbit LSC=P2^4;


  8. char num=0;
  9. u8 DisplayData[8];
  10. u8 code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

  11. void delay(u16 i)
  12. {
  13.         while(i--);        
  14. }


  15. void datapros()         
  16. {
  17.            Ds1302ReadTime();
  18.         DisplayData[0] = smgduan[TIME[2]/16];                                //时
  19.         DisplayData[1] = smgduan[TIME[2]&0x0f];                                 
  20.         DisplayData[2] = 0x40;
  21.         DisplayData[3] = smgduan[TIME[1]/16];                                //分
  22.         DisplayData[4] = smgduan[TIME[1]&0x0f];        
  23.         DisplayData[5] = 0x40;
  24.         DisplayData[6] = smgduan[TIME[0]/16];                                //秒
  25.         DisplayData[7] = smgduan[TIME[0]&0x0f];
  26. }

  27. void DigDisplay()
  28. {
  29.         u8 i;
  30.         for(i=0;i<8;i++)
  31.         {
  32.                 switch(i)         //位选,选择点亮的数码管,
  33.                 {
  34.                         case(0):
  35.                                 LSA=0;LSB=0;LSC=0; break;//显示第0位
  36.                         case(1):
  37.                                 LSA=1;LSB=0;LSC=0; break;//显示第1位
  38.                         case(2):
  39.                                 LSA=0;LSB=1;LSC=0; break;//显示第2位
  40.                         case(3):
  41.                                 LSA=1;LSB=1;LSC=0; break;//显示第3位
  42.                         case(4):
  43.                                 LSA=0;LSB=0;LSC=1; break;//显示第4位
  44.                         case(5):
  45.                                 LSA=1;LSB=0;LSC=1; break;//显示第5位
  46.                         case(6):
  47.                                 LSA=0;LSB=1;LSC=1; break;//显示第6位
  48.                         case(7):
  49.                                 LSA=1;LSB=1;LSC=1; break;//显示第7位        
  50.                 }
  51.                 P0=DisplayData[7-i];//发送数据
  52.                 delay(100); //间隔一段时间扫描        
  53.                 P0=0x00;//消隐
  54.         }               
  55. }

  56. void main()
  57. {        
  58.         Ds1302Init();
  59.         while(1)
  60.         {
  61.                 datapros();         //数据处理函数
  62.                 DigDisplay();//数码管显示函数               
  63.         }               
  64. }

  65. #include"ds1302.h"

  66. //---DS1302写入和读取时分秒的地址命令---//
  67. //---秒分时日月周年 最低位读写位;-------//
  68. uchar code READ_RTC_ADDR[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d};
  69. uchar code WRITE_RTC_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};

  70. //---DS1302时钟初始化2016年5月7日星期六12点00分00秒。---//
  71. //---存储顺序是秒分时日月周年,存储格式是用BCD码---//
  72. uchar TIME[7] = {0, 0, 0x12, 0x07, 0x05, 0x06, 0x16};


  73. void Ds1302Write(uchar addr, uchar dat)
  74. {
  75.         uchar n;
  76.         RST = 0;
  77.         _nop_();

  78.         SCLK = 0;//先将SCLK置低电平。
  79.         _nop_();
  80.         RST = 1; //然后将RST(CE)置高电平。
  81.         _nop_();

  82.         for (n=0; n<8; n++)//开始传送八位地址命令
  83.         {
  84.                 DSIO = addr & 0x01;//数据从低位开始传送
  85.                 addr >>= 1;
  86.                 SCLK = 1;//数据在上升沿时,DS1302读取数据
  87.                 _nop_();
  88.                 SCLK = 0;
  89.                 _nop_();
  90.         }
  91.         for (n=0; n<8; n++)//写入8位数据
  92.         {
  93.                 DSIO = dat & 0x01;
  94.                 dat >>= 1;
  95.                 SCLK = 1;//数据在上升沿时,DS1302读取数据
  96.                 _nop_();
  97.                 SCLK = 0;
  98.                 _nop_();        
  99.         }        
  100.                  
  101.         RST = 0;//传送数据结束
  102.         _nop_();
  103. }


  104. uchar Ds1302Read(uchar addr)
  105. {
  106.         uchar n,dat,dat1;
  107.         RST = 0;
  108.         _nop_();

  109.         SCLK = 0;//先将SCLK置低电平。
  110.         _nop_();
  111.         RST = 1;//然后将RST(CE)置高电平。
  112.         _nop_();

  113.         for(n=0; n<8; n++)//开始传送八位地址命令
  114.         {
  115.                 DSIO = addr & 0x01;//数据从低位开始传送
  116.                 addr >>= 1;
  117.                 SCLK = 1;//数据在上升沿时,DS1302读取数据
  118.                 _nop_();
  119.                 SCLK = 0;//DS1302下降沿时,放置数据
  120.                 _nop_();
  121.         }
  122.         _nop_();
  123.         for(n=0; n<8; n++)//读取8位数据
  124.         {
  125.                 dat1 = DSIO;//从最低位开始接收
  126.                 dat = (dat>>1) | (dat1<<7);
  127.                 SCLK = 1;
  128.                 _nop_();
  129.                 SCLK = 0;//DS1302下降沿时,放置数据
  130.                 _nop_();
  131.         }

  132.         RST = 0;
  133.         _nop_();        //以下为DS1302复位的稳定时间,必须的。
  134.         SCLK = 1;
  135.         _nop_();
  136.         DSIO = 0;
  137.         _nop_();
  138.         DSIO = 1;
  139.         _nop_();
  140.         return dat;        
  141. }


  142. void Ds1302Init()
  143. {
  144.         uchar n;
  145.         Ds1302Write(0x8E,0X00);                 //禁止写保护,就是关闭写保护功能
  146.         for (n=0; n<7; n++)//写入7个字节的时钟信号:分秒时日月周年
  147.         {
  148.                 Ds1302Write(WRITE_RTC_ADDR[n],TIME[n]);        
  149.         }
  150.         Ds1302Write(0x8E,0x80);                 //打开写保护功能
  151. }


  152. void Ds1302ReadTime()
  153. {
  154.         uchar n;
  155.         for (n=0; n<7; n++)//读取7个字节的时钟信号:分秒时日月周年
  156.         {
  157.                 TIME[n] = Ds1302Read(READ_RTC_ADDR[n]);
  158.         }
  159.                
  160. }

复制代码


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

使用道具 举报

沙发
ID:297618 发表于 2018-4-1 15:08 | 只看该作者
数码管显示的时钟,要如何改才能改成可调时间的?
回复

使用道具 举报

板凳
ID:123289 发表于 2018-4-1 16:12 | 只看该作者
不是程序如何改,而是你的思路如何改!
列出现在的思路,画出逻辑原理图,看看哪里需要改进?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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