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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機DS1302時鐘程序分段式編寫,調試良好

[復制鏈接]
跳轉到指定樓層
樓主
ID:1009788 發表于 2022-5-1 22:34 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
單片機源程序如下:
  1. /*-----------------------------------------------
  2.   名稱:DS1302時鐘數碼管顯示 串口更新
  3.   內容:DS1302實時時鐘數碼管顯示,時間和日期切換顯示 按下按鍵,循環切換
  4.         時間格式xx-xx-xx
  5.                 日期格式xx-xx-xx
  6.                 周秒格式-x-   xx
  7.                 開發板使用12M晶振,通過dofly自帶的串口調試軟件,打開串口,波特率默認2400,點擊更新時間即可,如果不行,按下開發板復位重新更新
  8. ------------------------------------------------*/
  9. #include<reg52.h> //包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義
  10. #include "ds1302.h"

  11. #define KeyPort P3 //定義按鍵端口

  12. #define DataPort P0 //定義數據端口 程序中遇到DataPort 則用P0 替換

  13. sbit LATCH1=P2^2;//定義鎖存使能端口 段鎖存
  14. sbit LATCH2=P2^3;//                 位鎖存

  15. bit ReadTimeFlag;//定義讀時間標志
  16. bit SetFlag;     //更新時間標志位
  17. unsigned char time_buf2[16];

  18. unsigned char code dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 顯示段碼值0~9
  19. unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分別對應相應的數碼管點亮,即位碼
  20. unsigned char TempData[5]; //存儲顯示值的全局變量

  21. void DelayUs2x(unsigned char t);//us級延時函數聲明
  22. void DelayMs(unsigned char t); //ms級延時
  23. void Display(unsigned char FirstBit,unsigned char Num);//數碼管顯示函數
  24. unsigned char KeyScan(void);//鍵盤掃描
  25. void Init_Timer0(void);//定時器初始化
  26. void UART_Init(void);
  27. /*------------------------------------------------
  28.                     主函數
  29. ------------------------------------------------*/
  30. void main (void)
  31. {
  32. unsigned char i,num,displaynum;                  

  33. Init_Timer0();
  34. Ds1302_Init();
  35. UART_Init();
  36. while (1)         //主循環
  37.   {


  38. if(SetFlag)     //如果接收到串口信息則更新時鐘
  39.   {
  40.         for(i=0;i<8;i++)
  41.                 {
  42.                 time_buf1[i]=time_buf2[2*i]*10+time_buf2[2*i+1];
  43.                 }//數據整合,如2個數 1和5整合成15
  44.                 Ds1302_Write_Time();
  45.                 SetFlag=0;       //時鐘信息更新后標志位清零
  46.    }

  47. num=KeyScan();
  48. if(num==5)
  49.   {
  50.    displaynum++;
  51.    if(displaynum==3)
  52.       displaynum=0;
  53.   }
  54. if(ReadTimeFlag==1)
  55. {
  56.   ReadTimeFlag=0;
  57.   Ds1302_Read_Time();
  58. if(displaynum==0) //顯示時間
  59. {
  60. TempData[0]=dofly_DuanMa[time_buf1[4]/10];//時                        //數據的轉換,因我們采用數碼管0~9的顯示,將數據分開
  61. TempData[1]=dofly_DuanMa[time_buf1[4]%10];       
  62. TempData[2]=0x40;        //加入"-"
  63. TempData[3]=dofly_DuanMa[time_buf1[5]/10];//分
  64. TempData[4]=dofly_DuanMa[time_buf1[5]%10];

  65. }
  66. else if(displaynum==1)//顯示日期
  67. {

  68. TempData[0]=dofly_DuanMa[time_buf1[2]/10];//月
  69. TempData[1]=dofly_DuanMa[time_buf1[2]%10];
  70. TempData[2]=0x40;        //加入"-"
  71. TempData[3]=dofly_DuanMa[time_buf1[3]/10];//日
  72. TempData[4]=dofly_DuanMa[time_buf1[3]%10];       
  73. }
  74. else if(displaynum==2)//顯示周  秒
  75. {
  76. TempData[0]=0x40;                                //數據的轉換,因我們采用數碼管0~9的顯示,將數據分開
  77. TempData[1]=dofly_DuanMa[time_buf1[7]%10];//周
  78. TempData[2]=0x40;        //加入"-"

  79. TempData[3]=dofly_DuanMa[time_buf1[6]/10];//秒
  80. TempData[4]=dofly_DuanMa[time_buf1[6]%10];       
  81. }
  82. }       
  83. }
  84. }
  85. /*------------------------------------------------
  86.               串口通訊初始化
  87. ------------------------------------------------*/
  88. void UART_Init(void)
  89. {
  90.     SCON  = 0x50;                        // SCON: 模式 1, 8-bit UART, 使能接收  
  91.     TMOD |= 0x20;               // TMOD: timer 1, mode 2, 8-bit 重裝
  92.     TH1   = 0xF3;               // TH1:  重裝值 2400 波特率 晶振 12MHz  
  93.     TR1   = 1;                  // TR1:  timer 1 打開                        
  94.     EA    = 1;                  //打開總中斷
  95.     ES    = 1;                  //打開串口中斷
  96. }
  97. /*------------------------------------------------
  98. uS延時函數,含有輸入參數 unsigned char t,無返回值
  99. unsigned char 是定義無符號字符變量,其值的范圍是
  100. 0~255 這里使用晶振12M,精確延時請使用匯編,大致延時
  101. 長度如下 T=tx2+5 uS
  102. ------------------------------------------------*/
  103. void DelayUs2x(unsigned char t)
  104. {   
  105. while(--t);
  106. }
  107. /*------------------------------------------------
  108. mS延時函數,含有輸入參數 unsigned char t,無返回值
  109. unsigned char 是定義無符號字符變量,其值的范圍是
  110. 0~255 這里使用晶振12M,精確延時請使用匯編
  111. ------------------------------------------------*/
  112. void DelayMs(unsigned char t)
  113. {
  114.      
  115. while(t--)
  116. {
  117.      //大致延時1mS
  118.      DelayUs2x(245);
  119.          DelayUs2x(245);
  120. }
  121. }
  122. /*------------------------------------------------
  123. 顯示函數,用于動態掃描數碼管
  124. 輸入參數 FirstBit 表示需要顯示的第一位,如賦值2表示從第三個數碼管開始顯示
  125. 如輸入0表示從第一個顯示。
  126. Num表示需要顯示的位數,如需要顯示99兩位數值則該值輸入2
  127. ------------------------------------------------*/
  128. void Display(unsigned char FirstBit,unsigned char Num)
  129. {
  130.       static unsigned char i=0;
  131.           

  132.            DataPort=0;   //清空數據,防止有交替重影
  133.        LATCH1=1;     //段鎖存
  134.        LATCH1=0;

  135.        DataPort=dofly_WeiMa[i+FirstBit]; //取位碼
  136.        LATCH2=1;     //位鎖存
  137.        LATCH2=0;

  138.        DataPort=TempData[i]; //取顯示數據,段碼
  139.        LATCH1=1;     //段鎖存
  140.        LATCH1=0;
  141.       
  142.            i++;
  143.        if(i==Num)
  144.               i=0;


  145. }
  146. /*------------------------------------------------
  147.                     定時器初始化子程序
  148. ------------------------------------------------*/
  149. void Init_Timer0(void)
  150. {
  151. TMOD |= 0x01;          //使用模式1,16位定時器,使用"|"符號可以在使用多個定時器時不受影響                     
  152. //TH0=0x00;              //給定初值
  153. //TL0=0x00;
  154. EA=1;            //總中斷打開
  155. ET0=1;           //定時器中斷打開
  156. TR0=1;           //定時器開關打開
  157. }
  158. /*------------------------------------------------
  159.                  定時器中斷子程序
  160. ------------------------------------------------*/
  161. void Timer0_isr(void) interrupt 1
  162. {
  163. static unsigned int num;
  164. TH0=(65536-2000)/256;                  //重新賦值 2ms
  165. TL0=(65536-2000)%256;

  166. Display(0,5);       // 調用數碼管掃描
  167. num++;
  168. if(num==50)        //大致100ms
  169.    {
  170.     num=0;
  171.     ReadTimeFlag=1; //讀標志位置1
  172.         }
  173. }

  174. /*------------------------------------------------
  175. 按鍵掃描函數,返回掃描鍵值
  176. ------------------------------------------------*/
  177. unsigned char KeyScan(void)
  178. {
  179. unsigned char keyvalue;
  180. if(KeyPort!=0xff)
  181.    {
  182.     DelayMs(10);
  183.     if(KeyPort!=0xff)
  184.            {
  185.             keyvalue=KeyPort;
  186.             while(KeyPort!=0xff);
  187.                 switch(keyvalue)
  188.                 {
  189.                  case 0xfe:return 1;break;
  190.                  case 0xfd:return 2;break;
  191.                  case 0xfb:return 3;break;
  192.                  case 0xf7:return 4;break;
  193.                  case 0xef:return 5;break;
  194.                  case 0xdf:return 6;break;
  195.                  case 0xbf:return 7;break;
  196.                  case 0x7f:return 8;break;
  197.                  default:return 0;break;
  198.                 }
  199.           }
  200.    }
  201.    return 0;
  202. }
  203. /*------------------------------------------------
  204.                   串口中斷程序
  205. ------------------------------------------------*/
  206. void UART_SER (void) interrupt 4 //串行中斷服務程序
  207. {
  208.     unsigned char Temp;          //定義臨時變量
  209.     unsigned char i;
  210.     if(RI)                        //判斷是接收中斷產生
  211.      {
  212.           RI=0;                      //標志位清零
  213.           Temp=SBUF;                 //讀入緩沖區的值
  214.           time_buf2[i]=Temp&0x0F;
  215.           i++;
  216.           if(i==16)                  //連續接收16個字符信息
  217.            {
  218.             i=0;
  219.                 SetFlag=1;               //接收完成標志位置1
  220.            }
  221.       SBUF=Temp; //把接收到的值再發回電腦端
  222.          }
  223.    if(TI)  //如果是發送標志位,清零
  224.      TI=0;
  225. }
