基于51与DS1302时钟芯片数码管显示万年历

基于51与DS1302时钟芯片数码管显示万年历
基于51与DS1302时钟芯片数码管显示万年历

基于51与DS1302时钟芯片数码管显示

#include

#include

#define uchar unsigned char

#define uint unsigned int

uchar data_7seg[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

uchar hour,min,sec,year,mon,day,week,count,count1,ts;

sbit rst=P1^0; //1302脚1

sbit sck=P1^1; //1302脚2

sbit io=P1^2; //1302脚3

sbit shi=P1^3; //时

sbit fen=P1^4; //分

sbit miao=P1^5; //秒

sbit nian=P1^6; //年

sbit yue=P1^7; //月

sbit ri=P3^0; //日

sbit xq=P3^1; //星期

sbit miaodian=P3^2; //秒点

sbit deng=P3^3; //整点报时灯

sbit gm=P3^4; //光敏模块

sbit zd=P3^5; //节日报模块

sbit sun=P3^6; //太阳灯

sbit yuel=P3^7; //月亮灯

/******************************函数声明********************************************/

void write_ds1302_byte(uchar dat); //1302字节写

void write_ds1302(uchar add,uchar dat); //1302地址读

uchar read_ds1302(uchar add); //1302地址读

void read_rtc(); //1302字节写

void set_rtc();

void display();

void delay(int n);

void dsbz(); //判断语句定义

/**********************************DS1302单字节写入***********************************/

void write_ds1302_byte(uchar dat)

{

uchar i;

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

{

sck=0;

io=dat&0x01;

dat=dat>>1;

sck=1;

}

}

/***********************************DS1302多字节写入************************************/

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;

}

/****************************************DS1302读取**************************************************/

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()

{

if (shi==0)

delay(100);

{

hour=(hour>>4)*10+(hour&0x0f);

hour++;

if (hour==24) hour=0;

hour=((hour/10)<<4)+(hour%10);

write_ds1302(0x84,hour);

}

if (fen==0)

delay(100);

if (fen==0)

{

min=(min>>4)*10+(min&0x0f);

min++;

if (min==60) min=0;

min=((min/10)<<4)+(min%10);

write_ds1302(0x82,min);

}

if (miao==0)

delay(100);

if (miao==0)

{

sec=(sec>>4)*10+(sec&0x0f);

sec++;

if (sec==60) sec=0;

sec=((sec/10)<<4)+(sec%10);

write_ds1302(0x80,sec);

}

if (nian==0)

delay(100);

if (nian==0)

{

year=( year>>4)*10+( year&0x0f);

year++;

if ( year==37) year=0;

year=(( year/10)<<4)+( year%10);

write_ds1302(0x8c, year);

}

if (yue==0)

if (yue==0)

{

mon=(mon>>4)*10+(mon&0x0f);

mon++;

if (mon==13) mon=1;

mon=((mon/10)<<4)+(mon%10);

write_ds1302(0x88,mon);

}

if (ri==0)

delay(100);

if (ri==0)

{

day=(day>>4)*10+(day&0x0f);

day++;

if (day==32) day=1;

day=((day/10)<<4)+(day%10);

write_ds1302(0x86,day);

}

if (xq==0)

delay(100);

if (xq==0)

{

week=(week>>4)*10+(week&0x0f);

week--;

if (week==0) week=7;

week=((week/10)<<4)+(week%10);

write_ds1302(0x8A,week);

}

}

/****************************************************读取时间*********************************/

void read_rtc()

{

year=read_ds1302(0x8d); //年

mon=read_ds1302(0x89); //月

day=read_ds1302(0x87); //日

week=read_ds1302(0x8b); //星期

hour=read_ds1302(0x85); //时

min=read_ds1302(0x83); //分

sec=read_ds1302(0x81); //秒

}

/*************************************显示时间********************************************/

void display()

{

unsigned int a=1;

P2=0x06;P0=data_7seg[year,0x02];delay(a); //年

P2=0x07;P0=data_7seg[year%1];delay(a);

P2=0x08;P0=data_7seg[year/16];delay(a);

P2=0x09;P0=data_7seg[year%16];delay(a);

P2=0x0a;P0=data_7seg[mon/16];delay(a); //月

P2=0x0b;P0=data_7seg[mon%16];delay(a);

P2=0x0c;P0=data_7seg[day/16];delay(a); //日

P2=0x0d;P0=data_7seg[day%16];delay(a);

P2=0x0e;P0=data_7seg[week/1];delay(a); //星期

P2=0x00;P0=data_7seg[hour/16];delay(a); //时

P2=0x01;P0=data_7seg[hour%16];delay(a);

P2=0x02;P0=data_7seg[min/16];delay(a); //分

P2=0x03;P0=data_7seg[min%16];delay(a);

P2=0x04;P0=data_7seg[sec/16];delay(a); //秒

P2=0x05;P0=data_7seg[sec%16];delay(a);

}

