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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

中斷方式顯示DS1302時鐘的問題,附單片機程序

[復制鏈接]
跳轉到指定樓層
樓主

  1. #include<reg52.h>  // 定義頭文件
  2. #include<intrins.h>        //定義函數文件

  3. unsigned char Sce,Min,Hour;//Sce秒,Min分,Hour時
  4. unsigned char y = 2; //定時器0中斷時間y 設置ms

  5. sbit wei = P2^7; //定義位選
  6. sbit du = P2^6;        //定義段選
  7. sbit TSCLK = P1^0;//DS1302 時鐘線  SCLK
  8. sbit TIO = P1^1; //DS1302 數據線   IO
  9. sbit TRST = P1^2;//DS1302 使能端   CE

  10. /*共陰級數碼管段選碼*/
  11. unsigned char code numdu_data[]= {
  12.                                                                         0x3F,  //"0"
  13.                                                                         0x06,  //"1"
  14.                                                                         0x5B,  //"2"
  15.                                                                         0x4F,  //"3"
  16.                                                                         0x66,  //"4"
  17.                                                                         0x6D,  //"5"
  18.                                                                         0x7D,  //"6"
  19.                                                                         0x07,  //"7"
  20.                                                                         0x7F,  //"8"
  21.                                                                         0x6F,   //"9"
  22.                                                                         0x77,  //"A"
  23.                                                                         0x7C,  //"B"
  24.                                                                         0x39,  //"C"
  25.                                                                         0x5E,  //"D"
  26.                                                                         0x79,  //"E"
  27.                                                                         0x71,  //"F"
  28.                                                                         0x76,  //"H"
  29.                                                                         0x38,  //"L"
  30.                                                                         0x37,  //"n"
  31.                                                                         0x3E,  //"u"
  32.                                                                         0x73,  //"P"
  33.                                                                         0x5C,  //"o"
  34.                                                                         0x40,  //"-"
  35.                                                              };

  36. /*共陰級數碼管位選碼*/
  37. unsigned char code numwei_data[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};

  38. /*共陰級數碼管顯示函數*/
  39. void display(Sce,Min,Hour)
  40. {
  41.         unsigned char Scege,Sceshi,Minge,Minshi,Hourge,Hourshi;
  42.         static unsigned char i;//靜態變量

  43.          Scege = Sce%10;//  12/10=1_2 取余2
  44.          Sceshi = Sce/10;// 12/10=1_2 取商1

  45.          Minge = Min%10;//  12/10=1_2 取余2
  46.          Minshi = Min/10;// 12/10=1_2 取商1

  47.          Hourge = Hour%10;// 12/10=1_2 取余2
  48.          Hourshi = Hour/10;// 12/10=1_2 取商1

  49.          

  50.          P0 = 0XFF;
  51.          wei = 1;//位選碼打開
  52.          P0 = numwei_data[i];
  53.          wei = 0;//鎖存位選碼

  54.          switch(i)
  55.          {
  56.          //        如果是0 段選打開 P0等于數組里面的值 鎖存段選 返回
  57.                  case 0: du = 1; P0 = numdu_data[Scege];   du = 0; break;
  58.                 case 1: du = 1; P0 = numdu_data[Sceshi];  du = 0; break;
  59.                 case 2: du = 1; P0 = numdu_data[22];      du = 0; break;
  60.                 case 3: du = 1; P0 = numdu_data[Minge];   du = 0; break;
  61.                 case 4: du = 1; P0 = numdu_data[Minshi];  du = 0; break;
  62.                 case 5: du = 1; P0 = numdu_data[22];      du = 0; break;
  63.                 case 6: du = 1; P0 = numdu_data[Hourge];  du = 0; break;
  64.                 case 7: du = 1; P0 = numdu_data[Hourshi]; du = 0; break;
  65.          }
  66.          i++; //i自加
  67.          if(i == 8)//因為numwei_data[]里面只有8個元素,所以只能加到8
  68.                  i = 0;//清零

  69. }
  70. /*定時器0中斷寄存器配置*/
  71. void Timer_0()
  72. {
  73.         TMOD = 0X01;//配置TMOD寄存器 定時器0在16位工作模式下
  74.         TH0 =((65535-921)*y)/256;//1ms 把初值放入高8位
  75.         TL0 =((65535-921)*y)%256;//1ms 把初值放入低8位
  76.         EA = 1;//總中斷打開
  77.         ET0 = 1;//TO溢出中斷允許位
  78.         TR0 = 1;//允許定時0開始計數        
  79. }
  80. /*定時器0溢出中斷函數*/
  81. void Timer0_init() interrupt 1
  82. {
  83.         TH0 =((65535-921)*y)/256;//1ms 把初值放入高8位
  84.         TL0 =((65535-921)*y)%256;//1ms 把初值放入低8位
  85.         display(Sce,Min,Hour);//共陰級數碼管顯示函數        
  86. }
  87. /*DS1302寫數據*/
  88. void DS1302_wirte_dat(unsigned char cmd,unsigned char dat)
  89. {
  90.         unsigned char i; //發送數據次數變量
  91.         
  92.         TRST = 0;//        CE 拉低使能端
  93.         TSCLK = 0;//SCLK 拉低時鐘線
  94.         TRST = 1;//CE 拉高使能端 產生上升沿 允許開始寫數據
  95.         for(i = 0; i < 8; i++) // 執行8次將8位字節的數據寫入
  96.         {
  97.                 TSCLK = 0; //SCLK 拉低時鐘線
  98.                 TIO = cmd & 0x01;//寫入一位數據 從最低位開始寫入
  99.                 TSCLK = 1;// TSCLK產生上升沿時執行寫入數據 數據被DS1302讀取
  100.                 cmd >>= 1;//右移一位
  101.         }
  102.         for(i = 0; i < 8; i++)//執行8次將8位字節的數據寫入
  103.         {
  104.                 TSCLK = 0;//SCLK 拉低時鐘線
  105.                 TIO = dat & 0x01;//寫入一位數據 從最低位開始寫入
  106.                 TSCLK = 1;// TSCLK產生上升沿時執行寫入數據 數據被DS1302讀取
  107.                 dat >>= 1;//右移一位
  108.         }
  109. }
  110. /*DS1302讀數據*/
  111. unsigned char DS1302_Read_dat(unsigned char cmd)
  112. {
  113.         unsigned char i,dat;//i發送數據次數變量 dat存放讀取數據的變量

  114.         TRST = 0;//        CE 拉低使能端
  115.         TSCLK = 0;//SCLK 拉低時鐘線
  116.         TRST = 1;//CE 拉高使能端 產生上升沿 允許開始寫數據
  117.         for(i = 0; i < 8; i++) // 執行8次將8位字節的數據寫入
  118.         {
  119.                 TSCLK = 0;        //SCLK 拉低時鐘線
  120.                 TIO = cmd & 0x01; //寫入一位數據 從最低位開始寫入
  121.                 TSCLK = 1;// TSCLK產生上升沿時執行寫入數據 數據被DS1302讀取
  122.                 cmd >>= 1; //右移一位
  123.         }
  124.         for(i = 0; i < 8; i++)// 執行8次將8位字節的數據寫入
  125.         {
  126.                 TSCLK = 0;//SCLK 拉低時鐘線
  127.                 dat >>= 1;//讀取數據變量dat右移一位
  128.                 if(TIO == 1) //如果TIO是高電平(為1)
  129.                         dat |= 0x80;//那么讀取數據變量dat或等于1000 0000
  130.                 TSCLK = 1;//將SCLK時鐘線拉高 準備下次通信
  131.         }
  132.         return dat;//得到的值返回
  133. }
  134. /*數據轉換成BCD碼 十進制轉換成BCD碼*/
  135. unsigned char Dat_Chg_BCD(unsigned char dat)
  136. {                                                                           //45
  137.         unsigned char dat1,dat2;
  138.         dat1 = dat / 10;// 45/10=4_5 取值4
  139.         dat2 = dat % 10;// 45/10=4_5 取值5
  140.         dat2 = dat2 + dat1 * 16;// 5+4*16=69
  141.         return dat2;//得到的值69返回
  142. }
  143. /*BCD碼轉換成數據 BCD碼轉換成十進制*/
  144. unsigned char BCD_Chg_Dat(unsigned char dat)
  145. {                                                                           //69
  146.         unsigned char dat1,dat2;
  147.         dat1 = dat /16;// 69/16 = 4_5取值4
  148.         dat2 = dat %16;// 69/16 = 4_5取值5
  149.         dat2 = dat2 + dat1 *10;//5+4*10=45
  150.         return dat2;//得到的值45返回
  151. }


  152. void main()
  153. {
  154.         Timer_0();//定時器0寄存器配初始化

  155.         DS1302_wirte_dat(0x8e,0);//關閉DS1302的寫保護 好方便往里面寫數據
  156.         DS1302_wirte_dat(0x80,Dat_Chg_BCD(30));//寫秒初始顯示時間  往DS1302里面需要轉換成BCD碼才能寫進去
  157.         DS1302_wirte_dat(0x82,Dat_Chg_BCD(15));//寫分初始顯示時間
  158.         DS1302_wirte_dat(0x84,Dat_Chg_BCD(12));//寫分初始顯示時間  
  159.         DS1302_wirte_dat(0x8e,0x80);//打開DS1302的寫保護 寫不進數據
  160.                                                                   
  161.         while(1)
  162.         {         
  163.                 DS1302_wirte_dat(0x8e,0);//關閉DS1302的寫保護 好方便往里面寫數據
  164.                 Sce = BCD_Chg_Dat(DS1302_Read_dat(81));//讀秒
  165.                 Min = BCD_Chg_Dat(DS1302_Read_dat(83));//讀分
  166.                 Hour = BCD_Chg_Dat(DS1302_Read_dat(85));//讀時
  167.                 DS1302_wirte_dat(0x8e,0x80);//打開DS1302的寫保護 寫不進數據        
  168.         
  169.                
  170.         }
  171.         
  172. }
