电子钟的设计 C语言编程

合集下载

电子时钟c语言课程设计

电子时钟c语言课程设计

电子时钟c语言课程设计一、课程目标知识目标:1. 学生能理解并掌握C语言中结构体、指针、函数等基本概念;2. 学生能运用C语言编程实现电子时钟的功能,包括时、分、秒的显示与更新;3. 学生了解电子时钟的原理,明确时间与计算机系统时间的关系。

技能目标:1. 学生能运用所学知识,设计并编写出具有实际功能的电子时钟程序;2. 学生通过课程学习,掌握编程调试技巧,提高解决问题的能力;3. 学生能够进行团队协作,共同分析问题、设计解决方案并完成项目。

情感态度价值观目标:1. 学生培养对编程的兴趣,激发探索精神,增强学习动力;2. 学生通过课程学习,认识到编程在实际生活中的应用,提高学习的实用性;3. 学生在团队协作中,学会沟通与交流,培养合作精神和团队意识。

课程性质:本课程为实践性较强的课程,旨在让学生通过动手实践,掌握C语言编程的基本技能,培养实际编程能力。

学生特点:学生已经掌握了C语言的基本语法,具有一定的编程基础,但对实际项目的开发流程和团队协作经验不足。

教学要求:教师需引导学生将所学理论知识应用于实际项目,注重培养学生的动手能力、解决问题的能力和团队协作能力。

在教学过程中,将目标分解为具体的学习成果,以便进行有效的教学设计和评估。

二、教学内容1. C语言基础回顾:结构体、指针、函数的定义与使用;2. 电子时钟原理介绍:时间概念、计算机系统时间处理;3. 编程环境准备:配置开发环境、编译与调试;4. 项目需求分析:明确电子时钟的功能需求、界面设计;5. 编程实现:- 设计结构体存储时间数据;- 编写函数实现时、分、秒的更新;- 实现界面显示与交互;- 处理异常情况与边界条件;6. 项目测试与优化:测试电子时钟程序、优化代码性能;7. 团队协作与交流:分组进行项目开发、组内讨论与分享;8. 课堂总结与反馈:总结项目开发过程、收集学生反馈。

教材关联章节:C语言基础、结构体与指针、函数、项目实践。

教学内容安排与进度:1. 基础知识回顾(1课时);2. 电子时钟原理介绍(1课时);3. 编程环境准备与项目需求分析(1课时);4. 编程实现(4课时);5. 项目测试与优化(2课时);6. 团队协作与交流(2课时);7. 课堂总结与反馈(1课时)。

电子钟设计c语言设计

电子钟设计c语言设计

电子钟设计c语言设计电子钟是一种使用数字或者模拟显示时间的时钟。

它通常使用数字显示屏或者液晶屏来显示时间。

电子钟的优势在于与传统机械钟相比,它更加准确、可靠、精准和方便。

通过使用c语言来设计电子钟可以使它更加智能化和强大。

我们知道,c语言是一种通用的高级编程语言,它非常适合用于系统编程和应用程序开发。

电子钟的设计需要运用c语言的数据结构、算法、指针和其他通用编程技术。

设计一个可靠的电子钟需要考虑到准确显示时间、时区调整、闹钟功能、定时器和更多的功能。

在设计电子钟时,我们首先需要考虑到选择合适的开发平台和硬件选型。

例如,我们可以使用Arduino或者Raspberry Pi 等开发板来设计电子钟。

这些开发板既能提供强大的计算能力,又可以提供足够的GPIO引脚和通信接口。

同时,我们还需要选择合适的时钟模块,例如DS1307、DS3231和DS1302等。

接下来,我们可以考虑设计程序框架。

设计程序框架需要考虑到用户需求,从而使程序有条不紊地进行。

我们可以设计菜单选项来满足用户需求,例如时钟显示、日期显示、温度显示等等。

此外,还可以考虑添加一些有趣的功能,例如给予经度和纬度计算日出日落时间以及天气预报等。

电子钟的时间显示通常使用RTC模块与单片机进行通信。

RTC模块可以提供秒、分、时、日、月、年等时间数据。

我们需要从RTC模块读取这些数据,并将它们转换成格式化的字符串进行显示。

我们还需要考虑到时区的调整,以便在不同时区下准确显示时间。

闹钟功能是电子钟的一个重要特性。

我们可以设计界面来设置闹钟时间和日期。

当闹钟响起时,电子钟可以触发警报并发出声音或声音和振动提醒。

我们还可以增加关闭闹钟的选项,以便用户可以在闹钟响起时快速关闭它。

另一个特色功能是定时器,它可以用来进行倒计时或计时操作。

我们可以使用按钮或者旋转编码器来设置定时器时间。

定时器可以在倒计时或计时完成时发出警报来通知用户,以便执行相应的操作。

最后,我们需要考虑到电子钟的可扩展性和灵活性。

C语言课程设计 时钟代码

C语言课程设计 时钟代码

/*电子时钟源代码*/#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); /*规定画线的方式。

电子时钟计时器的设计(c语言版_调试完美通过_可直接使用)(附原理图源程序以及完整的文档)

电子时钟计时器的设计(c语言版_调试完美通过_可直接使用)(附原理图源程序以及完整的文档)

湖南人文科技学院课程设计报告课程名称:单片机原理及应用课程设计设计题目:电子时钟的设计系别:通信与控制工程系专业:通信工程班级:09级通信二班学生姓名: 袁琦黄文付学号: 09416230 09416227起止日期: 2011年12月20日~2011年12月30日指导教师:王善伟姚毅谢四莲教研室主任:刘建闽.指导教师评语:指导教师签名:年月日成绩评定项目权重成绩袁琦黄文付1、设计过程中出勤、学习态度等方面0.22、课程设计质量与答辩0.53、设计报告书写及图纸规范程度0.3总成绩教研室审核意见:教研室主任签字:年月日教学系审核意见:.摘要时钟是人类日常生活必不可少的工具,本设计从日常生活中常见的事物入手,通过对电子时钟的设计,让我们认识到单片机已经深入到我们生活的每个领域,该设计不仅可以锻炼我们的动手能力,而且可以加深我们对单片机的认识和激发我们对未知科学领域的探索。

