找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 4333|回復(fù): 44
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)DS1302驅(qū)動(dòng)與轉(zhuǎn)換數(shù)據(jù)以及時(shí)序觀察問(wèn)題

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:332444 發(fā)表于 2022-12-23 15:06 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
錄像只寫(xiě)了讀取秒鐘

觀察時(shí)序電路仿真示波器可以看到全部,編程仿真無(wú)法看到讀取數(shù)據(jù)時(shí)的IO狀態(tài)。


在這里只看看DS1302驅(qū)動(dòng)和數(shù)據(jù)轉(zhuǎn)換部分代碼,數(shù)碼管驅(qū)動(dòng)同以往帖子。


評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:332444 發(fā)表于 2023-1-3 14:29 | 只看該作者
如果哪位能寫(xiě)出全篇不調(diào)用獨(dú)占計(jì)數(shù)延時(shí)的代碼我有獎(jiǎng),獎(jiǎng)勵(lì)黑幣.
這圖演示的就是除了2個(gè)1302函數(shù)有獨(dú)占循環(huán)讀/寫(xiě)8次外,整篇都不用獨(dú)占計(jì)數(shù)延時(shí)的荔枝,包括數(shù)碼管顯示都不再使用獨(dú)占計(jì)數(shù)延時(shí)的高級(jí)應(yīng)用.

1.gif (281.22 KB, 下載次數(shù): 121)

1.gif
回復(fù)

使用道具 舉報(bào)

板凳
ID:624769 發(fā)表于 2023-1-3 20:47 來(lái)自觸屏版 | 只看該作者
雖然不知道你說(shuō)的獨(dú)占計(jì)數(shù)是啥東西,如果僅僅是指延時(shí)的話(huà),直接用串口1模式0,就好了,不光不需要延時(shí),連循環(huán)讀IO都不用了,直接寫(xiě)一次sbuf,讀一次sbuf即可,當(dāng)然我更喜歡用burst一次把秒分時(shí)都讀出來(lái)。
回復(fù)

使用道具 舉報(bào)

地板
ID:401564 發(fā)表于 2023-1-3 23:43 | 只看該作者
"獨(dú)占計(jì)數(shù)延時(shí)"
"獨(dú)占循環(huán)讀"
不要自己創(chuàng)造名詞,盡量用大家都能理解的詞匯
這個(gè)仿真一點(diǎn)意義都沒(méi)有,仿真行,實(shí)際電路不一定行,到了實(shí)際電路還是得重新調(diào)試,那么,這個(gè)仿真有什么意義?
對(duì)于時(shí)序,你也不一定能看得明白,自己找一個(gè)開(kāi)發(fā)板,點(diǎn)兩下燒錄驗(yàn)證,比什么都好
獎(jiǎng)勵(lì)黑幣這種東西就不需要了,你沒(méi)我的多
一個(gè)1302的程序,并不是什么火箭上天的難度,他只是一個(gè)入門(mén)的東西而已,實(shí)在不想動(dòng)手,我有現(xiàn)成的DS3231+GPS自動(dòng)對(duì)時(shí)的時(shí)鐘,程序和PCB都可以免費(fèi)上傳,只要你說(shuō)了就行
回復(fù)

使用道具 舉報(bào)

5#
ID:332444 發(fā)表于 2023-1-3 23:49 | 只看該作者
188610329 發(fā)表于 2023-1-3 20:47
雖然不知道你說(shuō)的獨(dú)占計(jì)數(shù)是啥東西,如果僅僅是指延時(shí)的話(huà),直接用串口1模式0,就好了,不光不需要延時(shí),連 ...

看我這帖子http://www.torrancerestoration.com/bbs/dpj-225609-1.html
回復(fù)

使用道具 舉報(bào)

6#
ID:332444 發(fā)表于 2023-1-4 07:12 | 只看該作者
可以這樣說(shuō),以貼出來(lái)的電路和只讀取1302的時(shí)分秒送8位數(shù)碼管顯示,并有整點(diǎn)4響半點(diǎn)2響為功能,并在主函數(shù)while(1)內(nèi)用beep=!beep;仿真測(cè)試整個(gè)代碼響應(yīng)時(shí)間為目標(biāo),且不得使用循環(huán)語(yǔ)句包括GOTO在內(nèi)構(gòu)成的獨(dú)占循環(huán)計(jì)數(shù)延時(shí),即這次把數(shù)碼管顯示中的while計(jì)數(shù)延時(shí)也去掉了,從而提高了程序整體響應(yīng)時(shí)間,從之前的10ms提高到了約40us,這就意味著整個(gè)程序還有充足的時(shí)間去響應(yīng)其它更多事件安排。各位高手可以盡情展現(xiàn)優(yōu)秀算法,盡量使得beep的周期最小,我目前能做到beep的周期不到40us,既然“大家”們說(shuō)得那么有把握,我很想開(kāi)開(kāi)眼界,相信有很多人也期待著。

