高精度时钟单片机设计
要靠自己!
好的 帮你做了 请留下邮箱
/*时钟程序,大家是否想到用定时器,对,也可用定时器的中断来处理,这样的程序我想不用我说了吧!
你们可自己发辉下,本程序采用外元件DS1302时钟IC,使用此IC不增加系统资源,要时钟时直
接去读取就可以了
本IC跟ADC0831一样以串口方式传送数据,不同的是协议,只要你读懂它的串口协议,就可以用
P口来模拟协议进行
,这样更能使你对传送数据协议的了解,在看本程序之前,先看看芯片的串口协议*/
这个程序是我的单片机开发板内光盘内的例子程序。肯定是没有问题的。
这需要一个非常常用的时钟芯片DS1302,与单片机相连的引脚非常少,只有三根。通过不同的
时序来对DS1302进行读写。
只要你先把这个程序看懂了,调整和闹铃功能都没有什么问题了。
如果要调整时钟。你通过键盘扫描程序将你要修改的值先存到单片机数据RAM里面。然后调用
DS1302写数据的子程序将数据送入DS1302,然后再启动DS1302就够了。
闹铃的话,你可以不断的将读出的时间和设定的闹铃时间进行比较,如果一到,然后就让闹铃
响。
#include <reg51.h>
#include <intrins.h>
sbit SCL2=P1^3; //SCL2定义为P1口的第3位脚,连接DS1302SCL和ADC0831SCL脚
sbit SDA2=P1^4; //SDA2定义为P1口的第4位脚,连接DS1302SCL和ADC0831SDA脚
//sbit CS2=P1^6; //CS2定义为P1口的第4位脚,连接ADC0831CS脚
sbit RST = P1^5; // DS1302片选脚
unsigned char l_tmpdate[8]={0x00,0x06,0x03,0x18,0x0c,0x07,0x06,0};
unsigned char l_tmpdisplay[8]={0x40,0x40,0x40,0x40,0x40,0x40,0x40,0};
code unsigned char write_rtc_address[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};
code unsigned char read_rtc_address[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};
code unsigned char table[]=
{0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,
0x40,0x00};
//共阴数码管 0-9 '-' '熄灭‘表
void delay();//延时子函数,5个空指令
void display(unsigned char *lp,unsigned char lc);//数字的显示函数;lp为指向数组的地
址,lc为显示的个数
//这个函数在第二节用过不用再说了吧!
void Write_Ds1302_byte(unsigned char temp);
void Write_Ds1302( unsigned char address,unsigned char dat );
unsigned char Read_Ds1302 ( unsigned char address );
void Read_RTC(void);//read RTC
void Set_RTC(void);//set RTC
void main(void) //入口函数
{
RST=0;
Set_RTC();
while(1){
Read_RTC();
switch (l_tmpdate[0]/5) //设计每个5秒 交替显示 年月日 时分秒
{
case 0:
case 2:
case 4:
case 6:
case 8:
case 10:
l_tmpdisplay[0]=l_tmpdate[2]/16; //
数据的转换,因我们采用数码管0~9的显示,将数据分开
l_tmpdisplay[1]=l_tmpdate[2]&0x0f;
l_tmpdisplay[2]=10;
//加入"-"
l_tmpdisplay[3]=l_tmpdate[1]/16;
l_tmpdisplay[4]=l_tmpdate[1]&0x0f;
l_tmpdisplay[5]=10;
l_tmpdisplay[6]=l_tmpdate[0]/16;
l_tmpdisplay[7]=l_tmpdate[0]&0x0f;
break;
case 1:
case 3:
case 5:
case 7:
case 9:
case 11:
l_tmpdisplay[0]=l_tmpdate[6]/16;
l_tmpdisplay[1]=l_tmpdate[6]&0x0f;
l_tmpdisplay[2]=10;
l_tmpdisplay[3]=l_tmpdate[4]/16;
l_tmpdisplay[4]=l_tmpdate[4]&0x0f;
l_tmpdisplay[5]=10;
l_tmpdisplay[6]=l_tmpdate[3]/16;
l_tmpdisplay[7]=l_tmpdate[3]&0x0f;
break;
default:
break;
}
display(l_tmpdisplay,8);
}
}
void display(unsigned char *lp,unsigned char lc)//显示
{
unsigned char i; //定义变量
P2=0; //端口2为输出
P1=P1&0xF8; //将P1口的前3位输出0,对应138译门输
入脚,全0为第一位数码管
for(i=0;i<lc;i++){ //循环显示
P2=table[lp[i]]; //查表法得到要显示数字的数码段
delay(); //延时
P2=0; //清0端口,准备显示下位
if(i==7) //检测显示完8位否,完成直接退出,不
让P1口再加1,否则进位影响到第四位数据
break;
P1++; //下一位数码管
}
}
void delay(void) //
空5个指令
{
unsigned char i=10;
while(i)
i--;
}
void Write_Ds1302_Byte(unsigned char temp)
{
unsigned char i;
for (i=0;i<8;i++) //循环8次 写入数据
{
SCL2=0;
SDA2=temp&0x01; //每次传输低字节
temp>>=1; //右移一位
SCL2=1;
}
}
/****************************************************************************/
void Write_Ds1302( unsigned char address,unsigned char dat )
{
RST=0;
_nop_();
SCL2=0;
_nop_();
RST=1;
_nop_(); //启动
Write_Ds1302_Byte(address); //发送地址
Write_Ds1302_Byte(dat); //发送数据
RST=0; //恢复
}
/****************************************************************************/
unsigned char Read_Ds1302 ( unsigned char address )
{
unsigned char i,temp=0x00;
RST=0;
_nop_();
SCL2=0;
_nop_();
RST=1;
_nop_();
Write_Ds1302_Byte(address);
for (i=0;i<8;i++) //循环8次 读取数据
{
SCL2=1;
_nop_();
if(SDA2)
temp|=0x80; //每次传输低字节
SCL2=0;
temp>>=1; //右移一位
}
RST=0;
_nop_();
SCL2=1;
SDA2=0;
return (temp); //返回
}
/****************************************************************************/
void Read_RTC(void) //读取 日历
{
unsigned char i,*p;
p=read_rtc_address; //地址传递
for(i=0;i<7;i++) //分7次读取 年月日时分秒星期
{
l_tmpdate[i]=Read_Ds1302(*p);
p++;
}
}
/***********************************************************************/
void Set_RTC(void) //设定 日历
{
unsigned char i,*p,tmp;
for(i=0;i<7;i++){
tmp=l_tmpdate[i]/10;
l_tmpdate[i]=l_tmpdate[i]%10;
l_tmpdate[i]=l_tmpdate[i]+tmp*16;
}
Write_Ds1302(0x8E,0X00);
p=write_rtc_address; //传地址
for(i=0;i<7;i++) //7次写入 年月日时分秒星期
{
Write_Ds1302(*p,l_tmpdate[i]);
p++;
}
Write_Ds1302(0x8E,0x80);
}
外加DS1302或者用DS12887吧。都是非常精确的时钟。
你的显示是什么?数码管吗?有几个?调时,怎么调?说详细点,我帮你。
一块主控芯片,加一个显示器(用数码管或者LCD1602)外加几个按键,就可以实现你的基本功能了。如果想时间精确,就再外加一个DS1302或者DS12887.
按照芯片资料上的说明,连接好就可以了。网上的电路图也非常多,程序也有好多。自己搜下就知道怎么做了。
加时钟芯片
设计一个单片机时钟。要求显示时、分、秒,并能修改时间,能进行定时控 ...
\/ 作品名称:基于单片机的二十四进制数字时钟 实现功能:正常显示、调时调分、秒位清零、整点报时 \/ ORG 0 START: MOV R0,#100 MOV R1,#0 MOV R2,#0 MOV R3,#0 MOV R4,#0 MOVR5,#0 MOVR6,#0 MOV20H,#20 \/***查表显示部分***\/ NEXT1: MOV A,R1 ...
单片机做时钟程序
POP PSW POP B POP ACC RETITABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,40H END 已赞过 已踩过< 你对这个回答的评价是? 评论 收起 更多回答(1) 其他类似问题 2018-11-14 求一个简单的单片机时钟程序 10 2013-09-12 用51单片机实现时钟功能程序??? 21 2018-04-15 ...
用单片机设计一个时钟,可显示时和分,可以调时间,也要有闹钟功能,要有设...
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...
单片机实现500KHZ时钟信号
LOOP:CPL P1.0 --- 1US AJMP LOOP --- 2US 周期是6us,超出了!LOOP:SETB P1.0 ---1US CLR P1.0 ---1US AJMP LOOP --- 2US 周期是4us,还是超出了!所以12M下不能通过编程产生500khz的时钟 那么只有提高单片机的晶振了,24M,机器周期0.5US LOOP:SETB P1.0 --- 0.5US ...
8051单片机时钟电路
8051单片机时钟电路如下所示:电容C2、C3对频率有微调的作用,电容容量的选择范围在30pF±10pF。震荡频率的选择范围为1.2-12MHz。时钟周期=石英振荡器频率的倒数。单片机是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I\/O口和...
数字时钟C语言设计.用的是51单片机。 00 秒 00 分 00 小时 还有小数点...
我这写了一个!使用数码管显示的!可以用键盘校对时间!你参考下。还写了一个液晶显示的!你要的话也可以发给你!include<reg52.h> define uchar unsigned char define uint unsigned int sbit K1=P3^0;sbit K2=P3^1;sbit K3=P3^2;uchar table[]={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x...
求大神帮忙做一个以单片机为基础的多功能电子时钟
1,系统具有3种工作模式状态(正常时钟显示模式、系统校准模式,秒表计时模式) 2,在正常时钟显示模式时,时钟具有显示年、月、日、时、分、秒的功能。3,在正常时钟显示模式时,时钟具有整点报时功能,在离整点前10秒时,自动发出鸣叫声,步长1秒,每隔1秒鸣叫一次,前4响为低音,后1响为高音,共鸣...
设计电子时钟 要用AT89S51单片机的定时器实现,用4位数码管显示,用点的...
设计电子时钟 要用AT89S51单片机的定时器实现,用4位数码管显示,用点的闪烁表示秒,我需要电路原理图 80 时间可以通过按键修改2个或者3个或者4个按键都可以... 时间可以通过按键修改 2个或者3个或者4个按键都可以 展开 我来答 4个回答 #热议# 已婚女性就应该承担家里大部分家务吗?
单片机89c51的电子时钟课程设计
include <reg52.h> include<stddef.h> define uchar unsigned char define uint unsigned int define LCD1602_FLAG define LCD1602_PORT P0 sbit lcd1602_rs=P2^0;sbit lcd1602_e=P2^2;sbit lcd1602_rw=P2^1;sbit lcd1602_busy=P0^7;sbit key_ch=P3^5;sbit key_add=P3^6;sbit key_minus=P3...
单片机电子钟原理图,帮我大概解释一下这个图的工作原理就可以了,谢谢...
PIC16C55单片机程序存储器只有512字节,加上采用外接32768Hz晶体振荡方式,时钟速度较低,因此,统筹好系统的工作时序与人机界面之间的关系是软件设计成败的关键。本机编程采用如下方案:软件工作流程见附图2。图 2 PIC16C55单片机的一个机器周期是4个时钟周期,不难算出,本系统中每秒有8192个机器周期。...
赞符双甲: 可以根据以下程序修改,数码管显示 此程序为国信长天51板子的程序,用到38译码器 #include<reg52.h> #define uchar unsigned char #define uint unsigned int sbit HC138A=P2^5; sbit HC138B=P2^6; sbit HC138C=P2^7; uchar num,num0,...
高陵县17588709469: 若要得到高精度的时钟信号,应怎样设计时钟电路 - ?
赞符双甲: 很简单的问题,晶振通过振荡电路起振(单片机内部带有)形成与晶振频率相应的时钟信号,单片机在时钟信号的作用下 运行程序指令,完成指令要求的任务.
高陵县17588709469: 用100管脚左右的单片机实现高精度时钟系统,应该怎么选择? - ?
赞符双甲: 高精度时钟系统与单片机的引脚多少没有关系,方法不对,管脚再多也解决不了.相反,方法对了,就是8个引脚的单片机也可以解决了.计时的精度在于晶振的频率要精确,要稳定.但是用单片机做时钟,因单片机需要执行指令来完成计时和显示的,这都会引起误差.可以用时钟芯片,DS1302来计时,所配的晶振要高精度的.其实,这样,仍然存在误差的,可以在编程上进行修补.要实现高精度计时,最好的办法是,接收GPS的授时信号,用一个接收GPS信号的模块,单片机来接收模块的数据,显示出时间.
高陵县17588709469: 用C语言编写AT89C51单片机程序,设计一个智能数字钟. - ?
赞符双甲: 基本要求:1.C语言程序要求是模块化设计.2.该闹钟基于AT89C51单片机及相关外围电路进行设计.3.该闹钟有6个数码管(共阳极),可分别显示时间(时、分、秒)、及定时时间(分、秒).4.该闹钟有4个按钮,S1是切换显示按键,该键按下时可分别实现切换正常走时显示、设定走时显示、设置定时时间,启动定时,回到正常状态等功能.S2是设定键,即该键按下,将分别选中需要设定的选项.S3键是加键,即按下去表示相应选项加1.S4键是减键,即按下去表示相应的选项减1.5.该闹钟可以定时时间到,LED将发出提示闪光,且持续30s.发挥要求:1.定时时间可被打断,即打断后恢复时继续计时.2.设置闹钟报警功能;3.能切换显示年月日等信息.
高陵县17588709469: 51单片机C语言高精度计时 - ?
赞符双甲: 若要高精度计时,可使用定时器,按照目前的单片机频率,计时精度可到uS.有些单片机带有PCA单元,计时更加方便
高陵县17588709469: 基于单片机的电子时钟 - ?
赞符双甲: 去百度文库,查看完整内容> 内容来自用户:啊宝1688 绪论 单片机在多功能数字电子钟中的应用已是非常普遍,人们对电子时钟的功能及工作顺序都已非常熟悉了,但是却很少知道它的内部结构以及工作原理.由单片机作为电子时钟的核心控...
高陵县17588709469: 基于单片机基础的指针式电子时钟设计 - ?
赞符双甲: 您好,方案一:静态显示.所谓静态显示,就是每个数码管的每一个段码都由一个单片机的I/O埠进行驱动.静态驱动的优点是编程简单,显示亮度高,缺点是占用I/O埠多,如驱动5个数码管静态显示则需要5*8=40根I/O埠来驱动.故实际应用时...
高陵县17588709469: 数字钟设计 单片机 - ?
赞符双甲: 相关资料: 多功能数字钟设计 一 简介 时钟, 自从它发明的那天起,就成为人类的朋友,但随着时间的推移,人们对它的功能又提出了新的要求,怎样让时钟更好的为人民服务,怎样让我们的老朋友焕发青春呢?这就要求人们不断设计出新型时...
高陵县17588709469: 如何用单片机实现高精度时间测量 - ?
赞符双甲: 用单片机实现高精度时间测量 前提是单片机晶振频率准,因它是计时的基准 其次单片机的运行速度要高,以便及时捕捉到脉冲的上升和下降沿,快速启动和关闭定时器,最好是定时器硬件捕获
高陵县17588709469: 单片机时钟设计思路 - ?
赞符双甲: 首先需要一个时钟信号.可以用DS1302,可能你会说我不想用,我用单片机定时器模拟,这样也可以,不过这你得把时间设置为当前时间.得对应,是吧! 有了时钟信号以后,(可以设计一个键盘电路与显示电路,这是方便直观查看与修改闹钟时间.当然,如果闹钟时间就是那个特定的值,就不用这些了.) 哦?差不多就可以了吧......