/**********************************延时程序*****************************************************/

void delay(int n)

{

unsigned int i,j;

for(i=0;i

{

for(j=0;j<121;j++)

{;}

}

}

/*****************************************主程序**************************************************/

void main()

{

TMOD=0x01;

TH0=0x3c;

TL0=0xb0;

EA=1;

ET0=1;

while (1)

{

set_rtc(); //按键

read_rtc(); //读取时间

display(); //延时函数

dsbz(); //判断函数

TR0=1;

}

}

/****************************************判断语句*******************************************************/

void dsbz()

{

if(hour==0x12&&min==0x00&&sec<0x12) //中午12点报时

{

deng=0;

delay(100);delay(100);delay(100);

deng=1;

delay(100);delay(100);delay(100);

deng=0;

}

if(hour==0x12&&min==0x00&&sec>=0x12) //12点报时停{

deng=1;

}

if(hour==0x18&&min==0x00&&sec<6) //16点报时开始{

deng=0;

delay(100); delay(100);delay(100);

deng=1;

delay(100); delay(100);delay(100);

deng=0;

}

if(hour==0x18&&min==0x00&&sec>=6) //16点报时停{

deng=1;

}

if(gm==0&&hour==0x00&&min==0x30) //光敏睡觉报警{

deng=0;

delay(100); delay(100);delay(100);

deng=1;

delay(100); delay(100);delay(100);

deng=0;

}

if(gm==1&&hour==0x00) //光敏睡觉报警停

{

deng=1;

}

if(hour<0x18&&hour>=0x05) //月亮转太阳

{

sun=0;

yuel=1;

}

if(hour>=0x18&&hour>=0x05) //太阳转月亮{

sun=1;

yuel=0;

}

if(day==0x13) //彩灯

{

zd=0;

}

if(day==0x14)

{

zd=1;

}

}

void int1()interrupt 1

{

count++;

if(count==10)

{

count=0;

count1++;

}

if(count1==1)

{

miaodian=0;

}

if(count1==2)

{

miaodian=1;

count1=0;

}

}

ds1302时钟程序详解-ds1302程序流程图(C程序)

ds1302时钟程序详解,ds1302程序流程图(C程序) ds1302时钟程序详解 DS1302 的控制字如图2所示。控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入DS1302中,位6如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1指示操作单元的地址;最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始 输出。 2.3 数据输入输出(I/O) 在控制指令字输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从低位即位0开始。同样,在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从 低位0位到高位7。 2.4 DS1302的寄存器 DS1302有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式,其日 历、时间寄存器及其控制字见表1。 此外,DS1302 还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM相关的寄存器等。时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器容。 DS1302与RAM相关的寄存器分为两类:一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为C0H~FDH,其中奇数为读操作,偶数为写操作;另一类为突发方式下的RAM寄存器,此方式下可一次性读写所有的RA M的31个字节,命令控制字为FEH(写)、FFH(读)。

ds1302程序流程图 3.2 DS1302实时时间流程 图4示出DS1302的实时时间流程。根据此流程框图,不难采集实时时间。下面结合流程图对DS1302的基 本操作进行编程:

多位数码管动态扫描protues仿真

实验题目:多位数码管动态扫描电路设计与调试 一、实验要求与目的 1、设计要求 8位数码管显示“8.8.8.8.8.8.8.8.”,即点亮显示器所有段,持续约500ms 之后,数码管持续约1s ;最后显示“HELLO —10”,保持。 2、实验目的 1、掌握数码管动态扫描显示原理及实现方法。 2、掌握动态扫描显示电路驱动程序的编写方法。 二、设计思路 1、在Proteus 中设计仿真电路原理图。 2、在Keil C51软件中编译并调试程序,程序后缀必须是.c 。调试时生成hex 文件,确认 无误后将生成的hex 文件添加到原理图的单片机中进行仿真。 3、观察电路仿真结果对程序进行更改直至达到预期结果 三、实验原理 p2[0..3] p0[0..7]p 00p 00p 07p 06p 0605p 02p 05p 04p 04p 03p 03p 02p 02p 01p 01p 07p 23p 22p 21p 20A 15B 14C 13D 12 01122334455667798109 11 U2 7445 A 02 B 018A 13B 117A 24B 216A 35B 315A 46B 414A 57B 513A 68B 612A 7 9 B 7 11 C E 19A B /B A 1 U3 74HC245 234567891 RP1 RESPACK-8 XTAL2 18 XTAL119 RST 9 P3.0/RXD 10P3.1/TXD 11P3.2/INT012P3.3/INT113P3.4/T014P3.7/RD 17 P3.6/WR 16P3.5/T115AD[0..7]A[8..15] ALE 30EA 31PSEN 29 P1.0/T21 P1.1/T2EX 2P1.23P1.34P1.45P1.56P1.67P1.78 U4 AT89C52 图1 原理图