本文利用单片机实现数字时钟计时功能的主要内容。

它体积小,成本低、功能强、使用方便、可靠性高等一系列优点,广泛应用于智能产业和工业自动化上。

本次设计采用独立式按键进行时间调整,其中STC89C52是核心元件,同时采用数码管LED动态显示“时”,“分”,“秒”的现代计时装置。

与传统机械表相比,它具有走时精确,显示直观等特点。

它的计时周期为24小时,显满刻度为“23时59分59秒”,另外利用DS1302具有校时功能,断电后有记忆功能,恢复供电时可实现计时同步等特点。

该系统同时具有硬件设计简单、工作稳定性高、价格低廉等优点。

关键词:STC89C52 ;LED数码管;8255芯片;DS1302芯片;目录设计要求 (1)1.方案论证与对比 (1)1.1方案一 (1)1.2方案二 (2)1.3方案对比 (3)2.系统硬件电路的设计 (3)2.1单片机的选择及引脚功能介绍 (3)2.2 8255A芯片的结构及引脚功能介绍 (5)2.3 DS1302芯片的结构及引脚功能介绍 (8)2.4显示电路设计 (9)2.5电源电路设计 (10)2.6键盘动态扫描电路设计 (10)3.控制系统的软件设计 (12)3.1主程序流程图 (12)3.2显示子程序 (13)3.3闹钟时间设定功能程序 (14)3.4键盘扫描程序 (15)4.系统功能调试与整体指标 (16)4.1硬件调试与分析 (16)4.2软件调试与分析 (16)4.3性能分析 (16)5.详细仪器清单 (17)6.总结与思考及致谢 (18)参考文献 (19)附录一:程序(方案一) (21)附录二:程序(方案二) (36)电子时钟的设计设计要求利用单片机作为控制核心,完成一个时钟计时器。

C语言实现电子时钟程序

C语言实现电子时钟程序

C语⾔实现电⼦时钟程序本⽂实例为⼤家分享了C语⾔实现电⼦时钟程序的具体代码,供⼤家参考,具体内容如下Qt ⾥⾯运⾏#include<windows.h>#include <stdio.h>#include <stdlib.h>#include <conio.h>#include <time.h>typedef struct{int x;int y;}Point;time_t now;struct tm *pt, t1, t2;int printpoint(Point p){Point p1;p1.x = p.x + 2; p1.y = p.y + 4;gotoxy(p1.x, p1.y); printf("%c%c", 2, 2);gotoxy(p1.x, p1.y + 1); printf("%c%c", 2, 2);p1.y += 4;gotoxy(p1.x, p1.y); printf("%c%c", 2, 2);gotoxy(p1.x, p1.y + 1); printf("%c%c", 2, 2);return 0;}int print0(Point p){int i = 0;for (; i<13; i++){gotoxy(p.x + 1, p.y + i);if (i == 0 || i == 12)printf("%c%c%c%c%c%c", 2, 2, 2, 2, 2, 2);elseprintf("%c%4s%c", 2, " ", 2);}return 0;}int print1(Point p){int i = 0;for (; i<13; i++){gotoxy(p.x + 1, p.y + i);printf("%5s%c", " ", 2);}return 0;}int print2(Point p){int i = 0;for (; i<13; i++){gotoxy(p.x + 1, p.y + i);if (i == 0 || i == 6 || i == 12)printf("%c%c%c%c%c%c", 2, 2, 2, 2, 2, 2);else if (i>0 && i<6)printf("%5s%c", " ", 2);elseprintf("%c", 2);}return 0;}int print3(Point p){int i = 0;for (; i<13; i++){gotoxy(p.x + 1, p.y + i);if (i == 0 || i == 6 || i == 12)printf("%c%c%c%c%c%c", 2, 2, 2, 2, 2, 2);elseprintf("%5s%c", " ", 2);}return 0;}int print4(Point p){int i = 0;for (; i<13; i++){gotoxy(p.x + 1, p.y + i);if (i<6) printf("%c%4s%c", 2, " ", 2);else if (i == 6)printf("%c%c%c%c%c%c", 2, 2, 2, 2, 2, 2);else printf("%5s%c", " ", 2);}return 0;}int print5(Point p){int i = 0;for (; i<13; i++){gotoxy(p.x + 1, p.y + i);if (i == 0 || i == 6 || i == 12)printf("%c%c%c%c%c%c", 2, 2, 2, 2, 2, 2);else if (i>0 && i<6)printf("%c", 2);elseprintf("%5s%c", " ", 2);}return 0;}int print6(Point p){int i = 0;for (; i<13; i++){gotoxy(p.x + 1, p.y + i);if (i == 0 || i == 6 || i == 12)printf("%c%c%c%c%c%c", 2, 2, 2, 2, 2, 2);else if (i>0 && i<6)printf("%c", 2);elseprintf("%c%4s%c", 2, " ", 2);}return 0;}int print7(Point p){int i = 0;for (; i<13; i++){gotoxy(p.x + 1, p.y + i);if (i == 0) printf("%c%c%c%c%c%c", 2, 2, 2, 2, 2, 2); else printf("%5s%c", " ", 2);}return 0;}int print8(Point p){int i = 0;for (; i<13; i++){gotoxy(p.x + 1, p.y + i);if (i == 0 || i == 6 || i == 12)printf("%c%c%c%c%c%c", 2, 2, 2, 2, 2, 2);else printf("%c%4s%c", 2, " ", 2);}return 0;}int print9(Point p){int i = 0;for (; i<13; i++){gotoxy(p.x + 1, p.y + i);if (i == 0 || i == 6 || i == 12)printf("%c%c%c%c%c%c", 2, 2, 2, 2, 2, 2); else if (i>0 && i<6)printf("%c%4s%c", 2, " ", 2);elseprintf("%5s%c", " ", 2);}return 0;}int clear(Point p){int i = 0;for (; i<13; i++)gotoxy(p.x, p.y + i); printf("%16s", " ");return 0;}int printtime(Point p, int n){int a, b;Point pp;a = n / 10,b = n % 10;pp.x = p.x + 8, pp.y = p.y;switch (a){case 0: print0(p); break;case 1: print1(p); break;case 2: print2(p); break;case 3: print3(p); break;case 4: print4(p); break;case 5: print5(p); break;}switch (b){case 0: print0(pp); break;case 1: print1(pp); break;case 2: print2(pp); break;case 3: print3(pp); break;case 4: print4(pp); break;case 5: print5(pp); break;case 6: print6(pp); break;case 7: print7(pp); break;case 8: print8(pp); break;case 9: print9(pp); break;}return 0;}int main(){Point phour, pmin, psec, point1, point2;phour.x = 9, pmin.x = 32, psec.x = 55;phour.y = pmin.y = psec.y = 7;point1.x = 25, point2.x = 49;point1.y = point2.y = 7;clrscr();textbackground(YELLOW); /* 设置背景颜⾊*/ textcolor(RED); /* 设置数字显⽰颜⾊*/now = time(0);pt = localtime(&now);t1 = *pt;printtime(phour, t1.tm_hour);printpoint(point1);printtime(pmin, t1.tm_min);printpoint(point2);printtime(psec, t1.tm_sec);while (1){now = time(0);pt = localtime(&now);t2 = *pt;if (t2.tm_sec != t1.tm_sec){t1 = t2;clrscr();printtime(phour, t1.tm_hour);printpoint(point1);printtime(pmin, t1.tm_min);printpoint(point2);printtime(psec, t1.tm_sec);}if (bioskey(1) == 0) continue;else exit(0);}return 0;}以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

