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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

Proteus仿真《用51單片機制作的6位數碼管GPS授時時鐘》

  [復制鏈接]
跳轉到指定樓層
樓主
ID:149389 發表于 2019-5-18 14:08 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
原貼: http://www.zg4o1577.cn/bbs/dpj-100009-1.html
仿真環境:Proteus 8.5 SP0

仿真說明:在Proteus仿真中使用AT89C52單片機,在原始程序的基礎上,調整了部分引腳定義,只測試了GPS授時功能。仿真不包含紅外部分。


1、為了對照說明GPS授時效果,DS1302,取消該選項的勾選。


2、仿真開始,時間從0:00:00 開始


3、閉合開關,獲取GPS授時信息,GPS授時的標記點亮,串口可觀察GPS信息,DS1302成功寫入獲取的時間。


4、斷開開關,時鐘從DS1302獲取時間值



5、仿真文件,含Proteus 8.5格式的工程文件,以及Hex文件,程序請參照原貼。



全部資料51hei下載地址(仿真+hex文件 不帶源碼):
6位數碼管GPS時鐘.rar (20.61 KB, 下載次數: 196)


評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:601774 發表于 2019-8-23 08:17 | 只看該作者
謝謝,學習了
回復

使用道具 舉報

板凳
ID:601774 發表于 2019-8-23 08:18 | 只看該作者
謝謝,學習了,剛好準備弄一個,就是不知道gps串口讀取的時間精度是到哪一位的,只是到秒級,還是能讀取毫秒,微秒
回復

使用道具 舉報

地板
ID:99130 發表于 2020-2-17 22:45 來自手機 | 只看該作者
正好需要
回復

使用道具 舉報

5#
ID:637324 發表于 2020-3-21 13:21 | 只看該作者
原貼不存在了,想看樓主大哥的程序
回復

使用道具 舉報

6#
ID:149389 發表于 2020-4-9 08:58 | 只看該作者
gspt 發表于 2020-3-21 13:21
原貼不存在了,想看樓主大哥的程序

