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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4256|回復(fù): 4
打印 上一主題 下一主題
收起左側(cè)

基于STC12C5604AD+TM1640+DS3231數(shù)碼管時鐘程序

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:39072 發(fā)表于 2022-3-24 10:13 | 只看該作者 |只看大圖 回帖獎勵 |倒序?yàn)g覽 |閱讀模式


單片機(jī)源程序如下:
  1. #include<reg52.h>
  2. #include<intrins.h>

  3. #define uchar unsigned char
  4. #define uint  unsigned int
  5. #define u8  uint8_t
  6. #define u16 uint16_t
  7. #define u32 uint32_t
  8. typedef unsigned char    uint8_t;
  9. typedef unsigned short   uint16_t;
  10. typedef unsigned long    uint32_t;
  11. #define DS3231_WriteAddress                0xD0   
  12. #define DS3231_ReadAddress                0xD1
  13. #define Delay(us) {_nop_();_nop_();_nop_();_nop_();}
  14. typedef struct
  15. {
  16.         u8        hour;
  17.         u8        min;
  18.         u8        sec;                       
  19.         u32 w_year;
  20.         u8  w_month;
  21.         u8  w_date;
  22.         u8  week;               
  23.         u8        temper_H;
  24.         u8        temper_L;
  25. }Calendar_OBJ;
  26. extern Calendar_OBJ calendar;        //日歷結(jié)構(gòu)體
  27. extern u8 const mon_table[12];        //月份日期數(shù)據(jù)表
  28. //*******GPIO 定義********************************************************
  29. sbit TM1640_DIN=P1^3; //TM1640數(shù)據(jù)線
  30. sbit TM1640_SCLK=P1^4; //TM1640時鐘線
  31. sbit SDA=P3^3; //IIC數(shù)據(jù)線
  32. sbit SCL=P3^4; //IIC時鐘線
  33. sbit SDA_read=P3^3;
  34. sbit SCL_read=P3^4;
  35. //************************************************************************************************
  36. #define TM1640MEDO_ADD  0x44         //地址模式的設(shè)置0x40自動加一模式 0x44固定地址模式
  37. #define TM1640MEDO_DISPLAY  0x8C     //設(shè)置亮度小:0x88 0x89 0x8a 0x8b 0x8c 0x8d 0x8f最大0x80關(guān)閉
  38. #define TM1640MEDO_DISPLAY_OFF  0x80  //宏定義 關(guān)亮度設(shè)置
  39. //**************************************************************************************************
  40. //功能:延時1毫秒 ,入口參數(shù):x  ,說明:當(dāng)晶振為12M時,j<112;當(dāng)晶振為11.0592M時,j<122*/
  41. //***************************************************************************************************
  42. void Delay_xms(uint x)
  43. {
  44.   uint i,j;
  45.   for(i=0;i<x;i++)
  46.     for(j=0;j<112;j++);
  47. }
  48. //功能:12us延時,STC89C52為1T單片機(jī),即1個時鐘/機(jī)器周期,速度為AT89C52的12倍
  49. void Delay_us(uint t)                                          
  50. {
  51.   for(;t>0;t--)
  52.    {
  53.          _nop_();
  54.    }
  55. }

  56. //*********TM1640驅(qū)動函數(shù)  START***************
  57. //功能:12us延時
  58. //***************************************************************************************
  59. //通信時序 啟始
  60. void TM1640_start()
  61.         {
  62.         TM1640_DIN=1;
  63.         TM1640_SCLK=1;
  64.         Delay_us(1);
  65.         TM1640_DIN=0;
  66.         Delay_us(1);
  67.         TM1640_SCLK=0;
  68.         Delay_us(1);
  69. }
  70. //通信時序 結(jié)束       
  71. void TM1640_stop()
  72.         {
  73.         TM1640_DIN=0;
  74.         TM1640_SCLK=1;
  75.         Delay_us(1);
  76.         TM1640_DIN=1;
  77.         Delay_us(1);
  78. }
  79. //寫數(shù)據(jù)       
  80. void TM1640_write(u8 date)
  81.         {       
  82.         u8 i;
  83.         u8 aa;
  84.         aa=date;
  85.         TM1640_DIN=0;
  86.         TM1640_SCLK=0;
  87.         for(i=0;i<8;i++){
  88.                 TM1640_SCLK=0;
  89.                 Delay_us(1);
  90.                 if(aa&0x01){
  91.                         TM1640_DIN=1;
  92.                         Delay_us(1);
  93.                 }else{
  94.                         TM1640_DIN=0;
  95.                         Delay_us(1);
  96.                 }
  97.                 TM1640_SCLK=1;
  98.                 Delay_us(1);
  99.                 aa=aa>>1;
  100.    }
  101.          TM1640_DIN=0;
  102.          TM1640_SCLK=0;
  103. }
  104. //TM1640接口初始化函數(shù)//TM1640設(shè)置
  105. void TM1640_Init(void)
  106.         {   
  107.           TM1640_start();
  108.           TM1640_write(TM1640MEDO_ADD); //設(shè)置工作模式
  109.           TM1640_stop();
  110.           TM1640_start();
  111.           TM1640_write(TM1640MEDO_DISPLAY);//設(shè)置顯示亮度
  112.           TM1640_stop();                                       
  113. }
  114. //固定地址模式的顯示輸出函數(shù)
  115. void TM1640_display(u8 address,u8 date)
  116.         {
  117.         const u8 buff[12]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x00};//數(shù)字0~9及”-“”無”顯示段碼表
  118.                  //--   0    1    2    3    4    5    6    7    8    9     -   無   
  119.    TM1640_start();
  120.    TM1640_write(0xc0+address);             //傳顯示數(shù)據(jù)對應(yīng)的地址,0-15位數(shù)碼管
  121.    TM1640_write(buff[date]);                                 //傳1BYTE顯示數(shù)據(jù),對應(yīng)顯示buff[12]數(shù)組0-11
  122.    TM1640_stop();
  123. }
  124. //**************************************tm1640函數(shù)*end***********************************
  125.   
  126. /**************************************IIC函數(shù)************************************  
  127. * 函數(shù)名: void I2C_delay(void)
  128. * 描述  : 短暫延時
  129. * 說明  : 內(nèi)部定義的i可以優(yōu)化速度,經(jīng)測試最低到5還能寫入
  130. ***************************************************************************/
  131. /*
  132. static void I2C_delay(void)  
  133. {     
  134.     u8 i=5;   
  135.     while(i)   
  136.     {   
  137.         i--;   
  138.     }   
  139. }
  140. */

  141. /**************************************************************************
  142. * 函數(shù)名: void I2C_Start(void)
  143. * 描述  : 起始信號
  144. ***************************************************************************/
  145. void I2C_Start(void)
  146. {
  147.         SCL=1;        Delay_us(5);
  148.         SDA=1;        Delay_us(5);
  149.         SDA=0;        Delay_us(5);
  150.         SCL=0;        Delay_us(5);
  151. }
  152. /**************************************************************************
  153. * 函數(shù)名: I2C_Stop(void)
  154. * 描述  : 終止信號
  155. ***************************************************************************/
  156. void I2C_Stop(void)
  157. {
  158.         SDA=0;        Delay_us(5);
  159.         SCL=1;        Delay_us(5);
  160.         SDA=1;        Delay_us(5);
  161. }
  162. /**************************************************************************
  163. * 函數(shù)名: void I2C_Ack(void)
  164. * 描述  : 應(yīng)答信號
  165. ***************************************************************************/
  166. void I2C_Ack(void)  
  167. {     
  168.     SCL=0;  Delay_us(5);
  169.     SDA=0;  Delay_us(5);  
  170.     SCL=1;  Delay_us(5);
  171.     SCL=0;  Delay_us(5);
  172. }
  173. /**************************************************************************
  174. * 函數(shù)名: void I2C_NoAck(void)
  175. * 描述  : 無應(yīng)答信號
  176. ***************************************************************************/
  177. void I2C_NoAck(void)  
  178. {     
  179.     SCL=0;  Delay_us(5);  
  180.     SDA=1;  Delay_us(5);  
  181.     SCL=1;  Delay_us(5);  
  182.     SCL=0;  Delay_us(5);
  183. }  
  184. /**************************************************************************
  185. * 函數(shù)名: u8 I2C_WaitAck(void)
  186. * 描述  : 等待應(yīng)答信號
  187. * 輸出  : TRUE : 有應(yīng)答  FALSE : 無應(yīng)答
  188. ***************************************************************************/
  189. u8 I2C_WaitAck(void)     
  190. {  
  191.         u8 ucErrTime=0;
  192.     SCL=0;  Delay_us(5);
  193.     SDA=1;  Delay_us(5);  
  194.     SCL=1;  Delay_us(5);  
  195.     while(SDA_read)  
  196.     {  
  197.         ucErrTime++;
  198.                 if(ucErrTime>250)
  199.                 {
  200.                         I2C_Stop();
  201.                         return 0;
  202.                 }
  203.     }  
  204.     SCL=0;  
  205.     return 1;  
  206. }  
  207. /**************************************************************************  
  208. * 函數(shù)名: void I2C_SendByte(u8 SendByte)  
  209. * 描述  : 發(fā)送一個字節(jié)
  210. * 輸入  : SendByte : 字節(jié)數(shù)據(jù) ,說明 : 數(shù)據(jù)從高位到低位
  211. ***************************************************************************/
  212. void I2C_SendByte(u8 SendByte)   
  213. {  
  214.     u8 i=8;  
  215.     while(i--)  
  216.     {  
  217.         SCL=0;  
  218.         Delay_us(5);
  219.                
  220.         if(SendByte & 0x80)  
  221.             SDA=1;   
  222.         else  
  223.             SDA=0;     
  224.         SendByte<<=1;  
  225.         Delay_us(5);
  226.                
  227.         SCL=1;  
  228.         Delay_us(3);  
  229.     }  
  230.     SCL=0;  
  231. }
  232. /**************************************************************************
  233. * 函數(shù)名: u8 I2C_ReceiveByte(void)  
  234. * 描述  : 讀取一個字節(jié)
  235. * 輸出  : 字節(jié)數(shù)據(jù)
  236. * 說明  : ReceiveByte : 數(shù)據(jù)從高位到低位
  237. ***************************************************************************/
  238. u8 I2C_ReceiveByte(void)   
  239. {   
  240.     u8 i=8;  
  241.     u8 ReceiveByte=0;  
  242.            
  243.     SDA=1;               
  244.     while(i--)  
  245.     {  
  246.         ReceiveByte<<=1;        
  247.         SCL=0;  
  248.         Delay_us(5);
  249.         SCL=1;
  250.         Delay_us(5);     
  251.         if(SDA_read)  
  252.         {  
  253.             ReceiveByte|=0x01;  
  254.         }  
  255.     }  
  256.     SCL=0;  
  257.     return ReceiveByte;  
  258. }
  259. //**************************IIC END*****************************************************************

  260. //****************ds3231函數(shù)*******************************************************************
  261. Calendar_OBJ calendar;
  262. //bcd轉(zhuǎn)hex
  263. u8 BCD2HEX(u8 val)
  264. {
  265.     u8 i;
  266.     i= val&0x0f;
  267.     val >>= 4;
  268.     val &= 0x0f;
  269.     val *= 10;
  270.     i += val;
  271.    
  272.     return i;
  273. }

  274. u16 B_BCD(u8 val)
  275. {
  276.         u8 i,j,k;
  277.         i=val/10;
  278.         j=val%10;
  279.         k=j+(i<<4);
  280.         return k;
  281. }

  282. void DS3231_WR_Byte(u8 addr,u8 bytedata)
  283. {
  284.         I2C_Start();
  285.         I2C_SendByte(DS3231_WriteAddress);
  286.         I2C_WaitAck();
  287.         I2C_SendByte(addr);
  288.         I2C_WaitAck();
  289.         I2C_SendByte(bytedata);
  290.         I2C_WaitAck();
  291.         I2C_Stop();
  292. }       

  293. u8 DS3231_RD_Byte(u8 addr)
  294. {
  295.         u8 Dat=0;
  296.           I2C_Start();
  297.         I2C_SendByte(DS3231_WriteAddress);
  298.         I2C_WaitAck();
  299.         I2C_SendByte(addr);
  300.         I2C_WaitAck();
  301.         I2C_Start();
  302.         I2C_SendByte(DS3231_ReadAddress);
  303.         I2C_WaitAck();
  304.         Dat=I2C_ReceiveByte();
  305.         I2C_Stop();
  306.         return Dat;
  307. }
  308. //ds3231初始化函數(shù)
  309. void DS3231_Init(void)
  310. {
  311.         //I2C_GPIO_Config();
  312.         DS3231_WR_Byte(0x0e,0);
  313.     DS3231_WR_Byte(0x0f,0x0);
  314. }

  315. //DS3231初始化設(shè)置函數(shù)( 年 月 日 時 分 秒 周)
  316. void Set_DS3231_Time(u8 yea,u8 mon,u8 da,u8 hou,u8 min,u8 sec,u8 week)
  317. {
  318.         u8 temp=0;
  319.           temp=B_BCD(yea);
  320.         DS3231_WR_Byte(0x06,temp);  
  321.         temp=B_BCD(mon);
  322.         DS3231_WR_Byte(0x05,temp);  
  323.         temp=B_BCD(da);
  324.         DS3231_WR_Byte(0x04,temp);
  325.         temp=B_BCD(hou);
  326.         DS3231_WR_Byte(0x02,temp);
  327.         temp=B_BCD(min);
  328.         DS3231_WR_Byte(0x01,temp);  
  329.         temp=B_BCD(sec);
  330.         DS3231_WR_Byte(0x00,temp);
  331.         temp=B_BCD(week);
  332.         DS3231_WR_Byte(0x03,temp);
  333. }
  334. void Get_DS3231_Time(void)
  335. {
  336.         calendar.w_year=DS3231_RD_Byte(0x06);  
  337.         calendar.w_year=BCD2HEX(calendar.w_year);
  338.         calendar.w_month=DS3231_RD_Byte(0x05);
  339.         calendar.w_month=BCD2HEX(calendar.w_month);
  340.         calendar.w_date=DS3231_RD_Byte(0x04);  
  341.         calendar.w_date=BCD2HEX(calendar.w_date);
  342.          
  343.         calendar.hour=DS3231_RD_Byte(0x02);
  344.         calendar.hour&=0x3f;                  
  345.         calendar.hour=BCD2HEX(calendar.hour);
  346.         calendar.min=DS3231_RD_Byte(0x01);
  347.         calendar.min=BCD2HEX(calendar.min);
  348.         calendar.sec=DS3231_RD_Byte(0x00);
  349.         calendar.sec=BCD2HEX(calendar.sec);

  350.         calendar.week=DS3231_RD_Byte(0x03);
  351.         calendar.week=BCD2HEX(calendar.week);       
  352.         DS3231_WR_Byte(0x0e,0x20);
  353.         calendar.temper_H=DS3231_RD_Byte(0x11);
  354.         calendar.temper_L=(DS3231_RD_Byte(0x12)>>6)*25;
  355. }
  356. //****************ds3231函數(shù)*********end*******************************************************************

  357. int main(void)
  358. {       
  359.        
  360.     //Set_DS3231_Time(22,03,24,09,53,00,4);//22年03月23號17點(diǎn)55分00秒周3 .第1次初始化DS3231使用后注銷  
  361.         Delay_us(100);
  362.         DS3231_Init();
  363.         TM1640_Init(); //TM1640初始化       
  364.         while(1)
  365.         {
  366.                 Get_DS3231_Time();
  367.                 {                       
  368.                         TM1640_display(0,calendar.hour/10);        //第1個數(shù)碼管顯示時十位
  369.                         TM1640_display(1,calendar.hour%10);        //第2個數(shù)碼管顯示時個位
  370.                         TM1640_display(2,10); //此位數(shù)碼管顯示"-"
  371.                         TM1640_display(3,calendar.min/10);  //第4個數(shù)碼管顯示分十位                               
  372.                         TM1640_display(4,calendar.min%10);  //第5個數(shù)碼管顯示分個位
  373.                         TM1640_display(5,10); //此位數(shù)碼管顯示"-"
  374.                         TM1640_display(6,calendar.sec/10);        //第7個數(shù)碼管顯示秒十位
  375.                         TM1640_display(7,calendar.sec%10);  //第8個數(shù)碼管顯示秒個位       
  376.                 }
  377.         }
  378. }       