AT89C52电子时钟c设计

AT89C52电子时钟c设计
timecount2++;
}
else
{
timecount=0;
second++;
}
}
////////////////////////////显示日期////////////////////////////////////
p0=outfunction(month%10);
delay(5);
p0=0x00;
p2=cout2[6];
p0=outfunction(date/10);
delay(5);
p0=0x00;
p2=cout2[7];
p0=outfunction(date%10);
delay(5);
p0=0x00;
recount();//换算时分秒
}
}
///////////////////////////////时间设置////////////////////////////////////
void int1() interrupt 2 using 1
p2=cout2[1];
p0=outfunction((year%1000)/100);
delay(5);
p0=0x00;
p2=cout2[2];
p0=outfunction((year%100)/10);
delay(5);
p0=0x00;
p0=outfunction(minute%10);
delay(5);
p0=0x00;
p2=cout2[5];
p0=cout1[10];
delay(7);

世上最简单的遥控(数码管显示)电子钟(C语言编写)

世上最简单的遥控(数码管显示)电子钟(C语言编写)

世上最简单的遥控(数码管显示)电子钟(C语言编写)/*此程序为红外遥控电子钟,晶振为12M,MCU 型号为51 系列,电路很简单四位共阳数码管,红外接收管sm0038 接在P3.2*/#include #define uchar unsigned char#define uint unsigned int#define c(x) (x*120000/120000)sbit IR=P3 ; sbit ge=P2;//数码管四位选控制端sbit shi=P2 ;sbit bai=P2;sbit qian=P2;char miao,fen=59,shij=23;//时分秒3 个变量uchar num,ding; //两定时器计数变量uint temp;//遥控解码变量uchar i;uchar j;bit flag;//控制小数点亮与灭变量bit power;//控制数码管亮与灭变量bit flash;//进入时间调整标志位变量uchar IRBUF[4]; //用于保存解码结果uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86, 0x8e};uint Low(){TL0=0;TH0=0;TR0=1;while(!IR&&(TH0&0x80)==0);TR0=0;returnTH0*256+TL0;}//=============================================================uintHigh(){TL0=0;TH0=0;TR0=1;while(IR&&(TH0&0x80)==0);TR0=0;returnTH0*256+TL0;}void xian(uchar shik,uchar fen){P0=table[shik/10];if(power==0)qian=0;elseqian=1;//delay(2);qian=1;if(flag==0)P0=table[shik%10]&0x7f;elseP0=table[shik%10]|0x80;if (power==0)bai=0;elsebai=1;//delay(2);bai=1;P0=table[fen/10];if(power==0)shi=0;els eshi=1;//delay(2);shi=1;P0=table[fen%10];if(power==0)ge=0;elsege=1;//delay(2);ge =1;}void yin(){while(1){ restart: while(IR) {xian(shij,fen); if(flash==1) { if(ding>5) { ding=0; power=~power; //xian(shij,fen); } } }。

电子时钟C代码

电子时钟C代码