DS1302时钟芯片读写详解

DS1302时钟芯片读写详解 2008-09-26 13:07 /*DS1302读写程序(C51)*/ sbit DS13CLK =P1^5; /*DS1302的SCLK脚脉冲*/ sbit DS13IO =P1^6; /*DS1302的IO脚数据*/ sbit DS13CS =P1^7; /*DS1302的RST脚片选*/ /*向DS1302写一个字节*/ void _wds13byte(uchar _code) { uchar i; DS13CLK =0; DS13CLK =0; for(i=0;i<8;i++) { if(_code&0x01) DS13IO =1; else DS13IO =0; DS13CLK =1; DS13CLK =1; DS13CLK =0; DS13CLK =0; _code =_code >> 1; } } /*从DS1302读一个字节*/ uchar _rds13byte(void) { uchar i,_code; _code=0; DS13CLK =0; DS13CLK =0; DS13IO =1; for(i=0;i<8;i++) { _code =_code >>1; if(DS13IO) _code =_code|0x80; DS13CLK =1; DS13CLK =1; DS13CLK =0; DS13CLK =0; } return _code; } /*读功能_code读功能命令*/ uchar readds1302(uchar _code)

{ DS13CS =0; /*关闭DS1302*/ DS13CLK =0; DS13CLK =0; DS13CS =1; /*使能DS1302*/ _wds13byte(_code); /*读代码*/ _code=_rds13byte(); /*返回读取数字*/ DS13CLK =1; DS13CS =0; /*关闭DS1302*/ return _code; } /*写功能fp写的地址,_code写的内容*/ void writeds1302(uchar fp,uchar _code) { DS13CS =0; /*关闭DS1302*/ DS13CLK =0; DS13CLK =0; DS13CS =1; /*使能DS1302*/ _wds13byte(fp); /*写控制命令*/ _wds13byte(_code); /*写入数据*/ DS13CLK=1; DS13CS =0; /*关闭DS1302*/ } /*******DS1302设置快速充电***************/ void ds13_charg(void) { writeds1302(0x8e,0x00); /*解除写保护*/ writeds1302(0x90,0xa5); /*单二极管2K电阻充电*/ writeds1302(0x8e,0x80); /*置位写保护*/ } ;;;DS1302读写程序(汇编);;; ;******************************************************************* **/ T_CLK Bit P1.5 ;实时时钟时钟线引脚 T_IO Bit P1.6 ;实时时钟数据线引脚 T_RST Bit P1.7 ;实时时钟复位线引脚 ;********************************************************** ;子程序名:Set1302 ;功能:设置DS1302 初始时间,并启动计时。 ;说明: ;调用:RTInputByte ;入口参数:初始时间在:Second,Minute,Hour,Day,Month,Week.YearL(地址连续) ;出口参数:无 ;影响资源:A B R0 R1 R4 R7

ds1302数码管显示应用

DS1302应用 刚学单片机,好多好奇,所以想做个简单的时钟。下面是PROTEUS仿真电路和电路图,简单易懂。 文笔不好,说了多余。下面是程序。 #include #include #include #define uint unsigned int #define uchar unsigned char #define BCDTUAN(str) (str/10*16+str%10) //定义宏,将要写入DS1302的时间转化为BCD码 #define Write_Sec 0x80 #define Write_Min 0x82 #define Write_Hou 0x84 #define Write_Dat 0x86 #define Write_Mon 0x88 #define Write_day 0x8a #define Write_Yea 0x8c #define Write_WP 0x8e //写保护位 #define Write_TCR 0x90 #define Read_Sec 0x81 #define Read_Min 0x83 #define Read_Hou 0x85 #define Read_Dat0x87 #define Read_Mon 0x89 #define Read_Day 0x8b #define Read_Yea 0x8d #define CLK_BurstW 0xbf //时钟突发模式写 #define CLK_BurstR 0xbf //时钟突发模式读 #define Write_RAM_Begin 0xc0 //RAM第一个字节写指令 #define Read_RAM_Begin 0xc1 //RAM第一个字节读指令 #define RAM_BurstW 0xfe //突发模式写RAM #define RAM_BurstR 0xff //突发模式读RAM sbit _74hc154_A = P1^0; sbit _74hc154_B = P1^1; sbit _74hc154_C = P1^2; sbit _74hc154_D = P1^3; sbit CE =P1^6; sbit SCLK=P1^5; sbit IO =P1^4; uchar code scan[][4]={{0,0,0,0},{0,0,0,1},{0,0,1,0},{0,0,1,1}, {0,1,0,0},{0,1,0,1},{0,1,1,0},{0,1,1,1}, {1,0,0,0},{1,0,0,1},{1,0,1,0},{1,0,1,1},