復制代碼
Keil2代碼下載:
Keil2代碼只能用Keil2打開.7z (17.95 KB, 下載次數: 49)


評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:278457 發表于 2022-5-4 03:47 | 只看該作者
程序很好,有清晰的思路,模塊編程
回復

使用道具 舉報

板凳
ID:336378 發表于 2022-5-4 10:09 | 只看該作者
一個字,牛。 模塊化的編程思路。
回復

使用道具 舉報

地板
ID:645485 發表于 2022-5-27 00:00 | 只看該作者
很標準的編寫,閱讀性也強,多謝樓主的分享!
但我有一個問題想問一下,沒有用LCD1602顯示,作者用的是數碼管,用的是幾位數碼管?數碼管和單片機的管腳是怎樣連接的?還望指教!多謝了!
回復

使用道具 舉報

5#
ID:645485 發表于 2022-5-27 00:07 | 只看該作者
分析你程序,位碼是8位的話,然后通過按鍵切換時間和日期,并在數碼管顯示。這樣來看的話,顯示的時候中間是沒有間隔的,數字是連續的,是這樣嗎?請幫我解釋一下,謝謝!
回復

使用道具 舉報

6#
ID:645485 發表于 2022-5-27 00:20 | 只看該作者
我是一名初學者,說的不對的地方,還請樓主多擔待!
回復