#include<iostream.h>#include<iomanip.h>#include<time.h>class CDateTime{private:int year;int month;int days;int hour;int minute;int second;int wday; //星期private:int YearToDays(int y); int DatesToDays();int MonthToWeek();int YearMonthToDay( int y,int m);public:CDateTime(int y=0,int m=0,int d=0,int h=0,int mt=0,int s=0) {year=y;month=m;days=d;hour=h;minute=mt;second=s;wday=DatesToWeek();}~CDateTime(){}void Now();int DatesToWeek();CDateTime LastMonth();CDateTime NextMonth();void LastTime();void InputYearMonth();void PrintMonth();void InputDates();int Week(){return wday;}CDateTime operator+(const int &n);CDateTime operator-(const int &n);int operator-( CDateTime &dt);friend ostream & operator<< ( ostream & out, const CDateTime &c);};void CDateTime::Now(){time_t te;tm *tp;time(&te);tp=localtime(&te);year=tp->tm_year+1900;month=tp->tm_mon+1;days=tp->tm_mday;hour=tp->tm_hour;minute=tp->tm_min;second=tp->tm_sec;wday=tp->tm_wday;}CDateTime CDateTime:: operator-(const int &n) {int m=n;int mday;CDateTime dt(*this);mday=YearMonthToDay(dt.year,dt.month);while(dt.days+m >mday){dt.month--;if(dt.month>1){dt.year-=1;dt.month=12;m-=mday;mday=YearMonthToDay(dt.year,dt.month); }dt.days+=m;return dt;}CDateTime CDateTime::operator+(const int &n) {int m=n;int mday;CDateTime dt(*this);mday=YearMonthToDay(dt.year,dt.month);while(dt.days+m > mday){dt.month++;if(dt.month>12){dt.year+=1;dt.month=1;m-=mday;mday=YearMonthToDay(dt.year,dt.month); }dt.days+=m;return dt;}int CDateTime::operator-( CDateTime &dt) {int y=dt.year;int m=dt.month;int t1 = dt.DatesToDays ();int t2 = DatesToDays();return (t2 - t1);}int CDateTime::YearToDays(int y){int d=0;int i=(y-1900)*365;while(y>1900)if((y-1)% 4 ==0 && (y-1) % 100 != 0 || (y-1) % 400 == 0)++d;--y;}return(d+i);}int CDateTime::YearMonthToDay(int y,int m ){int mday=0;switch(m){case 1: case 3: case 5: case 7: case 8: case 10: case 12: mday=31;break;case 2:if(y % 4 ==0 && y % 100 != 0 || y % 400 == 0)mday=29;elsemday=28;break;case 4: case 6: case 9: case 11:mday=30;break;default:mday=0;}return mday;}int CDateTime::DatesToDays( ){int total = 0;while( month >1){total += YearMonthToDay(year ,month-1); --month;}int num = YearToDays( year);return (total +num +days);}int CDateTime::DatesToWeek()int w = DatesToDays();return (w%7);}CDateTime CDateTime:: NextMonth( ) {Date tmp( *this);if(month ==12){tmp.month = 1;++tmp.year ;}else++tmp.month;return tmp;}CDateTime CDateTime::LastMonth( ) {CDateTime tmp( *this);if(month ==1)tmp.month = 12;--tmp.year ;}else--tmp.month;return tmp;}void CDateTime::LastTime(){}void CDateTime::InputDates(){cout<<"输入年:"<<endl;cin>>year;while( year <= 1900 || year >=2099) {cout<<"重新输入年:"<<endl;cin>>year;}cout<<"输入月:"<<endl;cin>>month;while( month <= 0 || month >12){cout<<"重新输入月:"<<endl;cin>>month;}cout<<"输入天"<<endl;cin>>days;}void CDateTime::InputYearMonth() {cout<<"输入年:"<<endl;cin>>year;while( year <= 1900 || year >=2099) {cout<<"重新输入年:"<<endl;cin>>year;}cout<<"输入月:"<<endl;cin>>month;while( month <= 0 || month >12){cout<<"重新输入月:"<<endl;cin>>month;}}int CDateTime::MonthToWeek( ){int t = DatesToDays( );return (t-days)%7;}void CDateTime::PrintMonth( ){int y=year;int m=month;cout<<"------------------------------"<<endl;cout<<"******************************"<<endl;cout<<" "<<"日"<<" "<<"一"<<" "<<"二"<<" "<<"三"<<" "<<"四"<<" "<<"五"<<" "<<"六"<<endl;int w = MonthToWeek( );if( w !=6)for( int i =0;i<=w;i++)cout<<" ";int k = YearMonthToDay(y,m);for( int j = 1 ;j<= k; ++j){cout<<setw(2)<<""<<setw(2)<<j;if( (j+w+1)%7 ==0)cout<<endl;}cout<<endl;cout<<"------------------------------"<<endl;cout<<"******************************"<<endl;}ostream & operator<< ( ostream & out, const CDateTime &c) {out<<c.year<<"年"<<c.month<<"月"<<c.days<<"日";out<<c.hour<<":"<<c.minute<<":"<<c.second<<endl;return out;}void main(){CDateTime d1,d2,d3,d4,d5;cout<<"欢迎使用日历"<<endl; cout<<"请选择:"<<endl;cout<<"1.查询月历"<<endl;cout<<"2.查询星期"<<endl;cout<<"3.倒计时"<<endl;cout<<"0退出"<<endl;cin>>i;while(i!=0){switch(i){case 0:break;case 1:d1.InputYearMonth();d1.PrintMonth();cout<<"1.上一个月"<<endl; cout<<"2. 下一个月:"<<endl; cout<<"0.返回:"<<endl;while(j!=0){switch(j){case 0:break;case 1:d2=stMonth();d2.PrintMonth();break;case 2:d3=d1.NextMonth();d3.PrintMonth();break;default:while(j<0||j>2){cout<<"请重新选择"<<endl; cin>>j;}}cout<<"0返回"<<endl;cin>>j;}break;case 2:d4.InputDates();k=d4.DatesToWeek();cout<<"星期"<<k<<endl;break;case 3:d5.InputDates();// stTime();break;default:while(i<0||i>3){cout<<"请重新输入"<<endl; cin>>i;}}cout<<"1.查询月历"<<endl;cout<<"2.查询星期"<<endl; cout<<"3.倒计时"<<endl; cout<<"0退出"<<endl;cin>>i;}}。

51单片机C语言电子时钟程序设计程序

51单片机C语言电子时钟程序设计程序

主程序:#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按下以下。

电子钟C语言源程序

电子钟C语言源程序