C源程序, main.rar (3.36 KB, 下載次數: 49)

  1. #include <reg52.H>
  2. //--------數碼管段選定義--------
  3. #define LEDPORT P0
  4. #define uchar unsigned char
  5. #define uint unsigned int
  6. //--------數碼管位選定義--------
  7. sbit D1=P2^0;
  8. sbit D2=P2^1;
  9. sbit D3=P2^2;
  10. sbit D4=P2^3;
  11. sbit D5=P2^4;
  12. sbit D6=P2^5;
  13. //--------DS1302接口定義--------
  14. sbit CLK =P3^7;                                         
  15. sbit IO  =P3^6;
  16. sbit RST =P3^1;
  17. //--------狀態標記--------
  18. sbit LED1=P2^6;
  19. sbit LED2=P2^7;
  20. sbit ACC0=ACC^0;
  21. sbit ACC7=ACC^7;
  22. unsigned char hour,min,sec;                //小時、分鐘、秒
  23. bit rev_start,rev_stop;                        //GPS接收開始、結束標志位
  24. unsigned char code tab[ ]={
  25.   0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xFF};//共陽極0-9,滅
  26. unsigned char  buf[10];         //GPS數據接收緩沖
  27. unsigned char  irtime;//紅外用全局變量,用于計算2個下降沿之間的時間
  28. bit decode_ok,irok;
  29. static unsigned char ircode[4];
  30. unsigned char irdata[33];
  31. uchar set,temp,dot;
  32. bit flag,test;                                          
  33. uint cnt;
  34. /******************************************************************************************
  35. *函數名稱:Timer_Init
  36. *功能描述:定時器初始化
  37. ******************************************************************************************/
  38. void Timer_Init()
  39. {
  40.   TMOD=0x22;
  41.   TH0=0x00; //重載值
  42.   TL0=0x00; //初始化值
  43.   ET0=1;    //開中斷
  44.   TR0=1;
  45.   IT0 = 1;   //指定外部中斷0下降沿觸發,INT0 (P3.2)
  46.   EX0 = 1;   //使能外部中斷

  47.   TL2 = 0xCD;                //設置定時初值
  48.   TH2 = 0xF8;                //設置定時初值
  49.   RCAP2L = 0xCD;        //設置定時重載值
  50.   RCAP2H = 0xF8;        //設置定時重載值
  51.   ET2=1;
  52.   TR2=1;

  53.   TH1 = 0xFD;                //9600波特率的初值
  54.   TL1 = TH1;                //9600波特率的初值
  55.   TR1 = 1;  
  56.   SCON = 0x50;        //使用串行工作方式1,10位異步收發8位數據,波特率可變(由T1的溢出率控制)
  57.   //        ES = 1;
  58.   EA=1;
  59. }
  60. //--------數據串行輸入--------
  61. void inputbyte(unsigned char ucDa)
  62. {
  63.   unsigned char i;
  64.   ACC = ucDa;
  65.   for(i=8; i>0; i--)
  66.   {
  67.     IO = ACC0;                   //相當于匯編中的 RRC
  68.     CLK = 1;
  69.     CLK = 0;
  70.     ACC = ACC >> 1;
  71.   }
  72. }
  73. //--------數據并行輸出--------
  74. unsigned char outputbyte(void)
  75. {
  76.   unsigned char i;
  77.   for(i=8; i>0; i--)
  78.   {
  79.     ACC = ACC >>1;                      //相當于匯編中的 RRC
  80.     ACC7 = IO;
  81.     CLK = 1;
  82.     CLK = 0;
  83.   }
  84.   return(ACC);
  85. }
  86. //--------數據寫入--------
  87. void write(unsigned char ucAddr, unsigned char ucDa)
  88. {
  89.   RST = 0;
  90.   CLK = 0;
  91.   RST = 1;
  92.   inputbyte(ucAddr);                    //地址,命令
  93.   inputbyte(ucDa);                      //寫1Byte數據
  94.   CLK = 1;
  95.   RST =0;
  96. }
  97. //--------數據讀出--------
  98. unsigned char read(unsigned char ucAddr)
  99. {
  100.   unsigned char ucDa;
  101.   RST = 0;
  102.   CLK = 0;
  103.   RST = 1;
  104.   inputbyte(ucAddr);                    //地址,命令
  105.   ucDa = outputbyte();                 //讀1Byte數據
  106.   CLK = 1;
  107.   RST =0;
  108.   return(ucDa);
  109. }
  110. //--------DS1302初始化--------
  111. void DS1302_init()
  112. {
  113.   if(read(0xc1)!=0x82)  //如果1302掉電,寫入下面的初始值
  114.   {
  115.     write(0x8e,0x00);//關閉寫保護
  116.     write(0x80,0x22); //設置秒
  117.     write(0x82,0x22);//設置分鐘
  118.     write(0x84,0x22); // 小時
  119.     write(0x90,0xa5);//涓流充電
  120.     write(0xc0,0x82);//掉電標志位
  121.   }
  122. }
  123. //------------------------------------------------------------
  124. //--------------遙控器操作部分--------------------------------
  125. void decode(void)//紅外碼值處理函數
  126. {
  127.   unsigned char i, j, k;
  128.   unsigned char cord,value;
  129.   k=1;
  130.   for(i=0;i<4;i++)      //處理4個字節
  131.   {
  132.     for ( j=1; j<=8;  j++) //處理1個字節8位
  133.     {
  134.       cord=irdata[k];
  135.       if(cord>7)//大于某值為1,這個和晶振有絕對關系,這里使用12M計算,此值可以有一定誤差
  136.       {
  137.         value=value|0x80;
  138.       }
  139.       else
  140.       {
  141.         value=value;
  142.       }
  143.       if(j<8)
  144.       {
  145.         value=value>>1;
  146.       }
  147.       k++;
  148.     }
  149.     ircode[i]=value;
  150.     value=0;     
  151.   }
  152.   if(ircode[2]==~ircode[3])
  153.     decode_ok=1;//解碼完畢后標志位置1
  154. }
  155. void ir_work()
  156. {
  157.   if(ircode[2]==0x1e)
  158.     test=!test;                //熄滅屏幕標記
  159.   if(ircode[2]==0x05)
  160.   {
  161.     set++;
  162.     if(set==4)
  163.       set=0;
  164.   }
  165.   if(set==1)
  166.   {
  167.     if(ircode[2]==0x02|ircode[2]==0x06)                                                //hour
  168.     {
  169.       temp=(read(0x85)/16)*10+read(0x85)%16;
  170.       temp++;
  171.       if(temp==24)temp=0;
  172.       write(0x84,(temp/10)*16+temp%10);
  173.     }
  174.     if(ircode[2]==0x08|ircode[2]==0x04)
  175.     {
  176.       temp=(read(0x85)/16)*10+read(0x85)%16;
  177.       temp--;
  178.       if(temp==-1)temp=23;
  179.       write(0x84,(temp/10)*16+temp%10);
  180.     }         
  181.   }
  182.   if(set==2)                                                                         //min
  183.   {
  184.     if(ircode[2]==0x02|ircode[2]==0x06)       
  185.     {
  186.       temp=(read(0x83)/16)*10+read(0x83)%16;
  187.       temp++;
  188.       if(temp==60)temp=0;
  189.       write(0x82,(temp/10)*16+temp%10);
  190.     }
  191.     if(ircode[2]==0x08|ircode[2]==0x04)
  192.     {
  193.       temp=(read(0x83)/16)*10+read(0x83)%16;
  194.       temp--;
  195.       if(temp==-1)temp=59;
  196.       write(0x82,(temp/10)*16+temp%10);
  197.     }         
  198.   }
  199.   if(set==3)                                                                         //sec
  200.   {
  201.     if(ircode[2]==0x02|ircode[2]==0x06)       
  202.     {
  203.       temp=(read(0x81)/16)*10+read(0x81)%16;
  204.       temp++;
  205.       if(temp==60)temp=0;
  206.       write(0x80,(temp/10)*16+temp%10);
  207.     }
  208.     if(ircode[2]==0x08|ircode[2]==0x04)
  209.     {
  210.       temp=(read(0x81)/16)*10+read(0x81)%16;
  211.       temp--;
  212.       if(temp==-1)temp=59;
  213.       write(0x80,(temp/10)*16+temp%10);
  214.     }         
  215.   }
  216.   decode_ok=0;       
  217. }
  218. //--------數碼管顯示--------
  219. void Display(unsigned char a,b,c)   //數碼管顯示
  220. {
  221.   static unsigned char i;
  222.   LEDPORT=0xff;
  223.   switch (i)
  224.   {
  225.   case 0:
  226.     if(a/16)                                //不為零則顯示
  227.       LEDPORT=tab[a/16]˙
  228.     else
  229.       LEDPORT=tab[10]˙        //最高位"0",消隱字符
  230.     D1=0;
  231.     D2=D3=D4=D5=D6=1;       
  232.     break;
  233.   case 1:
  234.     LEDPORT=tab [a%16];   
  235.     D2=0;
  236.     D1=D3=D4=D5=D6=1;   
  237.     break;
  238.   case 2:
  239.     LEDPORT=tab [b/16];            
  240.     D3=0;
  241.     D1=D2=D4=D5=D6=1;       
  242.     break;
  243.   case 3:
  244.     LEDPORT=tab [b%16];       
  245.     D4=0;
  246.     D1=D2=D3=D5=D6=1;       
  247.     break;
  248.   case 4:
  249.     LEDPORT=tab [c/16];            
  250.     D5=0;
  251.     D1=D2=D3=D4=D6=1;       
  252.     break;
  253.   case 5:
  254.     LEDPORT=tab [c%16];   
  255.     D6=0;
  256.     D1=D3=D4=D5=D2=1;       
  257.     break;
  258.   }
  259.   i++;
  260.   if(i==6)i=0;
  261. }
  262. /******************************************************************************************
  263. *函數名稱:main
  264. *功能描述:主函數
  265. ******************************************************************************************/
  266. void main()
  267. {
  268.   Timer_Init();
  269.   DS1302_init();
  270.   dot=0xFF;
  271.   flag=1;
  272.   while(1)
  273.   {                 
  274.     hour= read(0x85);
  275.     min = read(0x83);
  276.     sec  = read(0x81);
  277.     /*        if((hour==0x08)&&(min==0x00) )                         //可以設置為每天的某個時間打開GPS對一下時間再關掉,這里設置的是8:00
  278.              ES=1;
  279.              else
  280.              ES=0;*/
  281.     if(flag==1&&cnt>500)                                  //上電稍做延時再打開串口,防止數碼管顯示出錯
  282.     {
  283.       flag=0;
  284.       cnt=0;
  285.       ES=1;
  286.     }
  287.     if((rev_stop==1)&&(buf[1]=='M')&&(buf[2]=='C')&&(buf[3]==','))//如果接收到GPRMC        就把GPS接收到的時間寫入DS1302
  288.     {
  289.       LED1=1;
  290.       ES=0;
  291.       hour= (buf [4]-0x30)* 16+ buf[5] -0x30;
  292.       min=  (buf [6]-0x30)* 16+ buf[7]-0x30;
  293.       sec=  (buf[8]-0x30)* 16+ buf[9]-0x30;
  294.       hour=  hour / 16 * 10 + hour % 16;
  295.       hour= (hour+8) % 24;        //UTC Time換算成北京時間
  296.       hour=hour/10*16+hour%10;
  297.       write(0x84,hour);
  298.       write(0x82,min);
  299.       write(0x80,sec);       
  300.       ES=1;
  301.       rev_stop=0;
  302.     }                       
  303.     if( sec==  (buf[8]-0x30)* 16+ buf[9]-0x30)                                        //用左上角的小點顯示有無GPS信號
  304.       dot=0x7f;
  305.     else
  306.       dot=0xff;
  307.     if(irok)                         //如果接收到正確的紅外信號后進行紅外處理
  308.     {   
  309.       decode();
  310.       irok=0;
  311.     }
  312.     if(decode_ok)                //如果解碼正確就進入調時程序
  313.     {
  314.       ir_work();
  315.     }
  316.     if(test)                        //需要時可以遙控關閉屏幕
  317.     {
  318.       ET2=0;
  319.       P0=0xff;
  320.       LED1=LED2=1;
  321.     }
  322.     else
  323.     {
  324.       ET2=1;
  325.     }          
  326.   }                    
  327. }
  328. void int0 (void) interrupt 0 //外部中斷0服務函數           用于紅外解碼
  329. {
  330.   static unsigned char  i;             //接收紅外信號處理
  331.   static bit startflag;                //是否開始處理標志位
  332.   if(startflag)                        
  333.   {
  334.     if(irtime<63&&irtime>=33)//引導碼 TC9012的頭碼,9ms+4.5ms
  335.       i=0;                  
  336.     irdata[i]=irtime;//存儲每個電平的持續時間,用于以后判斷是0還是1
  337.     irtime=0;
  338.     i++;
  339.     if(i==33)
  340.     {
  341.       irok=1;
  342.       i=0;
  343.     }
  344.   }
  345.   else
  346.   {
  347.     irtime=0;
  348.     startflag=1;
  349.   }
  350. }
  351. /******************************************************************************************
  352. *函數名稱:timer0
  353. *功能描述:紅外解碼計算脈沖寬度
  354. ******************************************************************************************/
  355. void timer0 (void) interrupt 1 //定時器0中斷服務函數 ,紅外解碼
  356. {
  357.   irtime++; //計算2個下降沿之間的時間
  358. }
  359. void Uart_Receive(void) interrupt 4         //串口中斷,用于GPS數據接收
  360. {
  361.   unsigned char ch,num;
  362.   ES = 0;
  363.   if (RI)                                        //如果接收完成則進入
  364.   {
  365.     ch = SBUF;
  366.     if (ch == 'R')  //如果收到字符'



  367. ,便開始接收
  368.     {
  369.       rev_start = 1;
  370.       rev_stop  = 0;                  //接收停止標志
  371.     }
  372.     if (rev_start == 1)       //標志位為1,開始接收
  373.     {
  374.       buf[num++] = ch;  //字符存到數組中
  375.       if (ch == '.')       //如果接收到換行
  376.       {
  377.         buf[num] = '\n';
  378.         rev_start = 0;
  379.         rev_stop  = 1;          //接收停止標志
  380.         num = 0;
  381.       }
  382.     }
  383.   }
  384.   RI = 0;         //RI清0,重新接收
  385.   ES = 1;         //串口1中斷允許                       
  386. }
  387. /******************************************************************************************
  388. *函數名稱:Timer2
  389. *功能描述:定時刷新顯示
  390. ******************************************************************************************/
  391. void Timer2() interrupt 5                                //2mS                          //用于刷新數碼管的顯示
  392. {
  393.   TF2=0;          //定時器2必須由軟件對溢出標志位清零,硬件不能清零,這里與定時器0和定時器1不同!!!
  394.   switch(set)
  395.   {
  396.   case 0:
  397.     Display(hour,min,sec);
  398.     LED1=0;
  399.     LED2=0;
  400.     break;
  401.   case 1:
  402.     Display(hour,0xaa,0xaa);
  403.     LED1=0;
  404.     LED2=1;
  405.     break;
  406.   case 2:
  407.     Display(0xaa, min,0xaa);
  408.     break;
  409.   case 3:
  410.     Display(0xaa, 0xaa,sec);
  411.     LED1=1;
  412.     LED2=0;
  413.     break;
  414.   }
  415.   cnt++;
  416. }
