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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

DS1302數碼管時鐘問題求助

[復制鏈接]
跳轉到指定樓層
樓主
ID:55566 發表于 2013-10-1 21:30 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
在網上看了51單片機的教程,下面是程序,對照我的實驗板,把段碼和位選都改正確了,sck,io,rst等位置也改了,但是數碼管一直顯示99-99-99,
求大神找原因,萬分感謝,我看了一天都沒找到問題
#include<reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int

sbit sck=P3^6;
sbit io=P3^4;
sbit rst=P3^5;
sbit smgen=P1^0;

unsigned char code smg_du[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};        //段選
unsigned char code smg_we[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};           //位選


uchar time_data[7]={1,1,1,1,1,18,1};        //年周月日時分秒

uchar write_add[7]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80};        //寄存器地址  寫
uchar read_add[7]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81};                //寄存器地址  讀
uchar disp[8];

/**********************函數聲明************************/
void write_ds1302_byte(uchar dat);
void write_ds1302(uchar add,uchar dat);
uchar read_ds1302(uchar add);
void set_rtc(void);
void read_rtc(void);
void time_pros(void);
void display(void);                  
//************************************************
//延時函數,在12MHz的晶振頻率下
//大約50us的延時
//************************************************
void delay_50us(uint t)
{
        uchar j;
        for(;t>0;t--)
        for(j=110;j>0;j--);
}
/*****************DS1302底層驅動函數**********************/
void write_ds1302_byte(uchar dat)                  //寫單個字節地址/數據
{
        uchar i;
        for(i=0;i<8;i++)          //經八次循環后數據/地址寫入
        {
                sck=0;
                io=dat&0x01;          //把要寫入數據/地址最低位賦給io,其他位置0
                dat=dat>>1;                  //數據右移一位
                sck=1;                          //將數據寫入
        }
}

void write_ds1302(uchar add,uchar dat)          //寫多個字節地址/數據
{
        rst=0;
        _nop_();
        sck=0;_nop_();
        rst=1;
        _nop_();
        write_ds1302_byte(add);                //寫入地址
        write_ds1302_byte(dat);            //寫入數據         
        rst=0;
        _nop_();
        io=1;
        sck=1;
}

uchar read_ds1302(uchar add)                 //讀多個字節數據
{
        uchar i,value;
        rst=0;
        _nop_();
        sck=0;
        _nop_();
        rst=1;
        _nop_();
        write_ds1302_byte(add);       //讀數據前要先寫入數據的地址
        for(i=0;i<8;i++)
        {
                value=value>>1;
                sck=0;
                if(io)
                value=value|0x80;
                sck=1;               

        }
        rst=0;
        _nop_();
        sck=0;
        _nop_();
        sck=1;
        io=1;
        return value;
}
/**************************底層驅動函數**************************/

void set_rtc(void)               
{
        uchar i,j;
        for(i=0;i<7;i++)                           //轉換成BCD碼
        {
                j=time_data[i]/10;
                time_data[i]=time_data[i]%10;
                time_data[i]=time_data[i]+j*16;               
        }
        write_ds1302(0x8e,0x00);        //去除寫保護
        for(i=0;i<7;i++)
        {
                write_ds1302(write_add[i],time_data[i]);
        }
        write_ds1302(0x8e,0x80);        //加寫保護
}
                                                          
void read_rtc(void)
{
        uchar i;
        for(i=0;i<7;i++)
        {
                time_data[i]=read_ds1302(read_add[i]);
        }       
}

void time_pros(void)                 //處理函數,將BCD碼轉換成十進制
{
        disp[0]=time_data[6]%16;
        disp[1]=time_data[6]/16;
        disp[2]=10;
        disp[3]=time_data[5]%16;
        disp[4]=time_data[5]/16;
        disp[5]=10;
        disp[6]=time_data[4]%16;
        disp[7]=time_data[4]/16;       
}

void display(void)                   //掃描函數
{
        uchar i;
        for(i=0;i<8;i++)
        {
        P0=smg_du[disp[i]];
        P2=smg_we[i];
        delay_50us(7);
        }
}


