实时电子指针时钟开发总结(C语言版)
- 格式:doc
- 大小:1.68 MB
- 文档页数:8
时钟显示设计1 功能:实现时钟的实时显示与定时2 基本要求:(1)画出表盘时钟,时、分、秒针填充不同的颜色(自选)。
(2)数字同步显示时间信息。
(3)整点报时。
(4)通过键盘输入闹铃时间,实现闹铃功能。
3 相关知识:图形操作、按键操作、时间函数等4 功能扩充:1)实现秒表功能2)给出其它国家的时钟同步信息目录一、题目介绍: (3)二、小组成员信息: .......................................................................................... 错误!未定义书签。
三、总体设计: (3)四、模块划分: (3)五、算法说明: (3)六、各模块函数功能及流程图: (4)七、程序测试: (5)八、结论: (9)九、体会及建议: .............................................................................................. 错误!未定义书签。
十、参考文献: .................................................................................................. 错误!未定义书签。
附录:源程序清单 (9)题目介绍:时钟显示设计可以实现时钟的实时显示与定时,并且具有整点报时与闹铃的功能,具有动态效果,能够激发学生学习c语言的兴趣与热情。
在设计过程中会遇到没有学过的知识,这需要自己查阅资料来完成,所以还是有一定难度的。
总体设计:本程序设计分为三步:1 是对时钟程序做全面的分析,即对程序要使用的编写方法功能,运行方式进行分析,并做出正确的解决方案。
2 是程序的编写。
由于该程序所涉及的信息比较广泛,所以程序的编写也有些复杂。
程序编写是一项困难的任务,完成此项目必须运用大量的知识,而且要有清晰的思路和较强的语言组织能力。
基于单片机的电子时钟:班级:学号:指导教师:完成日期:I / 20目录摘要一、引言 (1)二、基于单片机的电子时钟硬件选择分析 (2)2.1主要IC芯片选择 (2)2.1.1微处理器选择 (2)2.1.2 DS1302简介 (4)2.1.3 DS1302引脚说明 (4)2.2电子时钟硬件电路设计 (5)2.2.1时钟电路设计 (6)2.2.2整点报时功能 (7)三、Protel软件画原理图 (8)3.1系统工作流程图 (8)3.2原理图 (9)四、proteus软件仿真与调试 (9)4.1电路板的仿真 (9)4.2软件调试 (9)五、源程序 (10)六、课设心得 (13)II / 20七、参考文献 (13)基于单片机电子时钟设计摘要电子时钟主要是利用电子技术将时钟电子化、数字化,拥有时钟精确、体积小、界面友好、可扩展性能强等特点,被广泛应用于生活和工作当中。
另外,在生活和工农业生产中,也常常需要温度,这就需要电子时钟具有多功能性。
本设计主要为实现一款可正常显示时钟/日历、带有定时闹铃的多功能电子时钟。
本文对当前电子钟开发手段进行了比较和分析,最终确定了采用单片机技术实现多功能电子时钟。
本设计应用AT89C52芯片作为核心,6位LED数码管显示,使用DS1302实时时钟日历芯片完成时钟/日历的基本功能。
这种实现方法的优点是电路简单,性能可靠,实时性好,时间精确,操作简单,编程容易。
该电子时钟可以应用于一般的生活和工作中,也可通过改装,提高性能,增加新功能,从而给人们的生活和工作带来更多的方便。
关键词:电子时钟;多功能;AT89C52;时钟日历芯片III / 20一、引言时间是人类生活必不可少的重要元素,如果没有时间的概念,社会将不会有所发展和进步。
从古代的水漏、十二天干地支,到后来的机械钟表以与当今的石英钟,都充分显现出了时间的重要,同时也代表着科技的进步。
致力于计时器的研究和充分发挥时钟的作用,将有着重要的意义。
#include<reg52.h>#define uchar unsigned char#define uint unsigned intuchar code table[]=" 2011-12-30 SA T";uchar code table1[]=" 23:59:55 ";uchar code week1[][3]={"MON","TUE","WEN","THU","FRI","SA T","SUN"}; /*uchar code week2[]="TUE";uchar code week3[]="WEN";uchar code week4[]="THU";uchar code week5[]="FRI";uchar code week6[]="SA T";uchar code week7[]="SUN"; */uchar count,shi,fen,miao,dnum,year,month,day,week,a=5;sbit rs=P2^0; //数据命令sbit rw=P2^1; //读写sbit en=P2^2; //使能sbit d1=P3^1; //独立键盘sbit d2=P3^2;sbit d3=P3^3;sbit d4=P3^4;void delay(uchar z) //延时{uint x,y;for(x=110;x>0;x--)for(y=z;z>0;z--);}void write_com(uchar com) //写指令{rs=0;rw=0;en=0;P0=com;delay(5);en=1;delay(5);en=0;}void write_date(uchar date) //写数据{rs=1;rw=0;en=0;P0=date;delay(5);en=1;delay(5);en=0;}void write_weekday (uchar a){uchar x;write_com(0x80+13);for(x=0;x<3;x++){write_date(week1[a][x]);}}void weekday(uint i){write_weekday(i%7);}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); //0x30代表的数字是0,+shi表示shi的数字write_date(0x30+ge); //ge的数字}void write_ymd(uchar add,uchar date){uchar shi,ge;shi=date/10;ge=date%10;write_com(0x80+add); //指向要写的地址write_date(0x30+shi); //0x30代表的数字是0,+shi表示shi的数字write_date(0x30+ge); //ge的数字}void unit(){uchar num;en=0;write_com(0x38); //显示write_com(0x0c); //光标不显示write_com(0x06); //指针加1,整屏不移动write_com(0x01); //清屏write_com(0x80); //指针指向0x80for(num=0;num<16;num++) //第一行显示table数组{write_date(table[num]);delay(20);}write_com(0x80+0x40);for(num=0;num<16;num++) //第二行显示table1数组{write_date(table1[num]);delay(20);}TMOD=0X01;TH0=(65536-50000)/256; //开启中断TL0=(65536-50000)%256;EA=1;ET0=1;TR0=1;shi=23;fen=59;miao=55;year=11;month=12;day=30;}void jishu() //计数{if(count==20){count=0;miao++; //秒加if(miao==60){miao=0;fen++; //分加if(fen==60){fen=0;shi++;if(shi==24){shi=0;day++;a++;weekday(a);//时加}write_sfm(3,shi);write_ymd(9,day);if(day==31){day=0x01;write_ymd(9,day);month++;write_ymd(6,month);if(month==13){month=0x01;write_ymd(6,month);year++;write_ymd(3,year);}}}write_sfm(6,fen);}write_sfm(9,miao);}}void change(){d4=0;if(d1==0) //移光标{delay(10);if(d1==0){while(!d1);dnum++;if(dnum==1){TR0=0;write_com(0x0f);write_com(0x80+0x40+10);}if(dnum==2){write_com(0x80+0x40+7);}if(dnum==3){write_com(0x80+0x40+4);}if(dnum==4){write_com(0x80+10);}if(dnum==5){write_com(0x80+7);}if(dnum==6){write_com(0x80+4);}if(dnum==7){dnum=0;TR0=1;write_com(0x0c);}}}if(d2==0) //加数据{delay(10);if(d2==0){while(!d2);if(dnum==1){miao++;if(miao==60)miao=0;write_sfm(9,miao); //顺序不能换write_com(0x80+0x40+10); //顺序不能换}if(dnum==2){fen++;if(fen==60)fen=0;write_sfm(6,fen);write_com(0x80+0x40+7);}if(dnum==3){shi++;if(shi==24){shi=0;}write_sfm(3,shi);write_com(0x80+0x40+4);}if(dnum==4){day++;a++;weekday(a);if(day==31)day=1;write_ymd(9,day);write_com(0x80+10);}if(dnum==5){month++;if(month==13)month=1;write_ymd(6,month);write_com(0x80+7);}if(dnum==6){year++;write_ymd(3,year%100);write_com(0x80+4);}}}if(d3==0) //减数据{delay(10);if(d3==0){while(!d3);if(dnum==1){miao--;if(miao==-1)miao=59;write_sfm(9,miao);write_com(0x80+0x40+10);}if(dnum==2){fen--;if(fen==-1)fen=59;write_sfm(6,fen);write_com(0x80+0x40+7);}if(dnum==3){shi--;if(shi==-1)shi=23;write_sfm(3,shi);write_com(0x80+0x40+4);}if(dnum==4){day--;a--;weekday(a);if(day==0)day=30;write_ymd(9,day);write_com(0x80+10);}if(dnum==5){month--;if(month==0)month=12;write_ymd(6,month);write_com(0x80+7);}if(dnum==6){year--;write_ymd(3,year%100);write_com(0x80+4);}}}}void main(){unit();while(1){jishu();change();}}void timer0()interrupt 1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;count++;}#include<reg52.h>#define uchar unsigned char //宏定义#define uint unsigned int //宏定义sbit rs=P3^5; //液晶数据/指令选择端:1-数据,0-指令sbit lcden=P3^4; //液晶使能控制端:1-有效,0-无效sbit shift_key=P3^2;//位置移动键sbit up_key=P3^3;//增加键uchar temp=0;//定义定时器溢出计数变量,每隔50ms产生1次溢出,temp加1uint year=2011;//定义年变量并赋初值2011年uchar month=06,day=01,week;//定义月、日、星期变量,并赋初值5月23日uchar hour=23,minute=59,second=58;//定义时、分、秒变量,并赋初值12时00分00秒uchar code week_string[7][4]={"MON","TUE","WED","THU","FRI","SA T","SUN"};//定义星期英文缩写表uchar data month_day[12]={31,0,31,30,31,30,31,31,30,31,30,31};//定义每月天数表/*--定时计数器T0及中断初始化函数--*/void init(void){TMOD=0x01;//设置定时器0为工作方式1TH0=(65536-50000)/256;//16位计数初值除以256得到高8位初值TL0=(65536-50000)%256;//16位计数初值除以256的余数得到低8位初值EA=1;//开总中断ET0=1;//开启定时器0中断EX0=1;//开启外部中断,外部中断用于调整时间PT0=1;//将定时器0中断设置高优先级,调整时间期不停止计时TR0=1;//启动定时器0}/*----------1ms延时函数----------*/void delay(uint n){uint i,j;for(i=n;i>0;i--)for(j=114;j>0;j--);}/*-------LCD1602写指令函数-----*/void LCD1602_write_com(uchar com){rs=0;//rs=0,置指令输入状态P0=com;//输出指令码delay(1);//延时1mslcden=1;//lcden=1,使能端有效delay(1);//延时1mslcden=0;//lcden=0,使能端无效}/*-------LCD1602写数据函数-----*/void LCD1602_write_dat(uchar dat){rs=1;//rs=1,置数据输入状态P0=dat; //输出待显示字符的字符码(ASCII码)delay(1);//延时1mslcden=1;//lcden=1,使能端有效delay(1);//延时1mslcden=0;//lcden=0,使能端无效}/*********************公历平年的2月只有28天,公历闰年的2月有29天。
/*电子时钟源代码*/#include<graphics.h>#include<stdio.h>#include<math.h>#include<dos.h>#define PI 3.1415926 /*定义常量*/#define UP 0x4800 /*上移↑键:修改时间*/#define DOWN 0x5000 /*下移↓键:修改时间*/#define ESC 0x11b /*ESC键:退出系统*/#define TAB 0xf09 /*TAB键:移动光标*//*函数声明*/int keyhandle(int,int); /*键盘按键判断,并调用相关函数处理*/int timeupchange(int); /*处理上移按键*/int timedownchange(int); /*处理下移按键*/int digithour(double); /*将double型的小时数转换成int型*/int digitmin(double); /*将double型的分钟数转换成int型*/int digitsec(double); /*将double型的秒钟数转换成int型*/void digitclock(int,int,int ); /*在指定位置显示时钟或分钟或秒钟数*/void drawcursor(int); /*绘制一个光标*/ void clearcursor(int);/*消除前一个光标*/void clockhandle(); /*时钟处理*/ double h,m,s; /*全局变量:小时,分,秒*/double x,x1,x2,y,y1,y2; /*全局变量:坐标值*/struct time t[1];/*定义一个time结构类型的数组*/main(){int driver, mode=0,i,j;driver=DETECT; /*自动检测显示设备*/initgraph(&driver, &mode, "");/*初始化图形系统*/setlinestyle(0,0,3); /*设置当前画线宽度和类型:设置三点宽实线*/ setbkcolor(0);/*用调色板设置当前背景颜色*/setcolor(9); /*设置当前画线颜色*/ line(82,430,558,430);line(70,62,70,418);line(82,50,558,50);line(570,62,570,418);line(70,62,570,62);line(76,56,297,56);line(340,56,564,56); /*画主体框架的边直线*//*arc(int x, int y, int stangle, int endangle, int radius)*/arc(82,62,90,180,12);arc(558,62,0,90,12);setlinestyle(0,0,3);arc(82,418,180,279,12);setlinestyle(0,0,3);arc(558,418,270,360,12); /*画主体框架的边角弧线*/setcolor(15);outtextxy(300,53,"CLOCK"); /*显示标题*/setcolor(7);rectangle(342,72,560,360); /*画一个矩形,作为时钟的框架*/setwritemode(0); /*规定画线的方式。
模拟时针转动程序姓名:学号:完成日期:2012年12月设计目的加深对讲授内容的理解,尤其是一些语法规定。
通过课程设计,自然地、熟练地掌握。
熟悉所用的计算机系统的操作方法,也就是熟悉语言程序开发的环境。
学会上机调试程序。
熟悉C语言图形模式下的编程,掌握利用C语言相关函数开发电子时钟的基本原理。
能模拟机械钟表行走;要准确地利用数字显示时间;在屏幕上显示一个活动时钟;程序界面设计合理,色彩得体大方,显示正确;各指针运动规律正确;数字式时钟的时间显示与指针式时钟显示一致。
总体设计电子时钟的功能描述电子时钟流程图模块描述动画处理模块在屏幕上显示sin和cos型的动态函数图像,显示运动的问候语。
转时针动处理模块指针式的时钟表盘为椭圆形并且圆周上有分布均匀的12个刻度刻度显示清楚钟面上有长度不相同的指针即时针、分针、秒针指针的运动具有规律性为顺时针。
数字时钟处理模块数字钟显示时间的格式是年月日时分秒小时为24进制,分钟和秒是60进制,指针式的时钟和数字式的时钟显示的时间同步且两个时钟所显示的时间与计算机的系统时间一致。
详细设计time结构体strume time{usigned char ti_min;usigned char ti_hour;usigned char ti_hud;usigned char ti_sec;};time 结构体定义在dos.h文件中,可以保存系统的当前时间。
全局变量double h,m,s;这三个变量分别保存小时,分钟,秒。
double x,y,x1,y1,x2,y2;保存数字时钟中小时分钟秒在屏幕中显示的位置。
struct time t[1];定义一个time结构类型的数组。
函数功能的描述1.def()函数原型: void def()def()函数是用来输出一组彩带的,通过输入位置和颜色的变化来输出sin型的彩带,且在整个函数中保留结果。
2. abc()函数原型: void abc()abc()函数是用来在退出系统是输出运动的问候语,函数类型单一且比较简单。
c课程设计实时钟表一、课程目标知识目标:1. 学生能够理解实时钟表的基本概念,掌握时、分、秒的相互关系及其在钟表上的表示方法。
2. 学生能够运用所学知识,识别并准确读取各种类型的实时钟表时间。
3. 学生了解钟表的历史发展及其在日常生活和科技领域中的应用。
技能目标:1. 学生能够通过观察、分析,正确设置和调整钟表时间,培养实际操作能力。
2. 学生能够运用所学知识解决与实时钟表相关的问题,提高问题解决能力。
3. 学生能够运用信息技术手段,设计并制作简单的实时钟表模型。
情感态度价值观目标:1. 学生培养对时间观念的尊重,养成守时、珍惜时间的良好习惯。
2. 学生在小组合作中,培养团队协作精神,学会分享和交流。
3. 学生通过学习实时钟表,认识到科技与生活的紧密联系,增强对科学技术的兴趣和探索精神。
课程性质:本课程为小学四年级信息技术课程,旨在通过实时钟表的学习,让学生掌握时间的基本概念,提高观察、操作和问题解决能力。
学生特点:四年级学生对新鲜事物充满好奇,动手操作能力强,但注意力容易分散,需要结合实际操作和趣味性教学。
教学要求:教师应注重理论与实践相结合,运用生动、形象的教学方法,激发学生兴趣,引导学生在实践中掌握知识,培养技能和情感态度价值观。
通过分解课程目标为具体学习成果,为后续教学设计和评估提供依据。
二、教学内容1. 实时钟表的基本概念:时、分、秒的定义及其关系,钟表的构造及其工作原理。
2. 钟表时间的读取与设置:各类钟表(电子钟、指针钟、数字钟)的读取方法,如何调整和设置时间。
3. 钟表的应用与制作:- 钟表在日常生活和时间管理中的应用;- 设计并制作简易实时钟表模型,运用信息技术手段实现基本功能。
4. 钟表与科技发展:介绍钟表的历史演变,探讨钟表在科技领域的应用。
教学大纲安排:第一课时:实时钟表的基本概念及构造,了解时、分、秒的关系。
第二课时:学习读取和设置各类钟表时间,培养实际操作能力。
第三课时:探索钟表在日常生活和时间管理中的应用,培养时间管理意识。
#include<reg51.h>//#include"DS18B20_3.H"#define uint unsigned int#define uchar unsigned charuchar a,miao,shi,fen,ri,yue,nian,week,flag,key1n,temp,key4n;//sheding 为调节打铃时间时显示//flag用于读取头文件中的温度值,和显示温度值uchar codeSeg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf}; unsigned int s_1,s_2,s_3,s_4,s_5,s_6;#define yh 0x80 //LCD第一行的初始位置,因为LCD1602字符地址首位D7恒定为1(100000000=80)#define er 0x80+0x40 //LCD第二行初始位置(因为第二行第一个字符位置地址是0x40)uchar flag_xs=0,flag_m,flag_m1,flag_f,flag_f1,flag_s,flag_s1;uchar flag_n,flag_n1,flag_y,flag_y1,flag_r,flag_r1,flag_mb;uint numt;//液晶屏的与C51之间的引脚连接定义(显示数据线接C51的P0口)//DS1302时钟芯片与C51之间的引脚连接定义sbit IO=P1^1;sbit SCLK=P1^0;sbit RST=P1^2;sbit ACC0=ACC^0;sbit ACC7=ACC^7;sbit nyr=P3^1;sbit sfm=P3^0;/************************************************************ACC累加器=AACC.0=E0HACC.0就是ACC的第0位。
/*
软件实时钟(RTC)演示程序
说明:该程序演示RTC程序库所包含的常用的RTC功能函数的使用方法。
在使用RTC相关函数之前,其中RTC_Tick()函数需要被一个准确
的周期定时中断调用。
*/
d年%.2d月%.2d日 %.2d:%.2d:%.2d\r",Year,Month,Date,Hour,Minute,Second);
//从串口输出,打印到超级终端软件上。
for(i=0;i<30000;i++); //延迟
}
}
C语言_时钟代码+报告C语言程序设计课程设计报告选题名称:钟系(院):专业:班级:姓名学号::指导教师::2007~20081学年学期学年第学期2008年1月12日摘要:我们日常生活中有各种各样的时钟。
随着计算机的普及和计算机科学的飞速发展,人们开始越来越多的利用计算机解决实际问题。
开发一个易于查看的时钟有较大的现实意义。
同时,该时钟会听到时钟的喀哒声,程序与生活紧密结合,具体直观,开发应用简单。
利用C 语言编辑源程序,再进行编译链接生成可执行文件,运行时可以查看时间,听到喀哒声,具体直观,方便了生活。
:Turbo C关键词计算机;时钟;;函数目录4 6 程序调试……………………………………………………………………………总结 (8)致谢 (9)参考文献 (10)1程序概述程序设计是一种技术,也是一项工程。
程序设计语言是程序设计的工具。
一种程序设计语言凝聚了具有时代特征的程序设计理念和方法。
本程序利用C语言中的图形处理函数完成时间的模拟显示。
1.1课题来源这个C语言时钟的课程设计,可以初步理解C语言编程的方法,对C语言小程序有较深刻的理解。
利用C语言中的图形处理函数完成时间的模拟显示。
了解图形处理函数的基本功能,掌握C语言中的时间函数等。
1.2课题意义基于算法思维方法的训练是现代信息素养的重要内容。
程序设计是引导学习者利用计算机进行解题的能力培养过程。
为了有效地进行程序设计,正确地应用程序设计语言表达算法,必须准确地运用程序设计语言,掌握其语法设计。
用C语言编程,设计一个时钟,掌握声音函数sound()、系统时间函数gettime()、绘制多边形函数DrawPoly()的用法。
1.3预期目标本程序利用C语言中的图形处理函数完成时间的模拟显示。
在C 环境中编辑源程序,设置表盘刻度,模拟时针、分针、秒针的运动,声音,生成可执行文件之后并运行在屏幕上会显示一个时钟,便于查看系统的时间,并且会听到秒针运动时的喀哒声。
鉴于单片机的电子钟C语言程序————————————————————————————————作者:————————————————————————————————日期:鉴于 51 单片机的电子钟 C 语言程序#include<reg51.h>#include<absacc.h>#define uchar unsigned char#define uint unsigned int/* 七段共阴管显示定义 */uchar codedispcode[ ]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0xBF,0x86,0xCB,0xCF,0xEF,0xED,0xFD,0x87,0xFF,0xDF};/* 定义并初始化变量*/uchar seconde=0;uchar minite=0;uchar hour=12;uchar mstcnt=0;sbit P1_0=P1^0; sbit P1_1=P1^1; sbit P1_2=P1^2; // second//minite//hour调整定义调整定义调整定义/* 函数申明 */void delay(uint k );// void delay1(uchar h ); void time_pro( );//void display( );//void keyscan( );//延时子程序时间办理子程序显示子程序键盘扫描子程序/*****************************/ /* 延时子程序 *//****************************/ void delay1 (uchar h) {uchar j;while((h--)!=0){for(j=0;j<125;j++){;}}}void delay (uint k){uint a,b,c;for(c=k;c>0;c--)for(b=38;b>0;b--)for(a=130;a>0;a--);}/**************************//* 时间办理子程序 *//**************************/void time_pro( void){if(seconde==60) // 秒钟设为60 进制{ seconde=0;minite++;if( minite==60) // 分钟设为60 进制{ minite=0;hour++;if(hour==24) // 时钟设为24 进制{hour=0; }}}}/*****************************//*显示子程序*//*****************************/void display(void){P2=0xfe;P0=dispcode[hour/10]; // 显示小时的十位delay1(4);P2=0xfd;P0=(dispcode[(hour%10)])|0X80; // 显示小时的个位delay1(4);P2=0xfb;P0=dispcode[minite/10]; // 显示分的十位delay1(4);P2=0xf7;P0=(dispcode[minite%10])|0X80; delay1(4);P2=0xef;P0=dispcode[seconde/10]; // // 显示分的个位显示秒的十位delay1(4);P2=0xdf;P0=dispcode[seconde%10]; // 显示秒的个位delay1(4);}/*******************************//* 键盘扫描子程序 *//*******************************/void keyscan (void){if(P1_0==0) // 按键1 秒的调整{delay(2);if(P1_0==0)//delay(300);{seconde++;if(seconde==60){seconde=0; }}}if(P1_1==0)//按键2分的调整{delay(2);if(P1_1==0)//delay(300);{minite++;if(minite==60){minite=0;}}}if(P1_2==0) // 按键3 小时的调整{delay(2);if(P1_2==0)//delay(300);{hour++;if(hour==24){hour=0; }}}}void timer0(void) interrupt 1 using 0 // 准时器0 方式1, 50ms中止一次{TH0=0x3c;TMOD = 0x11;mstcnt++;if(mstcnt==20){seconde++;mstcnt=0; //注意点。
主程序:#include"DS18B20_3.H"#define uint unsigned int#define uchar unsigned charuchar a,miao,shi,fen,ri,yue,nian,week,flag,key1n,temp;#define yh 0x80#define er 0x80+0x40//液晶屏的与C51之间的引脚连接定义sbit rs=P2^0;sbit en=P2^2;sbit rw=P2^1; //如果硬件上rw接地,就不用写这句和后面的rw=0了sbit led=P2^6; //LCD背光开关//DS1302时钟芯片与C51之间的引脚连接定义sbit IO=P1^1;sbit SCLK=P1^0;sbit RST=P1^2;sbit ACC0=ACC^0;sbit ACC7=ACC^7;//校时按键与C51的引脚连接定义sbit key1=P1^5; //设置键sbit key2=P1^6; //加键sbit key3=P1^7; //减键sbit buzzer=P1^3; //蜂鸣器,通过三极管9012驱动,端口低电平响/**************************************************************/uchar code tab1[]={"20 - - "}; //年显示的固定字符uchar code tab2[]={" : : "}; //时间显示的固定字符//延时函数,后面经常调用void delay(uint xms) //延时函数,有参函数{uint x,y;for(x=xms;x>0;x--)for(y=110;y>0;y--);}/********液晶写入指令函数与写入数据函数,以后可调用**************/write_1602com(uchar com) //****液晶写入指令函数****{rs=0; //数据/指令选择置为指令rw=0; //读写选择置为写P0=com; //送入数据delay(1);en=1; //拉高使能端,为制造有效的下降沿做准备delay(1);en=0; //en由高变低,产生下降沿,液晶执行命令}write_1602dat(uchar dat) //***液晶写入数据函数****{rs=1; //数据/指令选择置为数据rw=0; //读写选择置为写P0=dat; //送入数据delay(1);en=1; //en置高电平,为制造下降沿做准备delay(1);en=0; //en由高变低,产生下降沿,液晶执行命令}lcd_init() //***液晶初始化函数****{write_1602com(0x38); //设置液晶工作模式,意思:16*2行显示,5*7点阵,8位数据write_1602com(0x0c); //开显示不显示光标write_1602com(0x06); //整屏不移动,光标自动右移write_1602com(0x01); //清显示write_1602com(yh+1); //日历显示固定符号从第一行第1个位置之后开始显示for(a=0;a<14;a++){write_1602dat(tab1[a]); //向液晶屏写日历显示的固定符号部分//delay(3);}write_1602com(er+2); //时间显示固定符号写入位置,从第2个位置后开始显示for(a=0;a<8;a++){write_1602dat(tab2[a]); //写显示时间固定符号,两个冒号//delay(3);}}/*********************over***********************//***************DS1302有关子函数********************/void write_byte(uchar dat)//写一个字节{ACC=dat;RST=1;for(a=8;a>0;a--){IO=ACC0;SCLK=0;SCLK=1;ACC=ACC>>1;}}uchar read_byte() //读一个字节{RST=1;for(a=8;a>0;a--){ACC7=IO;SCLK=1;SCLK=0;ACC=ACC>>1;}return (ACC);}//----------------------------------------void write_1302(uchar add,uchar dat) //向1302芯片写函数,指定写入地址,数据{RST=0;SCLK=0;RST=1;write_byte(add);write_byte(dat);SCLK=1;RST=0;}uchar read_1302(uchar add) //从1302读数据函数,指定读取数据来源地址{uchar temp;RST=0;SCLK=0;RST=1;write_byte(add);temp=read_byte();SCLK=1;RST=0;return(temp);}uchar BCD_Decimal(uchar bcd) //BCD码转十进制函数,输入BCD,返回十进制{uchar Decimal;Decimal=bcd>>4;return(Decimal=Decimal*10+(bcd&=0x0F));}//--------------------------------------void ds1302_init() //1302芯片初始化子函数(2010-01-07,12:00:00,week4){RST=0;SCLK=0;write_1302(0x8e,0x00); //允许写,禁止写保护//write_1302(0x80,0x00); //向DS1302内写秒寄存器80H写入初始秒数据00//write_1302(0x82,0x00); //向DS1302内写分寄存器82H写入初始分数据00//write_1302(0x84,0x12); //向DS1302内写小时寄存器84H写入初始小时数据12//write_1302(0x8a,0x04); //向DS1302内写周寄存器8aH写入初始周数据4//write_1302(0x86,0x07); //向DS1302内写日期寄存器86H写入初始日期数据07//write_1302(0x88,0x01); //向DS1302内写月份寄存器88H写入初始月份数据01//write_1302(0x8c,0x10); //向DS1302内写年份寄存器8cH写入初始年份数据10write_1302(0x8e,0x80); //打开写保护}//温度显示子函数void write_temp(uchar add,uchar dat) //向LCD写温度数据,并指定显示位置{uchar gw,sw;gw=dat%10; //取得个位数字sw=dat/10; //取得十位数字write_1602com(er+add); //er是头文件规定的值0x80+0x40write_1602dat(0x30+sw); //数字+30得到该数字的LCD1602显示码write_1602dat(0x30+gw); //数字+30得到该数字的LCD1602显示码write_1602dat(0xdf); //显示温度的小圆圈符号,0xdf是液晶屏字符库的该符号地址码write_1602dat(0x43); //显示"C"符号,0x43是液晶屏字符库里大写C的地址码}//时分秒显示子函数void write_sfm(uchar add,uchar dat) //向LCD写时分秒,有显示位置加、现示数据,两个参数{uchar gw,sw;gw=dat%10; //取得个位数字sw=dat/10; //取得十位数字write_1602com(er+add); //er是头文件规定的值0x80+0x40write_1602dat(0x30+sw); //数字+30得到该数字的LCD1602显示码write_1602dat(0x30+gw); //数字+30得到该数字的LCD1602显示码}//年月日显示子函数void write_nyr(uchar add,uchar dat) //向LCD写年月日,有显示位置加数、显示数据,两个参数{uchar gw,sw;gw=dat%10; //取得个位数字sw=dat/10; //取得十位数字write_1602com(yh+add); //设定显示位置为第一个位置+addwrite_1602dat(0x30+sw); //数字+30得到该数字的LCD1602显示码write_1602dat(0x30+gw); //数字+30得到该数字的LCD1602显示码}void write_week(uchar week) //写星期函数{write_1602com(yh+0x0c); //星期字符的显示位置switch(week){case 1:write_1602dat('M'); //星期数为1时,显示write_1602dat('O');write_1602dat('N');break;case 2:write_1602dat('T'); //星期数据为2时显示write_1602dat('U');write_1602dat('E');break;case 3:write_1602dat('W'); //星期数据为3时显示write_1602dat('E');write_1602dat('D');break;case 4:write_1602dat('T'); //星期数据为4是显示write_1602dat('H');write_1602dat('U');break;case 5:write_1602dat('F'); //星期数据为5时显示write_1602dat('R');write_1602dat('I');break;case 6:write_1602dat('S'); //星期数据为6时显示write_1602dat('T');write_1602dat('A');break;case 7:write_1602dat('S'); //星期数据为7时显示write_1602dat('U');write_1602dat('N');break;}}//****************键盘扫描有关函数**********************void keyscan(){if(key1==0) //key1为功能键(设置键){delay(9); //延时,用于消抖动if(key1==0) //延时后再次确认按键按下{buzzer=0; //蜂鸣器短响一次delay(20);buzzer=1;while(!key1);key1n++;if(key1n==9)key1n=1; //设置按键共有秒、分、时、星期、日、月、年、返回,8个功能循环switch(key1n){case 1: TR0=0; //关闭定时器//TR1=0;write_1602com(er+0x09); //设置按键按动一次,秒位置显示光标write_1602com(0x0f); //设置光标为闪烁temp=(miao)/10*16+(miao)%10; //秒数据写入DS1302write_1302(0x8e,0x00);write_1302(0x80,0x80|temp);//miaowrite_1302(0x8e,0x80);break;case 2: write_1602com(er+6); //按2次fen位置显示光标//write_1602com(0x0f);break;case 3: write_1602com(er+3); //按动3次,shi//write_1602com(0x0f);break;case 4: write_1602com(yh+0x0e); //按动4次,week//write_1602com(0x0f);break;case 5: write_1602com(yh+0x0a); //按动5次,ri//write_1602com(0x0f);break;case 6: write_1602com(yh+0x07); //按动6次,yue//write_1602com(0x0f);break;case 7: write_1602com(yh+0x04); //按动7次,nian//write_1602com(0x0f);break;case 8:write_1602com(0x0c); //按动到第8次,设置光标不闪烁TR0=1;//打开定时器temp=(miao)/10*16+(miao)%10;write_1302(0x8e,0x00);write_1302(0x80,0x00|temp);//miao数据写入DS1302write_1302(0x8e,0x80);break;}}}//------------------------------加键key2----------------------------if(key1n!=0) //当key1按下以下。
用PCF8563做实时时钟的C源程序#include<reg51.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intsbit pcf8563_scl=P0^4;sbit pcf8563_sda=P0^3;ucharnum[10]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0 x37,0x38,0x39}; //数字表sbit clk=P2^0;sbit dio=P2^1;sbit cfd=P2^2; //充放电开关,sbit en=P2^3;sbit rw=P2^4;sbit rs=P2^5;sbit deng=P2^6; //测试灯sbit adcs=P2^7;bit busy=0;uchar sg;uchar sd;uchar fg;uchar fd;uchar mg;uchar md;uchar hou=0;uchar min=0;uchar sec=0;uchar subadd;uchar dat;uchar number;void start_pcf8563();void send_pcf8563_byte();void LcdIni(void);void WrOp(uchar dat);void WrDat(uchar dat);void ChkBusy(void);void display0(void);void display1(void);void stop_pcf8563();void receive_pcf8563_byte();void spit_time();void LcdIni()//初始化LCD{WrOp(0x01);WrOp(0x38);WrOp(0x0c);WrOp(0x06);} void WrOp(uchar dat)//写LCD显示地址{P1 =dat;rs=0;rw=0;en=0;ChkBusy();en=1;}void WrDat(uchar dat)//写LCD显示数据{P1=dat;rs=1;rw=0;en=0;ChkBusy();en=1;}void ChkBusy() //检查LCD是否忙{P1=0xff;rs=0;rw=1;en=0;_nop_();en=1;while(P1&0x80);}void display0() //显示必要的背景{WrOp(0x80);WrDat('T');WrOp(0x81);WrDat(':');WrOp(0x84);WrDat(':');WrOp(0x87);WrDat(':');}void spit_time(){sg=(int)hou/10;sd=(int)hou%10;fg=(int)min/10;fd=(int)min%10;mg=(int)sec/10;md=(int)sec%10;}void display1()//显示时间六位{uchar temp6;uchar temp5;uchar temp4;uchar teMP3;uchar temp2;uchar temp1;WrOp(0x82);temp6=num[sg];WrDat(temp6);WrOp(0x83);temp5=num[sd];WrDat(temp5);WrOp(0x85);temp4=num[fg];WrDat(temp4);WrOp(0x86);teMP3=num[fd];WrDat(teMP3);WrOp(0x88);temp2=num[mg];WrDat(temp2);WrOp(0x89);temp1=num[md];WrDat(temp1);}void Send_pcf8563_byte(uchar bb) //向PCF8563发送一个字节{uchar aa;pcf8563_scl=0;for(aa=0;aa<8;aa++){if((bb&0x80)==0x80){pcf8563_sda=1;}else{pcf8563_sda=0;}pcf8563_scl=1;pcf8563_scl=0;bb=bb<<1;}_nop_();_nop_();pcf8563_sda=1;pcf8563_scl=1;busy=0;if(pcf8563_sda){busy=1;}else{_nop_();_nop_();pcf8563_scl=0;busy=0;}}void write_pcf8563(uchar subadd,uchar dat)// 向PCF8563对应地址写数据{start_pcf8563();Send_pcf8563_byte(0xa2);if(!busy){Send_pcf8563_byte(subadd);if(!busy){Send_pcf8563_byte(dat);}}stop_pcf8563();}void read_pcf8563() //读当时的时,分,钞{start_pcf8563();Send_pcf8563_byte(0xa2);if(!busy){Send_pcf8563_byte(0x02);if(!busy){start_pcf8563();Send_pcf8563_byte(0xa3);receive_pcf8563_byte();sec=number&0x7f;start_pcf8563();Send_pcf8563_byte(0xa3);receive_pcf8563_byte();min=number&0x7f;start_pcf8563();Send_pcf8563_byte(0xa3);receive_pcf8563_byte();hou=number&0x3f;}}stop_pcf8563();}void receive_pcf8563_byte() //从PCF8563接受一个字节{uchar CC;pcf8563_sda=1;number=0;for(CC=0;cc<8;cc++){number<<=1;pcf8563_scl=0;pcf8563_scl=1;_nop_();_nop_();number= number|pcf8563_sda;}pcf8563_scl=0;_nop_();_nop_();}void start_pcf8563() //开启PCF8563IIC {pcf8563_sda=1;pcf8563_scl=1;pcf8563_sda=0;//SCL为低,SDA执行一个上跳pcf8563_scl=0;//SCL为低,嵌住数据线}void stop_pcf8563() //关闭PCF8563IIC {pcf8563_sda=0;pcf8563_scl=1;pcf8563_sda=1;//SCL为高,SDA执行一个上跳pcf8563_scl=0;//SCL为低,嵌住数据线}void main(void){LcdIni(); //初始化屏display0(); //显示必要的背影write_pcf8563(0x02,sec); //写钞write_pcf8563(0x03,min); //写分write_pcf8563(0x04,hou); //写时while(1){read_pcf8563();//读当前时间spit_time(); //切害时间,为显示做准备display1(); //显示当前时间}}。
摘要就钟表的演变历史而言,它大致可以分为3个演变阶段,第一,从大型钟向小型钟演变;第二,从小型钟向袋表过渡;第三,从袋表象腕表发展。
每一阶段的发展都和当时的技术发明有着十分紧密的联系,同时它也是各个不同时期的科学家和钟表工匠智慧的结晶。
钟和表通常是以内机的大小来区别的。
按国际惯例,机芯直径超过50mm、厚度超过12mm的为钟;直径37~50mm、厚度4~6mm者,称为怀表;直径37mm以下为手表;最坚固、最精密的机械之一。
现代钟表的原动力有机械力和电力两种。
机械钟表是一种用重锤或弹簧的释放能量为动力,推动一系列齿轮运转,借助调速器调节轮系转速,以指针指示时刻和计量时间的计算器。
在生活进步的今天,电子时钟正成为人们生活的一部分,特别是应用在如火车站之类的公共场所,其用途不言而喻。
关键词: 模拟系统; 电子时钟; 时间修改.目录一. 设计过程1. 程序功能 (3)2.程序设计 (3)1)设计思路 (3)2)数据结构 (3)3)主函数 (4)4)流程图 (4)3.程序运行及分析 (8)4.运行结果 (9)二. 源代码 (10)1.程序预处理 (11)2. 主函数 (11)3. 时钟动画处理模块 (14)4.时钟按键控制模块 (15)5.数字时钟处理模块 (19)三. 设计总结 (22)四. 参考文献 (23)课程设计(电子时钟) 一.设计过程 1. 程序功能随着社会的进步和科技的发展,电子时钟逐渐成为人们生活中不可缺少的一部分,下面介绍一种电子时钟的设计和实现。
其基本功能模块图如图2.程序设计1) 设计思路程序设计一般由两部分组成:算法和数据结构,合理地选择和实现一个数据结构和处理这些数据结构具有同样的重要性。
在电子时钟程序中,重点和难点在于时、分、秒针坐标值得计算和时钟指针的运行控制,旨在了解C 语言图形模式下的编程,了解系统的绘图机数据结构等方面的知识。
利用几个模块现实时钟的运转,并可在界面进行时间的更改。
单片机电子钟程序设计实习报告单片机LCD1602电子钟毕业论文这次嵌入式系统综合实习已经结束了,哎..... 在网络发现很多计算机专业的毕业生都是以电子钟为题的毕业论文,个人感觉做一个电子钟程序设计的技术含量,技术水平都不高。
呵呵个人还是比较偏向于软件开发的,比较喜欢vc++开发。
一、引言1.1课题的背景及目的随着计算机科学与技术的飞速发展,计算机的应用已经渗透到国民经济与人们生活的各个角落,正在日益改变着传统的人类工作方式和生活方式,而单片机技术又作为计算机技术中的一个独立分支,有着性价比高,集成度高,体积小,可靠性高,控制功能强大,低功耗,低电压,便于生产,便于携带等特点,所以得到越来越广泛的应用,特别是在工业控制和仪表仪器智能化中起极其重要的作用.本文利用单片机强大的控制功能和内部定时器重要部件,设计了一款自行对时间进行调整以及把时、分、秒用LCD显示的电子钟。
电子钟从原理上讲是一种典型的数字电路,其中包括了组合逻辑电路和时序电路。
因此,我们此次设计与制做数字钟就是为了了解数字钟的原理,从而学会制作数字钟.而且通过数字钟的制作进一步的了解各种在制作中用到的中小规模集成电路的作用及实用方法.且由于数字钟包括组合逻辑电路和时叙电路.通过它可以进一步学习与掌握各种组合逻辑电路与时序电路的原理与使用方法1.2课题的内容要求及研究方法①时间以24小时为一个周期;②显示时、分、秒;③具有校时功能,可以分别对时及分进行单独校时,使其校正到标准时间;本文先按照设计的一般步骤,先选定用单片机实现的方案,了解设计要求,再分别从硬件系统设计和软件系统设计两个宏观方面着手.然后大量阅读相关资料,硬件方面,熟练单片机工作基本原理,查出相关元器件的参数,八个八段数码管,继电器等性能.然后画出系统框图和单元电路原理图,再对系统工作原理按照单元电路作简单的说明。
软件方面,熟悉编程语言,查找相关子程序.熟悉使用Keil uVision2开发软件及STC-ISP下载软件.把原器件按电路原理图安装.最后再对硬件和软件系统进行调试和仿真。
计算机工程实践实习报告专业:班级:姓名:学号:指导老师:设计时间:指导教师对实习报告的评语指导教师签字:年月日一前言漫步在繁华的现代化的大都市的大街上,随时都可以看到街上有很多可以用卡取钱的机器(ATM自动柜员机),十字路口的交通灯。
我们的手机,我们家里数码电视机、数码音响、遥控器、空调、智能玩具.....这些“高科技”看上去是如此的神秘,它到底是怎样构成的,它是通过什么样的程序和什么样的方式来完成这一系列指令的呢?让我们取钱更方便、避免城市的交通混乱和交通阻塞……给我们生活带来了处处方便。
其实这也是用单片机来控制的,单片机在我们生活中触手可及,它是如此地贴近我们的生活,单片机给我们的生活带来的有如此多的便利。
目前单片机渗透到我们生活的各个领域,几乎很难找到哪个领域没有单片机的踪迹。
导弹的导航装置,飞机上各种仪表的控制,计算机的网络通讯与数据传输,工业自动化过程的实时控制和数据处理,广泛使用的各种智能IC卡,民用豪华轿车的安全保障系统,录像机、摄像机、全自动洗衣机的控制,以及程控玩具、电子宠物等等,这些都离不开单片机。
更不用说自动控制领域的机器人、智能仪表、医疗器械了。
因此,单片机的学习、开发与应用将造就一批计算机应用与智能化控制的科学家、工程师。
科技越发达,智能化的东西就越多,使用的单片机就越多。
看来学单片机是社会发展的需求。
据统计,我国的单片机年容量已达1-3亿片,且每年以大约16%的速度增长,但相对于世界市场我国的占有率还不到1%。
特别是沿海地区的玩具厂等生产产品多数用到单片,并不断地辐射向内地, 这说明单片机应用在我国才刚刚起步,有着广阔的前景。
培养单片机应用人才,特别是在工程技术人员中普及单片机知识有着重要的现实意义。
面对着学习单片机一个终生受用的职业,不受年龄的限制。
同时面对着生活的现代化,我们衣、食、住、行也就越来越依赖各式各样的“高科技”了,也就有很多地方都用到高集成电路IC和单片机。
电子设计制作任务总结分析报告小组成员:林苗苗郑梦静史旭浩一、设计任务设计任务一 LCD电子定时闹钟设计:功能说明:定时闹钟的时间显示和设置1.LCD显示屏的显示格式为“SET TIME 时时:分分:秒秒”,并且能够修改时钟时间的时、分、秒。
2.操作键K1:当前时间状态的设置按钮;3.操作键K2:闹钟设定时间的显示按钮;4.操作键K3:设置闹钟时间按钮;5.操作键K4:闹铃ON/OFF状态设置,设为ON时连续三次发出哗的一声,设为OFF时发出哗的一声;6.当设置现在的时间或闹铃时间时,操作键K1:调整时;操作键K2:调整分;操作键K3:设置完成。
7.定时时间到时发出一阵声响,按下K4键可以停止声响。
设计任务二带有LCD显示的音乐倒数定时器设计:功能说明:倒数定时器的时间设置、显示及音乐的播放1.使用文字型LCD(16×2)来显示目前倒数的时间,显示格式为“TIME 时时:分分:秒秒”2.具有4个按键操作来设置现在想要倒数的时间:操作键K1:设置定时时间的开启和关闭;操作键K1 + 操作键K2:调整时;操作键K1 + 操作键K3:调整分;操作键K1 + 操作键K4:时间调整完成。
3.一旦按键后则开始倒数计时,当计时为0时则发出一阵生日快乐歌的音乐声响;4.重置后内定倒数计时时间为5min,显示“00:05:00”。
二、关于两个设计任务的硬件部分说明51单片机:51单片机是对目前所有兼容Intel 8031指令系统的单片机的统称。
它广泛应用于工业测控系统之中。
8位CPU·4kbytes 程序存储器(ROM) (52为8K),256bytes的数据存储器(RAM) (52有384bytes的RAM),32条I/O 口线·111条指令,大部分为单字节指令,21个专用寄存器,2个可编程定时/计数器,5个中断源,2个优先级(52有6个),片内振荡器和时钟产生电路,石英晶体和微调电容需要外接。
实时时钟开发总结
一.功能描述
本时钟可以获取电脑系统时钟,实现与系统时间的同步,时间的准确性根本不需怀疑,
可用于车站等公共场所的电子指针时钟。
二.系统开发平台
Visual C++
注意:
1) 单纯的Visual C++ 不行,需下载一个EasyX小插件对其进行配置好才可(网上有
下的,也有配置方法)。
2) 程序代码必须以.cpp结尾。
3) 分辨率:最佳效果1024*768。
三.游戏开发详细过程:
四.详细完整的代码
#include
#include
#include
#include
#include
#include
#include
#define PI 3.14159
#define ESC 0x011b
#define YELLOW 0x54FCFC
float s0=-1,m0=-1,h0=-1;
void timer();
//主函数
void main()
{
int i=3;
char H[10];
double n;
char key;
initgraph(640, 480); // 这里和 TC 略有区别,可以自定义大小
circle(200, 200, 100);
circle(200,200,95);
//时针、分针、秒针的动态实现
for(n=0;n<=2*PI;n+=PI/30)
{
putpixel((int)(200+94*cos(-n)),(int)(200+94*sin(-n)),4);
}
for(n=0;n<=2*PI;n+=PI/6)
{
circle(200+1*cos(-n),200+1*sin(-n),14);
}
for(n=0;n<=2*PI;n+=PI/6)
{
itoa(i,H,10);
outtextxy((int)(197+90*cos(-n)),(int)(197+90*sin(-n)),H);
i--;
if(i<1)
i+=12;
}
while(!kbhit())
{
timer();
double delay(1000);
}
//key=bioskey(0);
key=getchar();
if(key==ESC)
{
closegraph();
exit(0);
}
getch(); // 按任意键继续
closegraph(); // 关闭图形界面
}
//通过时间函数获取系统时钟
void timer()
{
struct tm *when;
float s,m1,h1;
int h,m;
time_t now;
time(&now);//获取当前系统时间
when= localtime(&now);
h=when->tm_hour;//将当前时间的小时成员赋值给h
m=when->tm_min;
s=(float)(when->tm_sec);
h1=(float)((h+(m*60+s)/3600)*PI/6-PI/2); //计算时钟的角度
m1=(float)((m+s/60)*(PI/30)-PI/2); //计算分钟的角度
if(s0!=(-1) && m0!=(-1) && h0!=(-1)) // 覆盖前一个指针留下的痕迹
{
setcolor(0);//清楚
line(200,200,200+55*cos(m0),200+55*sin(m0));
line(200,200,200+45*cos(h0),200+45*sin(h0));
line(200,200,200+65*cos((s0)*(PI/30)+PI/2),200+65*sin((s0)*(PI/30)+PI/2));
}
setcolor(RED);//设置时针的颜色
line(200,200,200+45*cos(h1),200+45*sin(h1));//绘制时针
setcolor(LIGHTGRAY);
line(200,200,200+55*cos(m1),200+55*sin(m1));//绘制分针
setcolor(BLUE);//设置秒针颜色
line(200,200,200+65*cos((s)*(PI/30)+PI/2),200+65*sin((s)*(PI/30)+PI/2));//绘制秒针
s0=s;
m0=m1;
h0=h1;
}
作者:flybird
时间:2012/08/12