51hei.png (51.47 KB, 下載次數(shù): 116)

51hei.png
回復(fù)

使用道具 舉報(bào)

7#
ID:996773 發(fā)表于 2023-1-4 13:31 | 只看該作者
沒(méi)看懂樓主的目的,樓主用的是138解碼逐個(gè)點(diǎn)亮數(shù)碼管的掃描方式,讀取1302數(shù)據(jù)和bcd轉(zhuǎn)換十進(jìn)制再查表只需要在點(diǎn)亮一個(gè)數(shù)碼管周期內(nèi)完成,其余時(shí)間只能等待延時(shí),不延時(shí)還能干嘛呢,還有啊,這程序太簡(jiǎn)單了,很多功能都沒(méi)實(shí)現(xiàn),操作不用按鈕,使用旋轉(zhuǎn)編碼器,年月日和鬧鐘都沒(méi)實(shí)現(xiàn)呢,這些都實(shí)現(xiàn)了,再找優(yōu)化方案和程序精簡(jiǎn)
回復(fù)

使用道具 舉報(bào)

8#
ID:401564 發(fā)表于 2023-1-4 20:03 | 只看該作者
xianfajushi 發(fā)表于 2023-1-4 07:12
可以這樣說(shuō),以貼出來(lái)的電路和只讀取1302的時(shí)分秒送8位數(shù)碼管顯示,并有整點(diǎn)4響半點(diǎn)2響為功能,并在主函數(shù)w ...

我這幾年編程白學(xué)了?我怎么看了幾次都看不明白這段文字表達(dá)了什么...........
回復(fù)

使用道具 舉報(bào)

9#
ID:213173 發(fā)表于 2023-1-4 20:42 | 只看該作者
xianfajushi 發(fā)表于 2023-1-4 07:12
可以這樣說(shuō),以貼出來(lái)的電路和只讀取1302的時(shí)分秒送8位數(shù)碼管顯示,并有整點(diǎn)4響半點(diǎn)2響為功能,并在主函數(shù)w ...

