找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

這個(gè)單片機(jī)程序怎么改成可調(diào)時(shí)間的啊?

[復(fù)制鏈接]
ID:297618 發(fā)表于 2018-3-31 17:37 | 顯示全部樓層 |閱讀模式
  1. #include "reg52.h"                         //此文件中定義了單片機(jī)的一些特殊功能寄存器
  2. #include"ds1302.h"        

  3. typedef unsigned int u16;          //對數(shù)據(jù)類型進(jìn)行聲明定義
  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];                                //時(shí)
  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)         //位選,選擇點(diǎn)亮的數(shù)碼管,
  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];//發(fā)送數(shù)據(jù)
  52.                 delay(100); //間隔一段時(shí)間掃描        
  53.                 P0=0x00;//消隱
  54.         }               
  55. }

  56. void main()
  57. {        
  58.         Ds1302Init();
  59.         while(1)
  60.         {
  61.                 datapros();         //數(shù)據(jù)處理函數(shù)
  62.                 DigDisplay();//數(shù)碼管顯示函數(shù)               
  63.         }               
  64. }

  65. #include"ds1302.h"

  66. //---DS1302寫入和讀取時(shí)分秒的地址命令---//
  67. //---秒分時(shí)日月周年 最低位讀寫位;-------//
  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時(shí)鐘初始化2016年5月7日星期六12點(diǎn)00分00秒。---//
  71. //---存儲(chǔ)順序是秒分時(shí)日月周年,存儲(chǔ)格式是用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;//數(shù)據(jù)從低位開始傳送
  85.                 addr >>= 1;
  86.                 SCLK = 1;//數(shù)據(jù)在上升沿時(shí),DS1302讀取數(shù)據(jù)
  87.                 _nop_();
  88.                 SCLK = 0;
  89.                 _nop_();
  90.         }
  91.         for (n=0; n<8; n++)//寫入8位數(shù)據(jù)
  92.         {
  93.                 DSIO = dat & 0x01;
  94.                 dat >>= 1;
  95.                 SCLK = 1;//數(shù)據(jù)在上升沿時(shí),DS1302讀取數(shù)據(jù)
  96.                 _nop_();
  97.                 SCLK = 0;
  98.                 _nop_();        
  99.         }        
  100.                  
  101.         RST = 0;//傳送數(shù)據(jù)結(jié)束
  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;//數(shù)據(jù)從低位開始傳送
  116.                 addr >>= 1;
  117.                 SCLK = 1;//數(shù)據(jù)在上升沿時(shí),DS1302讀取數(shù)據(jù)
  118.                 _nop_();
  119.                 SCLK = 0;//DS1302下降沿時(shí),放置數(shù)據(jù)
  120.                 _nop_();
  121.         }
  122.         _nop_();
  123.         for(n=0; n<8; n++)//讀取8位數(shù)據(jù)
  124.         {
  125.                 dat1 = DSIO;//從最低位開始接收
  126.                 dat = (dat>>1) | (dat1<<7);
  127.                 SCLK = 1;
  128.                 _nop_();
  129.                 SCLK = 0;//DS1302下降沿時(shí),放置數(shù)據(jù)
  130.                 _nop_();
  131.         }

  132.         RST = 0;
  133.         _nop_();        //以下為DS1302復(fù)位的穩(wěn)定時(shí)間,必須的。
  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);                 //禁止寫保護(hù),就是關(guān)閉寫保護(hù)功能
  146.         for (n=0; n<7; n++)//寫入7個(gè)字節(jié)的時(shí)鐘信號(hào):分秒時(shí)日月周年
  147.         {
  148.                 Ds1302Write(WRITE_RTC_ADDR[n],TIME[n]);        
  149.         }
  150.         Ds1302Write(0x8E,0x80);                 //打開寫保護(hù)功能
  151. }


  152. void Ds1302ReadTime()
  153. {
  154.         uchar n;
  155.         for (n=0; n<7; n++)//讀取7個(gè)字節(jié)的時(shí)鐘信號(hào):分秒時(shí)日月周年
  156.         {
  157.                 TIME[n] = Ds1302Read(READ_RTC_ADDR[n]);
  158.         }
  159.                
  160. }

復(fù)制代碼


回復(fù)

使用道具 舉報(bào)

ID:297618 發(fā)表于 2018-4-1 15:08 | 顯示全部樓層
數(shù)碼管顯示的時(shí)鐘,要如何改才能改成可調(diào)時(shí)間的?
回復(fù)

使用道具 舉報(bào)

ID:123289 發(fā)表于 2018-4-1 16:12 | 顯示全部樓層
不是程序如何改,而是你的思路如何改!
列出現(xiàn)在的思路,畫出邏輯原理圖,看看哪里需要改進(jìn)?
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

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