最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 正文

TM1638芯片+DS1302驱动共阴数码管时钟

来源:动视网 责编:小OO 时间:2025-09-24 06:14:55
文档

TM1638芯片+DS1302驱动共阴数码管时钟

一、概述二、51单片机,TM1638芯片+DS1302驱动共阴数码管时钟,最后包括按键检测程序(是分开的。)TM1638是带键盘扫描接口的LED(发光二极管显示器)驱动控制专用电路,内部集成有MCU数字接口、数据锁存器、LED高压驱动、键盘扫描等电路。主要应用于冰箱、空调、家庭影院等产品的高段位显示屏驱动。二、特性说明•采用功率CMOS工艺•显示模式10段×8位•键扫描(8×3bit)•辉度调节电路(占空比8级可调)•串行接口(CLK,STB,DIO)•振荡方式:RC振荡(450KHz+5%)
推荐度:
导读一、概述二、51单片机,TM1638芯片+DS1302驱动共阴数码管时钟,最后包括按键检测程序(是分开的。)TM1638是带键盘扫描接口的LED(发光二极管显示器)驱动控制专用电路,内部集成有MCU数字接口、数据锁存器、LED高压驱动、键盘扫描等电路。主要应用于冰箱、空调、家庭影院等产品的高段位显示屏驱动。二、特性说明•采用功率CMOS工艺•显示模式10段×8位•键扫描(8×3bit)•辉度调节电路(占空比8级可调)•串行接口(CLK,STB,DIO)•振荡方式:RC振荡(450KHz+5%)
一、概述

二、51单片机 ,TM1638芯片+DS1302驱动共阴数码管时钟,最后包括按键检测程序(是分开的。)

TM1638是带键盘扫描接口的LED(发光二极管显示器)驱动控制专用电路,内部集

成有MCU 数字接口、数据锁存器、LED 高压驱动、键盘扫描等电路。主要应用于冰箱、

空调 、家庭影院等产品的高段位显示屏驱动。

二、 特性说明

• 采用功率CMOS 工艺

• 显示模式 10 段×8 位

• 键扫描(8×3bit)

• 辉度调节电路(占空比8 级可调)

• 串行接口(CLK,STB,DIO)

• 振荡方式:RC 振荡(450KHz+5%)

• 内置上电复位电路

• 采用SOP28封装

三、、 管脚定义:

电路图数码管:

程序代码:

/*************** TM1638.H头文件 *******************/

#ifndef

#define

//引脚定义

sbit

sbit

sbit

//写一个8Bit数据