復(fù)制代碼

Keil代碼下載: Keil代碼.7z (21.58 KB, 下載次數(shù): 102)

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50

查看全部評分

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

使用道具 舉報(bào)

沙發(fā)
ID:334781 發(fā)表于 2022-12-19 14:02 | 只看該作者
TM1640這款芯片,用著還可以,用STC單片機(jī)驅(qū)動的程序是我想要的,謝謝樓主
回復(fù)

使用道具 舉報(bào)

板凳
ID:894868 發(fā)表于 2023-2-10 15:36 | 只看該作者
我都是為了學(xué)習(xí)一下驅(qū)動顯示而來··謝謝分享··
回復(fù)

使用道具 舉報(bào)

地板
ID:1112603 發(fā)表于 2024-4-16 08:18 | 只看該作者
51單片機(jī)TM1640驅(qū)動數(shù)碼管,正是我需要的,謝謝!
回復(fù)

使用道具 舉報(bào)

5#
ID:693716 發(fā)表于 2025-3-21 14:03 | 只看該作者
為啥我總是驅(qū)動不成功呢,總是毫無反應(yīng),也點(diǎn)不亮數(shù)碼管,用邏輯分析儀抓的DIN和CLK也和數(shù)據(jù)手冊中對比的,是不是買到假芯片了,焊接了兩個板子都沒成功,今天回去試試這個驅(qū)動試試.
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 色狠狠桃花综合 | 亚洲精精品 | 亚洲精品91 | 亚洲一区自拍 | 亚洲精选久久 | 午夜爱爱网 | 亚洲精品久久久久久一区二区 | 国产高潮av | 在线观看视频你懂得 | 日韩精品一 | 亚洲一区二区三区四区五区中文 | 久久这里只有精品首页 | 涩涩视频大全 | 国产精品日日摸夜夜添夜夜av | 第四色狠狠 | 91精品国产91久久综合桃花 | 国产视频在线观看一区二区三区 | 五月综合激情婷婷 | 国产精品一区二区精品 | 在线四虎 | 亚洲在线电影 | 久久人人爽人人爽人人片av免费 | 亚洲色图50p | 伊人精品国产 | 精品亚洲一区二区三区 | 精品综合久久久 | 国产精品美女www爽爽爽视频 | 亚洲国产成人精品久久久国产成人一区 | 综合久久久久久久 | 日本三级网 | 天天操天天操 | 成人午夜视频在线观看 | 日本精品在线观看 | 日韩av在线中文字幕 | 中文字幕一区二区三区精彩视频 | 国产麻豆乱码精品一区二区三区 | 国产精品日韩欧美一区二区三区 | 特黄特色大片免费视频观看 | 久久久这里只有17精品 | 国产一区二区在线播放视频 | 国产欧美在线 |