void main(void)                   //主函數
{
        set_rtc();                 //時間初始值
        while(1)
        {
                smgen=0;          //段碼鎖存端
                read_rtc();          //讀入時間值
                smgen=1;
                time_pros();   //處理函數,將BCD碼轉換成十進制
                display();           //掃描函數
        }

}


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

使用道具 舉報

沙發
ID:7485 發表于 2013-10-1 22:30 | 只看該作者
秒= time_data[?]
分= time_data[?]
時= time_data[?]
回復

使用道具 舉報

板凳
ID:55566 發表于 2013-10-2 09:13 | 只看該作者
ahshmj 發表于 2013-10-1 22:30
秒= time_data[?]
分= time_data[?]
時= time_data[?]

麻煩能說得再明白一點嗎?謝謝
回復

使用道具 舉報

地板
ID:7485 發表于 2013-10-2 18:25 | 只看該作者
?”個等于幾?看你的程序好像是等于4、5、6,你再看看這個數值對嗎?
回復

使用道具 舉報

5#
ID:55566 發表于 2013-10-2 20:19 | 只看該作者
ahshmj 發表于 2013-10-2 18:25
“?”個等于幾?看你的程序好像是等于4、5、6,你再看看這個數值對嗎?

4,5,6是因為time_data[4]是小時寄存器的值,time_data[5]是分鐘寄存器里面的值,在前面已經有定義,F在程序在走,但是數碼管有陰影,陰影是都是9,不知道怎么解決?感覺問題在bcd轉十進制處理程序那一塊,但不知道怎么解決
回復

使用道具 舉報

6#
ID:52286 發表于 2013-10-14 00:03 | 只看該作者
支持支持、、
回復

使用道具 舉報

7#
ID:27161 發表于 2013-12-24 13:29 | 只看該作者
1302啟動后沒有初始化,建議上電按設置按鍵設置一下再看,只要一起動,如果1302有后備電池,下次上電就正常顯示了。
回復

使用道具 舉報

8#
ID:57920 發表于 2013-12-24 21:22 | 只看該作者
你說數碼管有陰影
感覺你的數碼管顯示函數disp有問題,動態掃描的時間間隔是不是太短了
delay_50us(7)只有350us,,你把這個數值調整到10毫秒左右試試

回復

使用道具 舉報

9#
ID:18297 發表于 2013-12-29 20:14 | 只看該作者
數碼管有陰影,
“P0=smg_du[disp[i]];
P2=smg_we[i];”
這個可以改為:
“P2=0xff;
P0=smg_du[disp[i]];
P2=smg_we[i};"
原理是:在數碼管數據輸出前,先關閉位選。再輸出新的數據,在輸出位選。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 中文字幕日韩欧美一区二区三区 | 欧美视频 亚洲视频 | 亚洲一级视频在线 | 国产精品一区二区视频 | 中文字幕乱码一区二区三区 | 欧美综合国产精品久久丁香 | 99re在线观看 | 特级黄色毛片 | 九九久久精品视频 | 欧美黄色一区 | 中文字幕国产精品视频 | 最新av在线网址 | 亚洲在线一区 | 一级黄色片免费 | 亚洲字幕在线观看 | 日韩中文字幕在线观看 | 亚洲欧洲成人在线 | 超碰在线播 | 91在线资源| 999免费视频 | 日本免费一区二区三区四区 | 亚洲三区视频 | 精品三区 | 欧美午夜精品久久久久久浪潮 | 亚洲精品一 | 四虎成人免费视频 | 国产精品久久在线观看 | 色综合99 | 亚洲一区欧美 | 国产精品久久久久久久粉嫩 | 国产午夜精品久久久 | 欧美操操操 | 久久精品中文 | 黄色一级免费看 | 欧美成人一区二区三区 | 国产精品国产精品国产专区不片 | 天天色综 | 秋霞电影一区二区三区 | 中文亚洲视频 | 男女视频在线观看 | 久草久 |