找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2872|回复: 1
收起左侧

单片机四位数码模块时钟驱动程序

[复制链接]
ID:292103 发表于 2018-8-21 16:25 | 显示全部楼层 |阅读模式
制作出来的实物图如下:
副本 (4) myphoto.jpg

单片机源程序如下:
  1. 之前的程序是倒计时的,现在改成了向前走时了,经过反复的比对时间,时钟准确了!!/*************************************************************
  2. ****     Time: 2018.08.21
  3. ********************************/
  4. #include <reg52.h>
  5. #include<intrins.h>
  6. sbit CLK = P2^0;  //时钟信号
  7. sbit DIO = P2^1;  //数据/地址数据                                                                                                                                                                 
  8. unsigned char code SEGData[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴极数码管1-9
  9. unsigned char code SEGDataDp[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; //有小数点只用于地址0xc1
  10. unsigned char dpFlag = 0; //控制第二个数码管的dp的显示
  11. void TM1637_start( void );
  12. void TM1637_stop( void );
  13. void TM1637_write1Bit(unsigned char mBit);
  14. void TM1637_write1Byte(unsigned char mByte);
  15. void TM1637_writeCammand(unsigned char mData);
  16. void TM1637_writeData(unsigned char addr, unsigned char mData);
  17. void time_set(char hour, char min);
  18. void time_judge( void );
  19. void time_display( void );
  20. void timer0_init( void );
  21. void delay_140us( void );
  22. unsigned int countTime = 0;
  23. unsigned char time, sec;
  24. struct {
  25.         char shi;
  26.         char ge;
  27. }Hour;

  28. struct {
  29.         char shi;
  30.         char ge;
  31. }Min;



  32. /***********************************************************
  33. *****
  34. ***** 主函数
  35. *****
  36. ***********************************************************/
  37. void main( void )
  38. {
  39.         timer0_init();
  40.         time_set(23, 59);  //设置5小时倒计时
  41.         while(1)
  42.         {
  43.                 time_display();         //显示时间
  44.                 if(countTime <= 10)
  45.                 {
  46.                         dpFlag = 0;                       
  47.                 }
  48.                 else
  49.                 if(countTime <= 20)
  50.                 {
  51.                         dpFlag = 1;      
  52.                 }
  53.                 else
  54.                 {
  55.                         countTime = 0;
  56.                         time_judge();
  57.                 }
  58.         }
  59. }

  60. /********************************************************************
  61. * 名称 : void time_set(char hour, char min)
  62. * 功能 : 设置时间
  63. * 输入 : char hour, char min
  64. * 输出 : 无
  65. **************************************************************/
  66. void time_set(char hour, char min)
  67. {
  68.         if((hour < 0) || (min<0))
  69.         {
  70.                 hour = 0;
  71.                 min = 0;
  72.         }
  73.         Hour.shi = hour/10;
  74.         Hour.ge = hour%10;
  75.         Min.shi = min/10;
  76.         Min.ge = min%10;               
  77. }

  78. /*************************************************************
  79. * 名称 : time_judge( void )
  80. * 功能 : 判断时间变化
  81. * 输入 : void
  82. * 输出 : 无
  83. **************************************************************/
  84. void time_judge( void )
  85. {      

  86.                  sec++;
  87.                 if(sec>=60)
  88.        {
  89.         sec=0;
  90.         Min.ge ++;
  91.         }
  92.                 if(Min.ge>=10)
  93.        {               
  94.          Min.ge=0;
  95.          Min.shi++;
  96.                 }
  97.                    if(Min.shi>=6)
  98.        {               
  99.          Min.ge=0;
  100.                  Min.shi=0;
  101.          Hour.ge++;
  102.                 }
  103.                 if(Hour.ge>=10)
  104.        {               
  105.          Hour.ge=0;
  106.          Hour.shi++;
  107.                 }
  108.                 if((Hour.shi>=2) &&(Hour.ge>=4) )
  109.        {
  110.              sec=0;
  111.                  Min.ge        =0;
  112.              Min.shi=0;
  113.              Hour.ge=0;               
  114.          Hour.shi=0;                  
  115.                 }

  116. }

  117. /********************************************************************
  118. * 名称 : void time_display( void )
  119. * 功能 : 显示时间
  120. * 输入 : void
  121. * 输出 : 无
  122. **************************************************************/
  123. void time_display( void )
  124. {
  125.         TM1637_writeCammand(0x44);
  126.         TM1637_writeData(0xc0, SEGData[Hour.shi]);
  127.         if(dpFlag)
  128.                 TM1637_writeData(0xc1, SEGDataDp[Hour.ge]); //小数点标志为1则用小数点那个数组
  129.         else
  130.                 TM1637_writeData(0xc1, SEGData[Hour.ge]);
  131.         TM1637_writeData(0xc2, SEGData[Min.shi]);
  132.         TM1637_writeData(0xc3, SEGData[Min.ge]);
  133.         TM1637_writeCammand(0x8a);                              
  134. }

  135. /********************************************************************
  136. * 名称 : void TM1637_start( void )
  137. * 功能 : start信号
  138. * 输入 : void
  139. * 输出 : 无
  140. **************************************************************/
  141. void TM1637_start( void )
  142. {
  143.         CLK = 1;
  144.         DIO = 1;
  145.         delay_140us();
  146.         DIO = 0;
  147.         delay_140us();
  148.         CLK = 0;
  149.         delay_140us();
  150. }

  151. /********************************************************************
  152. * 名称 : void TM1637_stop( void )
  153. * 功能 : stop信号
  154. * 输入 : void
  155. * 输出 : 无
  156. **************************************************************/
  157. void TM1637_stop( void )
  158. {
  159.         CLK = 0;
  160.         delay_140us();
  161.         DIO = 0;
  162.         delay_140us();
  163.         CLK = 1;
  164.         delay_140us();
  165.         DIO = 1;
  166.         delay_140us();
  167. }

  168. /********************************************************************
  169. * 名称 : void TM1637_write1Bit(unsigned char mBit )
  170. * 功能 : 写1bit
  171. * 输入 : unsigned char mBit
  172. * 输出 : 无
  173. **************************************************************/
  174. void TM1637_write1Bit(unsigned char mBit )
  175. {
  176.         CLK = 0;
  177.         delay_140us();
  178.         if(mBit)
  179.                 DIO = 1;
  180.         else
  181.                 DIO = 0;
  182.         delay_140us();      
  183.         CLK        = 1;
  184.         delay_140us();
  185. }

  186. /********************************************************************
  187. * 名称 : void TM1637_write1Byte(unsigned char mByte)
  188. * 功能 : 写1byte
  189. * 输入 : unsigned char mByte
  190. * 输出 : 无
  191. **************************************************************/
  192. void TM1637_write1Byte(unsigned char mByte)
  193. {
  194.         char loop = 0;
  195.         for(loop = 0; loop < 8; loop++)
  196.         {
  197.                 TM1637_write1Bit((mByte>>loop)&0x01); //取得最低位      
  198.         }
  199.         CLK = 0;
  200.         delay_140us();
  201.         DIO = 1;
  202.         delay_140us();
  203.         CLK = 1;
  204.         delay_140us();
  205.         while(DIO == 1);  //获得应答位         
  206. }

  207. /********************************************************************
  208. * 名称 : void TM1637_writeCammand(unsigned char mData)
  209. * 功能 : 写指令1byte
  210. * 输入 : unsigned char mData
  211. * 输出 : 无
  212. **************************************************************/
  213. void TM1637_writeCammand(unsigned char mData)
  214. {
  215.         TM1637_start();
  216.         TM1637_write1Byte(mData);  //数据
  217.         TM1637_stop();      
  218. }

  219. /********************************************************************
  220. * 名称 : void TM1637_writeData(unsigned char addr, unsigned char mData)
  221. * 功能 : 固定地址写数据1byte
  222. * 输入 : unsigned char addr, unsigned char mData
  223. * 输出 : 无
  224. **************************************************************/
  225. void TM1637_writeData(unsigned char addr, unsigned char mData)
  226. {
  227.         TM1637_start();
  228.         TM1637_write1Byte(addr);  //地址
  229.         TM1637_write1Byte(mData);  //数据
  230.         TM1637_stop();      
  231. }

  232. /********************************************************************
  233. **************************************************************/
  234. void timer0_init( void )
  235. {
  236.         TMOD=0X01;
  237.         TH0=(65536-35000)/256;
  238.         TL0=(65536-35000)%256;
  239.         ET0=1;
  240.         EA=1;
  241.         TR0=1;      
  242. }
复制代码
0.png

所有资料51hei提供下载:
TM1637.rar (33.18 KB, 下载次数: 22)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:402417 发表于 2018-12-5 17:41 | 显示全部楼层
感谢感谢感谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表