復制代碼




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

使用道具 舉報

沙發
ID:205620 發表于 2021-11-4 22:46 | 只看該作者
數碼管只顯示,幾個零,也不走時,不明白,程序哪里出了問題
回復

使用道具 舉報

板凳
ID:205620 發表于 2021-11-4 23:03 | 只看該作者
找到問題了,寫讀取的函數的時候,寫的是十進制,前面忘記加0X了,
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩一区二区在线视频 | 国产精品99久 | 日本一区不卡 | av影音资源 | 国产亚洲精品久久19p | 狠狠视频| 久久51| 超碰免费在线 | 精品粉嫩aⅴ一区二区三区四区 | 一区二区日韩 | 成人国产精品久久久 | 欧美日本亚洲 | 日本亚洲精品成人欧美一区 | 亚洲精品一 | 中文字字幕一区二区三区四区五区 | 日本三级在线网站 | 亚洲国产一区二区三区 | 在线日韩 | 青青久久av北条麻妃海外网 | 亚洲综合色视频在线观看 | 久久aⅴ乱码一区二区三区 91综合网 | 亚洲免费人成在线视频观看 | 久久国产成人午夜av影院武则天 | 久久久久久久久久久成人 | 日韩成人影院在线观看 | 日韩精品在线观看网站 | 久久精品小视频 | 亚洲国产精品99久久久久久久久 | 亚洲一二三区不卡 | 91热爆在线观看 | 久久成人18免费网站 | 欧美日韩精品久久久免费观看 | www.精品国产| www.亚洲一区 | 日韩国产在线 | 亚洲伊人a | 欧洲精品视频一区 | 精品国产乱码久久久久久牛牛 | 在线视频日韩 | 国产精品日本一区二区不卡视频 | 国产精品日韩欧美一区二区三区 |