使用道具 舉報

7#
ID:1009788 發表于 2022-9-25 14:09 | 只看該作者
tongguan123 發表于 2022-5-27 00:07
分析你程序,位碼是8位的話,然后通過按鍵切換時間和日期,并在數碼管顯示。這樣來看的話,顯示的時候中間 ...

顯示是不連續的,但頻率超過人眼識別頻率了,所以看起來是一秒動一下
回復

使用道具 舉報

8#
ID:19006 發表于 2023-2-5 09:45 | 只看該作者
有參考電路圖嗎?
回復

使用道具 舉報

9#
ID:19006 發表于 2023-2-5 09:46 | 只看該作者
3910 發表于 2022-9-25 14:09
顯示是不連續的,但頻率超過人眼識別頻率了,所以看起來是一秒動一下

有原理圖嗎?電路如何連接的?
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 婷婷色国产偷v国产偷v小说 | 日韩精品一区二区三区在线播放 | 91亚洲一区 | 天堂va在线观看 | 欧美一级在线视频 | 在线观看中文字幕 | 91久久久久久久久久久久久 | 久久久久99 | 一区二区在线看 | 亚洲国产成人精品女人久久久 | 日韩精品视频一区二区三区 | 日本一区二区高清不卡 | 久久se精品一区精品二区 | 搞av.com| 日韩视频在线观看一区二区 | 亚洲日韩中文字幕一区 | 欧美中文字幕在线观看 | 国产精华一区 | 99精品国产成人一区二区 | 91精品国产欧美一区二区 | 日本不卡免费新一二三区 | 国产欧美视频一区二区三区 | 国产精品成人69xxx免费视频 | 国产在线播放av | 神马福利 | 日韩国产三区 | 夜夜干夜夜操 | 盗摄精品av一区二区三区 | 狠狠的日 | 国产精品精品视频一区二区三区 | 九色网址 | 亚洲精品一区二区三区中文字幕 | 国产一区高清 | 九九热九九 | 国产精品亚洲一区二区三区在线观看 | 奇米av | 国产高清在线精品 | 亚洲福利在线观看 | 在线观看国产视频 | 一级高清免费毛片 | 久久成人精品 |