/*************** writer:shopping.w ******************/ #include <reg52.h>#include <intrins.h>#include <string.h>#define uint unsigned int#define uchar unsigned charsbit IO = P1^0;sbit SCLK = P1^1;sbit RST = P1^2;sbit RS = P2^0;sbit RW = P2^1;sbit EN = P2^2;uchar *WEEK[]={"SUN","***","MON","TUS","WEN","THU","FRI","SAT"};uchar LCD_DSY_BUFFER1[]={"DATE 00-00-00 "};uchar LCD_DSY_BUFFER2[]={"TIME 00:00:00 "};uchar DateTime[7];void DelayMS(uint ms){uchar i;while(ms--){for(i=0;i<120;i++);}}void Write_A_Byte_TO_DS1302(uchar x){uchar i;for(i=0;i<8;i++){IO=x&0x01;SCLK=1;SCLK=0;x>>=1;}}uchar Get_A_Byte_FROM_DS1302(){uchar i,b=0x00;for(i=0;i<8;i++){b |= _crol_((uchar)IO,i);SCLK=1;SCLK=0;}return b/16*10+b%16;}uchar Read_Data(uchar addr){uchar dat;RST = 0;SCLK=0;RST=1;Write_A_Byte_TO_DS1302(addr);dat = Get_A_Byte_FROM_DS1302();SCLK=1;RST=0;return dat;}void GetTime(){uchar i,addr = 0x81;for(i=0;i<7;i++){DateTime[i]=Read_Data(addr);addr+=2;}}uchar Read_LCD_State(){uchar state;RS=0;RW=1;EN=1;DelayMS(1);state=P0;EN = 0;DelayMS(1);return state;}void LCD_Busy_Wait(){while((Read_LCD_State()&0x80)==0x80);DelayMS(5);}void Write_LCD_Data(uchar dat){LCD_Busy_Wait();RS=1;RW=0;EN=0;P0=dat;EN=1;DelayMS(1);EN=0; }void Write_LCD_Command(uchar cmd){LCD_Busy_Wait();RS=0;RW=0;EN=0;P0=cmd;EN=1;DelayMS(1);EN=0; }void Init_LCD(){Write_LCD_Command(0x38);DelayMS(1);Write_LCD_Command(0x01);DelayMS(1);Write_LCD_Command(0x06);DelayMS(1);Write_LCD_Command(0x0c);DelayMS(1);}void Set_LCD_POS(uchar p){Write_LCD_Command(p|0x80);}void Display_LCD_String(uchar p,uchar *s){uchar i;Set_LCD_POS(p);for(i=0;i<16;i++){Write_LCD_Data(s[i]);DelayMS(1);}}void Format_DateTime(uchar d,uchar *a){a[0]=d/10+'0';a[1]=d%10+'0';}void main(){Init_LCD();while(1){GetTime();Format_DateTime(DateTime[6],LCD_DSY_BUFFER1+5);Format_DateTime(DateTime[4],LCD_DSY_BUFFER1+8);Format_DateTime(DateTime[3],LCD_DSY_BUFFER1+11);strcpy(LCD_DSY_BUFFER1+13,WEEK[DateTime[5]]);Format_DateTime(DateTime[2],LCD_DSY_BUFFER1+5);Format_DateTime(DateTime[1],LCD_DSY_BUFFER1+8);Format_DateTime(DateTime[0],LCD_DSY_BUFFER1+11);Display_LCD_String(0x00,LCD_DSY_BUFFER1);Display_LCD_String(0x40,LCD_DSY_BUFFER2);}}。

基于单片机C语言电子时钟完整版(闹钟,整点报时)

基于单片机C语言电子时钟完整版(闹钟,整点报时)

《单片机技术》课程设计说明书数字电子钟系、部:电气与信息工程学院学生姓名:指导教师:职称专业:班级:完成时间:2013-06-07摘要电子钟在生活中应用非常广泛,而一种简单方便的数字电子钟则更能受到人们的欢迎。

所以设计一个简易数字电子钟很有必要。

本电子钟采用ATMEL公司的AT89S52单片机为核心,使用12MHz 晶振与单片机AT89S52 相连接,通过软件编程的方法实现以24小时为一个周期,同时8位7段LED数码管(两个四位一体数码管)显示小时、分钟和秒的要求,并在计时过程中具有定时功能,当时间到达提前定好的时间进行蜂鸣报时。

该电子钟设有四个按键KEY1、KEY2、KEY3、KEY4和KEU5键,进行相应的操作就可实现校时、定时、复位功能。

具有时间显示、整点报时、校正等功能。

走时准确、显示直观、运行稳定等优点。

具有极高的推广应用价值。

关键词电子钟;AT89S52;硬件设计;软件设计ABSTRACTClock is widely used in life, and a simple digital clock is more welcomed by people. So to design a simple digital electronic clock is necessary.The system use a single chip AT89S52 of ATMEL’s as its core to control The crystal oscillator clock,using of E-12MHZ is connected with the microcontroller AT89S52, through the software programming method to achieve a 24-hour cycle, and eight 7-segment LED digital tube (two four in one digital tube) displays hours, minutes and seconds requirements, and in the time course of a timing function, when the time arrived ahead of scheduled time to buzz a good timekeeping. The clock has four buttons KEY1, KEY2, KEY3,KEY4 and KEY5 key, and make the appropriate action can be achieved when the school, timing, reset. With a time display, alarm clock settings, timer function, corrective action. Accurate travel time, display and intuitive, precision, stability, and so on. With a high application value.Key words Electronic clock;;AT89S52;Hardware Design;Software Design目录1设计课题任务、功能要求说明及方案介绍 (1)1.1设计课题任务 (1)1.2功能要求说明 (1)1.3设计总体方案介绍及原理说明 (1)2设计课题硬件系统的设计 (2)2.1设计课题硬件系统各模块功能简要介绍 (2)2.2设计课题电路原理图、PCB图、元器件布局图 (2)2.3设计课题元器件清单 (5)3设计课题软件系统的设计 (6)3.1设计课题使用单片机资源的情况 (6)3.2设计课题软件系统各模块功能简要介绍 (6)3.3设计课题软件系统程序流程框图 (6)3.4设计课题软件系统程序清单 (10)4设计结论、仿真结果、误差分析、教学建议 (21)4.1设计课题的设计结论及使用说明 (21)4.2设计课题的仿真结果 (21)4.3设计课题的误差分析 (22)4.4设计体会 (22)4.5教学建议 (22)结束语 (23)参考文献 (24)致谢 (25)附录 (26)1 设计课题任务、功能要求说明及方案介绍1.1 设计课题任务设计一个具有特定功能的电子钟。

c语言电子时钟课程设计

c语言电子时钟课程设计

c语言电子时钟课程设计一、课程目标知识目标:1. 理解C语言中结构体、函数和循环控制的使用,掌握电子时钟的基本原理。

2. 学习并掌握使用C语言编写程序,实现电子时钟的功能,包括时、分、秒的显示与更新。

3. 了解C语言中定时器功能的使用,实现电子时钟的自动更新。

技能目标:1. 能够运用所学知识,独立设计并编写一个简单的C语言电子时钟程序。

2. 培养学生的编程实践能力,提高问题分析和解决能力。

3. 学会使用调试工具,对程序进行调试和优化,提高程序运行的稳定性。

情感态度价值观目标:1. 培养学生对计算机编程的兴趣和热情,激发学生的学习主动性。

2. 培养学生的团队合作意识,学会与他人共同解决问题,相互学习和进步。

3. 培养学生的创新精神,敢于尝试新方法,勇于克服困难,不断优化程序。

