久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4266|回復: 44
收起左側

單片機DS1302驅動與轉換數據以及時序觀察問題

[復制鏈接]
ID:332444 發表于 2022-12-23 15:06 | 顯示全部樓層 |閱讀模式
錄像只寫了讀取秒鐘
錄像34_轉.gif
觀察時序電路仿真示波器可以看到全部,編程仿真無法看到讀取數據時的IO狀態。

1.png
在這里只看看DS1302驅動和數據轉換部分代碼,數碼管驅動同以往帖子。

無標題1.png

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

ID:332444 發表于 2023-1-3 14:29 | 顯示全部樓層
如果哪位能寫出全篇不調用獨占計數延時的代碼我有獎,獎勵黑幣.
這圖演示的就是除了2個1302函數有獨占循環讀/寫8次外,整篇都不用獨占計數延時的荔枝,包括數碼管顯示都不再使用獨占計數延時的高級應用.
1.gif
回復

使用道具 舉報

ID:624769 發表于 2023-1-3 20:47 來自觸屏版 | 顯示全部樓層
雖然不知道你說的獨占計數是啥東西,如果僅僅是指延時的話,直接用串口1模式0,就好了,不光不需要延時,連循環讀IO都不用了,直接寫一次sbuf,讀一次sbuf即可,當然我更喜歡用burst一次把秒分時都讀出來。
回復

使用道具 舉報

ID:401564 發表于 2023-1-3 23:43 | 顯示全部樓層
"獨占計數延時"
"獨占循環讀"
不要自己創造名詞,盡量用大家都能理解的詞匯
這個仿真一點意義都沒有,仿真行,實際電路不一定行,到了實際電路還是得重新調試,那么,這個仿真有什么意義?
對于時序,你也不一定能看得明白,自己找一個開發板,點兩下燒錄驗證,比什么都好
獎勵黑幣這種東西就不需要了,你沒我的多
一個1302的程序,并不是什么火箭上天的難度,他只是一個入門的東西而已,實在不想動手,我有現成的DS3231+GPS自動對時的時鐘,程序和PCB都可以免費上傳,只要你說了就行
回復

使用道具 舉報

ID:332444 發表于 2023-1-3 23:49 | 顯示全部樓層
188610329 發表于 2023-1-3 20:47
雖然不知道你說的獨占計數是啥東西,如果僅僅是指延時的話,直接用串口1模式0,就好了,不光不需要延時,連 ...

看我這帖子http://www.zg4o1577.cn/bbs/dpj-225609-1.html
回復

使用道具 舉報

ID:332444 發表于 2023-1-4 07:12 | 顯示全部樓層
可以這樣說,以貼出來的電路和只讀取1302的時分秒送8位數碼管顯示,并有整點4響半點2響為功能,并在主函數while(1)內用beep=!beep;仿真測試整個代碼響應時間為目標,且不得使用循環語句包括GOTO在內構成的獨占循環計數延時,即這次把數碼管顯示中的while計數延時也去掉了,從而提高了程序整體響應時間,從之前的10ms提高到了約40us,這就意味著整個程序還有充足的時間去響應其它更多事件安排。各位高手可以盡情展現優秀算法,盡量使得beep的周期最小,我目前能做到beep的周期不到40us,既然“大家”們說得那么有把握,我很想開開眼界,相信有很多人也期待著。
51hei.png
回復

使用道具 舉報

ID:996773 發表于 2023-1-4 13:31 | 顯示全部樓層
沒看懂樓主的目的,樓主用的是138解碼逐個點亮數碼管的掃描方式,讀取1302數據和bcd轉換十進制再查表只需要在點亮一個數碼管周期內完成,其余時間只能等待延時,不延時還能干嘛呢,還有啊,這程序太簡單了,很多功能都沒實現,操作不用按鈕,使用旋轉編碼器,年月日和鬧鐘都沒實現呢,這些都實現了,再找優化方案和程序精簡
回復

使用道具 舉報

