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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

我用單片機+TM1638做的時鐘程序有問題希望大師指點

[復制鏈接]
跳轉到指定樓層
樓主
ID:39720 發表于 2023-2-11 14:39 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
  1. #include        <reg52.h>
  2. #include        <tm1638.h>
  3. #include <ds1302.h>
  4. void main(void)
  5. {
  6.         unsigned char i;        
  7.         init_TM1638();        //初始化TM1638
  8.         Ds1302Init();
  9.         for(i=0;i<8;i++)
  10.         Write_DATA(i<<1,tab[16]);                       //初始化寄存器        
  11.         while(1)
  12.         {
  13.                 Ds1302ReadTime();
  14.                 i=Read_key();                //讀按鍵值
  15.                
  16.                 switch(i)
  17.          {
  18.                         case 0:if(i==0)
  19.                                                  {        
  20.                                                                 temp=4567;                        
  21.                                                                 while(Read_key()==i);                       //等待按鍵釋放
  22.                                                                 Write_allLED(1);  //八只LED燈
  23.                                                                 Display();
  24.                                                                 Write_DATA(0*2,tab[1]);
  25.                                                                 Write_DATA(1*2,tab[12]);        
  26.                                                         } break;
  27.       case 1:if(i==1)
  28.                                                         {
  29.                                                                 while(Read_key()==i);
  30.                                                                 Write_allLED(2);
  31.                                                                 TimDisplay();
  32.                                                         } break;
  33.                         case 2:if(i==2)
  34.                                                         {        
  35.                                                                 while(Read_key()==i);
  36.                                                                 Write_allLED(3);
  37.                                                                 for(i=0;i<8;i++)
  38.                                                                 Write_DATA(i<<1,tab[16]);                                                        
  39.                                                         } break;        
  40.                                                         default:break;
  41.          }
  42.                
  43.                         
  44.          
  45.                
  46.         }
  47. }
  48. ds1302.c
  49. #include"ds1302.h"

  50. //---DS1302寫入和讀取時分秒的地址命令---//
  51. //---秒分時日月周年 最低位讀寫位;-------//
  52. uchar code READ_RTC_ADDR[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d};
  53. uchar code WRITE_RTC_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};

  54. //---DS1302時鐘初始化2013年1月1日星期二12點00分00秒。---//
  55. //---存儲順序是秒分時日月周年,存儲格式是用BCD碼---//
  56. uchar TIME[7] = {0, 0, 0x12, 0x01, 0x01, 0x02, 0x13};

  57. /*******************************************************************************
  58. * 函 數 名         : Ds1302Write
  59. * 函數功能                   : 向DS1302命令(地址+數據)
  60. * 輸    入         : addr,dat
  61. * 輸    出         : 無
  62. *******************************************************************************/

  63. void Ds1302Write(uchar addr, uchar dat)
  64. {
  65.         uchar n;
  66.         RST = 0;
  67.         _nop_();

  68.         SCLK = 0;//先將SCLK置低電平。
  69.         _nop_();
  70.         RST = 1; //然后將RST(CE)置高電平。
  71.         _nop_();

  72.         for (n=0; n<8; n++)//開始傳送八位地址命令
  73.         {
  74.                 DSIO = addr & 0x01;//數據從低位開始傳送
  75.                 addr >>= 1;
  76.                 SCLK = 1;//數據在上升沿時,DS1302讀取數據
  77.                 _nop_();
  78.                 SCLK = 0;
  79.                 _nop_();
  80.         }
  81.         for (n=0; n<8; n++)//寫入8位數據
  82.         {
  83.                 DSIO = dat & 0x01;
  84.                 dat >>= 1;
  85.                 SCLK = 1;//數據在上升沿時,DS1302讀取數據
  86.                 _nop_();
  87.                 SCLK = 0;
  88.                 _nop_();        
  89.         }        
  90.                  
  91.         RST = 0;//傳送數據結束
  92.         _nop_();
  93. }

  94. /*******************************************************************************
  95. * 函 數 名         : Ds1302Read
  96. * 函數功能                   : 讀取一個地址的數據
  97. * 輸    入         : addr
  98. * 輸    出         : dat
  99. *******************************************************************************/

  100. uchar Ds1302Read(uchar addr)
  101. {
  102.         uchar n,dat,dat1;
  103.         RST = 0;
  104.         _nop_();

  105.         SCLK = 0;//先將SCLK置低電平。
  106.         _nop_();
  107.         RST = 1;//然后將RST(CE)置高電平。
  108.         _nop_();

  109.         for(n=0; n<8; n++)//開始傳送八位地址命令
  110.         {
  111.                 DSIO = addr & 0x01;//數據從低位開始傳送
  112.                 addr >>= 1;
  113.                 SCLK = 1;//數據在上升沿時,DS1302讀取數據
  114.                 _nop_();
  115.                 SCLK = 0;//DS1302下降沿時,放置數據
  116.                 _nop_();
  117.         }
  118.         _nop_();
  119.         for(n=0; n<8; n++)//讀取8位數據
  120.         {
  121.                 dat1 = DSIO;//從最低位開始接收
  122.                 dat = (dat>>1) | (dat1<<7);
  123.                 SCLK = 1;
  124.                 _nop_();
  125.                 SCLK = 0;//DS1302下降沿時,放置數據
  126.                 _nop_();
  127.         }

  128.         RST = 0;
  129.         _nop_();        //以下為DS1302復位的穩定時間,必須的。
  130.         SCLK = 1;
  131.         _nop_();
  132.         DSIO = 0;
  133.         _nop_();
  134.         DSIO = 1;
  135.         _nop_();
  136.         return dat;        
  137. }

  138. /*******************************************************************************
  139. * 函 數 名         : Ds1302Init
  140. * 函數功能                   : 初始化DS1302.
  141. * 輸    入         : 無
  142. * 輸    出         : 無
  143. *******************************************************************************/

  144. void Ds1302Init()
  145. {
  146.         uchar n;
  147.         Ds1302Write(0x8E,0X00);                 //禁止寫保護,就是關閉寫保護功能
  148.         for (n=0; n<7; n++)//寫入7個字節的時鐘信號:分秒時日月周年
  149.         {
  150.                 Ds1302Write(WRITE_RTC_ADDR[n],TIME[n]);        
  151.         }
  152.         Ds1302Write(0x8E,0x80);                 //打開寫保護功能
  153. }

  154. /*******************************************************************************
  155. * 函 數 名         : Ds1302ReadTime
  156. * 函數功能                   : 讀取時鐘信息
  157. * 輸    入         : 無
  158. * 輸    出         : 無
  159. *******************************************************************************/

  160. void Ds1302ReadTime()
  161. {
  162.         uchar n;
  163.         for (n=0; n<7; n++)//讀取7個字節的時鐘信號:分秒時日月周年
  164.         {
  165.                 TIME[n] = Ds1302Read(READ_RTC_ADDR[n]);
  166.         }
  167.                
  168. }
  169. ds1302.h
  170. #ifndef __DS1302_H_
  171. #define __DS1302_H_

  172. //---包含頭文件---//
  173. #include<reg52.h>
  174. #include<intrins.h>

  175. //---重定義關鍵詞---//
  176. #ifndef uchar
  177. #define uchar unsigned char
  178. #endif

  179. #ifndef uint
  180. #define uint unsigned int
  181. #endif

  182. //---定義ds1302使用的IO口---//
  183. sbit DSIO=P3^4;
  184. sbit RST=P3^5;
  185. sbit SCLK=P3^6;

  186. //---定義全局函數---//
  187. void Ds1302Write(uchar addr, uchar dat);
  188. uchar Ds1302Read(uchar addr);
  189. void Ds1302Init();
  190. void Ds1302ReadTime();

  191. //---加入全局變量--//
  192. extern uchar TIME[7];        //加入全局變量

  193. #endif
  194. tm1638.h
  195. #ifndef        _TM1638_H
  196. #define        _TM1638_H

  197. #include        <reg52.h>
  198. #include <ds1302.h>
  199. #define        DATA_COMMAND        0X40
  200. #define        DISP_COMMAND        0x80
  201. #define        ADDR_COMMAND        0XC0

  202. //TM1638模塊引腳定義
  203. sbit        DIO=P2^0;
  204. sbit        CLK=P2^1;
  205. sbit        STB=P2^2;
  206. unsigned char num[8];                //各個數碼管顯示的值
  207. unsigned int temp;
  208. //共陰數碼管顯示代碼
  209. unsigned char code tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,
  210.                           0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x00,0x40};


  211. void TM1638_Write(unsigned char        DATA)                        //寫數據函數
  212. {
  213.         unsigned char i;
  214.         for(i=0;i<8;i++)
  215.         {
  216.                 CLK=0;
  217.                 if(DATA&0X01)
  218.                         DIO=1;
  219.                 else
  220.                         DIO=0;
  221.                 DATA>>=1;
  222.                 CLK=1;
  223.         }
  224. }
  225. unsigned char TM1638_Read(void)                                        //讀數據函數
  226. {
  227.         unsigned char i;
  228.         unsigned char temp=0;
  229.         DIO=1;        //設置為輸入
  230.         for(i=0;i<8;i++)
  231.         {
  232.                 temp>>=1;
  233.                 CLK=0;
  234.                 if(DIO)
  235.                         temp|=0x80;
  236.                 CLK=1;
  237.         }
  238.         return temp;
  239. }
  240. void Write_COM(unsigned char cmd)                //發送命令字
  241. {
  242.         STB=0;
  243.         TM1638_Write(cmd);
  244.         STB=1;
  245. }
  246. unsigned char Read_key(void)
  247. {
  248.         unsigned char c[4],i,key_value=0;
  249.         STB=0;
  250.         TM1638_Write(0x42);                           //讀鍵掃數據 命令
  251.         for(i=0;i<4;i++)               
  252.                 c[i]=TM1638_Read();
  253.         STB=1;                                                   //4個字節數據合成一個字節
  254.         for(i=0;i<4;i++)
  255.                 key_value|=c[i]<<i;
  256.         for(i=0;i<8;i++)
  257.                 if((0x01<<i)==key_value)
  258.                         break;
  259.         return i;
  260. }
  261. void Write_DATA(unsigned char add,unsigned char DATA)                //指定地址寫入數據
  262. {
  263.         Write_COM(0x44);
  264.         STB=0;
  265.         TM1638_Write(0xc0|add);
  266.         TM1638_Write(DATA);
  267.         STB=1;
  268. }
  269. void Display()
  270. {
  271.         
  272.         num[0] = temp % 10000 / 1000;
  273.         num[1] = temp % 1000 / 100;
  274.         num[2] = temp % 100 / 10;
  275.         num[3] = temp % 10;
  276.         Write_DATA(4*2,tab[num[0]]);
  277.         Write_DATA(5*2,tab[num[1]]|0x80);
  278.         Write_DATA(6*2,tab[num[2]]);
  279.         Write_DATA(7*2,tab[num[3]]);        
  280. }
  281. void TimDisplay()
  282. {        
  283.         Write_DATA( 0*2,tab[num[TIME[0]/16]]);
  284.         Write_DATA( 1*2,tab[num[TIME[0]%16]]);
  285.         Write_DATA( 2*2,tab[17]);
  286.         Write_DATA( 3*2,tab[num[TIME[1]/16]]);
  287.         Write_DATA( 4*2,tab[num[TIME[1]%16]]);
  288.         Write_DATA( 5*2,tab[17]);
  289.         Write_DATA( 6*2,tab[num[TIME[2]/16]]);
  290.         Write_DATA( 7*2,tab[num[TIME[2]%16]]);
  291.         /*LcdWriteData('0'+TIME[2]/16);                                //時
  292.         LcdWriteData('0'+(TIME[2]&0x0f));                                 
  293.         LcdWriteData('-');
  294.         LcdWriteData('0'+TIME[1]/16);                                //分
  295.         LcdWriteData('0'+(TIME[1]&0x0f));        
  296.         LcdWriteData('-');
  297.         LcdWriteData('0'+TIME[0]/16);                                //秒
  298.         LcdWriteData('0'+(TIME[0]&0x0f));

  299.         LcdWriteCom(0x80);
  300.         LcdWriteData('2');
  301.         LcdWriteData('0');
  302.         LcdWriteData('0'+TIME[6]/16);                        //年
  303.         LcdWriteData('0'+(TIME[6]&0x0f));
  304.         LcdWriteData('-');
  305.         LcdWriteData('0'+TIME[4]/16);                        //月
  306.         LcdWriteData('0'+(TIME[4]&0x0f));
  307.         LcdWriteData('-');
  308.         LcdWriteData('0'+TIME[3]/16);                        //日
  309.         LcdWriteData('0'+(TIME[3]&0x0f));
  310.         LcdWriteCom(0x8D);
  311.         LcdWriteData('0'+(TIME[5]&0x07));        //星期        */                 
  312. }

  313. /*
  314. void Write_oneLED(unsigned char num,unsigned char flag)        //單獨控制一個LED函數,num為需要控制的led序號,flag為0時熄滅,不為0時點亮
  315. {
  316.         if(flag)
  317.                 Write_DATA(2*num+1,1);
  318.         else
  319.                 Write_DATA(2*num+1,0);
  320. }          */
  321. void Write_allLED(unsigned char LED_flag)                                        //控制全部LED函數,LED_flag表示各個LED狀態
  322. {
  323.         unsigned char i;
  324.         for(i=0;i<8;i++)
  325.                 {
  326.                         if(LED_flag&(1<<i))
  327.                                 //Write_DATA(2*i+1,3);
  328.                                 Write_DATA(2*i+1,1);
  329.                         else
  330.                                 Write_DATA(2*i+1,0);
  331.                 }
  332. }


  333. //TM1638初始化函數
  334. void init_TM1638(void)
  335. {
  336.         unsigned char i;
  337.         Write_COM(0x8b);       //亮度 (0x88-0x8f)8級亮度可調
  338.         Write_COM(0x40);       //采用地址自動加1
  339.         STB=0;                           //
  340.         TM1638_Write(0xc0);    //設置起始地址

  341.         for(i=0;i<16;i++)           //傳送16個字節的數據
  342.                 TM1638_Write(0x00);
  343.         STB=1;
  344. }
  345. #endif

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