课程性质:本课程为实践性较强的课程,结合理论知识与实际操作,使学生能够学以致用。

学生特点:学生已具备一定的C语言基础,了解基本语法和编程思路,但对实际应用还不够熟练。

教学要求:结合学生特点,注重理论与实践相结合,提高学生的编程实践能力,培养学生的问题分析和解决能力。

在教学过程中,关注学生的个体差异,给予个性化指导。

通过课程学习,使学生能够独立完成一个具有实际意义的编程项目。

二、教学内容1. 复习C语言基础:变量、数据类型、运算符、控制结构(章节1-4)。

2. 结构体与指针:介绍结构体的定义和使用,指针的概念和操作(章节5)。

3. 函数:回顾函数的定义、调用和参数传递,强调模块化编程的重要性(章节6)。

4. 循环控制:深入学习for循环和while循环,理解其在电子时钟中的应用(章节7)。

5. 定时器与时间处理:介绍定时器原理,时间处理函数的使用(章节8)。

6. 电子时钟编程实践:结合所学知识,设计并实现电子时钟程序。

- 显示部分:编写代码实现时、分、秒的显示(课时1)。

- 更新部分:实现时间递增,每秒更新显示(课时2)。

- 定时器应用:使用定时器自动更新时间,减少资源消耗(课时3)。

C语言编写高精度 电子时钟

C语言编写高精度 电子时钟

#include<reg51.h>#include "public.h"#define uchar unsigned char#define uint unsigned int#define write_addr 0xa0#define read_addr 0xa1extern number_list[10]={0xed,0x28,0xb5,0xb9,0x78,0xd9,0xdd,0xa8,0xfd,0xf9}; extern number_list1[10]={0xef,0x2A,0xb7,0xbB,0x7A,0xdB,0xdF,0xaA,0xfF,0xfB}; extern x_list[12]={0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b}; void int_clock(void);void delay(ms);void ds_time();void ds_day();void set_time();uchar Sec;uchar Min;uchar Hour;uchar Week;uchar day;uchar month;uchar year;uchar Sec_H;uchar Sec_L;uchar Min_H;uchar Min_L;uchar Hour_H;uchar Hour_L;uchar timer_count;uchar dsplay_count;uchar key_week;uchar key_h;uchar key_m;uchar key_s;uchar set_flag;uchar ds_flag;void main (){uchar i,day_sum;timer_count=0;dsplay_count=0xAA;key_h=0;key_m=0;key_s=0;key_week=0;set_flag=0;ds_flag=0xBB;LCD_EN=1;TMOD=0X01;TCON=0x10;TH0=0X63;TL0=0XC0;EA=1;ET0=1;int_clock();while(1){ WDT_RST=0xA1;//时钟计算、进位if((month==1)||(month==3)||(month==5)||(month==7)||(month==8)||(month==10)||(month==12)) {day_sum=31;}if(month==2) //暂不区分闰年{day_sum=28;}if((month==4)||(month==6)||(month==9)||(month==11)){day_sum=30;}if((timer_count==10)&&(set_flag==0)){timer_count=0;Sec++;if(Sec==60){Sec=0;Min++;if(Min==60){Min=0;Hour++;if(Hour==24){Hour=0;Week++;day++;if(Week==8){Week=1;}if(day==day_sum){day=1;month++;if(month==13){month=1;year++;}}}}}}if(ds_flag==0xbb){ds_time();}if(ds_flag==0xaa){ds_day();}if (ds_flag==0xcc){for(i=0;i<=12;i++){EXT_ADR=x_list[i];EXT_DAT=0x00;}}set_time();}}void ds_time(void){EXT_ADR=0x1b; // 显示时间EXT_DAT=0x10;//时钟显示Sec_H=Sec/10;Sec_L=Sec%10;EXT_ADR=0x17;EXT_DAT=number_list[Sec_H];EXT_ADR=0x18;if(Sec_L%2==0){EXT_DAT=number_list1[Sec_L];}else{EXT_DAT=number_list[Sec_L];}Min_H=Min/10;Min_L=Min%10;EXT_ADR=0x15;EXT_DAT=number_list[Min_H];EXT_ADR=0x16;EXT_DAT=number_list[Min_L];Hour_H=Hour/10;Hour_L=Hour%10;EXT_ADR=0x13;EXT_DAT=number_list1[Hour_H];EXT_ADR=0x14;EXT_DAT=number_list1[Hour_L];EXT_ADR=0x11;EXT_DAT=number_list[Week];}void ds_day (void){EXT_ADR=0x1b; // 显示日期EXT_DAT=0x40;// 日期显示EXT_ADR=0x17;EXT_DAT=number_list[day/10];EXT_ADR=0x18;EXT_DAT=number_list1[day%10];//monthEXT_ADR=0x15;EXT_DAT=number_list[month/10];EXT_ADR=0x16;EXT_DAT=number_list[month%10];//yearEXT_ADR=0x11;EXT_DAT=number_list[2];EXT_ADR=0x12;EXT_DAT=number_list[0];EXT_ADR=0x13;EXT_DAT=number_list1[1];EXT_ADR=0x14;EXT_DAT=number_list1[1];}void set_time(){//set_sif(key_s==1){if(set_s==0)key_s=0;}else{ if(set_s==1){delay(20000);if(set_s==1){set_flag=1;key_s=1;Sec++;if(Sec==60){Sec=0;}}}}set_flag=0;//set_hif(key_h==1){if(set_h==0)key_h=0;}else{ if(set_h==1){delay(20000);if(set_h==1){set_flag=1;key_h=1;Hour++;if(Hour==24){Hour=0;}}}}set_flag=0;//set_mif(key_m==1){if(set_m==0)key_m=0;}else{ if(set_m==1){delay(20000);if(set_m==1){set_flag=1;key_m=1;Min++;if(Min==60){Min=0;}}}}set_flag=0;//set_weekif(key_week==1){if(set_week==0)key_week=0;}else{if (set_week==1){delay(20000);if(set_week==1){key_week=1;Week++;if(Week==8){Week=1;}}}}}void timer0_int(void) interrupt 1 //定时100ms {TMOD=0X01;TCON=0x10;TH0=0X63;TL0=0XC0;WDT_RST=0xA1;timer_count++;dsplay_count++;if(dsplay_count<30){ds_flag=0xaa;}if(((dsplay_count)>30)&&((dsplay_count)<32)) {ds_flag=0xcc;}if(((dsplay_count)>32)&&((dsplay_count)<60)){ds_flag=0xbb;}if(dsplay_count>60){dsplay_count=0;}}/*void I2C_sart(){SDA=1;SCL=1;delay();//延时4毫秒SDA=0;SCL=0;}void I2C_stop(){SDA=0;SCL=1;delay();//延时4毫秒SDA=1;SCL=0;}*/void int_clock(void){uchar i;Sec=0;Min=41;Hour=7;Week=2;day=23;month=3;for(i=0;i<4;i++){EXT_ADR=x_list[i+5];EXT_DAT=number_list[0];}EXT_ADR=x_list[3];EXT_DAT=number_list[1];EXT_ADR=0X14;EXT_DAT=0Xb7;EXT_ADR=0X18;EXT_DAT=0XEF;}void delay (ms){uint i;for(i=0;i<ms;i++){;;;;;;}}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