ID:401564 發表于 2023-1-4 20:03 | 顯示全部樓層
xianfajushi 發表于 2023-1-4 07:12
可以這樣說,以貼出來的電路和只讀取1302的時分秒送8位數碼管顯示,并有整點4響半點2響為功能,并在主函數w ...

我這幾年編程白學了?我怎么看了幾次都看不明白這段文字表達了什么...........
回復

使用道具 舉報

ID:213173 發表于 2023-1-4 20:42 | 顯示全部樓層
xianfajushi 發表于 2023-1-4 07:12
可以這樣說,以貼出來的電路和只讀取1302的時分秒送8位數碼管顯示,并有整點4響半點2響為功能,并在主函數w ...

這種要求的程序很簡單,也用不著138、573,給你一個示例參考,另加鬧鐘也是輕而易舉的事。黑幣你就自己留著吧。 無標題.jpg


  1. #include <reg51.H>
  2. #include <intrins.h>
  3. #define uchar unsigned char
  4. #define uint  unsigned int
  5. #define key_S 8                                        //宏定義短按(約20ms)
  6. #define key_L key_S*30                        //宏定義長按(約600ms)
  7. #define key_I key_S*20                        //宏定義長按連+間隔(約200ms)
  8. //DS1302引腳連接定義
  9. sbit DSIO = P3^2;
  10. sbit REST = P3^0;
  11. sbit SCLK = P3^1;
  12. sbit key1 = P3^3;
  13. uchar code table[]={//共陰數碼管段碼"0~f-."
  14. 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40,0x80};
  15. uchar dis_buf[8]={0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x00};                //數碼管顯示緩存數組
  16. //DS1302讀取和寫入時分秒日月周年的地址
  17. uchar code READ_RTC_ADDR[7]=  {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d}; //讀出地址
  18. uchar code WRITE_RTC_ADDR[7]= {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c}; //寫入地址
  19. //              秒    分    時    日    月    周    年
  20. uchar TIME[7]={0x00, 0x00, 0x12, 0x04, 0x01, 0x03, 0x23};//讀取Ds1302 存儲順序是秒分時日月周年
  21. //---全局變量聲明---
  22. uint  Cnt2ms;                //2.5ms計數變量
  23. uint  num;                    //計數變量
  24. uchar KeySec;                 //鍵值變量
  25. bit   flashing;               //閃爍標志
  26. //---本地函數聲明---//
  27. void Ds1302Init();            //DS1302初始化
  28. void Ds1302Write(uchar addr, uchar dat);//向1302芯片寫入地址和數據
  29. uchar Ds1302Read(uchar addr); //從1302讀數據
  30. void Ds1302ReadTime();        //讀取秒分時日月周年信息
  31. uchar BCD_D(uchar bcd);       //BCD碼轉十進制函數
  32. uchar D_BCD(uchar Dec);       //十進制轉BCD碼函數
  33. void Timer0Init(void);        //定時器T0初始化
  34. //==============DS1302驅動部分=====================
  35. //寫1302時鐘數據
  36. void Ds1302Write(uchar addr, uchar dat)
  37. {
  38.         uchar i;
  39.         REST= 0;
  40.         SCLK= 0;
  41.         REST= 1;
  42.         for(i=0;i<8;i++)       // 寫地址
  43.         {
  44.                 DSIO=addr & 0x01;  //數據從低位開始傳送
  45.                 addr>>=1;
  46.                 SCLK = 1;          //數據在上升沿時,DS1302讀取數據
  47.                 SCLK = 0;
  48.         }
  49.         for(i=0;i<8;i++)       //寫數據
  50.         {
  51.                 DSIO=dat & 0x01;
  52.                 dat>>= 1;
  53.                 SCLK = 1;           // 數據在上升沿時,DS1302讀取數據
  54.                 SCLK = 0;       
  55.         }                 
  56.         REST = 0;                // 傳送數據結束       
  57. }
  58. //讀1302時鐘數據
  59. uchar Ds1302Read(uchar addr)
  60. {
  61.         uchar i,dat,dat1;
  62.         REST = 0;
  63.         SCLK = 0;
  64.         REST = 1;
  65.         for(i=0; i<8; i++)      // 開始傳送八位地址命令
  66.         {
  67.                 DSIO = addr & 0x01; // 數據從低位開始傳送
  68.                 addr >>= 1;
  69.                 SCLK = 1;           // 上升沿有效,DS1302讀取數據
  70.                 SCLK = 0;
  71.         }
  72.         for(i=0;i<8;i++)        // 讀取8位數據
  73.         {
  74.                 dat1 = DSIO;        // 從最低位開始接收
  75.                 dat=(dat>>1)|(dat1<<7);
  76.                 SCLK = 1;           // 上升沿有效,DS1302讀取數據
  77.                 SCLK = 0;
  78.         }
  79.         REST = 0;               // 以下為DS1302復位的穩定時間,必須的。                   
  80.         SCLK = 1;
  81.         DSIO = 0;
  82.         DSIO = 1;
  83.         return dat;       
  84. }
  85. //初始化DS1302
  86. void Ds1302Init()
  87. {
  88.         uchar i;
  89.         Ds1302Write(0x8E,0x00);   // 禁止寫保護功能
  90.         for(i=0;i<3;i++)          // 寫入3個字節的時鐘信號:分秒時       
  91.                 Ds1302Write(WRITE_RTC_ADDR[i],TIME[i]);
  92.         Ds1302Write(0x8E,0x80);   // 打開寫保護功能
  93. }
  94. //BCD碼轉十進制函數
  95. uchar BCD_D(uchar bcd)
  96. {
  97.         return ((bcd>>4)*10)+(bcd & 0x0f);
  98. }
  99. //十進制轉BCD碼函數,返回BCD碼
  100. uchar D_BCD(uchar Dec)
  101. {
  102.         return (Dec/10*16+Dec%10);
  103. }

  104. //讀取時鐘信息
  105. void Ds1302ReadTime()
  106. {
  107.         uchar i;
  108.         for(i=0;i<3;i++)         //讀取3個字節的時鐘信號:秒分時
  109.                 TIME[i]=BCD_D(Ds1302Read(READ_RTC_ADDR[i]));//BCD轉換成十進制保存
  110. }

  111. //按鍵服務函數
  112. void key_scan()
  113. {
  114.         static uint time=0;  //計數變量

  115.         if(!key1)       //按鍵按下
  116.         {
  117.                 time++;
  118.                 if(time>=key_L)  //長按
  119.                 {
  120.                         switch(KeySec)
  121.                         {
  122.                                 case 1: TIME[2]++;if(TIME[2]>23)TIME[2]=0;break;
  123.                                 case 2: TIME[1]++;if(TIME[1]>59)TIME[1]=0;TIME[0]=0;break;
  124.                         }
  125.                         time=key_I;  //連+間隔
  126.                         num=2000;     //自復位變量賦值(5秒)
  127.                 }
  128.         }
  129.         else                                //松手
  130.         {
  131.                 if(time>key_S && time<key_I)//短按
  132.                 {
  133.                         num=2000;    //自復位變量賦值(5秒)
  134.                         KeySec++;
  135.                         if(KeySec>2)
  136.                         {
  137. //                                KeySec=0;
  138.                                 num=1;
  139.                         }
  140.                 }
  141.                 time=0;
  142.         }
  143. }

  144. // 數碼管顯示函數
  145. void display()
  146. {
  147.         uchar i;
  148.         if(KeySec==0)           //常態顯示
  149.         {
  150.                 dis_buf[0]=table[TIME[2]/10];
  151.                 dis_buf[1]=table[TIME[2]%10];
  152.                 dis_buf[3]=table[TIME[1]/10];
  153.                 dis_buf[4]=table[TIME[1]%10];
  154.                 dis_buf[6]=table[TIME[0]/10];
  155.                 dis_buf[7]=table[TIME[0]%10];
  156.         }
  157.         if(KeySec==1)           //調整時
  158.         {
  159.                 if(!key1)//持續不變表示鍵長按連加,時不閃爍
  160.                 {
  161.                         dis_buf[0]=table[TIME[2]/10];
  162.                         dis_buf[1]=table[TIME[2]%10];
  163.                 }
  164.                 else                //松手 時閃爍
  165.                 {
  166.                         if(flashing)
  167.                         {
  168.                                 dis_buf[0]=table[TIME[2]/10];
  169.                                 dis_buf[1]=table[TIME[2]%10];
  170.                         }
  171.                         else
  172.                         {
  173.                                 dis_buf[0]=0x00;
  174.                                 dis_buf[1]=0x00;
  175.                         }
  176.                 }
  177.                 dis_buf[3]=table[TIME[1]/10];
  178.                 dis_buf[4]=table[TIME[1]%10];
  179.                 dis_buf[6]=table[TIME[0]/10];
  180.                 dis_buf[7]=table[TIME[0]%10];

  181.         }
  182.         if(KeySec==2)           //調整分
  183.         {
  184.                 dis_buf[0]=table[TIME[2]/10];
  185.                 dis_buf[1]=table[TIME[2]%10];
  186.                 if(!key1)//持續不變表示鍵長按連加,分不閃爍
  187.                 {
  188.                         dis_buf[3]=table[TIME[1]/10];
  189.                         dis_buf[4]=table[TIME[1]%10];
  190.                 }
  191.                 else                //松手 分閃爍
  192.                 {
  193.                         if(flashing)
  194.                         {
  195.                                 dis_buf[3]=table[TIME[1]/10];
  196.                                 dis_buf[4]=table[TIME[1]%10];
  197.                         }
  198.                         else
  199.                         {
  200.                                 dis_buf[3]=0x00;
  201.                                 dis_buf[4]=0x00;
  202.                         }
  203.                 }
  204.                 dis_buf[6]=table[TIME[0]/10];
  205.                 dis_buf[7]=table[TIME[0]%10];
  206.         }
  207.         P2=0xff;
  208.         P0=dis_buf[i];
  209.         P2=~(0x01<<i);
  210.         i=++i%8;
  211. }
  212. //初始化定時器
  213. void Timer0Init(void)                //2500微秒@12.000MHz
  214. {
  215.         TMOD |= 0x01;                //設置定時器模式
  216.         TL0 = 0x3C;                //設置定時初始值
  217.         TH0 = 0xF6;                //設置定時初始值
  218.         TF0 = 0;                //清除TF0標志
  219.         TR0 = 1;                //定時器0開始計時
  220. }
  221. //主函數
  222. void main()
  223. {
  224.         uchar t;
  225.         Ds1302Init();
  226.         Timer0Init();   //初始化定時器
  227.         while(1)
  228.         {
  229.                 if(TF0)    //周期2.5ms
  230.                 {
  231.                         TF0=0;
  232.                         TL0 = 0x3C;                //設置定時初始值
  233.                         TH0 = 0xF6;                //設置定時初始值
  234.                         if(++Cnt2ms==400)Cnt2ms=0;
  235.                         key_scan();//按鍵掃描
  236.                         if(num!=0)
  237.                         {
  238.                                 if(Cnt2ms%80==0)//0.2s 設置狀態時、分快閃
  239.                                         flashing=~flashing;
  240.                                 num--;
  241.                                 if(num==0)//按鍵停止操作5秒自動恢復正常顯示
  242.                                 {
  243.                                         for(t=1;t<3;t++)//數據轉碼導入寫入緩存
  244.                                                 TIME[t]=D_BCD(TIME[t]);//十進制轉BCD碼
  245.                                         Ds1302Init();//寫入實時時間
  246.                                         KeySec=0;//鍵值清0
  247.                                 }
  248.                         }
  249.                         else //設置時間時 不讀取DS1302實時時間
  250.                         {
  251.                                 Ds1302ReadTime();//讀DS1302實時時間
  252.                         }
  253.                         display();// 數碼管顯示函數
  254.                 }
  255.         }
  256. }

