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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1262|回復: 11
打印 上一主題 下一主題
收起左側

單片機電子鐘調(diào)時問題

[復制鏈接]
跳轉到指定樓層
樓主
ID:143767 發(fā)表于 2024-10-12 11:39 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
這個程序是在網(wǎng)上找到的,硬件搭建完成后把程序燒錄到單片機,電子鐘從00:00開始走,但是按調(diào)節(jié)按鈕后電子鐘顯示01:01,松開后又進入走時狀態(tài),不管是單擊,雙擊,多擊,或按住不放等待幾秒后都是進入走時狀態(tài),不能調(diào)節(jié)時間,請大家?guī)兔匆幌逻@程序有什么問題,謝謝

//下載時選擇片內(nèi)RC振蕩12M
  1. #include <reg51.h>
  2. #define uchar unsigned char
  3. #define uint  unsigned int
  4. sbit din=P3^0; //引腳定義
  5.   sbit clk=P3^1;
  6. sbit sck=P3^2;
  7. sbit SDA=P3^3;
  8. sbit SCL=P3^4;
  9. sbit set=P3^5;
  10. bit ack; //應答位

  11. #define DS3231_WriteAddress 0xD0//器件寫地址
  12. #define DS3231_ReadAddress  0xD1//器件讀地址
  13. #define DS3231_SECOND  0x00//秒
  14. #define DS3231_MINUTE  0x01//分
  15. #define DS3231_HOUR      0x02//時
  16. #define DS3231_WEEK      0x03//星期
  17. #define DS3231_DAY      0x04//日
  18. #define DS3231_MONTH  0x05//月
  19. #define DS3231_YEAR      0x06//年
  20. //#define bcd_hex(bcd) ((((uchar)bcd) & 0xF0) >> 4) * 10 +  (((uchar)bcd) & 0x0F) //8421碼轉16進制
  21. //uchar bcd_hex(uchar bcd){return((bcd/16*10)+(bcd&0x0f));}
  22. //#define hex_bcd(hex) (((u8)hex) % 10) + ((((u8)hex) /10) << 4)//16進制轉8421碼

  23. void delayus(uint us) {while(--us);}
  24. void Start_I2C(void){SDA=1;delayus(1);SCL=1;delayus(5);SDA=0;delayus(5);SCL=0;delayus(2);} //I2C開始
  25. void Stop_I2C(void) {SDA=0;delayus(1);SCL=1;delayus(5);SDA=1;delayus(5);} //I2C停止
  26. void SendByte_595(uchar date); //74hc595發(fā)送字節(jié)時序
  27. void  SendByte_3231(uchar date); //ds3231發(fā)送字節(jié)時序
  28. uchar write_byte_3231(uchar addr,uchar write_date);//指定地址寫入字節(jié)
  29. uchar RcvdByte_3231(void); //ds3231接收字節(jié)時序
  30. void  Ack_3231(bit a); // 發(fā)送應答與否
  31. uchar read_current(void);
  32. uchar read_random(uchar random_addr);
  33. // uchar date[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
  34. code uchar code_led[]={
  35. 0x40,  // 0
  36. 0x79,  // 1
  37. 0x24,  // 2
  38. 0x30,  // 3
  39. 0x19,  // 4
  40. 0x12,  // 5
  41. 0x02,  // 6  
  42. 0x78,  // 7
  43. 0x00,  // 8
  44. 0x10,  // 9
  45. 0x08,  // A
  46. 0x03,  // B
  47. 0x46,  // C
  48. 0x21,  // D
  49. 0x06,  // E
  50. 0x0E  // F   
  51.     //0x00
  52. };


  53. void main()
  54. {
  55. uint  d=0;//點閃計時
  56. uchar i;
  57. uchar miao,fen,shi,ri,yue,nian;   
  58. uchar w[4];
  59. //uchar n=20,y=10,r=3,s=14,f=16,m=31;//調(diào)整時間用
  60. while(1){
  61. ////////////////////////////

  62. d=d+1;
  63. if(d%1000==0)
  64. {
  65. if(miao!=read_random(DS3231_SECOND))
  66. {  
  67.    d=0;
  68.    miao =read_random(DS3231_SECOND);
  69.    fen  =read_random(DS3231_MINUTE);
  70.    shi =read_random(DS3231_HOUR);
  71.    ri  =read_random(DS3231_DAY);
  72.    yue =read_random(DS3231_MONTH);
  73.    nian =read_random(DS3231_YEAR);
  74.   
  75.    w[0]=code_led[shi/16];w[1]=code_led[shi%16];
  76.    w[2]=code_led[fen/16];w[3]=code_led[fen%16];
  77. //   w[0]=code_led[fen/16];w[1]=code_led[fen%16];  
  78. //   w[2]=code_led[miao/16];w[3]=code_led[miao%16];   
  79.    for (i=0; i<4; i++) SendByte_595(w[i]); sck=0;delayus(5);sck=1;delayus(5);
  80. }
  81. }
  82. if(d==26000)
  83. {
  84.   w[1]=code_led[shi%16]^0x80;
  85.   w[2]=code_led[fen/16]^0x80;
  86. //  w[0]=code_led[fen/16];w[1]=code_led[fen%16]^0x80;  
  87. //  w[2]=code_led[miao/16]^0x80;w[3]=code_led[miao%16];   
  88.   for (i=0; i<4; i++) SendByte_595(w[i]); sck=0;delayus(5);sck=1;delayus(5);
  89. }
  90. /////////////////////////////////////
  91.   
  92.    while(set==0)
  93.    {
  94. w[0]=code_led[yue/16];w[1]=code_led[yue%16];
  95.     w[2]=code_led[ri/16]^0x80;w[3]=code_led[ri%16];
  96. for (i=0; i<4; i++) SendByte_595(w[i]); sck=0;delayus(5);sck=1;delayus(5);

  97. //   write_byte_3231(DS3231_SECOND,m/10*16+m%10);
  98. //   write_byte_3231(DS3231_MINUTE,f/10*16+f%10);
  99. //   write_byte_3231(DS3231_HOUR,s/10*16+s%10);
  100. //   write_byte_3231(DS3231_DAY,r/10*16+r%10);
  101. //   write_byte_3231(DS3231_MONTH,y/10*16+y%10);
  102. //   write_byte_3231(DS3231_YEAR,n/10*16+n%10);
  103.      }
  104. }
  105. }
  106. void SendByte_595(uchar date){uchar i;for(i=0;i<8;i++){clk=0;delayus(2);date<<=1;din=CY;delayus(5);clk=1;delayus(5);}}//595移位輸出
  107. void SendByte_3231(uchar date) //發(fā)送一個字節(jié)
  108. {
  109. uchar i;
  110. for (i=0;i<8;i++){date<<=1;SDA=CY;delayus(1);SCL=1;delayus(5);SCL=0;}
  111. delayus(2);SDA=1;delayus(2);SCL=1;delayus(3);//釋放SDA 準備接收應答信號
  112. if(SDA==1)ack=0;else ack=1;    //檢測應答信號
  113. SCL=0; delayus(2);
  114. }
  115. uchar RcvdByte_3231(void)//讀取一個字節(jié)的數(shù)據(jù)
  116. {
  117.   uchar i;
  118.   uchar date=0;
  119.   SDA=1;
  120.   for(i=0;i<8;i++)
  121.   {
  122.    delayus(1);
  123.    SCL=0;delayus(5); SCL=1;delayus(3);
  124.    date=date<<1;
  125.    if(SDA==1)date+=1; delayus(2);
  126.    }
  127.   SCL=0;
  128.    delayus(2);
  129.    return(date);
  130. }

  131. void Ack_3231(bit a){if(a==0)SDA=0;else SDA=1; delayus(3);SCL=1;delayus(5);SCL=0;delayus(2);}  //發(fā)送應答與否

  132. // uchar write_byte_3231(uchar addr,uchar write_date)
  133. // {
  134. // Start_I2C();
  135. // SendByte_3231(DS3231_WriteAddress);//呼叫ds3231傳送
  136. // if(ack==0)return 0;
  137. // SendByte_3231(addr);//送地址
  138. // if(ack==0)return 0;// 無應答退出
  139. // SendByte_3231(write_date);//送數(shù)據(jù)
  140. // if(ack==0)return 0;// 無應答退出
  141. // Stop_I2C();
  142. // delayus(10);
  143. // return 1;//  發(fā)送成功
  144. // }

  145. uchar read_current(void)
  146. {
  147. uchar read_date;
  148. Start_I2C();
  149. SendByte_3231(DS3231_ReadAddress);
  150. if(ack==0)return 0;// 無應答退出
  151. read_date=RcvdByte_3231();
  152. Ack_3231(1);//接收到一個字節(jié)數(shù)據(jù)后非應答
  153. Stop_I2C();
  154. return read_date;
  155. }

  156. uchar read_random(uchar random_addr)
  157. {
  158.   Start_I2C();
  159.   SendByte_3231(DS3231_WriteAddress);//呼叫ds3231傳送
  160.   if(ack==0)return 0;// 無應答退出
  161.   SendByte_3231(random_addr);
  162.   if(ack==0)return 0;// 無應答退出
  163.   return (read_current());
  164. }