基于DS1302的数码管显示数字钟

单片机原理课程设计 课题名称:基于DS1302的数码管显示数字钟 专业班级:电子信息工程 学生学号: 学生姓名: 指导教师: 设计时间:2010年6月21日--2010年6月25日

目录 摘要........................................................................................................................................................................ 1 设计任务和要求............................................................................................................................................ 2 方案论证........................................................................................................................................................ 3 系统硬件设计................................................................................................................................................ 3.1 系统总原理图 ................................................................................................................................ 3.2 元器件清单...................................................................................................................................... 3.3 PCB板图....................................................................................................................................... 3.4 Proteus仿真图 ............................................................................................................................... 3.5 分电路图及原理说明................................................................................................................... 3.5.1 主控部分(单片机MCS-51).............................................................................. 3.5.2 计时部分(实时时钟芯片DS1302).................................................................. 3.5.3 显示部分(共阳极数码管)................................................................................ 3.5.4 调时部分(按键)................................................................................................ 4系统软件设计................................................................................................................................................ 4.1 程序流程图..................................................................................................................................... 4.2 程序源代码........................................................................................................................................ 5心得体会........................................................................................................................................................ 6参考文献........................................................................................................................................................ 7结束语............................................................................................................................................................

数码管显示程序(汇编语言)

实验三数码显示 一、实验目的 了解LED数码管动态显示的工作原理及编程方法。 二、实验内容 编制程序,使数码管显示“DJ--88”字样。 三、实验程序框图 四、实验步骤 联机模式: (1)在PC机和实验系统联机状态下,运行该实验程序,可用鼠标左键单击菜单栏“文件”或工具栏“打开图标”,弹出“打开文件”的对话框,然后打开598K8ASM

文件夹,点击S6.ASM文件,单击“确定”即可装入源文件,再单击工具栏中编译装载,即可完成源文件自动编译、装载目标代码功能,再单击“调试”中“连续运行”或工具图标运行,即开始运行程序。 (2)数码管显示“DJ--88”字样。 脱机模式: 1、在P.态下,按SCAL键,输入2DF0,按EXEC键。 2、数码管显示“DJ--88”字样。 五、实验程序清单 CODE SEGMENT ;S6.ASM display "DJ--88" ASSUME CS:CODE ORG 2DF0H START: JMP START0 PA EQU 0FF20H ;字位口 PB EQU 0FF21H ;字形口 PC EQU 0FF22H ;键入口 BUF DB ?,?,?,?,?,? data1: db0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h,88h,83h,0 c6h,0a1h db 86h,8eh,0ffh,0ch,89h,0deh,0c7h,8ch,0f3h,0bfh,8FH,0F0H START0: CALL BUF1 CON1: CALL DISP JMP CON1 DISP: MOV AL,0FFH ;00H MOV DX,PA OUT DX,AL MOV CL,0DFH ;显示子程序 ,5ms MOV BX,OFFSET BUF DIS1: MOV AL,[BX] MOV AH,00H PUSH BX MOV BX,OFFSET DATA1 ADD BX,AX MOV AL,[BX] POP BX MOV DX,PB

DS1302时钟芯片的原理与应用

DS1302 时钟芯片的原理与应用 1 写保护寄存器操作 当写保护寄存器的最高位为0 时,允许数据写入寄存器,写保护寄存器可以通过命令字节8E 8F 来规定禁止写入/读出。写保护位不能在多字节传送模式下写入Write_Enable: MOV Command,#8Eh ;命令字节为8E MOV ByteCnt,#1 ;单字节传送模式 MOV R0,#XmtDat 数据地址覆给R0 MOV XmtDat,#00h 数据内容为0 写入允许 ACALL Send_Byte 调用写入数据子程序 RET 返回调用本子程序处 当写保护寄存器的最高位为1 时禁止数据写入寄存器 Write_Disable: MOV Command,#8Eh ;命令字节为8E MOV ByteCnt,#1 ;单字节传送模式 MOV R0,#XmtDat 数据地址覆给R0 MOV XmtDat,#80h 数据内容为80h 禁止写入 ACALL Send_Byte 调用写入数据子程序 RET 返回调用本子程序处 以上程序调用了基本数据发送(Send_Byte)模块及一些内存单元定义, 其源程序清单在附录中给出下面 的程序亦使用了这个模块 2 时钟停止位操作 当把秒寄存器的第7 位时钟停止位设置为0 时起动时钟开始 Osc_Enable: MOV Command,#80h ; 命令字节为80 MOV ByteCnt,#1 ; 单字节传送模式 MOV R0,#XmtDat 数据地址覆给R0 MOV XmtDat,#00h 数据内容为0 振荡器工作允许 ACALL Send_Byte 调用写入数据子程序 RET 返回调用本子程序处 当把秒寄存器的第7 位时钟停止位设置为1 时,时钟振荡器停止DS1320 进入低功耗方式 Osc_Disable: MOV Command,#80h ;命令字节为80 MOV ByteCnt,#1 ;单字节传送模式 MOV R0,#XmtDat 数据地址覆给R0 MOV XmtDat,#80h 数据内容为80h 振荡器停止 ACALL Send_Byte 调用写入数据子程序 RET 返回调用本子程序处 3. 多字节传送方式