使用道具 舉報

沙發
ID:748788 發表于 2023-2-11 17:31 | 只看該作者
問題在哪?如果是1638有問題,就先解決1638的問題,不要考慮1302
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 狠狠婷婷综合久久久久久妖精 | 男女一区二区三区 | 国产a区| 日韩aⅴ视频 | 男人天堂网址 | 精品中文字幕视频 | a级片在线观看 | 午夜影晥 | 午夜视频大全 | 日韩一区二区三区在线视频 | 韩国成人在线视频 | 精品欧美一区二区久久久伦 | 欧美三级电影在线播放 | 中文字幕一二三 | 亚洲精品一区二区另类图片 | 久久久一区二区三区四区 | 成人免费毛片在线观看 | 国产小视频在线看 | 男人天堂网址 | 亚洲精品播放 | 少妇精品久久久久久久久久 | 视频一二区 | 国产91丝袜在线播放 | 亚洲一区二区三区四区视频 | 国产精品成人在线 | 成年人免费网站 | 久久99精品久久久久久国产越南 | 久久精品国产99国产精品 | 天堂一区二区三区 | 麻豆久久久 | 91影库| 欧美 日韩 综合 | 国产视频在线一区二区 | 午夜免费网站 | 久久成人精品 | 精品亚洲永久免费精品 | 日韩在线精品强乱中文字幕 | 欧美精品一区二区三区在线播放 | 国产综合精品一区二区三区 | 欧美日韩成人在线 | 在线视频 亚洲 |