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

標(biāo)題: DS1307實(shí)時時鐘萬年歷proteus仿真與源碼 [打印本頁]

作者: 13268254421    時間: 2017-11-17 10:55
標(biāo)題: DS1307實(shí)時時鐘萬年歷proteus仿真與源碼
LCD1602液晶屏顯示的萬年歷,DS1307還有很多功能可以添加小白一個
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機(jī)源程序如下:
  1. /****************************************************

  2. 電路圖說明:
  3.         將單片機(jī)P2.7和P1.0分別與RTC(實(shí)時時鐘)的時鐘信號SCL端
  4. 和數(shù)據(jù)信號SDA端相連, RTC的sout引腳與單片機(jī)P3.2相連,RTC的
  5. 地址是11010000.獨(dú)立鍵盤k0~K3接P1.1~P1.3
  6. 程序功能:
  7.           使用時鐘芯片ds1307制作一個實(shí)時時鐘
  8. ******************************************************/
  9. #include <reg52.h>
  10. #include<intrins.h>
  11. #define uchar unsigned char
  12. #define uint unsigned int
  13. //實(shí)時時鐘兩信號線
  14. sbit scl=P2^7;
  15. sbit sda=P1^0;
  16. //獨(dú)立鍵盤掃描位
  17. sbit k0=P1^1;
  18. sbit k1=P1^2;
  19. sbit k2=P1^3;
  20. //液晶顯示器控制位
  21. sbit lcd_rs=P3^4;
  22. sbit lcd_e=P3^5;
  23. //數(shù)碼管和led鎖存器選通位
  24. sbit duan=P2^0;
  25. sbit wei=P2^1;
  26. sbit led=P2^2;
  27. void init();//初始化IIC總線,使總線處于備用狀態(tài),
  28.                         //初始化lcd并顯示上面table1和table2的值,初始化定時器0,初始化變量時分秒


  29. /****************IIC總線控制函數(shù)***************************/
  30. void IIC_start();//IIC通信開始信號
  31. void IIC_stop();//IIC通信停止信號
  32. void IIC_un_ack();//單片機(jī)發(fā)送非應(yīng)答位
  33. //void IIC_ack();//單片機(jī)發(fā)送應(yīng)答位
  34. void IIC_check_ack();//單片機(jī)檢查應(yīng)答位
  35. void IIC_write_byte(uchar);//發(fā)送一字節(jié)數(shù)據(jù)
  36. uchar IIC_read_byte();//接收一字節(jié)數(shù)據(jù)
  37. void nop();//5us空操作延遲
  38. /**********************************/
  39. /**********ds1307讀寫函數(shù)*******************/
  40. void ds1307_write_date(uchar ,uchar ,uchar);//向指定器件寫一字節(jié)數(shù)據(jù)
  41.                                                                         //參數(shù)1器件地址,參數(shù)2要存的數(shù)據(jù)存放位置8位地址
  42.                                                                         //參數(shù)3要寫的數(shù)據(jù)

  43. uchar ds1307_read_date(uchar ,uchar );//從指定器件讀一字節(jié)數(shù)據(jù),
  44.                                                                 //參數(shù)1被通信器件地址,參數(shù)2要讀的數(shù)據(jù)存放位置8位地址
  45.                                                                 //函數(shù)返回讀取的數(shù)據(jù)。
  46. void delay(uint);//基數(shù)1ms延遲程序
  47. /***********************************/



  48. /**************LCD操作函數(shù)**************************/

  49. uchar hour,minute,second,k0_num;//時分秒變量,菜單鍵k0第幾次按下計(jì)數(shù),ds1307跟新標(biāo)志
  50. //時鐘初顯示
  51. uchar code table1[]="2017-11-16 THUR";
  52. uchar code table2[]="    23:59:55 ";



  53. void lcd_write_com(uchar);//向液晶顯示器寫指令設(shè)置其顯示的格式
  54. void lcd_write_date(uchar);//向液晶顯示器寫顯示的數(shù)據(jù)

  55. /**********************************************/

  56. /**************時鐘函數(shù)*******************/
  57. void lcd_write_second(uchar);//向lcd寫秒
  58. void lcd_write_minute(uchar);//向lcd寫分
  59. void lcd_write_hour(uchar);//向lcd寫時
  60. void run_time();//時鐘走動顯示
  61. void keyscan();//菜單鍵掃描
  62. /****************************************/

  63. /*********十進(jìn)值與BCD碼之間互換**********/
  64. uchar b_second,b_minute,b_hour;
  65. uchar dectobcd(uchar);//十進(jìn)值轉(zhuǎn)bcd碼
  66. uchar bcdtodec(uchar);//bcd碼轉(zhuǎn)十進(jìn)值
  67. /****************************************/

  68. void main()
  69. {
  70.         init();
  71.         while(1)
  72.         {
  73.                 keyscan();
  74.         }
  75. }

  76. void nop()
  77. {
  78.         _nop_();_nop_();_nop_();
  79.         _nop_();_nop_();_nop_();
  80. }

  81. void init()
  82. {
  83.         uchar i;
  84.         //將數(shù)據(jù)線和時鐘線拉高,處于備用狀態(tài)即非忙
  85.         sda=1;
  86.         nop();
  87.         scl=1;
  88.         nop();
  89.         
  90.         //關(guān)數(shù)碼管顯示和8個LED顯示
  91.         duan=0;
  92.         wei=0;
  93.         led=0;
  94.         lcd_e=0;

  95.         
  96.         //初始化寫入LCD的時分秒
  97.         second=55;
  98.         minute=59;
  99.         hour=23;
  100.         //初始化ds1307
  101.         ds1307_write_date(0xd0,0x07,0x10);//初始化1307的控制字,使其SOUT引腳輸出1Hz的方波。
  102.         //初始化1307的時間
  103.         ds1307_write_date(0xd0,6,0x14);                 
  104.         ds1307_write_date(0xd0,5,0x06);   
  105.         ds1307_write_date(0xd0,4,0x09);
  106.         ds1307_write_date(0xd0,3,0x00);
  107.         ds1307_write_date(0xd0,2,0x23);
  108.         ds1307_write_date(0xd0,1,0x59);
  109.         ds1307_write_date(0xd0,0,0x55);

  110.         //初始化液晶顯示器
  111.         lcd_write_com(0x38);//設(shè)置16*2行,5*7點(diǎn)陣,8位數(shù)據(jù)接口
  112.         lcd_write_com(0x06);//寫字符指針和光標(biāo)自動向右移動
  113.         lcd_write_com(0x0c);//開顯示,不顯示光標(biāo),光標(biāo)不閃爍
  114.         lcd_write_com(0x01);//顯示清屏
  115.         for(i=0;i<15;i++)
  116.         {
  117.                 lcd_write_date(table1[i]);
  118.         }
  119.         lcd_write_com(0x80+0x40);
  120.         for(i=0;i<10;i++)
  121.         {
  122.                 lcd_write_date(table2[i]);
  123.         }
  124.         
  125. //開啟外部中斷0
  126.         EA=1;
  127.         EX0=1;
  128.         IT0=1;
  129. }
  130. void IIC_start()
  131. {
  132.         //在時鐘信號有效scl=1時,數(shù)據(jù)線負(fù)跳變
  133.         sda=1;
  134.         nop();
  135.         scl=1;
  136.         nop();
  137.         sda=0;
  138.         nop();
  139.         scl=0;//拉低為下個時鐘數(shù)據(jù)作準(zhǔn)備
  140.         nop();
  141. }
  142. void IIC_stop()
  143. {
  144.         //在時鐘信號有效scl=1時,數(shù)據(jù)線正跳變,釋放總線,使總線處于備用狀態(tài)即非忙
  145.         sda=0;
  146.         nop();
  147.         scl=1;
  148.         nop();
  149.         sda=1;
  150.         nop();
  151.         nop();
  152.         nop();
  153. }
  154. void IIC_un_ack()
  155. {
  156.         //時鐘信號有效時,sda給1,給出非應(yīng)答
  157.         sda=1;
  158.         nop();
  159.         scl=1;
  160.         nop();
  161.         scl=0;//拉低為下個時鐘數(shù)據(jù)作準(zhǔn)備
  162.         nop();
  163. }
  164. /*
  165. void IIC_ack()
  166. {
  167.         //時鐘信號有效時,sda給0,給出應(yīng)答
  168.         sda=0;
  169.         nop();
  170.         scl=1;
  171.         nop();
  172.         scl=0;//拉低為下個時鐘數(shù)據(jù)作準(zhǔn)備
  173.         nop();
  174. }
  175. */
  176. void IIC_check_ack()
  177. {
  178.         //uchar i;
  179.         //時鐘信號有效時,檢測數(shù)據(jù)信號sda是否為0,給0說明有應(yīng)答信號
  180.         scl=1;
  181.         //while((sda==1)&&(i<255)) i++;
  182.         nop();
  183.         scl=0;//拉低為下個時鐘數(shù)據(jù)作準(zhǔn)備
  184.         nop();
  185. }
  186. uchar IIC_read_byte( )
  187. {
  188.         uchar i,temp;//temp用于存放從數(shù)據(jù)線讀到的數(shù)據(jù)

  189.         for(i=0;i<8;i++)//從數(shù)據(jù)線讀取一個字節(jié)(8位)
  190.         {
  191.                 scl=1;
  192.                 nop();
  193.                 temp=(temp<<1)|sda;//temp左移,騰出第0位,然后將數(shù)據(jù)線上的一位數(shù)用或
  194.                                                                  //運(yùn)算存放到temp的第0位
  195.                 scl=0;//拉低為下個時鐘數(shù)據(jù)作準(zhǔn)備        
  196.                 nop();
  197.         }
  198.         return temp;        
  199. }

  200. void IIC_write_byte(uchar byte)
  201. {
  202.         uchar i;
  203.         for(i=0;i<8;i++)//向數(shù)據(jù)線寫一個字節(jié)(8位)
  204.         {
  205.                 byte=byte<<1;//左移位,將byte第7位移到PSW中的進(jìn)位標(biāo)志位CY中
  206.                 sda=CY;
  207.                 nop();
  208.                 scl=1;
  209.                 nop();
  210.                 scl=0;//拉低為下個時鐘數(shù)據(jù)作準(zhǔn)備
  211.                 nop();
  212.         }
  213.         sda=1;//釋放總線,準(zhǔn)備接收被控設(shè)備應(yīng)答信號
  214.         nop();
  215. }

  216. void ds1307_write_date(uchar d_address,uchar r_address,uchar date)
  217. {

  218.         IIC_start();
  219.         IIC_write_byte(d_address & (~0x01));//寫器件地址,方向是寫,所以或上0x00
  220.         IIC_check_ack();//等待應(yīng)答
  221.         IIC_write_byte(r_address);//寫存儲器數(shù)據(jù)存放的8位地址
  222.         IIC_check_ack();//等待應(yīng)答
  223.         IIC_write_byte(date);//寫一字節(jié)數(shù)據(jù)
  224.         IIC_check_ack();//等待應(yīng)答
  225.         IIC_stop();
  226. }

  227. uchar ds1307_read_date(uchar d_address,uchar r_address)
  228. {
  229.         uchar r;
  230.         IIC_start();
  231.         IIC_write_byte(d_address & (~0x01));//寫器件地址,方向是寫
  232.         IIC_check_ack();//等待應(yīng)答
  233.         IIC_write_byte(r_address);//寫存儲器數(shù)據(jù)存放的8位地址
  234.         IIC_check_ack();//等待應(yīng)答

  235.         //換方向
  236.         IIC_start();
  237.         IIC_write_byte(d_address|0x01);//寫器件地址,方向是讀,所以或上1
  238.     IIC_check_ack();
  239.         r=IIC_read_byte();//讀取一個字節(jié)數(shù)據(jù)
  240.         IIC_un_ack();
  241.         IIC_stop();
  242.         return r;//將讀到的數(shù)據(jù)返回
  243. }
  244. void delay(uint z)//晶振頻率12MHz時,z=1時延遲1ms
  245. {
  246.         uint a,b;
  247.         for(a=z;a>0;a--)
  248.                 for(b=110;b>0;b--);
  249. }



  250. void lcd_write_com(uchar com)//lcd寫指令函數(shù)定義
  251. {
  252.         lcd_rs=0;
  253.         P0=com;
  254.         delay(1);
  255.         lcd_e=1;
  256.         lcd_e=0;
  257.         delay(2);
  258. }
  259. void lcd_write_date(uchar date)//lcd寫數(shù)據(jù)函數(shù)定義
  260. {
  261.         lcd_rs=1;
  262.         P0=date;
  263.         delay(1);
  264.         lcd_e=1;
  265.         lcd_e=0;
  266.         delay(2);
  267. }


  268. void lcd_write_second(uchar sec)//向lcd寫秒
  269. {
  270.         uchar h,l;
  271.         h=sec/10;
  272.         l=sec%10;
  273.         lcd_write_com(0x80+0x40+10);
  274.         lcd_write_date(0x30+h);
  275.         lcd_write_date(0x30+l);
  276. }
  277. void lcd_write_minute(uchar min)//向lcd寫分
  278. {
  279.         uchar h,l;
  280.         h=min/10;
  281.         l=min%10;
  282.         lcd_write_com(0x80+0x40+7);
  283.         lcd_write_date(0x30+h);
  284.         lcd_write_date(0x30+l);
  285. }
  286. void lcd_write_hour(uchar hou)//向lcd寫時
  287. {
  288.         uchar h,l;
  289.         h=hou/10;
  290.         l=hou%10;
  291.         lcd_write_com(0x80+0x40+4);
  292.         lcd_write_date(0x30+h);
  293.         lcd_write_date(0x30+l);
  294. }



  295. void inter0()interrupt 0
  296. {
  297.         run_time();
  298. }

  299. void run_time()//時鐘走動函數(shù)定義
  300. {        
  301.         //從1307中讀出時間
  302.         b_second=ds1307_read_date(0xd0,0);//返回函數(shù)r值秒        
  303.         b_minute=ds1307_read_date(0xd0,1);
  304.         b_hour=ds1307_read_date(0xd0,2);
  305.         //將讀出的時間轉(zhuǎn)換成十進(jìn)值
  306.         second=bcdtodec(b_second);
  307.         minute=bcdtodec(b_minute);
  308.         hour=bcdtodec(b_hour);
  309.         //更新lcd顯示時間
  310.         lcd_write_second(second);
  311.         lcd_write_minute(minute);
  312.         lcd_write_hour(hour);        
  313. }

  314. uchar dectobcd(uchar dec)//十進(jìn)值到BCD碼
  315. {
  316.         uchar x,y;
  317.         x=dec/10;//得到bcd的十位數(shù)
  318.         y=dec%10;//得到bcd的個位數(shù)
  319.         y=(x<<4)|y;
  320.         return y;
  321. }
  322. uchar bcdtodec(uchar bcd)//bcd碼轉(zhuǎn)十進(jìn)值
  323. {
  324.         uchar x,y;
  325.         y=bcd/16;//得到十進(jìn)制的十位數(shù)
  326.         x=bcd%16;//得到十進(jìn)制的個位數(shù)
  327.         y=y*10+x;
  328.         return y;        
  329. }

  330. void keyscan()//菜單鍵按下掃描函數(shù)定義
  331. {
  332.         k0=1;
  333.         k1=1;
  334.         k2=1;
  335.         //判斷菜單鍵k0是否按下
  336.         if(k0==0)
  337.         {
  338.                 delay(5);
  339.                 if(k0==0)
  340.                 {        
  341.                         while(!k0);//松手檢測
  342.                         k0_num++;//記錄菜單鍵k0是第幾次按下,而判斷是調(diào)節(jié)秒、分還是時。
  343.                         if(k0_num==1)//指示調(diào)節(jié)秒
  344.                         {
  345.                                 EX0=0;//關(guān)閉外部中斷0,使時間走動停止,準(zhǔn)備調(diào)時間
  346.                                 ds1307_write_date(0xd0,0,0x80|b_second);
  347.                                 lcd_write_com(0x80+0x40+11);//數(shù)據(jù)指針和光標(biāo)移動秒出
  348.                                 lcd_write_com(0x0f);//使光標(biāo)顯示,并光標(biāo)處字符格符閃爍,用來提示用戶此時可以調(diào)節(jié)
  349.                                                                          //什么?是秒,是分還是時。        
  350.                         }
  351.                         if(k0_num==2)//指示調(diào)節(jié)分
  352.                         {
  353.                                 lcd_write_com(0x80+0x40+8);//數(shù)據(jù)指針和光標(biāo)移動分出
  354.                         }
  355.                         if(k0_num==3)//指示調(diào)節(jié)時
  356.                         {
  357.                                 lcd_write_com(0x80+0x40+5);//數(shù)據(jù)指針和光標(biāo)移動時出
  358.                         }
  359.                         if(k0_num==4)//退出時間調(diào)節(jié)菜單
  360.                         {
  361.                                 k0_num=0;//菜單鍵k0按下清零
  362.                                 lcd_write_com(0x0c);//恢復(fù)到時鐘走動狀態(tài),即光標(biāo)不顯示,不閃爍
  363.                                 //將所調(diào)的時間轉(zhuǎn)換成bcd碼
  364.                                 b_second=dectobcd(second);
  365.                                 b_minute=dectobcd(minute);
  366.                                 b_hour=dectobcd(hour);
  367.                                 //將所調(diào)的時間向時鐘寫入
  368.                                 ds1307_write_date(0xd0,2,b_hour);
  369.                                 ds1307_write_date(0xd0,1,b_minute);        
  370.                                 ds1307_write_date(0xd0,0,b_second);

  371.                                 EX0=1;//開外部中斷0,時間開始繼續(xù)走動
  372.                         }
  373.                         
  374.                 }
  375.         }
  376.         //判斷是否按下過時間調(diào)節(jié)菜單鍵k0,而處于需要調(diào)節(jié)時間狀態(tài)
  377.         if(k0_num)
  378.         {
  379.                 //判斷是否是上調(diào)鍵k1按下
  380.                 if(k1==0)
  381.                 {
  382.                         delay(5);
  383.                         if(k1==0)
  384.                         {
  385.                                 while(!k1);//松手檢測
  386.                                 if(k0_num==1)//上調(diào)秒
  387.                                 {
  388.                                         second++;
  389.                                         if(second==60)
  390.                                                 second=0;
  391.                                         lcd_write_second(second);//向lcd寫入被修改的時間
  392.                                         lcd_write_com(0x80+0x40+11);//光標(biāo)位置重定位到所要調(diào)的時間處
  393.                                        
  394.                                 }
  395.                                 if(k0_num==2)//上調(diào)分
  396.                                 {
  397.                                         minute++;
  398. ……………………

  399. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
DS1307實(shí)時時鐘應(yīng)用.rar (56.62 KB, 下載次數(shù): 415)





作者: 電子癡    時間: 2018-3-18 14:34
看看看看,學(xué)習(xí)學(xué)習(xí),dsn文件需要用 Proteus7.5版本來打開

作者: 光明使者剛-51    時間: 2018-4-14 22:54
太好了,學(xué)習(xí)學(xué)習(xí)
作者: 豬先生    時間: 2018-11-26 15:53
謝謝,希望東西是我想要的
作者: 豬先生    時間: 2018-11-26 16:12
謝謝,希望是我想要的資料
作者: 千與千尋9527    時間: 2018-12-27 11:20
DS1307的手冊時鐘是100khZ,過高,過低是否可以,你用的晶振11.0592還是12M,有沒有影響子
作者: xinglingxz    時間: 2019-1-29 22:09

太好了,學(xué)習(xí)學(xué)習(xí)
作者: j1005513260    時間: 2019-2-19 17:14
寫的太好了 學(xué)習(xí)一下
作者: saya0769    時間: 2019-3-24 12:33
學(xué)習(xí)一下。謝謝啊!
作者: waliy    時間: 2019-3-24 21:03
學(xué)習(xí)一下,感謝分享!
作者: ptlantu    時間: 2019-3-25 09:45
感謝分享!
作者: huaaaa    時間: 2019-5-1 10:39
感謝分享  小白一個   分不夠
作者: 紫色的云    時間: 2019-6-5 17:46
謝謝,正在找DS1307資料
作者: wwg666    時間: 2019-11-16 02:33
1602無顯示數(shù)據(jù)
作者: King小白.    時間: 2019-11-24 22:14
今天正在學(xué)習(xí)電子鐘,看到樓主的代碼,收獲頗多,謝謝樓主,學(xué)習(xí)了!
作者: d917419982    時間: 2019-12-15 12:23
今天正在學(xué)習(xí)電子鐘,看到樓主的代碼,收獲頗多,謝謝樓主,學(xué)習(xí)了!
作者: zhangsan53    時間: 2019-12-22 13:45
支持一下啊
作者: wwh2382    時間: 2020-8-17 21:17
可以仿真,功能比較完善
作者: 歐洋    時間: 2020-11-20 16:12
時間可以調(diào),日期調(diào)不了嗎
作者: 歌舞團(tuán)123    時間: 2021-12-12 09:33
時間可調(diào),比ds1302更簡潔

作者: S_camp    時間: 2022-10-8 01:24
Proteus 8 打不開.dsn嗎




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 午夜免费电影 | 久久国产精品视频 | 亚洲精品视频一区 | 国产一区91精品张津瑜 | 亚洲国产精品成人综合久久久 | 久久视频精品 | 欧美黄色一区 | 在线观看视频你懂得 | 久久久精品网 | 久久综合亚洲 | 日韩一区精品 | 成人在线视频观看 | 日韩欧美在线视频播放 | 成人小视频在线观看 | 91xxx在线观看 | 中文字幕一区二区三区四区 | 成人国产精品一级毛片视频毛片 | 国产精品伦理一区 | 91精品国产91久久久久久不卞 | 东京av男人的天堂 | 四虎影音 | 玖玖久久 | 日韩精品在线一区 | 亚洲黄色视屏 | 精品久久久久久18免费网站 | 久热精品视频 | 亚洲区一区二区 | 亚洲精品国产偷自在线观看 | 一区二区三区四区免费视频 | 女女百合av大片一区二区三区九县 | 精品国产一区二区三区免费 | 亚洲国产精品视频 | 国产免费一区二区 | 久久不卡| 国产精品成人一区二区三区夜夜夜 | 一区二区免费视频 | 精品毛片视频 | 五月天婷婷综合 | 一区二区三区欧美在线观看 | www.久久精品 | 91传媒在线观看 |