搜档网
当前位置:搜档网 › 使用DS12C887设置高精度可调节时钟 Microsoft Word 文档

使用DS12C887设置高精度可调节时钟 Microsoft Word 文档

使用DS12C887设置高精度可调节时钟 Microsoft Word 文档
使用DS12C887设置高精度可调节时钟 Microsoft Word 文档

#include"reg52.h"

#define uchar unsigned char

#define uint unsigned int

sbit rs=P3^5; //1602液晶声明

sbit lcden=P3^4; 管脚

sbit rw=P3^6;

sbit s1=P3^0; //功能键

sbit s2=P3^1; //增大键

sbit s3=P3^2; //减少键

sbit rd=P3^7; //置零端

sbit beep=P2^3;//蜂鸣器管脚声明

sbit dscs=P1^4;//ds12c887管脚声明

sbit dsas=P1^5;

sbit dsrw=P1^6;

sbit dsds=P1^7;

sbit dsirq=P3^3;

sbit dula=P2^6;//数码管段选声明

sbit wela=P2^7;///位选声明

sbit alarmk=P1^3;//闹钟开关键

char amiao,ashi,afen;

uchar count,slnum,flag;

bit flag1;

char miao,fen,shi,nian,yue,ri,week; uchar code table[]=" 20 - - "; uchar code table1[]=" : : ";

void write_ds(uchar,uchar); //ds写入函数

uchar read_ds(uchar);//ds读出函数

// void set_time(); 时间初始化函数

void set_riq(); //设置时钟的布局

void delay(uchar z) //延时函数

{

uint x,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

void di() //按键声

{

beep=0;

delay(100);

beep=1;

}

void didi() //闹钟声

{

beep=0;

delay(50);

beep=1;

delay(100);

beep=0;

delay(50);

beep=1;

}

void write_com(uchar com) //液晶写入命令

{ 写入

rs=0;

rw=0;

lcden=0;

P0=com;

delay(5);

lcden=1;

delay(5);

lcden=0;

}

void write_date(uchar date) //液晶写入数据

{

rs=1;

rw=0;

lcden=0;

P0=date;

delay(5);

lcden=1;

delay(5);

lcden=0;

}

void init() //初始化

{

EA=1; //开中断

EX1=1;

IT1=1; //下降沿触发

lcden=0;

week=1;

dula=0;

wela=0;

flag=0;

// write_ds(0x0a,0x20); 更改出厂时的设置,开启振荡器write_ds(0x0B,0x026);//开闹钟,BCD模式

write_com(0x38);//液晶初始化

write_com(0x0c);

write_com(0x06);

write_com(0x01);

write_com(0x80);

}

void set_riq()

{

uchar num;

write_com(0x80+0);

for(num=0;num<16;num++)

{

write_date(table[num]);

delay(5);

}

write_com(0x80+0x40);

for(num=0;num<16;num++)

{

write_date(table1[num]);

delay(5);

}

}

void write_sfm(uchar add,uchar date) //时分秒写入函数{

uchar shi,ge;

shi=date/10;

ge=date%10;

write_com(0x80+0x40+add);

write_date(0x30+shi);

write_date(0x30+ge);

}

void write_sfm1(uchar add,uchar date) //年月日写入函数{

uchar shi,ge;

shi=date/10;

ge=date%10;

write_com(0x80+add);

write_date(0x30+shi);

write_date(0x30+ge);

}

void write_week(uchar we) //星期写入函数

{

write_com(0x80+12);

switch(we)

{

case 1: write_date('M');

delay(5);

write_date('O');

delay(5);

write_date('N');

break;

case 2: write_date('F');

delay(5);

write_date('U');

delay(5);

write_date('E');

break;

case 3: write_date('W');

delay(5);

write_date('E');

delay(5);

write_date('N');

break;

case 4: write_date('F');

delay(5);

write_date('H');

delay(5);

write_date('U');

break;

case 5: write_date('F');

delay(5);

write_date('R');

delay(5);

write_date('I');

break;

case 6: write_date('S');

delay(5);

write_date('A');

delay(5);

write_date('T');

break;

case 7: write_date('S');

delay(5);

write_date('U');

delay(5);

write_date('N');

break;

}

}

void keyscan() //键盘扫描