基于DS1302与数码管设计的可调数字钟

学习情境2-可调式数字钟 之基于DS1302与数码管设计的可调数字钟 ☆点名,复习 1、定时器的工作方式有哪些?如何对定时器进行初始化。 2、数码管动态显示技术的原理? ☆新课讲授 2.2 基于DS1302与数码管设计的可调数字钟 前面我们用定时器产生1秒的时间,从而也设计出了可以调节数字钟,但用这种方法设计出来的电子钟不够准确。这节课我们用美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路DS1302 ,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能。同时,我们还是用数码管作为显示时间的硬件。 2.2.1 DS1302芯片技术资料 DS1302 是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM 数据。DS1302内部有一个31×8的用于临时性存放数据的RAM寄存器。DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后背电源双电源引脚,同时提供了对后背电源进行涓细电流充电的能力。DS1302的外部引脚分配如图1所示及内部结构如图2所示。DS1302用于数据记录,特别是对某些具有特殊意义的数据点的记录上,能实现数据与出现该数据的时间同时记录,因此广泛应用于测量系统中。 图 1 DS1302引脚 图2 DS1302内部结构 1、引脚功能及结构

DS1302的引脚排列,其中Vcc1为后备电源,VCC2为主电源。在主电源关闭的情况下,也能保持时钟的连续运行。DS1302由Vcc1或Vcc2两者中的较大者供电。当Vcc2大于Vcc1+0.2V时,Vcc2给DS1302供电。当Vcc2小于Vcc1时,DS1302由Vcc1供电。X1和X2是振荡源,外接32.768kHz晶振。RST是复位/片选线,通过把RST输入驱动置高电平来启动所有的数据传送。RST输入有两种功能:首先,RST接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,RST提供终止单字节或多字节数据的传送手段。当RST为高电平时,所有的数据传送被初始化,允许对DS1302进行操作。如果在传送过程中RST置为低电平,则会终止此次数据传送,I/O引脚变为高阻态。上电运行时,在Vcc≥2.5V之前,RST必须保持低电平。只有在SCLK为低电平时,才能将RST置为高电平。I/O为串行数据输入输出端(双向),SCLK 始终是输入端。 2 、DS1302的寄存器和控制命令 对DS1302的操作就是对其内部寄存器的操作,DS1302内部共有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式。 小时寄存器(85h、84h)的位7用于定义DS1302是运行于12小时模式还是24小时模式。当为高时,选择12小时模式。在12小时模式时,位5是,当为1时,表示PM,当为0时,表示AM。在24小时模式时,位5是第二个10小时位。 秒寄存器(81h、80h)的位7定义为时钟暂停标志(CH)。当该位置为1时,时钟振荡器停止,DS1302处于低功耗状态;当该位置为0时,时钟开始运行。 控制寄存器(8Fh、8Eh)的位7是写保护位(WP),其它7位均置为0。在任何的对时钟和RAM的写操作之前,WP位必须为0。当WP位为1时,写保护位防止对任一寄存器的写操作。 日历、时间寄存器及控制字如表1所示: 此外,DS1302还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM相关的寄存器等。时钟突发寄存器可一次性顺序读写除充电寄存器以外的寄存器。DS1302内部的RAM分为两类,一类是单个RAM单元,共31个,每个单元为一个8位的字节,其命令控制字为COH~FDH,其中奇数为读操作,偶数为写操作;再一类为突发方式下的RAM,此方式下可一次性读写所有的RAM的31个字节,命令控制字为FEH(写)、FFH(读)。

ds1302时钟程序详解经典

dsl302时钟程序详解经典 dsl302时钟程序详解 DS1302的控制字如图2所示。控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入DS1302中,位6如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1指示操作单元的地址;最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始 2.3数据输入输出(I/O) 在控制指令字输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从低位即位0开始。同样,在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位0 位到高位7o 2.4 DS1302的寄存器 DS1302有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位 为BCD码形式,其日历、 时间寄存器及其控制字见表1。

