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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

DS1302的單片機時鐘proteus通過了,但在實物上不顯示?

[復制鏈接]
回帖獎勵 2 黑幣 回復本帖可獲得 2 黑幣獎勵! 每人限 1 次
跳轉到指定樓層
樓主
ID:187835 發表于 2017-8-9 04:54 來自手機 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
有用過DS1302的親嗎,幫我看一下?
----------------2017.8.9更新------------------
額,源程序和電路圖如下:


  1. #include<reg51.h>
  2. #include<string.h>
  3. #include<intrins.h>
  4. #define uchar unsigned char
  5. #define uint unsigned int
  6. sbit SDA = P3^4;// 實物
  7. sbit CLK = P3^6;
  8. sbit RST = P3^5;
  9. sbit EN = P2^7;
  10. sbit RW = P2^5;
  11. sbit RS = P2^6;
  12. sbit K1 = P3^1;
  13. sbit K2 = P3^0;
  14. sbit K3 = P3^2;
  15. sbit K4 = P3^3;

  16. uchar tCount = 0;
  17. //一年中每個月的天數,2月的天數由年份決定
  18. uchar MonthsDays[] = { 0,31,0,31,30,31,30,31,31,30,31,30,31 };
  19. uchar *WEEK[]= {"SUN","MON","TUS","WEN","THU","FRI","SAT"};

  20. //LCD顯示緩沖
  21. uchar LCD_DSY_BUFFER1[] = {"DATE 00-00-00   "};//???為什么要空4鍵?----為后面的YMHD等留空間
  22. uchar LCD_DSY_BUFFER2[] = {"TIME 00:00:00   "};
  23. uchar DateTime[7] = {0, 0, 0x12, 0x01, 0x01, 0x02, 0x13}; //所讀取的日期時間
  24. char Adjust_Index = -1;//當前調節的時間對象(不調節秒與周)
  25. uchar Change_Flag[] = "-MHDM-Y";

  26. //----------------------------------------------------
  27. //延時
  28. //----------------------------------------------------
  29. void DelayMS(uint x)
  30. {
  31. uchar i;
  32. while(x--) for(i=0;i<120;i++);
  33. }

  34. //----------------------------------------------------
  35. //向DS1302寫入一個字節
  36. //----------------------------------------------------
  37. void Write_A_Byte_TO_DS1302(uchar x)
  38. {
  39. uchar i;
  40. for(i=0;i<8;i++)
  41. {
  42.   SDA = x & 0x01;
  43.   x >>= 1;  
  44.   CLK = 1;
  45.   _nop_();
  46.   CLK = 0;
  47.   _nop_();
  48.    }
  49. }

  50. //----------------------------------------------------
  51. //從DS1302讀取一字節
  52. //----------------------------------------------------
  53. uchar Get_A_Byte_FROM_DS1302()
  54. {
  55.     uchar i,b,t;
  56. for(i = 0 ;i < 8 ;i++)
  57. {
  58.   t = SDA;
  59.   b = (b>>=1) | (t<<7);  //3
  60.   
  61.   CLK = 1;
  62.   _nop_();
  63.   CLK = 0;
  64.   _nop_();
  65. }
  66. //BCD碼轉換
  67. return b / 16 * 10+ b % 16;
  68. }

  69. //------------------------------------------------------
  70. //向DS1302某地址寫入數據
  71. //------------------------------------------------------
  72. void Write_DS1302(uchar addr,uchar dat)
  73. {
  74. RST = 0;
  75. _nop_();
  76. CLK = 0;                        
  77. _nop_();
  78. RST = 1;
  79. _nop_();
  80. Write_A_Byte_TO_DS1302(addr);
  81. Write_A_Byte_TO_DS1302(dat);
  82. RST = 0;
  83. _nop_();
  84. }

  85. //------------------------------------------------------
  86. //從DS1302指定位置讀數據
  87. //------------------------------------------------------
  88. uchar Read_Data(uchar addr)
  89. {
  90. uchar dat;
  91. RST = 0;
  92. _nop_();
  93. CLK = 0;
  94. _nop_();
  95. RST = 1;
  96. _nop_();

  97. Write_A_Byte_TO_DS1302(addr);
  98. dat = Get_A_Byte_FROM_DS1302();

  99. RST = 0;                            //2.以下為DS1302復位的穩定時間,必須的。
  100. _nop_();
  101. CLK = 1;
  102. _nop_();
  103. SDA = 0;
  104. _nop_();
  105. SDA = 1;
  106. _nop_();
  107. // CLK =1;
  108. // RST=0;
  109. return dat;
  110. }

  111. //------------------------------------------------------
  112. //設置時間
  113. //------------------------------------------------------
  114. void SET_DS1302()                                         //(初始化)
  115. {
  116. uchar i;
  117. //寫控制字,取消寫保護
  118.     Write_DS1302(0x8E,0x00);
  119. //分時日年月依次寫入
  120.     for(i = 1; i < 7; i++ )
  121.    {
  122.      Write_DS1302(0x80 + 2*i, (DateTime[i]/10<<4) | (DateTime[i]%10));
  123.      }
  124.   Write_DS1302(0x8E,0x80);//加保護

  125. }

  126. //----------------------------------------------------
  127. //讀取當前日期時間
  128. //----------------------------------------------------
  129. void GetTime()
  130. {
  131. uchar i;
  132. for(i = 0; i < 7; i++)
  133.   {
  134.   DateTime[i] = Read_Data(0x81 + 2*i);
  135.   }
  136. }

  137. //------------------------------------------------------
  138. //1602LCD的若干控制代碼
  139. //------------------------------------------------------
  140. uchar Read_LCD_State(){
  141. uchar state;
  142. RS=0;RW=1;EN=1;DelayMS(1);state = P0; EN = 0; DelayMS(1);
  143. return state;
  144. }

  145. //------------------------------------------------------
  146. //忙等待
  147. //-------------------------------------------------------
  148. void LCD_Busy_Wait()
  149.    {
  150.     while((Read_LCD_State() & 0x80) == 0x80);
  151.     DelayMS(5);
  152.    }

  153. //------------------------------------------------------
  154. //向LCD寫數據
  155. //------------------------------------------------------
  156. void Write_LCD_Data(uchar dat)
  157. {
  158. LCD_Busy_Wait();
  159. RS = 1;
  160. RW = 0;
  161. EN = 0;
  162. P0 = dat;
  163. DelayMS(1);
  164. EN = 1;
  165. DelayMS(5);
  166. EN = 0;
  167. }

  168. //------------------------------------------------------
  169. //寫LCD指令
  170. //------------------------------------------------------
  171. void Write_LCD_Command(uchar cmd)
  172. {
  173. LCD_Busy_Wait();
  174. RS = 0;
  175. RW = 0;
  176. EN = 0;
  177. P0 = cmd;
  178. DelayMS(1);
  179. EN = 1;
  180. DelayMS(5);
  181. EN = 0;
  182. }
  183. //------------------------------------------------------
  184. //LCD初始化
  185. //------------------------------------------------------
  186. void Init_LCD()
  187. {
  188. Write_LCD_Command(0x38);DelayMS(1);
  189. Write_LCD_Command(0x0F);DelayMS(1);
  190. Write_LCD_Command(0x01);DelayMS(1);
  191. Write_LCD_Command(0x06);DelayMS(1);
  192. Write_LCD_Command(0x0c);DelayMS(1);
  193. }
  194. //------------------------------------------------------
  195. //設置液晶顯示位置
  196. //------------------------------------------------------
  197. void Set_LCD_POS(uchar p)
  198. {
  199. Write_LCD_Command(p | 0x80);
  200. }
  201. //------------------------------------------------------
  202. //在LCD上顯示字符串
  203. //------------------------------------------------------
  204. void Display_LCD_String(uchar p,uchar *s)
  205. {
  206. uchar i;
  207. Set_LCD_POS(p);
  208. for(i = 0;i<16;i++)
  209. {
  210.   Write_LCD_Data(s[i]);
  211.   DelayMS(1);
  212. }
  213. }
  214. //------------------------------------------------------
  215. //日期與時間值轉換為數字字符
  216. //------------------------------------------------------
  217. void Format_DateTime(uchar d, uchar *a)
  218. {
  219. a[0] = d / 10+'0'; a[1] = d % 10 + '0';
  220. }
  221. //------------------------------------------------------
  222. //判斷是否為閏年
  223. //------------------------------------------------------
  224. uchar isLeapYear(uint y)
  225. {
  226. return (y & 4 == 0 && y & 100 != 0) || (y & 400 == 0);
  227. }
  228. //------------------------------------------------------
  229. //求星期幾
  230. //------------------------------------------------------
  231. void RefreshWeekDay()
  232. {
  233. uint i,d,w = 5;
  234. for(i = 2000;i< 2000 + DateTime[6];i++)
  235. {
  236.   d = isLeapYear(i) ? 366 : 365;
  237.   w = (w + d) % 7;
  238. }
  239. d = 0;
  240. for(i = 1;i < DateTime[4] ;i++ ) d += MonthsDays[i];
  241. d += DateTime[3];
  242. //保存星期,0~6表示星期日,星期一,二,,,,六,為了與DS1302星期格式匹配,返回值需要加1
  243. DateTime[5] = (w + d) % 7 + 1;
  244. }
  245. //------------------------------------------------------
  246. //年月日時分++ / --
  247. //------------------------------------------------------
  248. void DateTime_Adjust(char x)
  249. {

  250. switch ( Adjust_Index )
  251. {
  252.   case 6://年00-99
  253.         if(x == 1 && DateTime[6] < 99 ) DateTime[6]++;
  254.   if(x == -1 && DateTime[6] > 0 ) DateTime[6]--;
  255.   MonthsDays[2] = isLeapYear(2000 + DateTime[6]) ? 29 : 28;
  256.   if(DateTime[3] > MonthsDays[DateTime[4]] )
  257.   DateTime[3] = MonthsDays[DateTime[4]];
  258.   RefreshWeekDay();
  259.   break;
  260.   
  261.   case 4://月
  262.         if(x == 1 && DateTime[4] < 12 ) DateTime[4]++;
  263.   if(x ==-1 && DateTime[4] > 1 ) DateTime[4]--;
  264.   MonthsDays[2] = isLeapYear(2000 + DateTime[6]) ? 29 : 28;
  265.   if(DateTime[3] > MonthsDays[DateTime[4]] )
  266.    DateTime[3] = MonthsDays[DateTime[4]];
  267.   RefreshWeekDay();
  268.   break;
  269.   
  270.   case 3://日
  271.   MonthsDays[2] = isLeapYear(2000 + DateTime[6]) ? 29 : 28;
  272.         if(x == 1 && DateTime[3] < MonthsDays[DateTime[4]] ) DateTime[3]++;
  273.   if(x == -1 && DateTime[3]>0 ) DateTime[3]--;
  274.   RefreshWeekDay();
  275.   break;
  276.   
  277.   case 2://時
  278.         if(x == 1 && DateTime[2] < 23 ) DateTime[2]++;
  279.   if(x ==-1 && DateTime[2] > 0 ) DateTime[2]--;
  280.   break;
  281.   
  282.   case 1://分
  283.         if(x == 1 && DateTime[1]<59 ) DateTime[1]++;
  284.   if(x == -1 && DateTime[1]>0 ) DateTime[1]--;
  285.   break;
  286. }
  287. }
  288. //------------------------------------------------------
  289. //定時器0每秒刷新LCD顯示
  290. //------------------------------------------------------
  291. void T0_INT() interrupt 1
  292. {
  293. TH0 = -5000 / 256;
  294. TL0 = -5000 % 256;

  295. if( ++tCount != 2 ) return;
  296. tCount = 0;
  297. //按指定格式生成待顯示的日期時間串
  298. Format_DateTime(DateTime[6],LCD_DSY_BUFFER1 + 5);
  299. Format_DateTime(DateTime[4],LCD_DSY_BUFFER1 + 8);
  300. Format_DateTime(DateTime[3],LCD_DSY_BUFFER1 + 11);
  301. //星期
  302. strcpy(LCD_DSY_BUFFER1 + 13,WEEK[DateTime[5] - 1]);
  303. //時分秒
  304. Format_DateTime(DateTime[2],LCD_DSY_BUFFER2 + 5);
  305. Format_DateTime(DateTime[1],LCD_DSY_BUFFER2 + 8);
  306. Format_DateTime(DateTime[0],LCD_DSY_BUFFER2 + 11);
  307. //顯示年月日、星期、時分秒
  308. Display_LCD_String(0x00,LCD_DSY_BUFFER1);
  309. Display_LCD_String(0x40,LCD_DSY_BUFFER2);
  310. }
  311. //------------------------------------------------------
  312. //鍵盤中斷
  313. //------------------------------------------------------
  314. void EX_INT0() interrupt 0
  315. {
  316. if(K1==0)//選擇調整對象(Y M D H M)
  317. {
  318.   while(K1==0);
  319.   if (Adjust_Index == -1 || Adjust_Index == 1 )Adjust_Index = 7;
  320.   Adjust_Index --;
  321.   if (Adjust_Index == 5) Adjust_Index = 4;//跳過對星期的調節
  322.   LCD_DSY_BUFFER2[13] = '[';
  323.   LCD_DSY_BUFFER2[14] = Change_Flag[Adjust_Index];
  324.   LCD_DSY_BUFFER2[15] = ']';
  325. }
  326.      else
  327.   if(K2==0)//加
  328.   {
  329.   while(K2==0);DateTime_Adjust(1);
  330.   }
  331.   else
  332.   if(K3==0)//減
  333.   {
  334.   while(K3==0);DateTime_Adjust(-1);
  335.   }
  336.   else
  337.   if(K4==0)//確定
  338.   {
  339.       while(K4==0);
  340.    SET_DS1302();//將調整后的時間寫入DS1302
  341.    LCD_DSY_BUFFER2[13] = ' ';
  342.    LCD_DSY_BUFFER2[14] = ' ';
  343.    LCD_DSY_BUFFER2[15] = ' ';
  344.    Adjust_Index = -1;//操作索引重設為-1,時間繼續正常顯示
  345.   }
  346. }
  347. //------------------------------------------------------
  348. //主程序
  349. //------------------------------------------------------
  350. //void Int0Configuration()
  351. //{
  352. // //設置INT0
  353. // IT0=1;//跳變沿出發方式(下降沿)
  354. // EX0=1;//打開INT0的中斷允許。
  355. // EA=1;//打開總中斷
  356. //}
  357. void main()
  358. {   
  359. Init_LCD();//液晶初始化
  360. IE = 0x83;//允許INT0,T0中斷
  361. IP = 0x01;
  362. IT0 = 0X01;
  363. TMOD = 0x01;
  364. TH0 = -5000 / 256;
  365. TL0 = -5000 % 256;
  366. TR0 = 1;
  367. while(1)
  368. {
  369.    //如果未執行調整操作則正常讀取當前時間
  370.   if(Adjust_Index == -1) GetTime();
  371. }
  372. }
