找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2598|回复: 11
收起左侧

单片机+4个74HC595静态显示时间段位,12V共阳数码管,第一个595发烫,时间不更新

[复制链接]
ID:883770 发表于 2021-3-29 21:39 | 显示全部楼层 |阅读模式
#include <reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint  unsigned int
//DS1302引脚定义,可根据实际情况自行修改端口定义
sbit RST=P3^2;
sbit IO=P3^0;
sbit SCK=P3^1;
sbit ser=P1^7;
sbit clk=P1^6;
sbit rck=P1^5;
sbit flash=P3^5;
uchar dat;
//DS1302地址定义
#define ds1302_sec_add                        0x80                //秒数据地址
#define ds1302_min_add                        0x82                //分数据地址
#define ds1302_hr_add                        0x84                //时数据地址
#define ds1302_date_add                        0x86                //日数据地址
#define ds1302_month_add                0x88                //月数据地址
#define ds1302_day_add                        0x8a                //星期数据地址
#define ds1302_year_add                        0x8c                //年数据地址
#define ds1302_control_add                0x8e                //控制数据地址
#define ds1302_charger_add                0x90                                          
#define ds1302_clkburst_add                0xbe
//初始时间定义
uchar code seg_table[]= {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8,
                            0x80, 0x90}; //0-9段码
uchar time_buf[8] = {0x20,0x21,0x03,0x29,0x19,0x54,0x00,0x05};//初始时间
uchar readtime[14];//当前时间
uchar sec_buf=0;  //秒缓存
uchar sec_flag=0; //秒标志位
//功能:延时1毫秒
//入口参数:x
//出口参数:无
//说明:晶振为12M
void Init_Timer(void)
{
TMOD |= 0x11;          //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响                     
TH0=0x3c;              //给定初值,这里使用定时器最大值从0开始计数一直到65535溢出
TL0=0xb0;
TH0=0x15;              //给定初值,这里使用定时器最大值从0开始计数一直到65535溢出
TL0=0xa0;
EA=1;            //总中断打开
ET0=1;           //定时器中断打开
TR0=1;           //定时器开关打开
ET1=1;           //定时器中断打开
TR1=1;
}
void delay_xms(uint x)
{
  uint i,j;
  for(i=0;i<x;i++)
    for(j=0;j<112;j++);
}
//DS1302初始化函数
void ds1302_init(void)
{
        RST=0;                        //RST脚置低
        SCK=0;                        //SCK脚置低
}
//向DS1302写入一字节数据
void ds1302_write_byte(uchar addr, uchar d)
{
        uchar i;
        RST=1;                                        //启动DS1302总线        
        //写入目标地址:addr
        addr = addr & 0xFE;   //最低位置零,寄存器0位为0时写,为1时读
        for (i = 0; i < 8; i ++) {
                if (addr & 0x01) {
                        IO=1;
                        }
                else {
                        IO=0;
                        }
                SCK=1;      //产生时钟
                SCK=0;
                addr = addr >> 1;
                }        
        //写入数据:d
        for (i = 0; i < 8; i ++) {
                if (d & 0x01) {
                        IO=1;
                        }
                else {
                        IO=0;
                        }
                SCK=1;    //产生时钟
                SCK=0;
                d = d >> 1;
                }
        RST=0;                //停止DS1302总线
}

//从DS1302读出一字节数据
uchar ds1302_read_byte(uchar addr) {

        uchar i,temp;        
        RST=1;                                        //启动DS1302总线
        //写入目标地址:addr
        addr = addr | 0x01;    //最低位置高,寄存器0位为0时写,为1时读
        for (i = 0; i < 8; i ++) {
                if (addr & 0x01) {
                        IO=1;
                        }
                else {
                        IO=0;
                        }
                SCK=1;
                SCK=0;
                addr = addr >> 1;
                }        
        //输出数据:temp
        for (i = 0; i < 8; i ++) {
                temp = temp >> 1;
                if (IO) {
                        temp |= 0x80;          //   高位置1
                        }
                else {
                        temp &= 0x7F;        //高位置0
                        }
                SCK=1;
                SCK=0;
                }        
        RST=0;                                        //停止DS1302总线
        return temp;
}
//向DS302写入时钟数据
void ds1302_write_time(void)
{
        ds1302_write_byte(ds1302_control_add,0x00);                        //关闭写保护
        ds1302_write_byte(ds1302_sec_add,0x80);                                //暂停时钟 ,晶振停振
        ds1302_write_byte(ds1302_charger_add,0x00);            //涓流充电
        ds1302_write_byte(ds1302_year_add,time_buf[1]);                //年
        ds1302_write_byte(ds1302_month_add,time_buf[2]);        //月
        ds1302_write_byte(ds1302_date_add,time_buf[3]);                //日
        ds1302_write_byte(ds1302_hr_add,time_buf[4]);                //时
        ds1302_write_byte(ds1302_min_add,time_buf[5]);                //分
        ds1302_write_byte(ds1302_sec_add,time_buf[6]);                //秒
        ds1302_write_byte(ds1302_day_add,time_buf[7]);                //周
        ds1302_write_byte(ds1302_control_add,0x80);                        //打开写保护
}
//从DS302读出时钟数据
void ds1302_read_time(void)  
{
//        time_buf[1]=ds1302_read_byte(ds1302_year_add);                //年
//        time_buf[2]=ds1302_read_byte(ds1302_month_add);                //月
//        time_buf[3]=ds1302_read_byte(ds1302_date_add);                //日
        time_buf[4]=ds1302_read_byte(ds1302_hr_add);                //时
        time_buf[5]=ds1302_read_byte(ds1302_min_add);                //分
        time_buf[6]=(ds1302_read_byte(ds1302_sec_add))&0x7f;//秒,屏蔽秒的第7位,避免超出59
//        time_buf[7]=ds1302_read_byte(ds1302_day_add);                //周         
}
void serial_input_595(uchar d)//串口发送8位数据,高字节在前
{uchar i;
   for(i=0;i<8;i++)
   {d<<=1;ser=CY;
   clk=0;_nop_();_nop_();
   clk=1;_nop_();_nop_(); }         //上升沿时钟
   }