這種要求的程序很簡(jiǎn)單,也用不著138、573,給你一個(gè)示例參考,另加鬧鐘也是輕而易舉的事。黑幣你就自己留著吧。


  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                        //宏定義長(zhǎng)按(約600ms)
  7. #define key_I key_S*20                        //宏定義長(zhǎng)按連+間隔(約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[]={//共陰數(shù)碼管段碼"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};                //數(shù)碼管顯示緩存數(shù)組
  16. //DS1302讀取和寫(xiě)入時(shí)分秒日月周年的地址
  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}; //寫(xiě)入地址
  19. //              秒    分    時(shí)    日    月    周    年
  20. uchar TIME[7]={0x00, 0x00, 0x12, 0x04, 0x01, 0x03, 0x23};//讀取Ds1302 存儲(chǔ)順序是秒分時(shí)日月周年
  21. //---全局變量聲明---
  22. uint  Cnt2ms;                //2.5ms計(jì)數(shù)變量
  23. uint  num;                    //計(jì)數(shù)變量
  24. uchar KeySec;                 //鍵值變量
  25. bit   flashing;               //閃爍標(biāo)志
  26. //---本地函數(shù)聲明---//
  27. void Ds1302Init();            //DS1302初始化
  28. void Ds1302Write(uchar addr, uchar dat);//向1302芯片寫(xiě)入地址和數(shù)據(jù)
  29. uchar Ds1302Read(uchar addr); //從1302讀數(shù)據(jù)
  30. void Ds1302ReadTime();        //讀取秒分時(shí)日月周年信息
  31. uchar BCD_D(uchar bcd);       //BCD碼轉(zhuǎn)十進(jìn)制函數(shù)
  32. uchar D_BCD(uchar Dec);       //十進(jìn)制轉(zhuǎn)BCD碼函數(shù)
  33. void Timer0Init(void);        //定時(shí)器T0初始化
  34. //==============DS1302驅(qū)動(dòng)部分=====================
  35. //寫(xiě)1302時(shí)鐘數(shù)據(jù)
  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++)       // 寫(xiě)地址
  43.         {
  44.                 DSIO=addr & 0x01;  //數(shù)據(jù)從低位開(kāi)始傳送
  45.                 addr>>=1;
  46.                 SCLK = 1;          //數(shù)據(jù)在上升沿時(shí),DS1302讀取數(shù)據(jù)
  47.                 SCLK = 0;
  48.         }
  49.         for(i=0;i<8;i++)       //寫(xiě)數(shù)據(jù)
  50.         {
  51.                 DSIO=dat & 0x01;
  52.                 dat>>= 1;
  53.                 SCLK = 1;           // 數(shù)據(jù)在上升沿時(shí),DS1302讀取數(shù)據(jù)
  54.                 SCLK = 0;       
  55.         }                 
  56.         REST = 0;                // 傳送數(shù)據(jù)結(jié)束       
  57. }
  58. //讀1302時(shí)鐘數(shù)據(jù)
  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++)      // 開(kāi)始傳送八位地址命令
  66.         {
  67.                 DSIO = addr & 0x01; // 數(shù)據(jù)從低位開(kāi)始傳送
  68.                 addr >>= 1;
  69.                 SCLK = 1;           // 上升沿有效,DS1302讀取數(shù)據(jù)
  70.                 SCLK = 0;
  71.         }
  72.         for(i=0;i<8;i++)        // 讀取8位數(shù)據(jù)
  73.         {
  74.                 dat1 = DSIO;        // 從最低位開(kāi)始接收
  75.                 dat=(dat>>1)|(dat1<<7);
  76.                 SCLK = 1;           // 上升沿有效,DS1302讀取數(shù)據(jù)
  77.                 SCLK = 0;
  78.         }
  79.         REST = 0;               // 以下為DS1302復(fù)位的穩(wěn)定時(shí)間,必須的。                   
  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);   // 禁止寫(xiě)保護(hù)功能
  90.         for(i=0;i<3;i++)          // 寫(xiě)入3個(gè)字節(jié)的時(shí)鐘信號(hào):分秒時(shí)       
  91.                 Ds1302Write(WRITE_RTC_ADDR[i],TIME[i]);
  92.         Ds1302Write(0x8E,0x80);   // 打開(kāi)寫(xiě)保護(hù)功能
  93. }
  94. //BCD碼轉(zhuǎn)十進(jìn)制函數(shù)
  95. uchar BCD_D(uchar bcd)
  96. {
  97.         return ((bcd>>4)*10)+(bcd & 0x0f);
  98. }
  99. //十進(jìn)制轉(zhuǎn)BCD碼函數(shù),返回BCD碼
  100. uchar D_BCD(uchar Dec)
  101. {
  102.         return (Dec/10*16+Dec%10);
  103. }

  104. //讀取時(shí)鐘信息
  105. void Ds1302ReadTime()
  106. {
  107.         uchar i;
  108.         for(i=0;i<3;i++)         //讀取3個(gè)字節(jié)的時(shí)鐘信號(hào):秒分時(shí)
  109.                 TIME[i]=BCD_D(Ds1302Read(READ_RTC_ADDR[i]));//BCD轉(zhuǎn)換成十進(jìn)制保存
  110. }

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

  115.         if(!key1)       //按鍵按下
  116.         {
  117.                 time++;
  118.                 if(time>=key_L)  //長(zhǎng)按
  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;     //自復(fù)位變量賦值(5秒)
  127.                 }
  128.         }
  129.         else                                //松手
  130.         {
  131.                 if(time>key_S && time<key_I)//短按
  132.                 {
  133.                         num=2000;    //自復(fù)位變量賦值(5秒)
  134.                         KeySec++;
  135.                         if(KeySec>2)
  136.                         {
  137. //                                KeySec=0;
  138.                                 num=1;
  139.                         }
  140.                 }
  141.                 time=0;
  142.         }
  143. }

  144. // 數(shù)碼管顯示函數(shù)
  145. void display()
  146. {
  147.         uchar i;
  148.         if(KeySec==0)           //常態(tài)顯示
  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)           //調(diào)整時(shí)
  158.         {
  159.                 if(!key1)//持續(xù)不變表示鍵長(zhǎng)按連加,時(shí)不閃爍
  160.                 {
  161.                         dis_buf[0]=table[TIME[2]/10];
  162.                         dis_buf[1]=table[TIME[2]%10];
  163.                 }
  164.                 else                //松手 時(shí)閃爍
  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)           //調(diào)整分
  183.         {
  184.                 dis_buf[0]=table[TIME[2]/10];
  185.                 dis_buf[1]=table[TIME[2]%10];
  186.                 if(!key1)//持續(xù)不變表示鍵長(zhǎng)按連加,分不閃爍
  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. //初始化定時(shí)器
  213. void Timer0Init(void)                //2500微秒@12.000MHz
  214. {
  215.         TMOD |= 0x01;                //設(shè)置定時(shí)器模式
  216.         TL0 = 0x3C;                //設(shè)置定時(shí)初始值
  217.         TH0 = 0xF6;                //設(shè)置定時(shí)初始值
  218.         TF0 = 0;                //清除TF0標(biāo)志
  219.         TR0 = 1;                //定時(shí)器0開(kāi)始計(jì)時(shí)
  220. }
  221. //主函數(shù)
  222. void main()
  223. {
  224.         uchar t;
  225.         Ds1302Init();
  226.         Timer0Init();   //初始化定時(shí)器
  227.         while(1)
  228.         {
  229.                 if(TF0)    //周期2.5ms
  230.                 {
  231.                         TF0=0;
  232.                         TL0 = 0x3C;                //設(shè)置定時(shí)初始值
  233.                         TH0 = 0xF6;                //設(shè)置定時(shí)初始值
  234.                         if(++Cnt2ms==400)Cnt2ms=0;
  235.                         key_scan();//按鍵掃描
  236.                         if(num!=0)
  237.                         {
  238.                                 if(Cnt2ms%80==0)//0.2s 設(shè)置狀態(tài)時(shí)、分快閃
  239.                                         flashing=~flashing;
  240.                                 num--;
  241.                                 if(num==0)//按鍵停止操作5秒自動(dòng)恢復(fù)正常顯示
  242.                                 {
  243.                                         for(t=1;t<3;t++)//數(shù)據(jù)轉(zhuǎn)碼導(dǎo)入寫(xiě)入緩存
  244.                                                 TIME[t]=D_BCD(TIME[t]);//十進(jìn)制轉(zhuǎn)BCD碼
  245.                                         Ds1302Init();//寫(xiě)入實(shí)時(shí)時(shí)間
  246.                                         KeySec=0;//鍵值清0
  247.                                 }
  248.                         }
  249.                         else //設(shè)置時(shí)間時(shí) 不讀取DS1302實(shí)時(shí)時(shí)間
  250.                         {
  251.                                 Ds1302ReadTime();//讀DS1302實(shí)時(shí)時(shí)間
  252.                         }
  253.                         display();// 數(shù)碼管顯示函數(shù)
  254.                 }
  255.         }
  256. }

復(fù)制代碼



回復(fù)

使用道具 舉報(bào)

10#
ID:332444 發(fā)表于 2023-1-5 07:02 | 只看該作者
wulin 發(fā)表于 2023-1-4 20:42
這種要求的程序很簡(jiǎn)單,也用不著138、573,給你一個(gè)示例參考,另加鬧鐘也是輕而易舉的事。黑幣你就自己留 ...

實(shí)在是抱歉,我忘記了說(shuō)明是不開(kāi)定時(shí)器的情況下,就用簡(jiǎn)單的功能做測(cè)試,不要看表面功能簡(jiǎn)單,練就的是功夫。
回復(fù)

使用道具 舉報(bào)

11#
ID:332444 發(fā)表于 2023-1-5 07:05 | 只看該作者
wulin 發(fā)表于 2023-1-4 20:42
這種要求的程序很簡(jiǎn)單,也用不著138、573,給你一個(gè)示例參考,另加鬧鐘也是輕而易舉的事。黑幣你就自己留 ...

不錯(cuò),通篇沒(méi)用到計(jì)數(shù)延時(shí)。
回復(fù)

使用道具 舉報(bào)

12#
ID:332444 發(fā)表于 2023-1-5 07:29 | 只看該作者
wulin 發(fā)表于 2023-1-4 20:42
這種要求的程序很簡(jiǎn)單,也用不著138、573,給你一個(gè)示例參考,另加鬧鐘也是輕而易舉的事。黑幣你就自己留 ...

今早想起來(lái)要補(bǔ)充說(shuō)明不開(kāi)定時(shí)器的情況下,就用簡(jiǎn)單的功能來(lái)測(cè)試,蜂鳴器一定要的,若要其它功能不是不會(huì)提出來(lái),我自己代碼也是不開(kāi)定時(shí)器,不使用額外循環(huán)計(jì)數(shù)延時(shí),我的測(cè)試周期還可以?xún)?yōu)化再減小。
回復(fù)