? I日历?別间襦存祁及凡担制孑 fir* 野擅"itwtr 収他总cn - T ?fsy网 移 e S』3 2 1 0 林斶 son8!ll00-59 f.H IUSVX SIX X2H S3II oum(1Mh、 MH K4H851101 \2A12 24? 10 IIH HK MhH M7II01 -2S.2V, W-Jl ?o imiAre 8SH WII03 - !2(11) 0 IUM MOYI1I AAII8HH ni(i II ? 0 0h\V 8LH Mill OQ ? 9910YLAH 此外,DS1302还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器 及与RAM相关的寄存器等。时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器内容。DS1302与RAM相关的寄存器分为两类:一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为COH, FDH,其中奇数为读操作,偶数为写操作;另一类为突发方式下的RAM寄存器,此方式下可一次性读写所有的RAM的31个字节,命令控制字为FEH(写)、FFH(读)。 dsl302程序流程图

数码管动态显示教案

电子综合设计实训 题目数码管动态显示 _ 姓名 专业 学号 指导教师 郑州科技学院电气工程学院

目录 摘要.................................................................................................. I 1背景. (1) 1.1介绍 (1) 1.2设计步骤 (2) 2 设计思路 (3) 2.1方案对比 (3) 3元件的选择 (6) 3.1单片机 (6) 3.2 显示元器件的选择 (6) 4 设计原理及功能说明 (8) 4.1 各部分功能说明 (8) 5 装配与调试 (14) 5.1装配 (14) 5.2调试 (14) 6 总结 (15) 附录 (17) 附录一:元件清单 (17) 附录二:电路源程序 (17)

数码管动态显示的设计 摘要 本文介绍了一种基于AT89C51单片机的8个数码管滚动显示单个数字的设计,让八位数码管滚动显示0、1、2、3、4、5、6、7,我们以液晶显示技术的发展为背景,选择了比较常用的液晶数码管显示模块,利用了单片机控制数码管模块的显示机理。研究学习AT89C51单片机其功能,对学习过的单片机,C语言课程进行巩固,设计一款在8只数码管上流动显示单个数字的程序,并用PROTEUS进行电路设计和实时仿真。该电路有两部分组成:AT89C51单片机和显示模块组成。AT89C51单片机具有超低功耗和CPU外围的高度整合性;显示模块数码管是由多个发光二极管封装在一起组成“8”字型的器件,引线已在内部连接完成,只需引出它们的各个笔划,公共电极,方便易用。实际应用中不需要外部任何元器件即可实现,具有接口电路简单、可靠,易于编程的特点,抗干扰性好等特点。 单片机技术使我们可以利用软硬件实现数码管准确显示各种数码。而且这种技术相对简单,性价比较高,在我们生活中应用很广泛,具有一定的发展前景。 关键词:AT89C51单片机;数码管;滚动显示

最新ds1302时钟程序详解 含电路图 源程序 注释资料

以下资料摘自电子发烧友网感谢作者,版权归网站所有,资料仅供参考 ds1302时钟程序详解 DS1302 的控制字如图2所示。控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入DS1302中,位6如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1指示操作单元的地址;最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出。 2.3 数据输入输出(I/O) 在控制指令字输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从低位即位0开始。同样,在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位0位到高位7。 2.4 DS1302的寄存器 DS1302有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式,其日历、时间寄存器及其控制字见表1。

此外,DS1302 还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM相关的寄存器等。时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器内容。DS1302与RAM相关的寄存器分为两类:一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为C0H~FDH,其中奇数为读操作,偶数为写操作;另一类为突发方式下的RAM寄存器,此方式下可一次性读写所有的RAM的31个字节,命令控制字为FEH(写)、FFH(读)。 ds1302程序流程图

3.2 DS1302实时时间流程 图4示出DS1302的实时时间流程。根据此流程框图,不难采集实时时间。下面结合流程图对DS1302的基本操作进行编程:

基于51单片机的LED数码管动态显示

基于51单片机的LED数码管动态显示 LED数码管动态显示就是一位一位地轮流点亮各位数码管,对于每一位LED数码管来说,每隔一段时间点亮一次,利用人眼的“视觉暂留"效应,采用循环扫描的方式,分时轮流选通各数码管的公共端,使数码管轮流导通显示。当扫描速度达到一定程度时,人眼就分辨不出来了。尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,认为各数码管是同时发光的。若数码管的位数不大于8位时,只需两个8位I/O口。 1 硬件设计 利用51单片机的P0口输出段码,P2口输出位码,其电路原理图如下所示。 在桌面上双击图标,打开ISIS 7 Professional窗口(本人使用的是v7.4 SP3中文版)。单击菜单命令“文件”→“新建设计”,选择DEFAULT模板,保存文件名为“DT.DSN”。在器件选择按钮中单击

