当前位置:文档之家› 51单片机数码管显示时钟(C语言)

51单片机数码管显示时钟(C语言)

case(6): LSA=1;LSB=0;LSC=0; break;
case(5): LSA=0;LSB=1;LSC=0; break;
case(4): LSA=1;LSB=1;LSC=0; break;
case(3): LSA=0;LSB=0;LSC=1; break;
case(2): LSA=1;LSB=0;LSC=1; break;
SCLK = 0;//先将 SCLK 置低电平。 _nop_(); RST = 1;//然后将 RST(CE)置高电平。 _nop_();
for(n=0; n<8; n++)//开始传送八位地址命令 {
DSIO = addr & 0x01;//数据从低位开始传送 addr >>= 1; SCLK = 1;//数据在上升沿时,DS1302 读取数据 _nop_(); SCLK = 0;//DS1302 下降沿时,放置数据 _nop_(); } _nop_(); for(n=0; n<8; n++)//读取 8 位数据 { dat1 = DSIO;//从最低位开始接收 dat = (dat>>1) | (dat1<<7); SCLK = 1; _nop_();
/******************************************************************************
*
*函数名 * 函数功能
: Ds1302Init : 初始化 DS1302.
*输 入
:无
*输 出
:无
*******************************************************************************
/
void Ds1302Init()
{
uchar n; Ds1302Write(0x8E,0X00);
//禁止写保护,就是关闭写保护功能
for (n=0; n<7; n++)//写入 7 个字节的时钟信号:分秒时日月周年
{
Ds1302Write(WRITE_RTC_ADDR[n],TIME[n]);
void LcdDisplay(); void Timer0Configuration();
/******************************************************************************
* * 函数名
: main
* 函数功能 * 输入
: 主函数 :无
/******************************************************************************
*
* 实验名
: 万年历实验
* 使用的 IO
:
* 实验效果
:1602 显示时钟
* 注意

*******************************************************************************
uchar n;
EA = 0; RST = 0; _nop_();
SCLK = 0;//先将 SCLK 置低电平。 _nop_(); RST = 1; //然后将 RST(CE)置高电平。 _nop_();
for (n=0; n<8; n++)//开始传送八位地址命令 {
DSIO = addr & 0x01;//数据从低位开始传送 addr >>= 1; SCLK = 1;//数据在上升沿时,DS1302 读取数据 _nop_(); SCLK = 0; _nop_(); } for (n=0; n<8; n++)//写入 8 位数据 { DSIO = dat & 0x01; dat >>= 1; SCLK = 1;//数据在上升沿时,DS1302 读取数据 _nop_(); SCLK = 0; _nop_(); }
* 输出
:无
*******************************************************************************
/
void main() {
Ds1302Init(); Timer0Configuration(); while(1) {
Ds1302ReadTime(); disp[7] = DIG_CODE[TIME[0]&0x0f]; disp[6] = DIG_CODE[TIME[0]>>4]; disp[5] = 0X40; disp[4] = DIG_CODE[TIME[1]&0x0f]; disp[3] = DIG_CODE[TIME[1]>>4]; disp[2] = 0X40; disp[1] = DIG_CODE[TIME[2]&0x0f]; disp[0] = DIG_CODE[TIME[2]>>4]; }
*输 出
: dat
*******************************************************************************
/
uchar Ds1302Read(uchar addr) {
uchar n,dat,dat1;
EA =0; RST = 0; _nop_();
/
#include<reg51.h> #include"ds1302.h"
//数码管 IO #define DIG P0 sbit LSA=P2^2; sbit LSB=P2^3; sbit LSC=P2^4;
unsigned char code DIG_CODE[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; unsigned char Num=0; unsigned int disp[8]={0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f};
} Ds1302Write(0x8E,0x80);
//打开写保护功能
}
/******************************************************************************
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////以下是 主文件 main.c 的内容
//---DS1302 时钟初始化 2013 年 1 月 1 日星期二 12 点 00 分 00 秒。---// //---存储顺序是秒分时日月周年,存储格式是用 BCD 码---// uchar TIME[7] = {0, 0, 0x12, 0x01, 0x01, 0x02, 0x13};
/******************************************************************************
RST = 0;//传送数据结束 _nop_(); EA = 1; }
/******************************************************************************
* *函数名
: Ds1302Read
* 函数功能 *输 入
: 读取一个地址的数据 : addr
//---DS1302 写入和读取时ห้องสมุดไป่ตู้秒的地址命令---// //---秒分时日月周年 最低位读写位;-------// uchar code READ_RTC_ADDR[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d}; uchar code WRITE_RTC_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};
case(1): LSA=0;LSB=1;LSC=1; break;
case(0): LSA=1;LSB=1;LSC=1; break;
} DIG=disp[Num]; //段选,选择显示的数字。 Num++; if(Num>7)
Num=0; }
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////以下是被调文件 ds1302.c 的内容 #include"ds1302.h"
/
void DigDisplay() interrupt 1 { //定时器在工作方式二会自动重装初,所以不用在赋值。 // TH0=0X9c;//给定时器赋初值,定时 1ms // TL0=0X00;
DIG=0; //消隐 switch(Num) //位选,选择点亮的数码管, {
case(7): LSA=0;LSB=0;LSC=0; break;
相关主题