时钟芯片编程
Ⅰ ds1302时钟芯片怎么连单片机
ds1302时钟芯片采用I2C总线和单片机连接,如果 单 片机没有I2C总线接口,可以用普通IO口模拟
Ⅱ 有没有人用过可编程锁相环合成时钟芯片
随着数字电路技术的发展,数字锁相环在调制解调、频率合成、FM 立体声解码、彩色副载波同步、图象处理等各个方面得到了广泛的应用。数字锁相环不仅吸收了数字电路可靠性高、体积小、价格低等优点,还解决了模拟锁相环的直流零点漂移、器件饱和及易受电源和环境温度变化等缺点,此外还具有对离散样值的实时处理能力,已成为锁相技术发展的方向。锁相环是一个相位反馈控制系统,在数字锁相环中,由于误差控制信号是离散的数字信号,而不是模拟电压,因而受控的输出电压的改变是离散的而不是连续的;此外,环路组成部件也全用数字电路实现,故而这种锁相环就称之为全数字锁相环(简称DPLL)。
基本原理:
传统的数字锁相环是利用输人信号与其输出信号之间的相位差别来跟踪输人信号,但由于锁相环具有一定的捕捉时间,采用这种数字锁相环不能准确提取输人信号的每一周期的相位改变,不能用于数显装置的动态测量。针对这些问题,设计出一种新型的全数字锁相环
全数字锁相环主要由数字鉴相器、可逆计数器、频率切换电路及N分频器四部分组成。其中可逆计数器及N分频器的时钟由外部晶振提供。不用VCO,可大大减轻温度及电源电压变化对环路的影响。同时,采用在系统可编程芯片实现有利于提高系统的集成度和可靠性。
现状和发展
目前,已有单片集成全数字锁相环的商用产品,但作为某一个实际项目设计,需要的锁相电路特性不尽相同,有些现成的产品,不是成本高、体积大、资源浪费多,就是不能完全满足设计性能的要求。根据位移检测的特点,采用高密度可编程逻辑器件,可根据实际要求,充分利用器件资源,同时把一些相关的数字电路组合在一起,不仅提高了系统的集成度和可靠性,降低了功耗,降低了成本。而且使电路性能得到明显改善。
Ⅲ 怎么读时钟芯片DS1302的时间
我的DS1302刚刚弄好。也遇到过你说的问题,原因是没有DS1302没有启动。首先你在开机时候如果DS1302处于掉电状态,则要在8EH输入00H,也就是初始化。否则不能对它进行操作,之后你就可以随意操作了。注意:1.如果是往DS1302里边写数据,在写之前要先将CLK置低电平,然后才能将RST置高。之后在前8个上升沿发送地址,下8个上升沿发送你要写的数据。完了RST置低,禁止操作。2.读的时候也是要先将CLK置低电平,然后才能将RST置高。之后在前8个上升沿发送地址,特别注意,在最后一个数据发送完了后,该脉冲的下降沿就会输出数据的第一位。所以实际上只有15个脉冲。3.另外数据的读写都是从低位发送和接收的。4.网上中文资料很多,你可以下来看看,但以上问题是往往被忽略的,和你一起分享下。
Ⅳ 只想用8563日历时钟芯片的定时器功能,请问对51单片机用C语言编程,SCL,SDA这两个引脚要用吗怎么用
您好! 程式如下,编译运行确认过没问题了:
#include<stdio.h>
void main()
{
int N, i, j;
int *elements;
int **diffTriangle;
printf("Please input N:");
scanf("%d", &N);
// 动态申请一维数据内存来存储输入数据
elements = (int*)malloc(N*sizeof(int));
// 动态申请二维数据内存来存储间差数据
diffTriangle = (int**)malloc((N - 1)*sizeof(int*));
for (i = 0; i < N - 1; i++)
diffTriangle[i] = (int*)malloc((N - 1)*sizeof(int));
// 输入数据
printf("Please input %d numbers:", N);
for (i = 0; i < N; i++)
scanf("%d", &elements[i]);
// 计算间差
for (i = 0; i < N - 1; i++)
for (j = 0; j <= i; j++)
diffTriangle[i][j] = elements[i+1] - elements[i-j];
// 输出
for (i = 0; i < N - 1; i++)
{
for (j = 0; j <= i; j++)
printf("%d\t", diffTriangle[i][j]);
printf("\n");
}
// 清空内存
free(elements);
for (i = 0; i < N - 1; i++)
free(diffTriangle[i]);
free(diffTriangle);
}
Ⅳ 有木有大佬帮我解释一下这段ds1302时钟芯片程序是什么意思
在前面的课程中我们已经了解到了不少关于时钟的概念,比如我们用的单片机的主时钟是11.0592M、I2C总线有一条时钟信号线SCL等,这些时钟本质上都是一个某一频率的方波信号。那么除了这些在前面新学到的时钟概念外,还有一个我们早已熟悉的不能再熟悉的时钟概念——年-月-日 时:分:秒,就是我们的钟表和日历给出的时间,它的重要程度我想就不需要多说了吧,在单片机系统里我们把它称作实时时钟,以区别于前面提到的几种方波时钟信号。实时时钟,有时也被称作墙上时钟,很形象的一个名词,对吧,大家知道他们讲的一回事就行了。本章,我们将学习实时时钟的应用,有了它,你的单片机系统就能在漫漫历史长河中找到自己的时间定位啦,可以在指定时间干某件事,或者记录下某事发生的具体时间,等等。除此之外,本章还会学习到C语言的结构体,它也是C语言的精华部分,我们通过本章先来了解它的基础,后面再逐渐达到熟练、灵活运用它,你的编程水平会提高一个档次哦。 15.1 BCD码的学习 在我们日常生产生活中用的最多的数字是十进制数字,而单片机系统的所有数据本质上都是二进制的,所以聪明的前辈们就给我们创造了BCD码。
BCD码(Binary-Coded Decimal)亦称二进码十进制数或二-十进制代码。用4位二进制数来表示1位十进制数中的0~9这10个数字。是一种二进制的数字编码形式,用二进制编码的十进制代码。BCD码这种编码形式利用了四个位元来储存一个十进制的数码,使二进制和十进制之间的转换得以快捷的进行。我们前边讲过十六进制和二进制本质上是一回事,十六进制仅仅是二进制的一种缩写形式而已。而十进制的一位数字,从0到9,最大的数字就是9,再加1就要进位,所以用4位二进制表示十进制,就是从0000到1001,不存在1010、1011、1100、1101、1110、1111这6个数字。BCD码如果到了1001,再加1的话,数字就变成了0001 0000这样的数字了,相当于用了8位的二进制数字表示了2位的十进制数字。关于BCD码更详细的介绍请点击 www.51hei.com 的基础教程栏目里面有很多相关文章.
BCD码的应用还是非常广泛的,比如我们这节课要学的实时时钟,日期时间在时钟芯片中的存储格式就是BCD码,当我们需要把它记录的时间转换成可以直观显示的ASCII码时(比如在液晶上显示),就可以省去一步由二进制的整型数到ASCII的转换过程,而直接取出表示十进制1位数字的4个二进制位然后再加上0x30就可组成一个ASCII码字节了,这样就会方便的多,在后面的实际例程中将看到这个简单的转换。
15.2 SPI时序初步认识 UART、I2C和SPI是单片机通信中最常用的三种通信协议。前边我们已经学了UART和I2C通信协议,这节课我们来学习剩下的SPI通信协议。SPI是英语Serial Peripheral Interface的缩写,顾名思义就是串行外围设备接口。SPI是一种高速的、全双工、同步通信总线,标准的SPI也仅仅使用4个引脚,常用于单片机和EEPROM、FLASH、实时时钟、数字信号处理器等器件的通信。SPI通信原理比I2C要简单,它主要是主从方式通信,这种模式通常只有一个主机和一个或者多个从机,标准的SPI是4根线,分别是SSEL(片选,也写作SCS)、SCLK(时钟,也写作SCK)、MOSI(主机输出从机输入Master Output/Slave Input)和MISO(主机输入从机输出Master Input/Slave Output)。
SSEL:从设备片选使能信号。如果从设备是低电平使能的话,当拉低这个引脚后,从设备就会被选中,主机和这个被选中的从机进行通信。
SCLK:时钟信号,由主机产生,和I2C通信的SCL有点类似。
MOSI:主机给从机发送指令或者数据的通道。
MISO:主机读取从机的状态或者数据的通道。
在某些情况下,我们也可以用3根线的SPI或者2根线的SPI进行通信。比如主机只给从机发送命令,从机不需要回复数据的时候,那MISO就可以不要;而在主机只读取从机的数据,不需要给从机发送指令的时候,那MOSI可以不要;当一个主机一个从机的时候,从机的片选有时可以固定为有效电平而一直处于使能状态,那么SSEL可以不要;此时如果再加上主机只给从机发送数据,那么SSEL和MISO都可以不要;如果主机只读取从机送来的数据,SSEL和MOSI都可以不要。 3线和2线的SPI大家要知道怎么回事,实际使用也是有应用的,但是当我们提及SPI的时候,一般都是指标准SPI,都是指4根线的这种形式。
SPI通信的主机也是我们的单片机,在读写数据时序的过程中,有四种模式,要了解这四种模式,首先我们得学习一下2个名词。
CPOL:Clock Polarity,就是时钟的极性。
时钟的极性是什么概念呢?通信的整个过程分为空闲时刻和通信时刻,SCLK在数据发送之前和之后的空闲状态是高电平那么CPOL=1,如果空闲状态SCLK是低电平,那么CPOL=0。
CPHA:Clock Phase,就是时钟的相位。
主机和从机要交换数据,就牵涉到一个问题,即主机在什么时刻输出数据到MOSI上而从机在什么时刻采样这个数据,或者从机在什么时刻输出数据到MISO上而主机什么时刻采样这个数据。同步通信的一个特点就是所有数据的变化和采样都是伴随着时钟沿进行的,也就是说数据总是在时钟的边沿附近变化或被采样。而一个时钟周期必定包含了一个上升沿和一个下降沿,这是周期的定义所决定的,只是这两个沿的先后并无规定。又因为数据从产生的时刻到它的稳定是需要一定时间的,那么,如果主机在上升沿输出数据到MOSI上,从机就只能在下降沿去采样这个数据了。反之如果一方在下降沿输出数据,那么另一方就必须在上升沿采样这个数据。
CPHA=1,就表示数据的输出是在一个时钟周期的第一个沿上,至于这个沿是上升沿还是下降沿,这要是CPOL的值而定,CPOL=1那就是下降沿,反之就是上升沿。那么数据的采样自然就是在第二个沿上了。
CPHA=0,就表示数据的采样是在一个时钟周期的第一个沿上,同样它是什么沿由CPOL决定。那么数据的输出自然就在第二个沿上了。仔细想一下,这里会有一个问题:就是当一帧数据开始传输第一bit时,在第一个时钟沿上就采样该数据了,那么它是在什么时候输出来的呢?有两种情况:一是SSEL使能的边沿,二是上一帧数据的最后一个时钟沿,有时两种情况还会同时生效。
我们以CPOL=1/CPHA=1为例,把时序图画出来给大家看一下,如图15-1所示,。
Ⅵ 单片机编程的时钟,跟专业的时钟芯片做的时钟有什么区别
几乎没有区别。
专业的时钟芯片可以用电池很小的电流维持时钟工作,有些芯片还可以给电池涓流充电。
很多单片机也有节电模式,同样可以很省电,还可以做出很多其他功能,只是要自己设计实现,比较麻烦,体积也比较大。
说到底,“专业的时钟芯片”内部也是一个单片机系统,不过是别人做好了的、功能已经固定了的专用系统罢了。
Ⅶ DS1302芯片如何进行12/24 制显示时间转换的编程(C语言)
修改DS1302芯片的(85h、84h)寄存的BIT7进行12/24小时模式切换,BIT7=1是12小时模式,BIT7=0是24小时模式。
Ⅷ 求一份用74ls192芯片做的数字时钟电路图
如图所示:

主要突出计数和进位,略去预置和校时,及简化了七段码显示电路。
(8)时钟芯片编程扩展阅读:
现在流行的串行时钟电路很多,如DS1302、DS1307、PCF8485等。这些电路的接口简单、价格低廉、使用方便,被广泛地采用。
实时时钟电路DS1302是DALLAS公司的一种具有涓细电流充电能力的电路,主要特点是采用串行数据传输,可为掉电保护电源提供可编程的充电功能,并且可以关闭充电功能。采用普通32.768kHz晶振。
时钟芯片DS1302的各引脚功能如下:
Vcc1:主电源;Vcc2:备份电源。当Vcc2>Vcc1+0.2V时,由Vcc2
向DS1302供电,当Vcc2< Vcc1时,由Vcc1向DS1302供电。
SCLK:串行时钟,输入,控制数据的输入与输出;
I/O:三线接口时的双向数据线;
RST为复位引脚,在读、写数据期间,必须为高,
X1 X2为32.768Hz晶振管脚,为芯片提供时钟脉冲。
Ⅸ 用单片机设计一个时钟,可显示时和分,可以调时间,也要有闹钟功能,要有设计的电路图
其实不用定时中断也能实现功能:
#include<reg51.h> 主函数
unsigned char tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};定义0-9数组
unsigned int tmp;定义变量
void delay(unsigned int xms)定义延时函数
{unsigned int j,i;
for(i=0;i<xms;i++)
for(j=0;j<100;j++);
}
void disp()定义子函数
{
P1=tmp;
delay(1);
P2=0xff;
tmp=tmp<<1;
}
void main( )
{
unsigned char z,s=00,m=00,h=00;给时钟初始值
while(1)
{
for(z=0;z<100;z++)
{
tmp=0x01;
P2=tab[h/10];小时显示
disp();
P2=tab[h%10];
disp();
P2=tab[m/10];分钟显示
disp();
P2=tab[m%10];
disp();
P2=tab[s/10];秒显示
disp();
P2=tab[s%10];
disp();
}
s++;
while(s==60)秒进一位,到60清0
{
m++;
s=00;
}
while(m==60)分钟进一位,到60清0
{
h++;
m=00;
}
while(h==24)小时进一位,到24清0
{
h=00;
}
}
}