void parallel_output_595()        //并口显示
{ rck=0;_nop_();_nop_();
   rck=1;_nop_();_nop_(); //上升沿锁存
}
//主函数
void main(void)
{
delay_xms(50);
ds1302_init(); //DS1302初始化
delay_xms(50);
ds1302_write_time(); //写入初始值
  Init_Timer();
while(1)//
  {EA=0;
    ds1302_read_time();  //读取时间
// readtime[0]=(time_buf[0]>>4);   //分离出年千位
// readtime[1]=(time_buf[0]&0x0F); //分离出年百位
//  readtime[2]=(time_buf[1]>>4);   //分离出年十位
// readtime[3]=(time_buf[1]&0x0F); //分离出年个位
//  readtime[4]=(time_buf[2]>>4);   //分离出月十位
//  readtime[5]=(time_buf[2]&0x0F); //分离出月个位
// readtime[6]=(time_buf[3]>>4);   //分离出日十位
  //readtime[7]=(time_buf[3]&0x0F); //分离出日个位
  readtime[8]=(time_buf[4]>>4);   //分离出小时十位
  readtime[9]=(time_buf[4]&0x0F); //分离出小时个位
  readtime[10]=(time_buf[5]>>4);   //分离出分钟十位
  readtime[11]=(time_buf[5]&0x0F); //分离出分钟个位
readtime[12]=(time_buf[6]>>4);   //分离出秒钟十位
  readtime[13]=(time_buf[6]&0x0F); //分离出秒钟个位
  EA=1;  
dat=seg_table[readtime[8]];//小时十位
  serial_input_595(dat);
  dat=seg_table[readtime[9]]; //小时个位
  serial_input_595(dat);
  dat=seg_table[readtime[10]];//分十位
   serial_input_595(dat);
   dat=seg_table[readtime[11]];//分个位
   serial_input_595(dat);
   parallel_output_595();
   delay_xms(500);
  } }
void Timer0_isr(void) interrupt 1//中断子程序每半秒时钟点闪烁
{
uchar i;
TH0=0x3c;                  
TL0=0xb0;
if (i!=10)
{i++;}
else
{flash=~flash;
i=0;}
}        
回复

使用道具 举报

ID:328014 发表于 2021-3-29 21:58 | 显示全部楼层
发烫与程序无关,是你电路的问题,程序不会导致74hc595发烫
回复

使用道具 举报

ID:898290 发表于 2021-3-29 22:12 | 显示全部楼层
仔细检查一下电路板,拿万用表检查一下短路,也有可能芯片损毁,换一个试试,与程序没有关系
回复

使用道具 举报

ID:230742 发表于 2021-3-29 23:32 | 显示全部楼层
4个595都是一样的,换个位置试一试。就知道了。大部分都是焊错了。
回复

使用道具 举报

ID:155507 发表于 2021-3-30 07:55 | 显示全部楼层
74HC595 不能推动12V的数码管
你可以用  TPIC6C596 8位移位寄存器 7segment displays 7段数码管

http://www.ti.com/lit/ds/slis093d/slis093d.pdf




回复

使用道具 举报

ID:46065 发表于 2021-3-30 09:59 | 显示全部楼层
我曾经买到过一批质量很差的595
回复

使用道具 举报

ID:372579 发表于 2021-3-30 10:14 来自手机 | 显示全部楼层
仔细检查电路一般情况下就是电路焊错导致的
回复

使用道具 举报

ID:47541 发表于 2021-3-30 13:30 | 显示全部楼层
12V共阳数码管,数码管为啥12V 595 工作电压不是5V吗? 共阳极的电压也应该是5V啊?
回复

使用道具 举报

ID:207421 发表于 2021-3-30 16:44 | 显示全部楼层
仔细检查是不是没有限流电阻导致的电流过大发热了
回复

使用道具 举报

ID:883770 发表于 2021-3-30 17:50 | 显示全部楼层
angmall 发表于 2021-3-30 07:55
74HC595 不能推动12V的数码管
你可以用  TPIC6C596 8位移位寄存器 7segment displays 7段数码管

74HC595 输出低电平有效,12V电源经过数码管的笔段(12v灯带做的)回流到595管脚
回复

使用道具 举报

ID:883770 发表于 2021-3-30 17:53 | 显示全部楼层
51hei团团 发表于 2021-3-29 21:58
发烫与程序无关,是你电路的问题,程序不会导致74hc595发烫

四个IC只有第一个发烫,检查了线路也没有发现问题,把后面IC移前来替换也发烫,IC换到后面就不烫
回复

使用道具 举报

ID:883770 发表于 2021-3-31 10:53 | 显示全部楼层
lwh999995 发表于 2021-3-30 16:44
仔细检查是不是没有限流电阻导致的电流过大发热了

我怀疑可能就是这个问题
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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