復制代碼



回復

使用道具 舉報

ID:332444 發表于 2023-1-5 07:02 | 顯示全部樓層
wulin 發表于 2023-1-4 20:42
這種要求的程序很簡單,也用不著138、573,給你一個示例參考,另加鬧鐘也是輕而易舉的事。黑幣你就自己留 ...

實在是抱歉,我忘記了說明是不開定時器的情況下,就用簡單的功能做測試,不要看表面功能簡單,練就的是功夫。
回復

使用道具 舉報

ID:332444 發表于 2023-1-5 07:05 | 顯示全部樓層
wulin 發表于 2023-1-4 20:42
這種要求的程序很簡單,也用不著138、573,給你一個示例參考,另加鬧鐘也是輕而易舉的事。黑幣你就自己留 ...

不錯,通篇沒用到計數延時。
回復

使用道具 舉報

ID:332444 發表于 2023-1-5 07:29 | 顯示全部樓層
wulin 發表于 2023-1-4 20:42
這種要求的程序很簡單,也用不著138、573,給你一個示例參考,另加鬧鐘也是輕而易舉的事。黑幣你就自己留 ...

今早想起來要補充說明不開定時器的情況下,就用簡單的功能來測試,蜂鳴器一定要的,若要其它功能不是不會提出來,我自己代碼也是不開定時器,不使用額外循環計數延時,我的測試周期還可以優化再減小。
回復