復制代碼


全部資料下載地址:
DS1302設計的電子鐘.rar (60.13 KB, 下載次數: 7)

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

使用道具 舉報

沙發
ID:105206 發表于 2017-8-9 05:18 | 只看該作者
沒程序怎么看,發程序上來。
回復

使用道具 舉報

板凳
ID:167440 發表于 2017-8-9 08:11 | 只看該作者
親,仔細看看你的實物真的是DS1302嗎?肯能是DS1307呀!!!DS1302與DS1307通信是不一樣的
回復

使用道具 舉報

地板
ID:219560 發表于 2017-8-9 09:50 | 只看該作者
如果仿真可以的話,很大的可能是硬件問題。建議:1. 確定IO都對應;2. 測試一下顯示模塊;
回復

使用道具 舉報

5#
ID:219560 發表于 2017-8-9 09:50 | 只看該作者
最好把電路和程序貼出來!
回復

使用道具 舉報

6#
ID:187835 發表于 2017-8-9 19:16 | 只看該作者
jubaolun 發表于 2017-8-9 05:18
沒程序怎么看,發程序上來。

已更新
回復

使用道具 舉報

7#
ID:187835 發表于 2017-8-9 19:22 | 只看該作者
本帖最后由 Magatop 于 2017-8-9 20:21 編輯
浮云騎士 發表于 2017-8-9 08:11
親,仔細看看你的實物真的是DS1302嗎?肯能是DS1307呀!!!DS1302與DS1307通信是不一樣的