{

rd=0;

if(flag1==1) //闹钟响时任意键结束

{

if(s1==0)

{

delay(5);

if(s1==0)

{

while(!s1);

di();

flag1=0;

}

}

if(s2==0)

{

delay(5);

if(s2==0)

{

while(!s2);

di();

flag1=0;

}

}

if(s3==0)

{

delay(5);

if(s3==0)

{

while(!s3);

di();

flag1=0;

}

}

}

if(s1==0)

{

delay(5);

if(s1==0)

{

slnum++ ;

flag=1;

while(!s1);

di();

if(slnum==1)

{

write_com(0x80+0x40+10);

write_com(0x0f);

}

if(slnum==2)

{

write_com(0x80+0x40+7);

}

if(slnum==3)

{

write_com(0x80+0x40+4);

}

if(slnum==4)

{

write_com(0x80+12);

}

if(slnum==5)

{

write_com(0x80+9);

}

if(slnum==6)

{

write_com(0x80+6);

}

if(slnum==7)

{

write_com(0x80+3);

}

if(slnum==8)

{

write_sfm(10,amiao);

write_com(0x80+0x40+10);

}

if(slnum==9)

{

write_sfm(7,afen);

write_com(0x80+0x40+7);

}

if(slnum==10)

{

write_sfm(4,ashi);

write_com(0x80+0x40+4);

}

if(slnum==11)

{

slnum=0;

write_ds(1,amiao);

write_ds(3,afen);

write_ds(5,ashi);

write_com(0x0c);

write_ds(0,miao);

write_ds(2,fen);

write_ds(4,shi);

write_ds(6,week);

write_ds(7,ri);

write_ds(8,yue);

write_ds(9,nian);

flag=0;

}

}

}

if(slnum!=0)

{

if(s2==0)

{

delay(5);

if(s2==0)

{

while(!s2);

di();

if(slnum==1)

{

miao++;

if(miao==60)

miao=0;

write_sfm(10,miao) ; write_com(0x80+0x40+10);

}

if(slnum==2)

{

fen++;

if(fen==60)

fen=0;

write_sfm(7,fen) ;

write_com(0x80+0x40+7);

}

if(slnum==3)

{

shi++;

if(shi==24)

shi=0;

write_sfm(4,shi) ;

write_com(0x80+0x40+4);

}

if(slnum==4)

{

week++;

if(week==8)

week=1;

write_week(week) ;

write_com(0x80+12);

}

if(slnum==5)

{

ri++;

if(ri==32)

ri=1;

write_sfm1(9,ri);

write_com(0x80+9); }

if(slnum==6)

{

yue++;

if(yue==13)

yue=1;

write_sfm1(6,yue);

write_com(0x80+6); }

if(slnum==7)

{

nian++;

if(nian==100)

nian=1;

write_sfm1(3,nian);

write_com(0x80+3); }

if(slnum==8)

{

amiao++;

if(nian==60)

amiao=0;;

write_sfm(10,amiao);

write_com(0x80+0x40+10);

}

if(slnum==9)

{

afen++;

if(nian==60)

afen=0;;

write_sfm(7,afen);

write_com(0x80+0x40+7);

}

if(slnum==10)

{

ashi++;

if(nian==24)

amiao=0;;

write_sfm(4,ashi);

write_com(0x80+0x40+4);

}

}

}

if(s3==0)

{

delay(1);

if(s3==0)

{

while(!s3);

di();

if(slnum==1)

{

miao--;

if(miao==-1)

miao=59;

write_sfm(10,miao) ; write_com(0x80+0x40+10);

}

if(slnum==2)

{

fen--;

if(fen==-1)

fen=59;

write_sfm(7,fen) ;

write_com(0x80+0x40+7);

}

if(slnum==3)

{

shi--;

if(shi==-1)

shi=23;

write_sfm(4,shi) ;

write_com(0x80+0x40+4);

}

if(slnum==4)

{

week--;

if(week==-1)

week=7;

write_week(week) ;

write_com(0x80+12);

}

if(slnum==5)

{

ri--;

if(ri==0)

ri=31;

write_sfm1(9,ri);

write_com(0x80+9); }

if(slnum==6)

{

yue--;

if(yue==0)

yue=12;

write_sfm1(6,yue);

write_com(0x80+6); }

if(slnum==7)

{

nian--;

if(nian==-1)

nian=99;

write_sfm1(3,nian);

write_com(0x80+3);

}

if(slnum==8)

{

amiao--;

if(amiao==-1)

amiao=59;;

write_sfm(10,amiao);

write_com(0x80+0x40+10);

}

if(slnum==9)

{

afen--;

if(afen==-1)

afen=59;

write_sfm(7,afen);

write_com(0x80+0x40+7);

}

if(slnum==10)

{

ashi--;

if(ashi==-1)

ashi=23;

write_sfm(4,ashi);

write_com(0x80+0x40+4);

}

}

}

}

}

void write_ds(uchar add,uchar date) {

dscs=0;

dsas=1;

dsds=1;

dsrw=1;

dsas=0;

dsrw=0;

P0=date;

dsrw=1;

dsas=1;

dscs=1;

}

uchar read_ds(uchar add) {

uchar ds_date;

dsas=1;

dsds=1;

dsrw=1;

dscs=0;

P0=add;

dsas=0;

dsds=0;

P0=0xff;

ds_date=P0;

dsds=1;

dsas=1;

dscs=1;

return ds_date;

}

/* void set_time()//设置时间{

write_ds(4,7);//小时

write_ds(2,2);//分钟

write_ds(6,3);//星期

write_ds(7,4);//日

write_ds(8,5);//月

write_ds(9,6);//年

} */

void main()

{

set_riq();

while(1)

{

keyscan();

if(flag1==1)

didi();

if(alarmk==1) // 要将alarmk置低后闹钟才开启

{

write_ds(1,0);

write_ds(3,0);

write_ds(5,0);

}

if(flag==0)

{

miao=read_ds(0);//读取数据

fen=read_ds(2);

shi=read_ds(4);

week=read_ds(6);

ri=read_ds(7);

yue=read_ds(8);

nian=read_ds(9);

write_sfm(10,miao);//写入数据

write_sfm(7,fen);

write_sfm(4,shi);

write_week(week);

write_sfm1(9,ri);

write_sfm1(6,yue);

write_sfm1(3,nian);

}

}

}