使用道具 舉報

ID:332444 發表于 2023-1-5 07:39 | 顯示全部樓層
wulin 發表于 2023-1-4 20:42
這種要求的程序很簡單,也用不著138、573,給你一個示例參考,另加鬧鐘也是輕而易舉的事。黑幣你就自己留 ...

主函數添加bit zq=0;zq=~zq;做測試結果大約10毫秒處理時間間隔。
用時測試.png
回復

使用道具 舉報

ID:332444 發表于 2023-1-5 07:56 | 顯示全部樓層
看我的,最大空白間隔約0.6毫秒表示程序處理堆疊時間,紅色部分說明已經返回主函數了,不過我的周期比較長約40微秒,則說明有較多時間用于其它事件。 用時測試1.png
而看wulin程序周期只有6微秒,但是空白部分約十幾毫秒表示程序占用累積堆疊處理時間,而紅色部分表示已經返回主函數約有10毫秒,就說明有10毫秒間隔可以安排其它事件的時間。


以上測試都無任何操作情況下進行編程軟件內的仿真。
回復

使用道具 舉報

ID:332444 發表于 2023-1-9 10:26 | 顯示全部樓層
1.png 2.png
從以上2張測試圖片可以看到我的程序只是在讀取時獨占處理讀取時間,其他部分都返回主程序,包括數碼管延時都不再有較大的獨占時間。
回復