使用道具 舉報(bào)

13#
ID:332444 發(fā)表于 2023-1-5 07:39 | 只看該作者
wulin 發(fā)表于 2023-1-4 20:42
這種要求的程序很簡(jiǎn)單,也用不著138、573,給你一個(gè)示例參考,另加鬧鐘也是輕而易舉的事。黑幣你就自己留 ...

主函數(shù)添加bit zq=0;zq=~zq;做測(cè)試結(jié)果大約10毫秒處理時(shí)間間隔。

回復(fù)

使用道具 舉報(bào)

14#
ID:332444 發(fā)表于 2023-1-5 07:56 | 只看該作者
看我的,最大空白間隔約0.6毫秒表示程序處理堆疊時(shí)間,紅色部分說(shuō)明已經(jīng)返回主函數(shù)了,不過(guò)我的周期比較長(zhǎng)約40微秒,則說(shuō)明有較多時(shí)間用于其它事件。
而看wulin程序周期只有6微秒,但是空白部分約十幾毫秒表示程序占用累積堆疊處理時(shí)間,而紅色部分表示已經(jīng)返回主函數(shù)約有10毫秒,就說(shuō)明有10毫秒間隔可以安排其它事件的時(shí)間。


以上測(cè)試都無(wú)任何操作情況下進(jìn)行編程軟件內(nèi)的仿真。
回復(fù)