void exter() interrupt 2

{

uchar c ;

flag1=1 ;

c=read_ds(0x0c); }

基于DS12C887时钟芯片的高精度时钟的设计

华侨大学厦门工学院 本科生毕业设计(论文)题目:基于DS12C887时钟芯片的高精度时钟的设计姓名:吴挺 学号:0902106019 系别:电气工程 专业:电气工程及其自动化 年级:2009 指导教师:刘晓东 年月日

独创性声明 本毕业设计(论文)是我个人在导师指导下完成的。文中引用他人研究成果的部分已在标注中说明;其他同志对本设计(论文)的启发和贡献均已在谢辞中体现;其它内容及成果为本人独立完成。特此声明。 论文作者签名:日期: 关于论文使用授权的说明 本人完全了解华侨大学厦门工学院有关保留、使用学位论文的规定,即:学院有权保留送交论文的印刷本、复印件和电子版本,允许论文被查阅和借阅;学院可以公布论文的全部或部分内容,可以采用影印、缩印、数字化或其他复制手段保存论文。保密的论文在解密后应遵守此规定。 论文作者签名:指导教师签名:日期:

基于DS12C887时钟芯片的高精度时钟的设计 摘要 随着社会的发展人们的生活节奏越来越快,每天的工作,学习,休息的时间都安排的很紧,需要一个时钟准确的报时。人们对时钟的要求越来越高,不仅要求每天的的时间误差小于几毫秒,还要求具有定时闹钟,具有万年历等功能。传统的日历电子钟元器件多、维修麻烦、误差大、功能更新不方便。DS12C887时钟芯片能够自动显示年、月、日、时、分、秒等时间信息,同时还具有校时,报时,闹钟等功能。DS12C887也可以很方便的由软件编程进行功能的调整或增加。所以设计基于DS12C877时钟芯片的高精度时钟的设计具有十分重要的现实意义和实用价值。 关键词:DS12C887,时钟芯片,单片机STC89C52,高精度时钟

实时时钟设计实验报告

实验报告

源代码: #pragma sfr //使用特殊功能寄存器 #pragma EI //开中断 #pragma DI //关中断 #pragma access //使用绝对地址指令 #pragma interrupt INTTM000 Time //定义时间中断函数为Time #pragma interrupt INTKR OnKeyPress //定义按键中断为OnKeyPress #pragma interrupt INTP5 OnKeyOver //定义INT中断为OnKeyOver void Init_Led(); void InitKey_INTKR(); void Init_Lcd(); void Init_Inter(); void LightOneLed(unsigned char ucNum); void LightOff(); int Count_Day(int month); char i=0; //定义变量i,是切换时间的标志 int key=0; //定义key=0 int temp=1; //用于存放当前月的天数 int temp1=1; int second=0; //默认的秒second=0 int minute=0; //默认的分minute=0 int hour=12; //默认的时hour=12 int day=1; //默认的天day=1 int month=5; //默认的月month=5 int year=2014; //默认的年year=2014 int c_hour=1; //默认的闹钟时=1 int c_minute=1; //默认的闹钟分=1 int buffs[2]; //秒的数码显示缓存区 int buffm[2]; //分的数码显示缓存区 int buffh[2]; //时的数码显示缓存区 int buffday[2]; //天的数码显示缓存区 int buffmonth[2]; //月的数码显示缓存区 int buffyear[4]; //年的数码显示缓存区 int buffmd[4]; //月,天的数码显示缓存区 int buffhm[4]; //时,分的数码显示缓存区 int buffms[4]; //分,秒的数码显示缓存区 int buffch[2]; //闹钟时的数码显示缓存区 int buffcm[2]; //闹钟分的数码显示缓存区 unsigned char Que = 0; //INT中断中间变量 int LCD_num[10]={0X070d,0x0600,0x030e,0x070a,0x0603,0x050b,0x050f,0x0700,0x070f,0x070b};// 数字0~~9的显示码 unsigned char Scond; //…………………………延时函数1……………………// void Delay(int k){ i nt i,j; f or(i=0;i

基于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结束语............................................................................................................................................................

模拟时钟转动程序

模拟时钟转动程序 一、课程设计的内容 能模拟机械钟表行走,还要准确利用数字显示日期和时间,在屏幕上显示一个活动时钟,按任意键时程序退出。 二、课程设计的要求与数据 1.进一步掌握和利用C语言进行课程设计的能力 2.进一步理解和运用结构化程序设计的思想和方法 3.初步掌握开发一个小型实用系统的基本方法 4.学会调试一个较长程序的基本方法 5.学会利用流程图和N-S图表示算法 6.掌握书写程序设计开发文当的能力 三、课程设计应完成的工作 1、编写完成相应题目的程序 2、编写课程设计报告,课程设计报告应该包含以下6部分 1)需求分析:包括设计题目、设计要求以及系统功能需求分析 2)总体设计:包括系统总体设计框架和系统功能模块图 3)详细设计:包括主要功能模块的算法设计思路以及对应的工作流程图 4)调试分析过程描述:包括测试数据、测试输出结果以及对程序测试过程中存在问题进行思考(主要问题的出错现象、出错原因、 解决方法及其效果等,相应效果截图) 5)总结:课程设计完成了哪些主要功能,是否有扩展功能?还有哪些地方需要改进?课程设计的学习与体会?有哪些合理化建 议? 6)附录:主要原程序代码含必要的注释 3、答辩:在实验室建立程序运行环境,并在指导教师的监督下,独立解决问题,运行程序和回答教师的提问。 四、课程设计进程安排