使用道具 舉報

ID:332444 發表于 2023-1-9 16:05 | 顯示全部樓層
通過我提供的測試圖片一看就知道單片機的時間都到哪去了,也就知道優化該從何處下手了,我之所以說我的程序還能進一步優化,指的是讀取芯片的頻次可以進一步減少而不會明顯影響顯示精度,按目前圖片的時間約50毫秒的頻次顯然有很多次去讀取是不必要的,因此是可以繼續優化的,至于多少次或說多少時間去讀取一次合理,就值得探討了,各位高手不妨暢言高論。
回復

使用道具 舉報

ID:213173 發表于 2023-1-9 17:17 | 顯示全部樓層
xianfajushi 發表于 2023-1-5 07:29
今早想起來要補充說明不開定時器的情況下,就用簡單的功能來測試,蜂鳴器一定要的,若要其它功能不是不會 ...

用定時器的目的是控制主函數循環周期,以便輕松處理按鍵消抖和按鍵長短按計數以及數碼管動態掃描。如果在主函數中加無源蜂鳴器驅動就得縮短定時周期也就是主函數循環周期。大約200us。因為無源蜂鳴器有特定的驅動頻率要求,常見的廉價無源蜂鳴器約2KHz聲壓最大。若主函數循環周期不穩定蜂鳴器音量聲調也不會穩定。這不是仿真就可以搞定的。通常情況下200us可以干很多很多事。對于某些在一個主循環周期內做不完的事可以拆分。單片機玩的就是時間和邏輯。說白了就是在什么時間點干什么事。
回復

使用道具 舉報