使用道具 舉報(bào)

15#
ID:332444 發(fā)表于 2023-1-9 10:26 | 只看該作者

從以上2張測(cè)試圖片可以看到我的程序只是在讀取時(shí)獨(dú)占處理讀取時(shí)間,其他部分都返回主程序,包括數(shù)碼管延時(shí)都不再有較大的獨(dú)占時(shí)間。
回復(fù)

使用道具 舉報(bào)

16#
ID:332444 發(fā)表于 2023-1-9 16:05 | 只看該作者
通過(guò)我提供的測(cè)試圖片一看就知道單片機(jī)的時(shí)間都到哪去了,也就知道優(yōu)化該從何處下手了,我之所以說(shuō)我的程序還能進(jìn)一步優(yōu)化,指的是讀取芯片的頻次可以進(jìn)一步減少而不會(huì)明顯影響顯示精度,按目前圖片的時(shí)間約50毫秒的頻次顯然有很多次去讀取是不必要的,因此是可以繼續(xù)優(yōu)化的,至于多少次或說(shuō)多少時(shí)間去讀取一次合理,就值得探討了,各位高手不妨?xí)逞愿哒摗?/td>
回復(fù)

使用道具 舉報(bào)

17#
ID:213173 發(fā)表于 2023-1-9 17:17 | 只看該作者
xianfajushi 發(fā)表于 2023-1-5 07:29
今早想起來(lái)要補(bǔ)充說(shuō)明不開(kāi)定時(shí)器的情況下,就用簡(jiǎn)單的功能來(lái)測(cè)試,蜂鳴器一定要的,若要其它功能不是不會(huì) ...

用定時(shí)器的目的是控制主函數(shù)循環(huán)周期,以便輕松處理按鍵消抖和按鍵長(zhǎng)短按計(jì)數(shù)以及數(shù)碼管動(dòng)態(tài)掃描。如果在主函數(shù)中加無(wú)源蜂鳴器驅(qū)動(dòng)就得縮短定時(shí)周期也就是主函數(shù)循環(huán)周期。大約200us。因?yàn)闊o(wú)源蜂鳴器有特定的驅(qū)動(dòng)頻率要求,常見(jiàn)的廉價(jià)無(wú)源蜂鳴器約2KHz聲壓最大。若主函數(shù)循環(huán)周期不穩(wěn)定蜂鳴器音量聲調(diào)也不會(huì)穩(wěn)定。這不是仿真就可以搞定的。通常情況下200us可以干很多很多事。對(duì)于某些在一個(gè)主循環(huán)周期內(nèi)做不完的事可以拆分。單片機(jī)玩的就是時(shí)間和邏輯。說(shuō)白了就是在什么時(shí)間點(diǎn)干什么事。
回復(fù)

使用道具 舉報(bào)

18#
ID:332444 發(fā)表于 2023-1-10 16:50 | 只看該作者
wulin 發(fā)表于 2023-1-9 17:17
用定時(shí)器的目的是控制主函數(shù)循環(huán)周期,以便輕松處理按鍵消抖和按鍵長(zhǎng)短按計(jì)數(shù)以及數(shù)碼管動(dòng)態(tài)掃描。如果在 ...

優(yōu)化的讀取是秒=0則讀分,分=0則讀時(shí),不需要頻繁讀分和時(shí)信息,這樣就可以節(jié)省很多寶貴的時(shí)間資源.
回復(fù)

使用道具 舉報(bào)

19#
ID:332444 發(fā)表于 2023-1-10 16:59 | 只看該作者
wulin 發(fā)表于 2023-1-9 17:17
用定時(shí)器的目的是控制主函數(shù)循環(huán)周期,以便輕松處理按鍵消抖和按鍵長(zhǎng)短按計(jì)數(shù)以及數(shù)碼管動(dòng)態(tài)掃描。如果在 ...

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