五、应收集的资料及其主要参考文献 [1]谭浩强.C程序设计(第三版)[M]北京:清华大学出版社,2005年9月 [2]谭浩强.C程序设计题解与上机指导(第三版)[M]北京:清华大学出版社,2005年7月 [3]夏宝岚张慕蓉夏耘.程序设计教程(第二版)[M],上海:华东理工出版社,2003.1 [4]陈锦昌赵明秀.C语言计算机绘图教程(第一版)[M],广州:华南理工大 学出版社,1998.9 发出任务日期:2010年12月15日指导教师签名: 计划完成日期:2010年12月30日基层教学单位责任人签名: 主管院长签章: 目录 1.设计目的与要求 (5)

51定时器和lcd12864做的实时时钟显示(附图)

#include #include"intrins.h" #define uchar unsigned char #define uint unsigned int sbit rs=P1^0; sbit rw=P1^1; sbit e=P2^5; sbit psb=P1^2; sbit rst=P1^4; uchar hour,fen,miao,num; uchar code table[]="时间:"; uchar sbuf[]={0,0,0,0,0,0}; void delay(uint x) { uchar i,j; for(i=x;i>0;i--) for(j=110;j>0;j--); } void Timer0Init(void) //50??@11.0592MHz { TMOD |= 0x01; //??????? TL0 = 0x00; //??????

TH0 = 0x4C; //?????? EA=1; ET0=1; TR0=1; //???0???? } void Delay2ms() //@11.0592MHz { unsigned char i, j; _nop_(); i = 4; j = 146; do { while (--j); } while (--i); } void Delay100us() //@11.0592MHz { unsigned char i, j; i = 2; j = 109; do { while (--j); } while (--i);

void Delay50ms() //@11.0592MHz { unsigned char i, j, k; i = 3; j = 207; k = 28; do { do { while (--k); } while (--j); } while (--i); } void write_12864com(uchar com) { rs=0; rw=0; Delay100us(); P0=com; e=1; Delay100us(); e=0; Delay100us(); }

51单片机数码管时钟电路的设计_AT89C51

广东石油化工学院 《51单片机原理与实践》课程设计报告 学院计算机与电子信息学院 专业 班级 学号 姓名 指导教师 课程成绩 完成日期 2010年12月27日

数码管时钟电路的设计 一、设计目的: 通过这次课程设计掌握单片机系统的基本设计步骤及设计思路,掌握汇编语言的用法及各种指令的含义,比较熟练的运用指令进行单片机系统的设计的,熟悉用KEIL软件进行汇编语言的汇编,以及把代码写入实验板中,观测代码结合实际的运行结果后进行调整,体会到编程的分析问题、确定算法、画程序流程图、编写程序、程序功能模块化的优点的各各步骤。 二、设计要求: LED数码管时钟电路采用24h计时方式,时、分、秒用六位数码管显示。该电路采用AT89C2051单片机,使用3V电池供电,只使用一个按键开关即可进入调时、省电(不显示LED数码管)和正常显示三种状态。 三、设计实验内容: 1. 硬件的设计 其采用AT89C51单片机应用设计,LED显示采用动态扫描方式实现,P0口输出段码数据,P2口输出位码数据,P1.1、P1.2接按钮开关。为了提供LED数码管的驱动电流,采用6MHz晶振。 2. 系统总体分析 系统主要包含四大模块:显示模块、时间计时模块、模式切换模块和模式设置模块。 显示模块:主要由主循环负责。内存中开辟了一段8字节的内存空间,

用作数据显示的字符缓冲区。主循环不断将缓冲区中的字符呈现至数码管。 ● 时间计时模块:电子钟的核心模块,记录了时间的时、分、秒信息。 ● 模式切换模块(MODE ):切换电子钟的设置模式,包括时设置、分设置、秒设置、闹铃开关设置、闹铃时设置和闹铃分设置。相关数据被设置时将闪烁显示。 ● 模式设置模块(CONFIG ):通过判断设置模式(MODE ),执行相应的设置。如时、分、秒的增1以及闹铃开关的变换。 另外,主循环还负责扫描键盘,检测相应键是否被按下,若MODE 键被按下则在特定单元中登记该功能,并启动定时器1,然后返回继续执行显示功能。在定时器1中断时,被登记的功能正式执行。期间用时约10ms ,用以消除机械抖动。 主循环流程图大致如下: 图(一)主循环流程图 定时器1中断服务程序流程图如下: 开始 键被按下 登记相应功能 数码管显示 是 否

模拟时钟电路的程序