“P”按钮,或执行菜单命令“库”→“拾取元件/符号”,添加如下表所示的元件。 51单片机AT89C51 一片 晶体CRYSTAL 12MHz 一只 瓷片电容CAP 22pF 二只 电解电容CAP-ELEC 10uF 一只 电阻RES 10K 一只 电阻RES 4.7K 四只 双列电阻网络Rx8 300R(Ω) 一只 四位七段数码管7SEG-MPX4-CA 一只 三极管PNP 四只 若用Proteus软件进行仿真,则上图中的晶振和复位电路以及U1的31脚,都可以不画,它们都是默认的。 在ISIS原理图编辑窗口中放置元件,再单击工具箱中元件终端图标,在对象选择器中单击POWER 和GROUND放置电源和地。放置好元件后,布好线。左键双击各元件,设置相应元件参数,完成电路图的设计。 2 软件设计 LED数码管动态显示是一位一位地轮流点亮各位数码管的,因此要考虑每一位点亮的保持时间和间隔时间。保持时间太短,则发光太弱而人眼无法看清;时间太长,则间隔时间也将太长(假设N位,则间隔时间=保持时间X(N-1)),使人眼看到的数字闪烁。在程序中要合理的选择合适的保持时间和间隔时间。而循环次数则正比于显示的变化速度。 LED数码管动态显示的流程如下所示。

51单片机DS1302日历时钟程序

51 单片机ds1302 时钟芯片 #define uint unsigned int #define uchar unsigned char sbit lcdrs = P1^0; sbit lcdrw = P1^1; sbit lcden = P1^2; sbit key0 = P2^0;//功能键,选择时分秒 sbit key1 = P2^1;//加1键 sbit key2 = P2^2;//减1键 sbit key4 = P2^4; sbit clk_1302 = P1^5; //1302芯片位定义sbit io_1302 = P1^6; sbit rst_1302 = P1^7; uchar bdata dat; sbit dat0 = dat^0; sbit dat7 = dat^7; uchar key0_count;//按键0被按的次数(0~3) uchar flag; char hour,minute,second; uchar table_date[] = "2009-4-12 Mon"; uchar table_time[] = "00:00:00"; /****** 函数申明********/ void write_cmd_1602(uchar cmd); void write_data_1602(uchar dat); void write_add(uchar add,uchar dat); void init1602(); void delay(uint z); uchar reverse(uchar c); void keyscan(); void init(); void RTC_initial (); void wr_1302(uchar wr_data); uchar rd_1302(void); uchar uc_R1302(uchar ucAddr); void v_W1302(uchar ucAddr, uchar ucDa); 主程序 #include

时钟芯片DS1302 8位数码管显示

时钟芯片DS1302 8位数码管显示 [日期:2011-03-19 ] [来源:本站编辑作者:佚名] [字体:大中小] (投递新闻) ;8位数码管显示 ;P0 为段码口、P2 为位码口 ;时钟芯片:DS1302 ;-------------------------------------- DS1302 端口位定义: IO_DA TA→P1.1 ; 数据传送总线 SCLK →P1.0 ; 时钟控制总线 RST →P1.2 ; 复位总线 ;--------------------------------------- 24C04 端口位定义: SDA→P3.6 ;24C01的串行数据线 SCLK →P3.7 ;24C01的串行时钟线 ;--------------------------------------- K1 →P1.4 ;独立键 K2 →P1.5 K3 →P1.6 K4 →P1.7 ;--------------------------------------- BEEP →P3.3 ;蜂鸣器 ;--------------------------------------- 使用8位数码管显示: 段码→P0 位码→P2 ;--------------------------------------- 开机显示: 08-48-58 ;实时时间的显示,时、分、秒 K1: →切换显示内容键,每按一下可切换显示内容,最后返回实时时间的显示。 05-03-06 ;显示年、月、日 ;-------------------------------------------------------------------- K2: →时间与日期设定键, K3: →选择键(位移键) 每按一下可切换设定内容,最后返回实际时间的显示。在设定过程中,被选中的设定位闪动。选择顺序:时→分→日→月→年→返回 K1: →UP 键 K2: →DOWN 键

数码管动态扫描显示01234567

实验5 数码管动态扫描显示01234567 原理图:8个数码管它的数据线并联接到JP5, 位控制由8个PNP型三级管驱动后由JP8引出。 相关原理: 数码管是怎样来显示1,2,3,4呢?数码管实际上是由7个发光管组成8字形构成的,加上小数点就是8个。我们分别把他命名为 A,B,C,D,E,F,G,H。