使用道具 舉報(bào)

20#
ID:332444 發(fā)表于 2023-1-10 17:13 | 只看該作者
wulin 發(fā)表于 2023-1-9 17:17
用定時(shí)器的目的是控制主函數(shù)循環(huán)周期,以便輕松處理按鍵消抖和按鍵長(zhǎng)短按計(jì)數(shù)以及數(shù)碼管動(dòng)態(tài)掃描。如果在 ...

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

使用道具 舉報(bào)

21#
ID:332444 發(fā)表于 2023-1-10 23:01 | 只看該作者
在不開(kāi)定時(shí)器情況下也可以比較精準(zhǔn)控制只讀一次秒信息精度控制在毫秒以下,因?yàn)樯鲜稣f(shuō)過(guò)了的6毫秒和40毫秒周期,因此可以比較精準(zhǔn)控制去讀秒信息一次足夠,而不需要無(wú)謂的多次讀取,同樣道理讀天月年也可以按條件讀取,只是不開(kāi)定時(shí)器情況下按我的思路是實(shí)現(xiàn)所有功能代碼后再進(jìn)行比較精準(zhǔn)的控制讀秒信息,因?yàn)椴煌δ艿某绦蛑芷谝膊煌,就比?毫秒和40毫秒周期一般道理。
回復(fù)

使用道具 舉報(bào)

22#
ID:624769 發(fā)表于 2023-1-11 00:20 來(lái)自觸屏版 | 只看該作者
xianfajushi 發(fā)表于 2023-1-10 16:50
優(yōu)化的讀取是秒=0則讀分,分=0則讀時(shí),不需要頻繁讀分和時(shí)信息,這樣就可以節(jié)省很多寶貴的時(shí)間資源.

ds1302來(lái)說(shuō),你真要節(jié)約寶貴的系統(tǒng)資源,就用硬件讀寫(xiě)。不管用spi讀寫(xiě),還是串口1讀寫(xiě),都比你IO讀寫(xiě),占用系統(tǒng)時(shí)鐘少。
回復(fù)

使用道具 舉報(bào)

23#
ID:401564 發(fā)表于 2023-1-11 13:22 | 只看該作者
188610329 發(fā)表于 2023-1-11 00:20
ds1302來(lái)說(shuō),你真要節(jié)約寶貴的系統(tǒng)資源,就用硬件讀寫(xiě)。不管用spi讀寫(xiě),還是串口1讀寫(xiě),都比你IO讀寫(xiě),占 ...

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

使用道具 舉報(bào)

24#
ID:384109 發(fā)表于 2023-1-12 08:39 | 只看該作者
這個(gè)就是純粹的強(qiáng)調(diào)所謂的效率兩個(gè)字而已,但實(shí)際應(yīng)用中效率到底又指什么呢
回復(fù)

使用道具 舉報(bào)

25#
ID:332444 發(fā)表于 2023-1-15 12:52 | 只看該作者
人中狼 發(fā)表于 2023-1-12 08:39
這個(gè)就是純粹的強(qiáng)調(diào)所謂的效率兩個(gè)字而已,但實(shí)際應(yīng)用中效率到底又指什么呢

其它都不用說(shuō),有好的程序拿來(lái)看看。
我家一臺(tái)旭日紅外熱水器無(wú)線控制器每周都快1小時(shí)多,比如時(shí)間是6點(diǎn)看它屏幕走時(shí)已經(jīng)是7點(diǎn)多了,每次都要去調(diào)整時(shí)間,否則計(jì)算峰谷的時(shí)間就不準(zhǔn)確了!非常麻煩,是很差勁的產(chǎn)品質(zhì)量,可以斷定是很差勁的程序代碼,所以莫要小看簡(jiǎn)單的程序提高效率問(wèn)題,所謂見(jiàn)微知著,簡(jiǎn)單的功能都不能注重效率的話(huà),可知復(fù)雜功能是很有問(wèn)題的。
回復(fù)

使用道具 舉報(bào)

26#
ID:332444 發(fā)表于 2023-1-18 10:14 | 只看該作者
經(jīng)過(guò)幾次試驗(yàn)?zāi)壳鞍炎x秒信號(hào)壓縮到每秒4次左右基本察覺(jué)不到太大差別可以接受的程度,調(diào)整后蜂鳴器音調(diào)頻率也發(fā)生變化能聽(tīng)出區(qū)別來(lái)。
回復(fù)

使用道具 舉報(bào)

27#
ID:332444 發(fā)表于 2023-1-18 14:01 | 只看該作者
本帖最后由 xianfajushi 于 2023-1-18 14:44 編輯