//单片机实验模板文件。具有三个基本功能: // 1、数码管、发光二极管扫描显示 // 2、键盘扫描,返回0---15 // 3、T0中断,产生基本延时2.5ms,并且调用显示函数 // 根据以上功能,该文件为进一步编写实验程序、实际应用程序,提供了基础 #include #define delay5ms(x) {delay_xms=x*2; while(delay_xms<255);} //用于延时的宏,x的1个数值对应延时5ms。 x<=127。 void display(void); unsigned char code ledcode[]={0x3f,6,0x5b,0x4f,0x66,0x6d,0x7d,7,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0}; //共阴极7段数码管显示段码 //unsigned char xdata dis_seg _at_ 0xfeff; //输出数码管段显示码地址 //unsigned char xdata dis_bit _at_ 0xfdff; //输出数码管位控制码地址unsigned char min,sec,hour; unsigned char bdata dis_buf[7]; //dis_buf[0]为最高位数据(显示在左边),dis_buf[5]为最低位数据;dis_buf[6]为8个发光二极管的数据。 unsigned char data delay_xms; //用于延时 sfr IPH = 0xb7; //定义中断优先级(高2级)寄存器 //****************************************************************** void int_t0(void) interrupt 1 //T0中断函数,fosc按11.0592M计算,定时时间为2.5ms { TH0=0xf7; delay_xms--; display(); //调用显示函数 } //****************************************************************** void display(void) //数码管显示函数。左边是最高位,从左边开始扫描,函数每执行1次仅扫描1位,每2.5ms扫描一位 { static unsigned char data i=0, scan=0xfe; P0=0; if(i<6) P0=ledcode[dis_buf[i]]; else

基于51单片机的DS12C887时钟芯片的程序

#include #define uchar unsigned char #define uint unsigned int uchar code table[]=" 2011-10-03 MON"; uchar code table1[]=" 00:00:00"; sbit lcden=P2^7; sbit lcdrs=P2^6; sbit lcdrw=P2^5; sbit dscs=P1^0; sbit dsas=P1^1; sbit dsrw=P1^2; sbit dsds=P1^3; sbit dsirq=P3^3; sbit s1=P3^0; sbit s2=P3^1; sbit s3=P3^2; sbit rd=P3^7; uchar num,nian,yue,ri,zhou,s1num,flag; char miao,fen,shi; void delay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } void write_com(uchar com) { lcdrs=0; P0=com; delay(5); lcden=1; delay(5); lcden=0; } void write_date(uchar date) { lcdrs=1; P0=date; delay(5); lcden=1; delay(5); lcden=0; }

void write_ds(uchar add,uchar date) { dscs=0; dsas=1; dsds=1; dsrw=1; P0=add; dsas=0; dsrw=0; P0=date; dsrw=1; dsas=1; dscs=1; } uchar read_ds(uchar add) { uchar ds_date; dsas=1; dsds=1; dsrw=1; dscs=0; P0=add; dsas=0; dsds=0; P0=0xff; ds_date=P0; dsds=1; dsas=1; dscs=1; return ds_date; } void write_sfm(uchar add,uchar date) { uchar shi,ge; shi=date/10; ge=date%10; write_com(0x80+0x40+add); write_date(0x30+shi); write_date(0x30+ge); } void write_nyr(uchar add,uchar date) {

实时时钟实验报告

嵌入式系统开发实验报告 实验四:实时时钟实验 班级:应电112 姓名:张志可 学号: 110415151 指导教师:李静 实验日期: 2013年9月25日

实验四:实时时钟实验 一、实验目的 1. 了解实时时钟的硬件控制原理及设计方法。 2. 掌握 S3C2410X 处理器的 RTC 模块程序设计方法。 二、实验设备 硬件:Embest ARM 教学实验系统,ULINK USB-JTAG 仿真器套件,PC 机。 软件:MDK 集成开发环境,Windows 98/2000/NT/XP。 三、实验原理 1. 实时时钟(RTC) 实时时钟(RTC)器件是一种能提供日历/时钟、数据存储等功能的专用集成电路,常用作各种计算机系统的时钟信号源和参数设置存储电路。RTC 具有计时准确、耗电低和体积小等特点,特别是在各种嵌入式系统中用于记录事件发生的时间和相关信息,如通信工程、电力自动化、工业控制等自动化程度高的领域的无人值守环境。随着集成电路技术的不断发展,RTC 器件的新品也不断推出,这些新品不仅具有准确的 RTC,还有大容量的存储器、温度传感器和 A/D 数据采集通道等,已成为集 RTC、数据采集和存储于一体的综合功能器件,特别适用于以微控制器为核心的嵌入式系统。 RTC 器件与微控制器之间的接口大都采用连线简单的串行接口,诸如 I2C、SPI、MICROWIRE 和CAN 等串行总线接口。这些串口由2~3 根线连接,分为同步和异步。 2. S3C2410X 实时时钟(RTC)单元 S3C2410X 实时时钟(RTC)单元是处理器集成的片内外设。由开发板上的后备电池供电,可以在系统电源关闭的情况下运行。RTC 发送8 位BCD 码数据到CPU。传送的数据包括秒、分、小时、星期、日期、月份和年份。RTC 单元时钟源由外部32.768KHz 晶振提供,可以实现闹钟(报警)功能。 四、实验内容 学习和掌握 Embest ARM 教学实验平台中 RTC 模块的使用,编写应用程序,修改时钟日期及时间的设置,以及使用 EMBEST ARM 教学系统的串口,在超级终端显示当前系统时间。

数码管动态显示的51单片机时钟设计

一看就会,适合初学者参考 T0,T1同时开中断,和别人的有点不一样 源程序如下 //数码管设计的可调电子钟 //K1,K2分别调整小时和分钟 #include #include #define uchar unsigned char #define uint unsigned int uchar code DSY_CODE[]={0xC0,0xF9,0xA4,0xB0,0x99, //共阳段码 0x92,0x82,0xF8,0x80,0x90,0xFF}; uchar DSY_BUFFER[]={0,0,0xBF,0,0,0xBF,0,0}; //显示缓存ucharScan_BIT; //扫描位,选择要显示的数码管 uchar DSY_IDX; //显示缓存索引 ucharKey_State; //P1端口按键状态 uchar h,m,s,s100; //十分秒,1/100s void DelayMS(uchar x) //延时 { uchar i; while(x--) for(i=0;i<120;i++);

} void Increase_Hour() //小时处理函数 { if(++h>23)h=0; DSY_BUFFER[0]=DSY_CODE[h/10]; DSY_BUFFER[1]=DSY_CODE[h%10]; } void Increase_Minute()//分钟处理函数 { if(++m>59) { m=0;Increase_Hour(); } DSY_BUFFER[3]=DSY_CODE[m/10]; DSY_BUFFER[4]=DSY_CODE[m%10]; } void Increase_Second() //秒处理函数 { if((++s>59)) { s=0;Increase_Minute(); } DSY_BUFFER[6]=DSY_CODE[s/10]; DSY_BUFFER[7]=DSY_CODE[s%10]; } void T0_INT() interrupt 1 //T0中断动态扫描数码管显示 { TH0=(65536-1000)/256; TL0=(65536-1000)%256; P2=Scan_BIT; //选通相应数码管 P0=~DSY_BUFFER[DSY_IDX]; //段码送p0进行取反,共阴共阳转换Scan_BIT=_crol_(Scan_BIT,1);//准别下次选通的数码管 DSY_IDX=(DSY_IDX+1)%8; //索引0-7内循环 } void T1_INT() interrupt 3 //T1中断控制时钟运行 { TH1=(65536-50000)/256; TL1=(65536-50000)%256; if(++s100==20) //50ms*20=1s延时 { s100=0;Increase_Second();