ID:332444 發表于 2023-1-10 16:50 | 顯示全部樓層
wulin 發表于 2023-1-9 17:17
用定時器的目的是控制主函數循環周期,以便輕松處理按鍵消抖和按鍵長短按計數以及數碼管動態掃描。如果在 ...

優化的讀取是秒=0則讀分,分=0則讀時,不需要頻繁讀分和時信息,這樣就可以節省很多寶貴的時間資源.
回復

使用道具 舉報

ID:332444 發表于 2023-1-10 16:59 | 顯示全部樓層
wulin 發表于 2023-1-9 17:17
用定時器的目的是控制主函數循環周期,以便輕松處理按鍵消抖和按鍵長短按計數以及數碼管動態掃描。如果在 ...

之前代碼是秒分時頻繁都去讀取,其實沒必要,因此修改后的代碼就是按條件限制的讀取
Mbcd=Du_1302(0x81);
if(Mbcd==0)Fbcd=Du_1302(0x83);
if(Fbcd==0)Sbcd=Du_1302(0x85);
回復

使用道具 舉報

ID:332444 發表于 2023-1-10 17:13 | 顯示全部樓層
wulin 發表于 2023-1-9 17:17
用定時器的目的是控制主函數循環周期,以便輕松處理按鍵消抖和按鍵長短按計數以及數碼管動態掃描。如果在 ...

限制條件的讀是最合理的時間安排
Mbcd=Du_1302(0x81);
if(Mbcd==0)Fbcd=Du_1302(0x83);
if(Mbcd==0&&Fbcd==0)Sbcd=Du_1302(0x85);
回復

使用道具 舉報

ID:332444 發表于 2023-1-10 23:01 | 顯示全部樓層
在不開定時器情況下也可以比較精準控制只讀一次秒信息精度控制在毫秒以下,因為上述說過了的6毫秒和40毫秒周期,因此可以比較精準控制去讀秒信息一次足夠,而不需要無謂的多次讀取,同樣道理讀天月年也可以按條件讀取,只是不開定時器情況下按我的思路是實現所有功能代碼后再進行比較精準的控制讀秒信息,因為不同功能的程序周期也不同,就比如6毫秒和40毫秒周期一般道理。
回復

使用道具 舉報

ID:624769 發表于 2023-1-11 00:20 來自觸屏版 | 顯示全部樓層
xianfajushi 發表于 2023-1-10 16:50
優化的讀取是秒=0則讀分,分=0則讀時,不需要頻繁讀分和時信息,這樣就可以節省很多寶貴的時間資源.

ds1302來說,你真要節約寶貴的系統資源,就用硬件讀寫。不管用spi讀寫,還是串口1讀寫,都比你IO讀寫,占用系統時鐘少。
回復

使用道具 舉報

ID:401564 發表于 2023-1-11 13:22 | 顯示全部樓層
188610329 發表于 2023-1-11 00:20
ds1302來說,你真要節約寶貴的系統資源,就用硬件讀寫。不管用spi讀寫,還是串口1讀寫,都比你IO讀寫,占 ...

從主程序中看到,這就是一個1302時鐘,其它什么事都沒干,壓根就不需要節約什么時間,效率什么的都是沒有什么意義的
1秒鐘讀取一次,延時直接用delay();
按鍵一樣的直接延時去抖動,沒必要折騰那么多東西
或者是說用讀取的時間來作為數碼管的延時,都比樓主折騰這個好
我也不知道,把單片機時間節約成這樣子,是為了什么?
是怕單片機累壞了?還是怕單片機長時間延時會鬧情緒
我看了半天,都不知道“獨占時間”是個什么玩意
回復

使用道具 舉報

ID:384109 發表于 2023-1-12 08:39 | 顯示全部樓層
這個就是純粹的強調所謂的效率兩個字而已,但實際應用中效率到底又指什么呢
回復

使用道具 舉報

ID:332444 發表于 2023-1-15 12:52 | 顯示全部樓層
人中狼 發表于 2023-1-12 08:39
這個就是純粹的強調所謂的效率兩個字而已,但實際應用中效率到底又指什么呢