void TM1638_Write(unsigned char    写数据函数

{

 

 

  

 

  

 

 

}

/*unsigned char TM1638_Read(void)     读数据函数

{

  设置为输入

 

 

 

  

 

void Write_COM(unsigned char cmd)  //发送命令字

{

  写命令 

}

void Write_DATA(unsigned char add,unsigned char DATA)  指定地址写入数据

{

   //地址高位为1:11**  ****,写地址

}

void init_TM1638(void)

{

 8a);//亮度

 //写 数据命令,写数据到显示寄存器

   写地址命令

}

#endif

/***************************DS1302.H头文件***************************/

#ifndef DS1302_H

#define DS1302_H

#define uchar unsigned char 

#define uint unsigned int

#include"DELAY.h"

s移位时的第0位

s移位时用的第7位

sbit DATA=P2^1; 

void Write1302(uchar dat)

{

  uchar i; 

 拉低SCLK,为脉冲上升沿写入数据做好准备

 稍微等待,使硬件做好准备

 连续写8个二进制位数据

 取出dat的第0位数据写入1302

   delay(2);       //稍微等待,使硬件做好准备

   SCLK=1;           //上升沿写入数据

   delay1(2);      //稍微等待,使硬件做好准备

   SCLK=0;           //重新拉低SCLK,形成脉冲

 将dat的各数据位右移1位,准备写入下一个数据位

 }

 void WriteSet1302(uchar Cmd,uchar dat)

 {

   RST=0;           //禁止数据传递

   SCLK=0;          //确保写数居前SCLK被拉低

   RST=1;           //启动数据传输

   delay1(2);     //稍微等待,使硬件做好准备

 写入命令字

 写数据

   SCLK=1;          //将时钟电平置于已知状态

   RST=0;           //禁止数据传递

 }

uchar Read1302(void)

 {

   delay(2);       //稍微等待,使硬件做好准备

 连续读8个二进制位数据

 将dat的各数据位右移1位,因为先读出的是字节的最低位

    if(DATA==1)    //如果读出的数据是1

    dat|=0x80;    //将1取出,写在dat的最高位

    SCLK=1;       //将SCLK置于高电平,为下降沿读出

 稍微等待

    SCLK=0;       //拉低SCLK,形成脉冲下降沿

 稍微等待

 将读出的数据返回

  }

uchar  ReadSet1302(uchar Cmd)

 {

  uchar dat;

 拉低RST

 确保写数居前SCLK被拉低

 启动数据传输

 写入命令字

 读出数据

 将时钟电平置于已知状态

 禁止数据传递

 将读出的数据返回

}

void Init_DS1302(void)

   WriteSet1302(0x8E,0x00);                 //根据写状态寄存器命令字,写入不保护指令 

 根据写秒寄存器命令字,写入秒的初始值

 根据写分寄存器命令字,写入分的初始值

 根据写小时寄存器命令字,写入小时的初始值

 根据写日寄存器命令字,写入日的初始值

 根据写月寄存器命令字,写入月的初始值

 8c

 8a,((0/10)<<4|(0%10)));   

   WriteSet1302(0x8E,0x80);                 //根据写状态寄存器命令字,写入保护指令 

}

#endif

/***************显示头文件*******************************/

#include"TM1638.h"

u显示缓存区*/ 各个数码管显示的值

uchar code tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x40,0xef};

 void display1638(uchar hour,uchar minute,uchar second)

 

 

  

  

  

  

  

  

  

  

  

   

   

   

}

void DisplayHour(newval)

{

}

#endif

/**********************************************************/

//下面是处理程序头文件,调试功能的实现,但是本人接调时的来源是

//是鼠标芯片,所以这里都写上,各位可以根据自己是按键还是其他的,做修改

/***********************************************/

#ifndef CHULI_H

#define CHULI_H

#define uchar unsigned char

#define uint unsigned int

#include"DISPLAY.h"

#include"DS1302.h"

void  read_date(void)

{

     ReadValue = ReadSet1302(0x81);   

 0F);

 0F); 

 0F); 

 0F); 

 0F); 

 0F); 

 读星期

    

}

void turn_val(char newval,uchar flag,uchar  newaddr,uchar s1num)

                   newval=ReadSet1302(newaddr);                     //读取当前时间

 0f)将bcd码转换成十进制

                   if(flag)                  //判断是加一还是减一

   

                      DisplayYear(newval);      

       

    

       

       

    

     

       

    

     

       

     

       

     

       

     

       

    

   

   

    

    

       

    

       

     

    

       

     

    

     

       

     

       

     

       

     

       

     

   

    

 将新数据写入寄存器

void write_flsh(uchar com,uchar dat)

{

void sp2_mouse(void)

{

  

  

  

   

  

  

   

  

   

   

    

   

  

   

    

   

   

     

   

    

    

     

    

    

    

   

     

     

     

    

    

    

   

   

///////////////////////////////////////////////////////

   

  

  

   

    

   

  

     

    

    

   

     

   

    

    

     

   

     

    

   

     

     

      

     

    

    

    

   

/////////////////////////////////////////////////////////

  

   

   8a);

   

    

   

  

   

   

    8a);

   

   

     

   

   

    

     

    

    

    

   

     

     

      

     

    

    

   

         

///////////////////////////////////////////////////////////

  

  

   

   

    

   

  

   

    

    

   

   

    

   

    

    

    

    

    

    

   

     

     

      

     

     

    

   

        

////////////////////////////////////////////////////////////

   

  

   

   

    

   

  

    

    

     

   

   

    

   

    

    

    

    

    

    

   

     

     

      

     

      

  

   

  