模拟电梯问题实验报告

电梯模拟问题 一、目的与要求 1. 掌握线性结构的逻辑特点及存储实现; 2. 根据选题,按规范化流程完成课程设计报告: ⑴.提供需求分析。(15分) ⑵.列出概要设计。(包括:抽象数据类型的描述;程序结构图或功能模块图)(20分) ⑶.给出详细设计。(包括:①存储结构的描述;②算法的详细设计,对复杂算法,最好画出其N-S流程图;③函数的调用关系图)(30分) ⑷.进行调试分析(注:调试时遇到的问题及解决方法,程序的输出结果及对结果的分析)。(15分) ⑸. 整理设计总结。(设计心得体会,以及其他总结信息等)(10分) ⑹.附有程序清单(注:代码可具有适当注释,用来说明程序的功能、结构)。(10分) 二、设计步骤 1、线性结构是有序数据元素的集合,存在着“一对一”的线性关系且只有一 个首结点,一个尾结点,首结点只有后继没有前趋,尾结点只有前趋没有后继。顺序表的存储结构包括顺序表和链表,顺序存储是指将线性表元素按照逻辑顺序依次存储在一组连续的地址单元中。链式存储是通过结点中的链域将线性表中n个结点按其逻辑顺序链接在一起。分为:单向链表,双向链表,循环链表。 2、(1)设计一个电梯模拟系统。这是一个离散的模拟程序,因为电梯系统是 乘客和电梯等“活动体”够成的集合,虽然他们彼此交互作用,但是他们的行为是基本独立的。在离散的模拟中,一模拟时钟决定每个活动体的动作发生的时刻和顺序,系统在某个模拟瞬间处理有待完成的各种事情,然后把模拟时钟推进到某个动作预定要发生的下一个时刻。可模拟某校五层教学楼的电梯系统,或者九层教学楼的电梯系统。 此程序的关键是模拟好电梯运行状态的转换与乘客进出的同步进行,需要一个函数判断电梯的运行状态,决定电梯的下一个运行状态如电梯的开门,关门,上升,下降,减速,加速等,也需要模拟时钟的函数来判断该运行哪个函数,也需要定义几个结构体存放结点信息。 (2)时钟函数: void DoTime() { //此函数用于模拟时钟 while(1) { if(Time>MaxTime)

单片机DS12C887时钟设计

目录 摘要 (2) 1 系统总体设计 (2) 1.1 系统设计的主要内容和具体要求 (2) 1.1.1主要内容: (2) 1.1.2 具体技术要求: (2) 1.2 方案论证 (2) 2 系统硬件电路设计 (3) 2.1单片机控制系统包括STC89C52单片机以及它的外围电路(晶振电路和复位电路)。 (3) 2.1.1晶振电路 (4) 2.1.2 复位电路 (4) 2.2 DS12C887时钟电路 (5) 2.2.1 器件介绍 (5) 2.2.2 DS12C887与单片机的连接 (6) 2.3 1602液晶显示屏 (6) 2.4 USB供电电路 (7) 2.5 键盘电路 (8) 2.6闹铃电路 (9) 3 系统软件程序设计 (9) 3.1 主程序运行说明及流程图 (9) 3.2 DS12C887使用说明及流程图 (11) 3.3 1602操作说明及流程图 (11) 3.4 键盘控制说明及流程图 (12) 4 系统调试 (13) 5 结论 (14) 6 谢辞 (14) 7 参考文献 (15) 8 附录A:实时日历电子钟设计电路原理图 (15) 9 附录B:实时日历电子钟设计程序代码 (15)

摘要 在日新月异的21世纪里,家用电子产品得到了迅速发展。许多家电设备都趋于人性化、智能化,这些电器设备大部分都含有CPU控制器或者是单片机。单片机以其高可靠性、高性价比、低电压、低功耗等一系列优点,近几年得到迅猛发展和大范围推广,广泛应用于工业控制系统、通讯设备、日常消费类产品和玩具等。 本文设计的电子万年历属于小型智能家用电子产品。利用单片机进行控制,实时时钟芯片DS12C887时钟芯片进行记时及掉电存储,外加键盘电路和显示电路,可实现时间的调整和显示。电子万年历既可广泛应用于家庭,也可应用于银行、邮电、宾馆、医院、学校、企业、商店等相关行业的大厅,以及单位会议室、门卫等场所。因而,此设计具有相当重要的现实意义和实用价值。关键词:单片机;DS12C887;智能 1 系统总体设计 1.1 系统设计的主要内容和具体要求 1.1.1主要内容: 本次设计的题目是基于ds12c887的高精度时钟的设计,可以正常的显示年、月、日、星期、时、分、秒。本系统利用单片机实现具有计时校时等功能的数字时钟,是以单片机STC89C52为核心元件,同时采用1602液晶显示“时”、“分”、“秒”的现代计时装置。与传统机械表相比它具有走时精确,显示直观等特点。另外具有校时功能,编程灵活,便于扩充等优点。 本次设计可分为两部分:硬件部分,软件部分。 硬件部分包括:STC89C52、DS12C887时钟芯片、1602LCD液晶显示器。主要由STC89C52单片机、实时时钟芯片电路、液晶显示输出电路、键盘输入电路等几大部分组成。 软件部分包括:主程序模块,DS12C887模块,LCD1602模块,键盘控制模块。 1.1.2 具体技术要求: (1)在1602液晶上显示年、月、日、星期、时、分、秒,并且按秒实时更新显示。 (2)具有闹铃设定及到时报警功能,报警响起时按任意键可取消报警。 (3)能够通过按键随时调节各个参数,按键可设计4个有效键,分别为功能选择键、数值增大键、数值减小键、和闹铃查看键。 (4)每次有键按下时,蜂鸣器都以短“滴”声报警。 (5)利用DS12C887自身掉电可继续走时的特性,设计实现断电时间不停,再次上电时间仍然准确显示在液晶上的功能。 1.2 方案论证 时钟电路有各种各样的,在不同的要求和条件下有着各自的优势,本设计的题目是高精度时钟的设计,根据设计要求时钟显示正常的年、月、日、星期、时、分、秒。要想实现上述功能,所以设计要从电路设计的性价比、显示时间的精确以及稳定性为前提。本设计是要将硬件系统和软件系统有机的结合在一起,方可实现我们设计任务中的各项要求。 在以单片机为核心构成的装置中,经常需要一个实时的时钟和日历,以便对一些实时发生事件记录时给予时标,实时时钟芯片便可起到这一作用。DS12C887是一个综合性能较好且价格便宜的并行接口实时时钟芯片。利用单片机进行控制,采用DS12C887作为实时时钟芯片,并与单片机进行同步通信,外加显示电路、键盘电路、闹铃电路,即构成一个基本的电子万年历系统。若还要添加其他功能,在这基础上外扩电路即可。

基于ds1302的51单片机简易实时时钟-1602显示-源程序

。 ==================主程序================= #include

。#include "ds1302.h" #include "LCD1602.h" void change(); uchar times[9]; uchar date[9]; main() {LCD_init();//LCD初始化 init_1302(time_1302); gotoxy(1,1); LCD_display("Time:"); gotoxy(1,2); LCD_display("Date:"); times[8]='\0';// date[8]='\0'; while(1) {get_1302(time_1302); change(); gotoxy(7,1); LCD_display(times); gotoxy(7,2); LCD_display(date);

} } /*=========================== 转换子程序 ===========================*/ void change() { // 时间的转换 times[0]=time_1302[2]/10+'0'; times[1]=time_1302[2]%10+'0'; times[2]=':'; times[3]=time_1302[1]/10+'0'; times[4]=time_1302[1]%10+'0'; times[5]=':'; times[6]=time_1302[0]/10+'0'; times[7]=time_1302[0]%10+'0'; // 日期的转换 date[0]=time_1302[6]/10+'0'; date[1]=time_1302[6]%10+'0'; date[2]='-';

C语言模拟时钟转动程序

#include"graphics.h" #include"math.h" #include"dos.h" #define pi 3.1415926 #define X(a,b,c) x=a*cos(b*c*pi/180-pi/2)+300 #define Y(a,b,c) y=a*sin(b*c*pi/180-pi/2)+240 #define d(a,b,c) X(a,b,c);Y(a,b,c);line(300,240,x,y) void init() /*划时钟边框函数*/ { int i,l,x1,x2,y1,y2; setbkcolor(1); circle(300,240,200); circle(300,240,205); circle(300,240,5); for(i=0;i<60;i++) /*划钟点上的短线*/ { if(i%5==0) l=15; else l=5; x1=200*sin(i*6*pi/180)+300; y1=200*cos(i*6*pi/180)+240; x2=(200-l)*sin(i*6*pi/180)+300; y2=(200-l)*cos(i*6*pi/180)+240; line(x1,y1,x2,y2); } } #include"graphics.h" #include"math.h" #include"dos.h" #define pi 3.1415926 #define X(a,b,c) x=a*cos(b*c*pi/180-pi/2)+300 #define Y(a,b,c) y=a*sin(b*c*pi/180-pi/2)+240 #define d(a,b,c) X(a,b,c);Y(a,b,c);line(300,240,x,y) void init() /*划时钟边框函数*/ { int i,l,x1,x2,y1,y2; setbkcolor(1); circle(300,240,200); circle(300,240,205); circle(300,240,5); for(i=0;i<60;i++) /*划钟点上的短线*/ { if(i%5==0)

单片机万年历DS12C887实现程序

#include #include "1602.h" #include"ds12cr887.h" #define uchar unsigned char #define uint unsigned int sbit lcdrs=P3^7 ; sbit lcdrw=P3^6 ; sbit lcden=P3^5 ; sbit dscs=P1^4; sbit dsas=P1^5; sbit dsrw=P1^6; sbit dsds=P1^7; sbit dsirq=P3^3; /**************键盘引脚定义******************/ sbit key_1 = P1^0; //设置格式 sbit key_2 = P1^1; //+ sbit key_3 = P1^2; //- sbit key_4 = P1^3; //定时设置 sbit buzzer= P3^1; //蜂鸣器 sbit DQ = P3^0; //定义DS18B20 /******************小点闪烁********************/ bit at=0; /******************全局变量********************/ uchar t0=0,second=0, min=0, hour=0,day=0,month=0,year=0,weekday=0,flag=0,temp=0,flag1=0; /******************初始化时间******************/ uchar code table1[]=" 2009-05-12 MON "; uchar code table2[]="00:00:00 0000"; /*******************字符表*********************/ uchar code word[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x20,0x2d}; uchar code week[][3]={"SUN","MON","TUE","WED","THU","FRI","SAT"}; /************数据缓冲与键盘计数变量************/ uchar databuffer[14],TempBuffer[4],count,t_value; uint num=0; /******************函数声明********************/ void init(); void lcd_write_com(uchar command); //1602液晶写命令 void lcd_write_data(uchar date); //1602液晶写数据 void delay(uint a); void newbuf(); //数据转换 void keyboard(); //键盘子程序 void disp(); //显示程序 void write_ds(uchar add,uchar date); uchar read_ds(uchar add);

实时日历时钟显示系统的设计

微机原理及应用课程设计任务书 20 xx -20 xx 学年第 x 学期第 xx 周- xx 周 题目实时日历时钟显示系统的设计 内容及要求 内容:实时日历时钟显示系统 要求:设计一个实时日历时钟显示系统的程序。用“年/月/日”,“时:分:秒”(都是两位)的形式连续显示系统时间 进度安排 课程设计内容时间分配 方案论证1天 分析、设计、调试、运行3天 检查、整理、写设计报告、小结1天 合计5天 学生姓名: xx 指导时间: xxxx 指导地点: xxxx 任务下达任务完成 考核方式 1.评阅√ 2.答辩√ 3.实际操作□ 4.其它□指导教师系(部)主任 注:1、此表一组一表二份,课程设计小组组长一份;任课教师授课时自带一份备查。 2、课程设计结束后与“课程设计小结”、“学生成绩单”一并交院教务存档。

此次微机原理课程设计要求设计一个实时日历时钟显示系统。 本程序利用DOS中断2AH号功能调用取系统年月日,再逐个显示各数据,利用2CH号功能调用取系统时间,逐个显示各数据。用“时:分:秒”(都是两位)的形式连续显示系统时间,并利用计算机提供的软件调试工具对所编写程序进行调试,记录下整个调试分析的过程与运行结果。 任务安排: 主程序: xx:主体程序和流程设计 xx:日历调用显示系统 xx:时间调用显示系统 子程序: xx:显示两位数字的子程序

一、课程名称 (2) 二、课程内容及要求 (2) 三、小组组成 (2) 四、设计思路 (3) 五、程序流程图及介绍 (4) 六、调试 (5) 七、总结 (7) 八、参考资料 (9) 附录 (9)

一、课程名称:实时日历时钟显示系统的设计 二、课程内容及要求 课程内容:实时日历时钟显示系统 要求:设计一个实时日历时钟显示系统的程序。用“年/月/日”,“时:分:秒”(都是两位)的形式连续显示系统时间 三、小组组成: 成员: xx, xx, xx, xx 任务安排: 主程序: xx:主体程序和流程设计 xx:日历系统 xx:时间系统 子程序: xx:显示两位数字的子程序

相关主题