课程设计说明书课程设计名称:专业课程设计课程设计题目:电子钟的设计学院名称:信息工程学院专业:电子信息工程班级: XXXXXX 学号: XXXXXXXX 姓名: XXXX 评分:教师: XXXXXX20 XX 年 X 月 X 日当今信息科技高速发展,使用方便、低成本电子设备已逐步成为我们日常生活中电子产品的主力军。

用软件代替硬件的电子设备能大大地节省成本,且有利于资源的节约,因此,以软代硬的设计必将成为我们现代设计的主流。

本设计是利用MCS-51系列单片机内部的定时器/计数器进行中数年定时,配合软件延时实现时、分、秒的计时。

该方案节省硬件成本,且能够使设计者在定时/计数器的使用中及程序设计方面得到锻炼和提高,因此本系统将采用软件方法实现计时。

关键词:单片机计数器软件第一章实验要求及设计思路 (4)1.1 设计内容及要求 (4)1.2 设计的目与和意义 (4)1.3 设计的基本思路与主要内容 (5)第二章系统组成及工作原理 (6)2.1 系统组成 (6)2.2工作原理 (7)第三章硬件设计与分析 (9)3.1 硬件设计原理 (9)3.2 AT89C51单片机介绍 (9)3.3单片机最小应用系统 (9)3.4显示电路 (11)3.5 键盘及其接口 (12)第四章软件设计 (14)4.1 主程序设计 (14)4.2 定时中断程序 (17)4.3 显示子程序 (17)第五章调试与运行 (19)第六章结论与体会 (20)参考文献 (21)附录一系统原理图 (22)附录二元件清单 (23)附录三程序清单 (24)第一章 实验要求及设计思路1.1 设计内容及要求设计一个电子钟,要求如下:(1) 利用单片机最小系统设计一个电子钟(不能采用单片机开发系统)(2) 用8255扩展键盘及显示接口(3) 显示方式:** 时** 分** 秒(4) 时间可以任意修改1.2 设计的目的与意义人类的生活包括:工作、学习、休息以及参与社会的多种实践活动,环环有条理,更加丰富多彩。

应该说时钟的计时功能与人类的各种行为和活动有着密切的联系,于是时钟的作用便体现出来,生活中有许多人,因为只顾工作而忘记时间,从而耽误了重要的安排或者计划,造成不可挽回的损失,使之后悔莫及。

我们要养成良好的时间观念,就需要电子钟时刻提醒我们。

因此,电子钟已成为人们日常生活中必不可少,它的应用非常广泛,应用于家庭以及车站、码头、剧场、办公室等公共场所,给人们的生活、学习、工作、娱乐带来极大的方便。

现在投入生产的大多是智能时钟,它的功能很全面,但价格有点昂贵,大多数学生或者经济条件较差的人,想要拥有它,都有点困难。

因此,在这里设计一个较简单的电子钟,它能完成计时和校时的功能。

这个时钟系统很简单,投入生产的成本很低,因此,它的价格比较便宜,对于学生很实用。

单 片 机 显示器 键盘1.3 设计的基本思路与主要内容设计一个电子产品,首先了解它能实现的功能,时钟系统最基本的功能就是实现计时,在这里设计的数字电子时钟,它能实现计时和校时的功能,给电子钟加上电自动计时,设计一个按键对时钟进行复位和三个按键对时间进行调整。

硬件设计很简单,主要包括:单片机、按键电路、驱动显示电路,以及LED显示器四个部分。

单片机选用AT89C51芯片,它无须外扩程序存储器,设计电路很简单。

由于只用了四个按键,所以采用独立式按键使设计更简单。

显示时、分、秒加两个分隔符,采用8位的数码管,利用8255扩展的数码管及键盘达到时间显示和修改的功能。

简易数字时钟可实现校时和整点报时功能,该软件采用C语言来实现,主要包括主程序、键输入程序、显示程序、定时程序和中断程序等软件模块。

把原程序加入原理图,做出电子钟的仿真,以秒计数并显示时、分、秒。

其中秒和分为60进制,小时为24进制计数。

可通过按键实现时钟复位和分、秒、时的校正。

第二章 系统组成及工作原理2.1 系统组成电子钟的电路图主要由单片机(AT89C51)、键盘电路、驱动显示电路和LED 显示器四部分组成,它主要实现时钟的显示,以及对时、分、秒进行调整,即实现调时的功能。

其数字钟系统整体结构如图2-1所示。

图2-1 电子钟系统整体结构1. 显示方案方案一:静态显示就是当CPU 将要显示的字或字段码送到输出口,显示器就可以显示出所要显示的字符,如果CPU 不去改写它,它将一直保持下去;静态显示硬件开销大,电路复杂,信息刷新速度慢。

方案二:动态显示则是一位一位地轮流点亮显示器地各个位(扫描)。

对于显示器的每一位而言,每隔一段时间点亮一次;动态显示耗能较小,但编写程序较复杂。

动态显示硬件连接简单,信息刷新速度快。

由于本次设计是对时间进行显示,如采用静态显示,则所占用的I/O 口较多,电路较复杂,所以在此选择的是方案二,采用动态显示。