//////////////////////////////////////////////////////////////

   

  

   

   

    

   

  

    

   

      

     

   

         写入分寄存器

   

    

    

         写入分寄存器

    

     

    

   

     

     

      

     

    

     

      

   

////////////////////////////////////////////////////////////////

  

  

   

   

    

   

  

    

    

    

   

   

     

   

    

    

     

    

    

    

   

     

     

     

     

    

     

   

   

///////////////////////////////////////////////////////////////

  

  

  

     

//////////////////////////////////////////////////////////////

  

  

  

  

   

    7f);

   0c) ;

    根据写状态寄存器命令字,写入不保护指令 

  

  

  

#endif

/*********鼠标芯片*****/

#ifndef PS2_H

#define PS2_H

#include"DELAY.h"

sbit mouse_SDA=P3^4;//数据线P3_5 计数器0输入端口

sbit mouse_CLK=P3^3;//时钟线P3_3 外部中断1输入端口

sbit led=P3^6;

bit pp=0;  

bit ACK=0; 

uchar bdata mouse_byte; //接收字节 bdata-->可寻址的片内RAM

sbit mouse_byte_bit0=mouse_byte^0;//mouse_byte第0位

sbit mouse_byte_bit1=mouse_byte^1;//mouse_byte第1位

sbit mouse_byte_bit2=mouse_byte^2;//mouse_byte第2位

sbit mouse_byte_bit3=mouse_byte^3;//mouse_byte第3位

sbit mouse_byte_bit4=mouse_byte^4;//mouse_byte第4位

sbit mouse_byte_bit5=mouse_byte^5;//mouse_byte第5位

sbit mouse_byte_bit6=mouse_byte^6;//mouse_byte第6位

sbit mouse_byte_bit7=mouse_byte^7;//mouse_byte第7位

uchar mouse_buffer[11];//接收位数据缓冲区

uchar mouse_buffer_bit=0;//mouse_buffer[mouse_buffer_bit]

uchar mouse_data[4];//接收鼠标数据缓冲区,分别存放:功能信息字节,x位移量,y位移量

uchar mouse_data_bit=0;//mouse_data[mouse_data_bit]

uchar move_x;//存放横坐标

uint move_y;//存放纵坐标

uchar move_z;

extern uchar move_x;

/***********************************************************************

  发送数据

************************************************************************/

void Init_ter(void)

{

   开放中断

 允许外部中断1

 设置中断优先级 设外部中断1为最高优先级别  

}

void host_to_mouse(uchar cmd)

 uchar i;

 EX1=0; 

 mouse_CLK=0;

 delay100;

 delay100;

 ACC=cmd; 

 pp=~P;  //获得奇偶校验位

 mouse_SDA=0;

 mouse_CLK=1;

for(i=0;i<8;i++)

 {

  while(mouse_CLK==1);

  mouse_SDA=cmd&0x01;

cmd>>=1;

  while(mouse_CLK==0);

 }

 while(mouse_CLK==1);

 mouse_SDA=pp;  //发送奇偶校验位

 while(mouse_CLK==0);

 while(mouse_CLK==1);

 mouse_SDA=1;

 while(mouse_CLK==0);

 while(mouse_CLK==1);

 ACK=mouse_SDA; //接收应答位

 while(mouse_CLK==0);

}

void Init_mouse(void)

  host_to_mouse(0xf4);

  delayms(50);

  Init_ter();

  delayms(50);

  host_to_mouse(0xf3);

  delayms(50);

  host_to_mouse(0xc8);

  delayms(50);

  host_to_mouse(0xf3);

  delayms(50);

  host_to_mouse(0x);

  delayms(50);

  host_to_mouse(0xf3);

  delayms(50);

  host_to_mouse(0x50);

  delayms(50);

  host_to_mouse(0xf2);

  delayms(200);

  mouse_data[0]=0;

  mouse_data[1]=0;

  mouse_data[2]=0;

  mouse_data[3]=0;

  move_x=10;

  move_y=0;

  move_z=0;

}

/*********************************************

   奇校检

**********************************************/

uchar Checkout(void)  