并報(bào)時(shí)期間顯示日期,這樣才是合理的邏輯順序安排,按鍵代碼看以往帖子。
回復(fù)

使用道具 舉報(bào)

28#
ID:332444 發(fā)表于 2023-1-24 15:33 | 只看該作者
顯示年月天周用點(diǎn)號(hào)隔開(kāi)
回復(fù)

使用道具 舉報(bào)

29#
ID:332444 發(fā)表于 2023-1-26 11:19 | 只看該作者
樓上各位說(shuō)我功能簡(jiǎn)單了,擔(dān)心我不會(huì)寫(xiě)還是不會(huì)安排?之下就管中窺豹看看我的功能如何安排,稍微寫(xiě)了按秒步進(jìn)的分鐘+-調(diào)節(jié)并進(jìn)制到時(shí)鐘+-同步,年月天周道理一樣,以后想寫(xiě)時(shí)再補(bǔ)上。
之上代碼還不算最優(yōu)化,我還可以?xún)?yōu)化到顛覆常規(guī)思維,返回主函數(shù)周期減小到十幾微秒,除了數(shù)碼位7不能調(diào)節(jié)外,四層嵌套詢(xún)問(wèn)式延時(shí)可以靈活調(diào)節(jié)滿(mǎn)足硬件需求,當(dāng)然按鍵長(zhǎng)按也可以實(shí)現(xiàn)。


回復(fù)

使用道具 舉報(bào)

30#
ID:332444 發(fā)表于 2023-1-27 07:29 | 只看該作者
wulin 發(fā)表于 2023-1-9 17:17
用定時(shí)器的目的是控制主函數(shù)循環(huán)周期,以便輕松處理按鍵消抖和按鍵長(zhǎng)短按計(jì)數(shù)以及數(shù)碼管動(dòng)態(tài)掃描。如果在 ...

中斷+計(jì)數(shù)的1毫秒間隔或200微妙能做多少事還真的沒(méi)什么案例,本案例旨在說(shuō)明詢(xún)問(wèn)式計(jì)數(shù)延時(shí)相比獨(dú)占計(jì)數(shù)延時(shí)的優(yōu)越且靈活調(diào)節(jié)和設(shè)置,屬于高級(jí)分析思維模式,而非入門(mén)級(jí)別獨(dú)占計(jì)數(shù)延時(shí)一直套用引發(fā)種種疑難。
回復(fù)

使用道具 舉報(bào)

31#
ID:213173 發(fā)表于 2023-1-28 09:13 | 只看該作者
xianfajushi 發(fā)表于 2023-1-10 17:13
限制條件的讀是最合理的時(shí)間安排
Mbcd=Du_1302(0x81);
if(Mbcd==0)Fbcd=Du_1302(0x83);

這個(gè)限制條件不完善,在Mbcd=0的1秒時(shí)間內(nèi)會(huì)多次讀1302,如果是跨年的那1秒內(nèi),則重復(fù)多次讀全部數(shù)據(jù)。當(dāng)然這屬吹毛求疵,未必影響其它程序正常運(yùn)行。何況是在半夜,誰(shuí)還會(huì)去計(jì)較。
回復(fù)

使用道具 舉報(bào)

32#
ID:332444 發(fā)表于 2023-1-28 10:27 | 只看該作者
wulin 發(fā)表于 2023-1-28 09:13
這個(gè)限制條件不完善,在Mbcd=0的1秒時(shí)間內(nèi)會(huì)多次讀1302,如果是跨年的那1秒內(nèi),則重復(fù)多次讀全部數(shù)據(jù)。當(dāng) ...

頻繁讀取1302全部數(shù)據(jù)是否會(huì)影響其計(jì)時(shí)精度?目前猜測(cè)而已沒(méi)什么證據(jù)。
回復(fù)

使用道具 舉報(bào)

33#
ID:332444 發(fā)表于 2023-1-28 17:08 | 只看該作者
wulin 發(fā)表于 2023-1-28 09:13
這個(gè)限制條件不完善,在Mbcd=0的1秒時(shí)間內(nèi)會(huì)多次讀1302,如果是跨年的那1秒內(nèi),則重復(fù)多次讀全部數(shù)據(jù)。當(dāng) ...

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

使用道具 舉報(bào)

34#
ID:213173 發(fā)表于 2023-1-28 20:39 | 只看該作者
xianfajushi 發(fā)表于 2023-1-28 10:27
頻繁讀取1302全部數(shù)據(jù)是否會(huì)影響其計(jì)時(shí)精度?目前猜測(cè)而已沒(méi)什么證據(jù)。