其它都不用說,有好的程序拿來看看。
我家一臺旭日紅外熱水器無線控制器每周都快1小時多,比如時間是6點看它屏幕走時已經是7點多了,每次都要去調整時間,否則計算峰谷的時間就不準確了!非常麻煩,是很差勁的產品質量,可以斷定是很差勁的程序代碼,所以莫要小看簡單的程序提高效率問題,所謂見微知著,簡單的功能都不能注重效率的話,可知復雜功能是很有問題的。
回復

使用道具 舉報

26#
無效樓層,該帖已經被刪除
ID:332444 發表于 2023-1-18 10:14 | 顯示全部樓層
經過幾次試驗目前把讀秒信號壓縮到每秒4次左右基本察覺不到太大差別可以接受的程度,調整后蜂鳴器音調頻率也發生變化能聽出區別來。
回復

使用道具 舉報

ID:332444 發表于 2023-1-18 14:01 | 顯示全部樓層
本帖最后由 xianfajushi 于 2023-1-18 14:44 編輯

無標題2.png
并報時期間顯示日期,這樣才是合理的邏輯順序安排,按鍵代碼看以往帖子。
回復

使用道具 舉報

ID:332444 發表于 2023-1-24 15:33 | 顯示全部樓層
顯示年月天周用點號隔開
1.png
回復

使用道具 舉報

ID:332444 發表于 2023-1-26 11:19 | 顯示全部樓層
樓上各位說我功能簡單了,擔心我不會寫還是不會安排?之下就管中窺豹看看我的功能如何安排,稍微寫了按秒步進的分鐘+-調節并進制到時鐘+-同步,年月天周道理一樣,以后想寫時再補上。
之上代碼還不算最優化,我還可以優化到顛覆常規思維,返回主函數周期減小到十幾微秒,除了數碼位7不能調節外,四層嵌套詢問式延時可以靈活調節滿足硬件需求,當然按鍵長按也可以實現。
用時測試.png

回復

使用道具 舉報

ID:332444 發表于 2023-1-27 07:29 | 顯示全部樓層
wulin 發表于 2023-1-9 17:17
用定時器的目的是控制主函數循環周期,以便輕松處理按鍵消抖和按鍵長短按計數以及數碼管動態掃描。如果在 ...

中斷+計數的1毫秒間隔或200微妙能做多少事還真的沒什么案例,本案例旨在說明詢問式計數延時相比獨占計數延時的優越且靈活調節和設置,屬于高級分析思維模式,而非入門級別獨占計數延時一直套用引發種種疑難。
回復

使用道具 舉報

ID:213173 發表于 2023-1-28 09:13 | 顯示全部樓層
xianfajushi 發表于 2023-1-10 17:13
限制條件的讀是最合理的時間安排
Mbcd=Du_1302(0x81);
if(Mbcd==0)Fbcd=Du_1302(0x83);

這個限制條件不完善,在Mbcd=0的1秒時間內會多次讀1302,如果是跨年的那1秒內,則重復多次讀全部數據。當然這屬吹毛求疵,未必影響其它程序正常運行。何況是在半夜,誰還會去計較。
回復

使用道具 舉報

ID:332444 發表于 2023-1-28 10:27 | 顯示全部樓層
wulin 發表于 2023-1-28 09:13
這個限制條件不完善,在Mbcd=0的1秒時間內會多次讀1302,如果是跨年的那1秒內,則重復多次讀全部數據。當 ...

頻繁讀取1302全部數據是否會影響其計時精度?目前猜測而已沒什么證據。
回復

使用道具 舉報

ID:332444 發表于 2023-1-28 17:08 | 顯示全部樓層
wulin 發表于 2023-1-28 09:13
這個限制條件不完善,在Mbcd=0的1秒時間內會多次讀1302,如果是跨年的那1秒內,則重復多次讀全部數據。當 ...

那么怎樣才合理?之上已經說了,尋求合理的安排,目前把讀秒壓縮在每秒4次左右,在不開定時期情況下;若開定時器按每秒讀取然而定時器未必就能精確每秒夜有不精確時候就會造成漏讀秒的情況發生.
回復