{

 

 

/*********************************************************

  数据分析及处理

**********************************************************/

{

 将收到的11位信号中截取8位数据放进mouse_byte

 

 如果校验正确

 

 

  

 

 

  

   如果"X sign bit"为1,表示鼠标向右左移 

   

    坐标减

   

  

  

  

    坐标加

   

  

  

  

    坐标减

 

  

  

  

    坐标加

  

  

  

   0f));

  

  

  

   0f;

   坐标加

  

 

/**************************************************

    外部中断1

***************************************************/

void ReceiveData(void)  interrupt 2

{

  

  等待设备拉高时钟线

  接收数据

 

  数据分析及处理

 

         

}

#endif

////////////////////////////////主函数部分////////////////////////////////////////////////////

#include

#include"TM1638.h"

#include"DS1302.h"

#include"DELAY.h"

#include"CHULI.h"

#include"DISPLAY.h"

void main()

{  

 将1302初始化 

     

}

/**********************************************/

再来一个按键测试的程序:这个是另外的,与上面的无关;

#ifndef

#define

#include

#define 

#define 

#define 

//引脚定义

sbit

sbit

sbit

unsigned char code tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x40};

void TM1638_Write(unsigned char    写数据函数

{

 

 

  

 

  

 

 

}

unsigned char TM1638_Read(void)     读数据函数

{

  设置为输入

 

 

 

  

 

}

void Write_COM(unsigned char cmd)  发送命令字

{

}

unsigned char Read_key(void)

{

  //读取键盘值

 

      个字节数据合成一个字节

 

 

  

}

void Write_DATA(unsigned char add,unsigned char DATA)  指定地址写入数据

{

}

/*void Write_oneLED(unsigned char num,unsigned char flag) 单独控制一个LED函数,num为需要控制的led序号,flag为0时熄灭,不为0时点亮

{

 

 

void Write_allLED(unsigned char LED_flag)     控制全部LED函数,LED_flag表示各个LED状态

{

 

  

   

  

   

 

void init_TM1638(void)

{

 8a);//亮度

 

}

#endif

#include

#include

#include

unsigned char num[8];  各个数码管显示的值

unsigned char x=0xff;

sbit key=P3^4;

int main(void)

{

 

 

 

 

 

 

}

 void display1638()

{

 

 

  

  

  

  

  

  

  

  

  

   

   

   

 

  

}

#ifndef

#define

#include

#define uchar unsigned char

void delay_ms(uchar);

void display();

void detectkey();

void display1638();

uchar code tap[10]={

};

sbit key_hour=P3^5;

sbit key_min=P3^6;

uchar hour=12;

uchar minute=0;

uchar second=0;

uchar flag=0;

uchar sec_flag=0;

/*************************

 初始化程序  

**************************/

void system_init()

{

}

/*************************

 定时器中断0中断处理程序  

**************************/

void int1_ISR()  interrupt 1

{  

  TH0=(65536-50000)/256;  

  TL0=(65536-50000)%256;

  

 

 

 

 

 

  

  

}

/*************************

  按键程序  

**************************/

void detectkey()

{

 

 

 

 

 

 

 

  

  

 

  

 

 

 }

/*************************

 显示程序  

**************************/

void display(uchar i)

P0=i;

}

/*************************

 延时处理程序  

**************************/

void delay_ms(uchar no)

{

 

}

#endif

说明:按键值送P0接的LED显示。其过程不影响数码管显示时间。

希望对各位有帮助!

文档

TM1638芯片+DS1302驱动共阴数码管时钟

一、概述二、51单片机,TM1638芯片+DS1302驱动共阴数码管时钟,最后包括按键检测程序(是分开的。)TM1638是带键盘扫描接口的LED(发光二极管显示器)驱动控制专用电路,内部集成有MCU数字接口、数据锁存器、LED高压驱动、键盘扫描等电路。主要应用于冰箱、空调、家庭影院等产品的高段位显示屏驱动。二、特性说明•采用功率CMOS工艺•显示模式10段×8位•键扫描(8×3bit)•辉度调节电路(占空比8级可调)•串行接口(CLK,STB,DIO)•振荡方式:RC振荡(450KHz+5%)
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top