復制代碼




回復

使用道具 舉報

7#
ID:637324 發表于 2020-4-27 09:24 | 只看該作者

謝謝!
回復

使用道具 舉報

8#
ID:762924 發表于 2020-6-1 15:40 | 只看該作者

老哥,那個電路圖有嗎,樓主的文件打不開(閃退)
回復

使用道具 舉報

9#
ID:771461 發表于 2020-6-6 21:25 | 只看該作者
很有幫助,很需要這個資料的內容進行學習。
回復

使用道具 舉報

10#
ID:653173 發表于 2020-8-13 10:01 | 只看該作者
樓主能否分享一個Proteus8.5能用的key?
回復

使用道具 舉報

11#
ID:889564 發表于 2021-3-8 15:17 | 只看該作者
沒有VGPS這個元件啊
回復

使用道具 舉報

12#
ID:611269 發表于 2021-8-7 21:33 | 只看該作者
非門是干啥的呀,沒搞懂
回復

使用道具 舉報

13#
ID:51443 發表于 2021-9-8 17:22 | 只看該作者
有個疑問,一旦接收到GPS信號,就把時間寫入DS1302中,這樣不停的寫入,DS1302中儲存器的寫入次數壽命到底能撐多久?
回復

使用道具 舉報

14#
ID:317629 發表于 2023-10-3 10:50 | 只看該作者
非常好的東西,非常有幫助
回復