搞懂了这个原理, 我们如果要显示一个数字2, 那么 A,B,G,E,D这5个段的发光管亮就可以了。也就是把B,E,H(小数点)不亮,其余全亮。根据硬件的接法我们编出以下程序。当然在此之前,还必须指定哪一个数码管亮,这里我们就指定最后一个P2.7。 LOOP: CLR P2.7 ;选中最后的数码管 SETB P0.7 ;B段不亮 SETB P0.5 ;小数点不亮 SETB P0.1 ;C段不亮 CLR P0.2 ;其他都亮 CLR P0.3 CLR P0.4 CLR P0.6 CLR P0.0 JMP LOOP ;跳转到开始重新进行

END 把这个程序编译后写入单片机,可以看到数码管的最后一位显示了一个数字2。 也许你会说:显示1个2字就要10多行程序,太麻烦了。 显示数字2则是C,F,H(小数点)不亮,同时由于接法为共阳接法,那么为0(低电平)是亮 为1(高电平)是灭。从高往低排列,(p0.7_p0.0)写成二进制为01111110, 把他转化为16进制则为A2H。我们可以根据硬件的接线把数码管显示数字编制成一个表格, 以后直接调用就行了。 有了这个表格上面显示一个2的程序则可简化为: LOOP: CLR P2.7 ;选中左边的数码管 MOV P0,#0A2H ;送数字2的代码到P0口 JMP LOOP ;跳转到开始重新进行 END

DS1302和51单片机设计电子钟数码管显示

DS1302和51单片机设计电子钟数码管显示 2010-09-03 10:39 DS1302和51单片机设计电子钟数码管显示(未作出防真) #include #define uchar unsigned char #define uint unsigned int uchar dis[16]={0,0,0,0,10,10,0,0,7,2,9,0,9,0,0,2}; uchar P2_scan[4]={0xf7,0xfb,0xfd,0xfe}; //位选择显示扫描uchar P0_scan[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}; //数字显示不带小数点 uchar P0_scan1[11]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x7f} ;//数字显示带小数点 char clock[7]={4,0,15,10,27,9,9}; uchar tiao,m=0,n=8,S; bit time=0,p=0; sbit CLK = P1^0; sbit IO = P1^1; sbit RST = P1^2; sbit P32 = P3^2; sbit P33 = P3^3; sbit P34 = P3^4; sbit P35 = P3^5; /**************************** 延时函数 **************************/ void delay(uchar time)//延时0.1ms { uchar i,j; do{ for(i=0;i<10;i++) for(j=0;j<20;j++); time--; }while (time>0); } /***************************** 复位函数 ******************************/ void reset() { CLK = 0; RST = 0;

51单片机可调的ds1302时钟程序

#include #include #define uchar unsigned char #define uint unsigned int uchar count_10ms; //定义10ms计数器 sbit K1 = P3^7; //定义K1键 sbit K2 = P3^4; //定义K2键 sbit K3 = P3^5; //定义K3键 sbit K4 = P3^6; //P1^3定义K4键 sbit K5 = P3^3; sbit BEEP=P2^2; //定义蜂鸣器 sbit reset = P1^6; //P2^5; sbit sclk = P1^7; //P2^6; sbit io = P2^6; //P2^7; sbit LCD_RS=P1^0; sbit LCD_RW=P1^1 ; sbit LCD_EN=P1^2; bit K1_FLAG=0; //定义按键标志位,当按下K1键时,该位置1,K1键未按下时,该位为0。 uchar disp_buf[16] ={0x00}; //定义显示缓冲区 uchar time_buf[7] ={0,0,0x12,0,0,0,0}; //DS1302时间缓冲区,存放秒、分、时、日、月、星期、年 uchar temp [2]={0}; //用来存放设置时的小时、分钟的中间值 uint m=0,n=0,r=0; /********以下是函数声明********/ void Delay_ms(uint xms) ; bit lcd_busy(); void lcd_wcmd(uchar cmd); void lcd_wdat(uchar dat) ; void lcd_clr() ; void lcd_init() ; void write_byte(uchar inbyte); //写一字节数据函数声明 uchar read_byte(); //读一字节数据函数声明 void write_ds1302(uchar cmd,uchar indata); //写DS1302函数声明 uchar read_ds1302(uchar addr); //读DS1302函数声明 void set_ds1302(uchar addr,uchar *p,uchar n); //设置DS1302初始时间函数声明 void get_ds1302(uchar addr,uchar *p,uchar n); //读当前时间函数声明 void init_ds1302(); //DS1302初始化函数声明 /********以下是延时函数********/ void Delay_ms(uint xms) { uint i,j;

相关文档
最新文档