七 段 数 码 管 AT89C51 驱动 LED 显示器 位选按 键2.键盘方案方案一:独立式键盘。

独立式键盘的各个按键相互独立,每个按键独立地与一根数据输入线(单片机并行接口或其它芯片的并行接口)连接。

独立式键盘配臵灵活,软件结构简单,但每个按键必须占用一根接口线,在按键数量不多时,接口线占用多。

所以,独立式按键常用于按键数量不多的场合。

方案二:矩阵式键盘。

矩阵式键盘采用的是行列式结构,按键设臵在行列的交点上.(当接口线数量为8时,可以将4根接口线定义为行线,另4根接口线定义为列线,形成4*4键盘,可以配臵16个按键。

)由于本设计只用了四个按键,不需要采用矩阵式键盘,所以选用第一种方案,采用独立式键盘。

3.计时方案采用软件控制:利用单片机内部的定时/计数器进行定时,配合软件定时实现时、分、秒的计时。

该方案能够使设计者,在设计的过程中容易实现,且节省硬件成本,因此本系统将采用软件方法实现计时。

2.2工作原理AT89C51内部有两个定时器,利用它们可以获得精准的时间。

设计中定义40H-47H8个单元为时间显示缓冲区,里面存放00H-0AH 之间的数,其中0AH在查表时会查到‘—’的字形码。

我们让定时器T1定时50ms。

同时再定义一个单元来记录T1定时器记满50ms 的次数,当该单元中的次数达到了20次时,即时间走了1s钟,马上执行时间加1s的程序。

即要对40H-47H中的秒缓冲单元加一,再将更新后的40H-47H依次查表后送8255去显示,这样便实现了电子钟走时的功能。

8255的PC口接有按键开关,平时不按下,对应的PC口会获得一个高电平,可一旦有键按下,对应的PC口便会接地而获得一个低电平。

设计中只使用了五个PC口,剩余的三个PC口全部接地。

这样,无键按下或只按下一个键PC口都会有一个确定的键值对应着。

例如,C0-C4接着K1-K5五个按键开关,C5-C7是接地的。

根据上面所述可知,无键按下时,单片机读到PC口的值为1FH,当K1按下时为1EH。

同理,K2对应1DH,K3对应1BH ,K4对应17H ,K5对应0FH。

如此,我们便可在程序中根据读取到的键值让单片机去执行相应的设臵时、分、加、减和确定等功能程序。

数码管的动态显示是指一位一位地轮流点亮各个数码管。

对于每一个数码管来说,每隔一段时间点亮一次。

通常点亮时间为1ms 左右,相隔时间为20ms。

图1.3.1中,PA口的输出为段数据口,接显示器的各个段极,PB口输出为位扫描口,接数码管的公共极。

显示时,首先使PB口的B7为低电平,B1-B7为高电平,则仅第一位数码管的公共阴极为低电平(被选通);同时PA口输出第一个显示数据的段码,这时第一位数码管将显示出第一个显示数据。

持续1ms左右后,使B0为高电平,关闭第一个数码管,随后使B1为低电平,选通第二位数码管,并由PA口输出第二个显示数据,并持续1ms左右。

用类似的方法依次选通第3,第4,〃〃〃,第8位即完成一次循环显示。

如果连续地循环便可在数码管上稳定地显示所需显示的内容。

图2-2 电子钟硬件电路图第三章硬件设计与分析3.1 硬件设计原理时钟电路的核心是AT89C51单片机,其内部带有2KB的可反复擦写的只读Flash程序存储器和128 bytes的随机存取数据存储器(RAM),无须外扩程序存储器。

电脑时钟没有大量的运算和暂存数据,现有的128B片内RAM已能满足要求,也不必外扩片RAM。

3.2AT89C51单片机介绍AT89C51是一个低电压,高性能CMOS 8位单片机,片内含2k bytes的可反复擦写的只读Flash程序存储器和128 bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内臵通用8位中央处理器和Flash存储单元,所以说AT89C51是一个功能强大的单片机。

AT89C51是一个低功耗高性能单片机,它有40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中断口,2个16位可编程定时计数器,2个全双工串行通信口,AT89C51可以按照常规方法进行编程,也可以在线编程。

其将通用的微处理器和Flash存储器结合在一起,特别是可反复擦写的Flash存储器可有效地降低开发成本。

同时AT89C51的时钟频率可以为零,即具备可用软件设臵的睡眠省电功能,系统的唤醒方式有RAM、定时/计数器、串行口和外中断口,系统唤醒后即进入继续工作状态。

省电模式中,片内RAM将被冻结,时钟停止振荡,所有功能停止工作,直至系统被硬件复位方可继续运行。

3.3单片机最小应用系统时钟电路和复位电路是单片机最小应用系统中必不可少的。

单片机时钟电路图,如图3-1所示:XTAL1和XTAL2分别为反向放大器的输入和输出。

该反向放大器可以配臵为片内振荡器。

石晶振荡和陶瓷振荡均可采用。

如采用外部时钟源驱动器件,XTAL2应不接。

有余输入至内部时钟信号要通过一个二分频触发器,因此对外部时钟信号的脉宽无任何要求,但必须保证脉冲的高低电平要求的宽度。

图3-1 单片机时钟电路图复位是使单片机或系统中的其它部件处于某种确定的初始状态。

单片机的工作就是从复位开始的,当在单片机的RST引脚引入高电平并保持2个机器周期时,单片机内部就执复位操作(若该引脚持续保持高电平,单片机就处于循环复位状态)。

实际应用中,复位操作有两种基本的形式:一种是上电复位,另一种是上电与按键均有效的复位。

由于本次设计采用的是上电复位,所以这里只介绍上电复位,如下图3-2所示:图3-2上电复位电路上电复位要求接通电源后,单片机自动实现复位操作。

常用的上电复位如上图所示。

上电瞬间RST引脚获得高电平,随着电容C1的充电,RST引脚的高电平将逐渐下降。

3.4显示电路一、七段LED显示器的原理显示器是单片机应用系统常用的设备,包括LED、LCD等。

LED 显示器由若干个发光二极管组成。

相关文档
最新文档