使用道具 舉報

15#
ID:76044 發表于 2024-6-8 17:26 | 只看該作者
樓主,能不能幫個忙,如何把GPS接收的時間寫入DS1302,這個我一直沒有搞定,其他的都可以正常使用了,感覺是制式不同不能直接寫,最好是匯編的,本人只會匯編,幫個忙,謝謝了
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品免费视频 | 久久久精品久久久 | 亚洲精选一区二区 | 欧美啊v在线观看 | 中文字幕精品视频 | 在线观看的av| 国产精品美女一区二区 | 亚洲一区在线观看视频 | 伊人久久大香线 | 在线观看成年人视频 | 毛片1| 久久国产精品网站 | 成人深夜福利 | 欧美激情综合色综合啪啪五月 | 日韩欧美一区二区在线播放 | 日韩成人性视频 | 国产 日韩 欧美 制服 另类 | 成人三区 | 久久久新视频 | 亚洲喷水 | 色综合九九 | 色综合国产 | 成人中文字幕在线 | 日本中文字幕日韩精品免费 | 欧美日韩在线观看一区 | 一本大道久久a久久精二百 国产成人免费在线 | 自拍偷拍第一页 | 天天操天天干天天爽 | 中文字幕在线一区 | 国产精彩视频 | 国内自拍偷拍 | h视频在线免费 | 99久久免费观看 | 综合久久亚洲 | 一区二区欧美在线 | 日韩欧美在线不卡 | 婷婷色成人 | 作爱视频免费看 | 日韩久久中文字幕 | 91日韩在线 | 午夜国产羞羞视频免费网站 |