復制代碼

電路圖

補充一下, 單片機用的是STC15L104W,我用的是STC15W104,網(wǎng)上查是可以直接代換的。


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

使用道具 舉報

沙發(fā)
ID:155811 發(fā)表于 2024-10-12 14:37 | 只看該作者
使用 狀態(tài)變量,按動按鈕時候,依次進入 調(diào)日時分,可以解決問題
回復

使用道具 舉報

板凳
ID:556433 發(fā)表于 2024-10-12 15:26 | 只看該作者
你這程序都不是完整的啊,沒實現(xiàn)調(diào)整時間的功能,而且最好增加一個狀態(tài)變量,來判斷當前是顯示時間還是調(diào)整時間的模式。
回復

使用道具 舉報

地板
ID:143767 發(fā)表于 2024-10-12 18:11 | 只看該作者
這個狀態(tài)變量怎么寫呢
回復

使用道具 舉報

5#
ID:556433 發(fā)表于 2024-10-14 11:58 | 只看該作者
void main() {
    uchar mode = 0; // 0顯示模式、1調(diào)時模式

    while (1) {

    if (set == 0) {
        mode = 1 - mode; // 切換模式
        delayus(1000); // 防抖
    }

    if (mode == 1) {
        // 在此處添加調(diào)整時間的邏輯
        // 比如按下其他按鈕來增加/減少時間
    }
  }
}