使用道具 舉報

ID:213173 發表于 2023-1-28 20:39 | 顯示全部樓層
xianfajushi 發表于 2023-1-28 10:27
頻繁讀取1302全部數據是否會影響其計時精度?目前猜測而已沒什么證據。

頻繁讀取1302全部數據不會影響其計時精度,但對于你刻意精打細算主循環時間肯定有影響。比如蜂鳴器音調會不穩。
回復

使用道具 舉報

ID:213173 發表于 2023-1-28 20:56 | 顯示全部樓層
xianfajushi 發表于 2023-1-28 17:08
那么怎樣才合理?之上已經說了,尋求合理的安排,目前把讀秒壓縮在每秒4次左右,在不開定時期情況下;若開定時 ...

所謂合理是相對的,在不影響其它功能的前提下頻繁讀1302也并無不可,單片機也累不死。只能說在現有硬件條件下,滿足所有功能預期,互相不發生沖突是需要一定的編程技巧。刻意追求主函數周期減小到十幾微秒又有多少實際意義。
回復

使用道具 舉報

ID:332444 發表于 2023-1-29 08:29 | 顯示全部樓層
wulin 發表于 2023-1-28 20:56
所謂合理是相對的,在不影響其它功能的前提下頻繁讀1302也并無不可,單片機也累不死。只能說在現有硬件條 ...

不斷優化就是對邏輯思維的驗證,從而實現賣油翁的過程.
其實不然我認為頻繁讀取對精度有所影響,就好比開定時器中斷應該說沒什么影響,然而實踐告訴人們,輕便的程序對定時器計時精度沒多大影響,而復雜的程序對定時器計時精度就有影響,中斷也要獲得響應時間的,電路也是一樣的總要撥點時間去處理其他事件.
回復

使用道具 舉報

ID:332444 發表于 2023-1-29 08:50 | 顯示全部樓層
wulin 發表于 2023-1-28 20:56
所謂合理是相對的,在不影響其它功能的前提下頻繁讀1302也并無不可,單片機也累不死。只能說在現有硬件條 ...

只有了然于胸才能駕輕就熟
回復

使用道具 舉報

ID:332444 發表于 2023-1-29 08:55 | 顯示全部樓層
wulin 發表于 2023-1-28 20:56
所謂合理是相對的,在不影響其它功能的前提下頻繁讀1302也并無不可,單片機也累不死。只能說在現有硬件條 ...

如果能夠把程序打造得輕便即可用計時器中斷實現比較精準的計時拋卻時鐘芯片目標,畢竟兆赫茲的精度比千赫茲提高了一個數量級別。
回復

使用道具 舉報

ID:332444 發表于 2023-1-29 15:43 | 顯示全部樓層
突發奇想,用數碼管顯示每周的值:一二三四五六日。64,64,9,9,73,73,63,63,9,61,81,69,121,79
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 先锋资源吧| 欧美mv日韩mv国产网站91进入 | 久草免费在线视频 | 国产精品亚洲成在人线 | 日韩欧美国产一区二区三区 | 五月婷婷婷 | 久久精品一区 | 福利视频三区 | 久久精品国产清自在天天线 | 超碰成人av | 成人网av | 久久99网站| 黑人巨大精品 | 欧美福利 | 成人在线观看亚洲 | 久久久久国产精品www | 一区二区免费 | av中文字幕网 | 欧美片网站免费 | 亚洲www.| 毛片韩国 | 欧美日韩在线观看一区 | 亚洲综合色| 天天草天天干 | 美女高潮网站 | 欧美日韩高清免费 | 金莲网| 成人国产在线视频 | 老头搡老女人毛片视频在线看 | 亚洲免费在线观看 | 夜夜草 | 天天草天天| 中文字幕av网址 | www.夜夜骑.com | av资源网站| 欧美午夜精品久久久久免费视 | 亚洲乱码一区二区三区在线观看 | 亚洲性爰 | 日韩午夜 | 国产精品美女久久久久aⅴ国产馆 | 男人av网 |