回復

使用道具 舉報

8#
ID:187835 發表于 2017-8-9 19:22 | 只看該作者
qingtao 發表于 2017-8-9 09:50
如果仿真可以的話,很大的可能是硬件問題。建議:1. 確定IO都對應;2. 測試一下顯示模塊;

這兩項都正確。。
回復

使用道具 舉報

9#
ID:187835 發表于 2017-8-9 19:23 | 只看該作者
qingtao 發表于 2017-8-9 09:50
最好把電路和程序貼出來!

已貼
回復

使用道具 舉報

10#
ID:187835 發表于 2017-8-9 20:24 | 只看該作者
qingtao 發表于 2017-8-9 09:50
如果仿真可以的話,很大的可能是硬件問題。建議:1. 確定IO都對應;2. 測試一下顯示模塊;

這兩項是正確的
回復

使用道具 舉報

11#
ID:187835 發表于 2017-8-9 20:53 | 只看該作者
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产成人精品av | 男人久久天堂 | 国产日韩欧美激情 | 99精品视频在线 | 91久久久久久 | 亚洲大片一区 | 成年人视频在线免费观看 | 成人网在线观看 | 欧美精品一区二区三区四区五区 | 亚洲精品一区二区三区 | 韩国欧洲一级毛片 | 麻豆国产一区二区三区四区 | 夜色www国产精品资源站 | 亚洲成人综合社区 | ww 255hh 在线观看 | 羞羞视频网站免费看 | 欧美激情视频一区二区三区在线播放 | 欧美九九九 | 在线观看中文字幕 | 国产黄a一级| 美女黄视频网站 | 欧美日韩亚洲在线 | 婷婷成人在线 | 欧美另类视频在线 | 亚洲欧美日韩国产综合 | 男女午夜免费视频 | 日韩第一页| h片免费看| 影音先锋中文字幕在线观看 | 91一区二区三区在线观看 | 日韩一二区 | 综合一区二区三区 | 免费欧美 | av天天爽 | 精品麻豆剧传媒av国产九九九 | 给我免费的视频在线观看 | 男人的天堂久久 | 精品丝袜在线 | 97超碰在线播放 | 日朝毛片 | 日本精品一区二区三区在线观看视频 |