回復

使用道具 舉報

6#
ID:143767 發(fā)表于 2024-10-16 10:50 | 只看該作者
嘗試寫了一下,沒成功,整不明白了,求高人指點
回復

使用道具 舉報

7#
ID:161164 發(fā)表于 2024-10-16 14:19 | 只看該作者
dj3365191 發(fā)表于 2024-10-16 10:50
嘗試寫了一下,沒成功,整不明白了,求高人指點

只有一個set按鍵是如何控制數(shù)值加減?
回復

使用道具 舉報

8#
ID:143767 發(fā)表于 2024-10-17 10:50 | 只看該作者
lkc8210 發(fā)表于 2024-10-16 14:19
只有一個set按鍵是如何控制數(shù)值加減?

是他原來就這樣設定的,但在程序中不知哪里是寫按鍵使用邏輯的地方
回復

使用道具 舉報

9#
ID:143767 發(fā)表于 2024-10-22 10:13 | 只看該作者
keyneko 發(fā)表于 2024-10-14 11:58
void main() {
    uchar mode = 0; // 0顯示模式、1調(diào)時模式

怎樣寫調(diào)整時間的邏輯,沒有其他按鈕了,除非復用
回復

使用道具 舉報

10#
ID:1133081 發(fā)表于 2024-10-23 06:23 | 只看該作者
dj3365191 發(fā)表于 2024-10-22 10:13
怎樣寫調(diào)整時間的邏輯,沒有其他按鈕了,除非復用

4位冒號數(shù)碼管時鐘 單鍵調(diào)時 仿真.rar (128.22 KB, 下載次數(shù): 4) 給你一個單鍵調(diào)時的例子參考
回復

使用道具 舉報

11#
ID:143767 發(fā)表于 2024-10-23 10:31 | 只看該作者
WL0123 發(fā)表于 2024-10-23 06:23
給你一個單鍵調(diào)時的例子參考

謝謝,我試著改一下看看
回復

使用道具 舉報

12#
ID:961114 發(fā)表于 2024-10-24 17:22 | 只看該作者
學習郭老師鬧鐘

回復

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲一区二区精品 | 亚洲欧美激情国产综合久久久 | 成人福利在线 | 国产高清在线视频 | 国产成人免费 | 精品国模一区二区三区欧美 | 欧美综合国产精品久久丁香 | 99re在线视频 | 成人综合视频在线观看 | 国产成人综合久久 | 亚洲福利一区二区 | 亚洲三区在线观看 | 日本久久福利 | 在线播放亚洲 | 欧美激情在线精品一区二区三区 | 视频一区二区中文字幕 | 日本一区二区不卡 | 在线看黄免费 | 国产一区二区视频在线 | 日一区二区| 日本午夜在线视频 | 在线播放亚洲 | 亚av在线 | 欧美成人在线免费 | 日韩一级免费大片 | 国产91在线观看 | 美女视频网站久久 | 免费的网站www | 国产在线观看一区二区三区 | 羞羞网站在线免费观看 | 欧美成人精品一区二区男人看 | 国产小视频自拍 | 综合精品| 日本中文在线视频 | 精品美女在线观看视频在线观看 | 国产一区二区三区免费视频 | 欧美日韩在线国产 | 干干天天 | 国产精品99久久久久久大便 | 91视频在线看 | 欧美成年人 |