頻繁讀取1302全部數(shù)據(jù)不會(huì)影響其計(jì)時(shí)精度,但對(duì)于你刻意精打細(xì)算主循環(huán)時(shí)間肯定有影響。比如蜂鳴器音調(diào)會(huì)不穩(wěn)。
回復(fù)

使用道具 舉報(bào)

35#
ID:213173 發(fā)表于 2023-1-28 20:56 | 只看該作者
xianfajushi 發(fā)表于 2023-1-28 17:08
那么怎樣才合理?之上已經(jīng)說(shuō)了,尋求合理的安排,目前把讀秒壓縮在每秒4次左右,在不開(kāi)定時(shí)期情況下;若開(kāi)定時(shí) ...

所謂合理是相對(duì)的,在不影響其它功能的前提下頻繁讀1302也并無(wú)不可,單片機(jī)也累不死。只能說(shuō)在現(xiàn)有硬件條件下,滿(mǎn)足所有功能預(yù)期,互相不發(fā)生沖突是需要一定的編程技巧?桃庾非笾骱瘮(shù)周期減小到十幾微秒又有多少實(shí)際意義。
回復(fù)

使用道具 舉報(bào)

36#
ID:332444 發(fā)表于 2023-1-29 08:29 | 只看該作者
wulin 發(fā)表于 2023-1-28 20:56
所謂合理是相對(duì)的,在不影響其它功能的前提下頻繁讀1302也并無(wú)不可,單片機(jī)也累不死。只能說(shuō)在現(xiàn)有硬件條 ...

不斷優(yōu)化就是對(duì)邏輯思維的驗(yàn)證,從而實(shí)現(xiàn)賣(mài)油翁的過(guò)程.
其實(shí)不然我認(rèn)為頻繁讀取對(duì)精度有所影響,就好比開(kāi)定時(shí)器中斷應(yīng)該說(shuō)沒(méi)什么影響,然而實(shí)踐告訴人們,輕便的程序?qū)Χ〞r(shí)器計(jì)時(shí)精度沒(méi)多大影響,而復(fù)雜的程序?qū)Χ〞r(shí)器計(jì)時(shí)精度就有影響,中斷也要獲得響應(yīng)時(shí)間的,電路也是一樣的總要撥點(diǎn)時(shí)間去處理其他事件.
回復(fù)

使用道具 舉報(bào)

37#
ID:332444 發(fā)表于 2023-1-29 08:50 | 只看該作者
wulin 發(fā)表于 2023-1-28 20:56
所謂合理是相對(duì)的,在不影響其它功能的前提下頻繁讀1302也并無(wú)不可,單片機(jī)也累不死。只能說(shuō)在現(xiàn)有硬件條 ...

只有了然于胸才能駕輕就熟
回復(fù)

使用道具 舉報(bào)

38#
ID:332444 發(fā)表于 2023-1-29 08:55 | 只看該作者
wulin 發(fā)表于 2023-1-28 20:56
所謂合理是相對(duì)的,在不影響其它功能的前提下頻繁讀1302也并無(wú)不可,單片機(jī)也累不死。只能說(shuō)在現(xiàn)有硬件條 ...

如果能夠把程序打造得輕便即可用計(jì)時(shí)器中斷實(shí)現(xiàn)比較精準(zhǔn)的計(jì)時(shí)拋卻時(shí)鐘芯片目標(biāo),畢竟兆赫茲的精度比千赫茲提高了一個(gè)數(shù)量級(jí)別。
回復(fù)

使用道具 舉報(bào)

39#
ID:332444 發(fā)表于 2023-1-29 15:43 | 只看該作者
突發(fā)奇想,用數(shù)碼管顯示每周的值:一二三四五六日。64,64,9,9,73,73,63,63,9,61,81,69,121,79
回復(fù)

使用道具 舉報(bào)

40#
ID:332444 發(fā)表于 2023-1-31 11:00 | 只看該作者
為了驗(yàn)證程序員的價(jià)值和水平可以做到降低產(chǎn)品成本,我修改了程序拋開(kāi)時(shí)鐘芯片用定時(shí)期替代秒計(jì)時(shí),運(yùn)行十幾個(gè)小時(shí)結(jié)果和電腦時(shí)鐘一樣精準(zhǔn)。主函數(shù)初始化讀取時(shí)鐘芯片信息保持與系統(tǒng)一樣時(shí)間后由定時(shí)期進(jìn)行計(jì)時(shí),不再讀時(shí)鐘芯片信息,這樣就可以在仿真中對(duì)比數(shù)碼管與時(shí)鐘芯片顯示的窗口信息。


回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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