52单片机 时钟 音乐 秒表 程序

合集下载

单片机电子闹钟程序亲自编写-可用

单片机电子闹钟程序亲自编写-可用

单片机电子闹钟程序(亲自编写-可用)————————————————————————————————作者:————————————————————————————————日期:学校电子钟,有闹钟功能,按键可调时间,可调打铃时间,打铃时间长短显示,每个模块有功能注释。

其中正常时间显示和闹钟时间显示可用一个开关来调整。

芯片选择STC89C52程序:#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int//定义显示段码uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};uchar codebbtime[]={0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; uchar clock[]={0,0,0,0};uchar clock1[]={12,30,0};uchar weikong[6];uchar bbduration=4;uchar lingtime=9;//学校打铃时间组uchar shangwu1[]={8,30};uchar shangwu2[]={10,0};uchar shangwu3[]={10,20};uchar shangwu4[]={11,50};uchar xiawu1[]={13,30};uchar xiawu2[]={15,00};uchar xiawu3[]={15,15};uchar xiawu4[]={16,45};//按键定义sbit mode=P1^7;sbit sec_clr=P1^0;sbit min_set_add=P1^3;sbit min_set_sub=P1^4;sbit hour_set_add=P1^1;sbit hour_set_sub=P1^2;sbit bb_set_add=P1^5;sbit bb_set_sub=P1^6;sbit speaker=P2^6;//延时函数void delay(unsigned int t){while(t--);//时钟进位函数void clockjinwei(){clock[0]++;if(clock[0]==20){clock[1]++;clock[0]=0;if(clock[1]==60){clock[2]++;clock[1]=0;if(clock[2]==60){clock[3]++;clock[2]=0;if(clock[3]==24)clock[3]=0;}}}}//定时器0中断服务函数void timer0(void) interrupt 1 using 1 {TMOD=0x01;TH0=0x3c;TL0=0xb0;clockjinwei();}//时钟分位显示函数void fenwei(){weikong[0]=clock[3]/10;weikong[1]=clock[3]%10;weikong[2]=clock[2]/10;weikong[3]=clock[2]%10;weikong[4]=clock[1]/10;weikong[5]=clock[1]%10;}//闹钟分位显示函数void naofen(){weikong[0]=clock1[0]/10;weikong[1]=clock1[0]%10;weikong[2]=clock1[1]/10;weikong[3]=clock1[1]%10;weikong[4]=clock1[2]/10;weikong[5]=clock1[2]%10; }//闹钟定时显示函数void naozhongdisplay(){uchar z,s;uchar x=0x01;naofen();for(z=0;z<6;z++){P2=0;P0=table[weikong[z]];P2=x;x=_crol_(x,1);for(s=0;s<255;s++);}}//时钟显示函数void display(){uchar i,j;uchar x=0x01;fenwei();for(i=0;i<6;i++){P2=0;P0=table[weikong[i]];P2=x;x=_crol_(x,1);for(j=0;j<255;j++);}}//总显示函数void zhongxian(){if(mode==1)delay(100);if(mode==1)display();if(mode==0)delay(100);if(mode==0)naozhongdisplay();}//按键处理程序void key_set(){zhongxian();P1=0xff;if(min_set_add==0){delay(100);if(min_set_add==0){if(mode==1){clock[2]++;if(clock[2]==60){clock[2]=0;}while(min_set_add==0)zhongxian();}}if(mode==0){clock1[1]++;if(clock1[1]==60){clock1[1]=0;}while(min_set_add==0)zhongxian();}}//if(min_set_sub==0){delay(100);if(min_set_sub==0){if(mode==1){clock[2]--;if(clock[2]==0)clock[2]=59;}while(min_set_sub==0)zhongxian();if(mode==0){clock1[1]--;if(clock1[1]==0)clock1[1]=59;}while(min_set_sub==0)zhongxian();}}//if(hour_set_add==0){delay(100);if(hour_set_add==0){if(mode==1){clock[3]++;if(clock[3]==24){clock[3]=0;}while(hour_set_add==0)zhongxian();}if(mode==0){clock1[0]++;if(clock1[0]==24){clock1[0]=0;}while(hour_set_add==0)zhongxian();}}}//if(hour_set_sub==0){delay(100);if(hour_set_sub==0){if(mode==1){clock[3]--;if(clock[3]==0)clock[3]=23;}while(hour_set_sub==0)zhongxian();if(mode==0){clock1[0]--;if(clock1[0]==0)clock1[0]=23;}while(hour_set_sub==0)zhongxian();}}//if(sec_clr==0){delay(100);if(sec_clr==0){clock[1]=0;}while(sec_clr==0)zhongxian();}}//闹钟响铃函数void bb(){if(clock[1]<=bbduration){speaker=1;delay(100);speaker=0;}else speaker=0;}//打铃函数void daling(){if(clock[1]<=lingtime){speaker=1;delay(100);speaker=0;}else speaker=0;}//时间比较函数void bijiao(){if(clock[3]==shangwu1[0]){if(clock[2]==shangwu1[1])daling();}if(clock[3]==shangwu2[0]){if(clock[2]==shangwu2[1])daling();}if(clock[3]==shangwu3[0]){if(clock[2]==shangwu3[1])daling();}if(clock[3]==shangwu4[0]){if(clock[2]==shangwu4[1])daling();}if(clock[3]==xiawu1[0]){if(clock[2]==xiawu1[1])daling();}if(clock[3]==xiawu2[0]){if(clock[2]==xiawu2[1])daling();}if(clock[3]==xiawu3[0]){if(clock[2]==xiawu3[1])daling();}if(clock[3]==xiawu4[0]){if(clock[2]==xiawu4[1])daling();}}//闹钟比较void naobijiao(){if(clock[3]==clock1[0]){if(clock[2]==clock1[1]||clock[2]==clock1[1]+1||clock[2]==clock1[1]+2) bb();}}//响铃时长显示函数void bbtimeshow(){P3=bbtime[bbduration];if(bbduration>15)bbduration=0;}//响铃按键处理函数void bbtime_set(){bbtimeshow();if(bb_set_add==0){delay(100);if(bb_set_add==0)bbduration++;while(bb_set_add==0)bbtimeshow();}if(bb_set_sub==0){delay(100);if(bb_set_sub==0)bbduration--;while(bb_set_sub==0)bbtimeshow();}}//主程序void main(){EA=1;ET0=1;TR0=1;while(1){key_set();bijiao();bbtime_set();naobijiao();}}电路图:分四部分显示:如果在学习这个程序过程中有什么问题,可以发邮件到询问。

基于STC89C52单片机的电子时钟设计(带程序)

基于STC89C52单片机的电子时钟设计(带程序)

河南机电高等专科学校基于51单片机的电子时钟设计目录绪论 (1)概述 (1)研究目的 (1)第1章设计要求与方案论证 (2)1.1 设计要求 (2)1.2 系统基本方案选择和论证 (2)1.2.1 单片机芯片的选择方案和论证 (2)1.2.2 显示模块选择方案和论证 (2)1.2.3 时钟芯片的选择方案和论证 (3)1.3 电路设计最终方案决定 (3)第2章主要元件介绍 (4)2.1 STC89C52介绍 (4)2.1.1 STC89C52主要功能及PDIP封装 (4)2.1.2 STC89C52引脚介绍 (4)2.1.3 STC89C52最小系统 (5)2.2 DS1302时钟芯片介绍 (6)2.2.1 DS1302概述 (6)2.2.2 DS1302引脚介绍 (7)2.2.3 DS1302使用方法 (7)2. 3 1602字符液晶介绍 (9)2.3.1 1602液晶概述 (9)2.3.2 1602引脚介绍 (10)2.3.3 1602字符液晶使用方法 (10)第3章系统硬件设计 (13)3.1 电路设计框图 (13)3.2 系统硬件概述 (13)第4章系统的软件设计 (13)4.1程序概述 (13)4.2延时函数 (2)4.3 对DS1302读写操作函数 (3)4.3.1 向DS1302写数据 (3)4.3.2 从DS1302读数据 (3)4.4 显示函数 (4)4.4.1向1602液晶中写一个指令 (4)4.4.2向液晶写数据 (4)4.4.3初使化1602液晶 (5)4.4.4 如何在液晶上显示时间、日期及周 (5)4.5按键函数 (6)4.5.1 12/24小时显示模式切换键 (8)4.5.2 功能键函数 (10)4.5.3 调整键函数 (12)4.5.4确定键 (16)4.6 主函数 (17)总结 (18)致谢 (19)参考文献 (20)绪论概述时间,对人们来说是非常宝贵的,准确的掌握时间和分配时间对人们来说至关重要。

数字时钟_89C52_单片机C语言程序

数字时钟_89C52_单片机C语言程序
/*列扫描控制 LED1位 2位 3位 4位 5位 6位 7位 8位*/
uchar MON[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
uchar A;
uchar BIN=0; /* 【BIN】作为倒计时开始的标志 */
TH0 = (65536 - 10000) / 256; /*给定计时器高位赋予 初值=15536/256*/
TL0 = (65536 - 10000) % 256; /*给定计时器低位赋予 初值=15536%256 */
ET0 = 1; /*打开定时器外部终断0允许 ET1是中断器1的开关*/
P2 = C[4];
Delay(1);
P0 = Code[Msec%10]; /*第五位的数字显示【分】的【个】位 */
P2 = C[5];
Delay(1);
Delay(1);
P0 = 0x40; /*第六位符号【-】的显示 */
P2 = C[6];
Delay(1);
P2 = C[2];
Delay(1);
if(x/50==0)
P0 = 0x40; /*第三位符号【-】的显示 */
else
P0 = 0x00;
P2 = C[3];
Delay(1);
P0 = Code[min/10]; /*第四位的数字的显示【分】的【十】位 */
uchar month=7;
uchar month2;
uchar day=19;
uchar set1 = 1; /* set1=1 是调节 时分秒 set1=2时时调节 年月日 set=3时事调节闹钟 */

单片机时钟秒表课程设计报告

单片机时钟秒表课程设计报告

单片机的时钟设计小组成员:班级:课程老师:目录一、硬件结构 (3)1硬件原理 (3)1 89C52 (3)1.1硬件原理 (3)1.2 主要功能特性 (3)1.3 管脚说明 (4)1.4振荡器特性 (5)1.5结构特点 (5)2、数码管 (6)2.1数码管分类 (6)2.2数码管结构 (7)2.3驱动方式 (8)3、排阻 (9)3.1排阻的作用 (9)3.2排阻引脚说明 (9)4、晶振 (10)4.1晶振构成 (10)4.2工作原理 (11)4.3功能作用 (11)二、软件结构概述 (12)1、显示子程序 (12)2、键盘扫描子程序 (13)3、中断程序 (16)4、流程图 (18)三、调试过程 (20)四、心得体会 (22)五、参考文献 (23)六、硬件电路图 (23)七、程序清单 (25)一、硬件结构概述1、89C521.1硬件原理89C52是INTEL公司MCS-51系列单片机中基本的产品,它采用ATMEL公司可靠的CMOS工艺技术制造的高性能8位单片机,属于标准的MCS-51的HCMOS产品。

它结合了CMOS的高速和高密度技术及CMOS的低功耗特征,它基于标准的MCS-51单片机体系结构和指令系统,属于89C51增强型单片机版本,集成了时钟输出和向上或向下计数器等更多的功能,适合于类似马达控制等应用场合。

89C52内置8位中央处理单元、256字节内部数据存储器RAM、8k片内程序存储器(ROM)32个双向输入/输出(I/O)口、3个16位定时/计数器和5个两级中断结构,一个全双工串行通信口,片内时钟振荡电路。

此外,89C52还可工作于低功耗模式,可通过两种软件选择空闲和掉电模式。

在空闲模式下冻结CPU而RAM定时器、串行口和中断系统维持其功能。

掉电模式下,保存RAM数据,时钟振荡停止,同时停止芯片内其它功能。

89C52有PDIP(40pin)和PLCC(44pin)两种封装形式。

1.2 主要功能特性·标准MCS-51内核和指令系统· 32个双向I/O口· 3个16位可编程定时/计数器·向上或向下定时计数器· 6个中断源·全双工串行通信口·空闲和掉电节省模式·片内8kROM(可扩充64kB外部存储器)· 256x8bit内部RAM(可扩充64kB外部存储器)·时钟频率3.5-12/24/33MHz·改进型快速编程脉冲算法· 5.0V工作电压·布尔处理器· 4层优先级中断结构·兼容TTL和CMOS逻辑电平· PDIP(40)和PLCC(44)封装形式·—帧错误侦测·—自动地址识别1.3 管脚说明VCC:供电电压。

单片机秒表程序代码

单片机秒表程序代码

单片机秒表程序代码
以下是一个基本的单片机秒表程序代码,使用Keil C语言编写:#include <reg52.h> 引入头文件
unsigned int s=0; 定义全局变量秒数
void delay() 定义延时函数
{
unsigned int i,j;
for(i=1;i<=1000;i++)
{
for(j=1;j<=100;j++);
}
}
void timer0() interrupt 1 定义定时器0中断服务函数
{
TH0=0xFC; 设置计时器初始值,每50ms中断一次
TL0=0x67;
s++; 秒数+1
}
void main() 主函数
{
TMOD=0x01; 设置计时器0为模式1
TH0=0xFC; 设置计时器初始值,每50ms中断一次
TL0=0x67;
EA=1; 允许中断
ET0=1;
TR0=1; 启动计时器0
while(1)
{
if(s>=60) 如果秒数到达60秒,重置秒数为0
{
s=0;
}
P1=s; 将秒数显示在P1口上
delay(); 延时
}
}
注:此代码仅供参考,实际使用时可能需要根据具体需求进行修改和优化。

51单片机时钟代码(带秒表闹钟功能)

51单片机时钟代码(带秒表闹钟功能)

51单片机时钟代码(带秒表闹钟功能)#include#include#defineucharunignedchar#defineuintunignedintbitbeep=P1^5;//蜂鸣器bitLED1=P1"6;//LED灯bitep=P2"7;//1602使能端bitr=P2八6;//1602bitrw=P2八5;//1602bit0二P3八4;//停止闹铃和小灯bit1二P3八5;//功能键bit2二P3飞;//增大键bit3二P3X;//减小键bit4二P3「;//bit5=P3^2;bit6二P3八3;bit7=P3^0;uchar1num,4num,count,count1,judge=0;charec,min,hour,miao,fen,hi,ec1,min1,diwei;voiddelay(uintz){ uint某,y;for(某二z;某〉0;某--)for(y=100;y〉0;y—);}voiddi(){beep=0;delay(50);beep=1;}bitlcd_bz()//测试LCD忙碌状态{bitreult;r=0;rw=1;ep=1;_nop_();_nop_();_nop_();_nop_();reult=(bit)(P0&0某80);ep=0;returnreult;}_nop_();_nop_();_nop_();ep=1;_nop_();_nop_();_nop_();_nop_();ep=0;}voidwrite_data(uchardat)//写入字符显示数据到LCD{while(lcd_bz());//等待LCD空闲r=1;rw=0;ep=0;P0=dat;_nop_();_nop_();_nop_();_nop_();ep=1;_nop_( );_nop_();_nop_();_nop_();ep=0;}ucharhi,ge;hi=dat/10;ge=dat;write_data(0某30+hi);write_data(0某30+ge);}voidwrite_alarm(ucharadd,uchardat){ucharhi1,ge1;hi1=dat/10;ge1=dat;count=0;//clearwrite_data('A');delay(5);hi=17;voidkeycan()//按键扫描{if(l==0){delay(5);if(1==0){1num++;while(!1);di(); if(1num==1){TR0=0;if(1num==2){if(1num==3){if(1num==4){1num=0;if(1num!=0){if(2==0){delay(5);if(2==0){while(!2);di();if(1num==1){ec++;if(ec==60)ec=0;min++;if(min==60)min=0;if(1num==3){hour++;if(hour==24)hour=0;delay(5);if(3==0){while(!3);di();if(1num==1){ec--;if(ec<0)ec=59;if(1num==2){min--;if(min<0)min=59;hour--;if(hour<0)hour=23;}voidkeycan1(){if(4==0){delay(5);if(4==0){4num++;while(!4);di();if(4num==1){TR0=0;if(4num==3){if(4num==4){if(4num!=0){if(5==0){delay(5);if(5==0){while(!5);di();if(4num==1){miao++;if(miao==60)miao=0; write_alarm(10,miao);if(4num==2){fen++;if(fen==60)fen=0;if(4num==3){hi++;if(hi==24)hi=0;write_alarm(4,hi);if(6==0){delay(5);if(6==0){while(!6);di();if(4num==1){miao--;if(miao<0)miao=59;if(4num==2){fen--;if(fen<0)fen=59;write_alarm(7,fen);if(4num==3){hi--;if(hi<0)hi=23;}}if(7==0){delay(5);if(7==0){while(!7)di();judge++;}}if(judge==2){TL0=0某b0;TH0=0某3c; {ec=0;min++;if(min==60){min=0;hour++;if(hour==24){hour=0;}}}}}if(judge==3){judge=0;ec1=0;min1=0;diwei=0;write_alarm(10,miao);write_alarm(7,fen);write_alarm(4,hi);wr ite_alarm(10,miao);write_alarm(7,fen);write_alarm(4,hi);} if(count==20){count=0;ec++;if(ec==60){ec=0;min++;if(min==60){min=0;hour++;if(hour==24){hour=0;}}}}}。

单片机简易秒表正计时时间可设置

单片机简易秒表正计时时间可设置

单片机简易秒表正计时时间可设置秒表是一种用来测量时间流逝的仪器,广泛应用于体育比赛、科学实验和日常生活中。

在现代科技的推动下,秒表的功能和精准度都得到了极大提升。

本文将介绍一种单片机实现的简易秒表,能够进行正计时,并可设置计时时间。

用于实现秒表功能的单片机芯片有很多种,通常选择计时和定时功能强大的单片机,如STC89C52、AT89C51等。

这些单片机具有丰富的外设和强大的计时能力,非常适合实现秒表功能。

在开始设计之前,我们需要明确几个关键的功能要求。

首先是正计时功能,我们需要编写程序来实现从0开始的计时。

其次是计时时间可设置,即用户可以设置计时的起始时间和结束时间。

最后是计时的精确度,单片机通常使用定时中断来实现计时,我们需要考虑到时钟频率和定时器的精度,确保计时的准确性。

首先,我们需要连接单片机与显示器和按键开关。

单片机的引脚可以通过通用I/O口或专用的定时器引脚与显示器和按键开关相连接。

这里我们选择7段LED数码管作为显示器,用来显示计时结果。

按键开关用于设置计时时间。

接下来,我们需要编写程序来实现秒表的功能。

首先,初始化单片机的定时器和中断。

我们需要设置定时器的工作模式、时钟频率和计时的时间间隔。

然后,我们需要编写中断服务函数,该函数在定时器达到设定的时间时被调用。

在中断服务函数中,我们将对计时进行加法操作,并将结果显示在LED数码管上。

同时,我们还需要判断计时是否达到设置的结束时间,如果达到,则停止计时。

为了使用户可以设置计时时间,我们可以通过按键开关来实现。

当用户按下设定时间的键时,我们将进入设定模式,用户可以通过按键来设定起始时间和结束时间。

通过LED数码管来显示用户设置的时间。

最后,我们需要对秒表进行测试和调试,确保其功能的正常运行。

我们可以逐步测试每个功能点,如正计时功能、计时时间设置功能和计时精确度等。

通过串口输出调试信息,我们可以对程序进行调优和改进,提高秒表的性能和稳定性。

基于52单片机电子时钟的设计论文(纯汇编语言编写)

基于52单片机电子时钟的设计论文(纯汇编语言编写)

编号单片机课程设计(2013 级)题目:基于52单片机电子时钟的设计学院:物理与机电工程学院专业:电子信息科学与技术作者姓名:陈✘✘党✘✘杜✘✘指导教师:张✘✘职称:教授完成日期:2016 年7 月 2 日二〇一六年七月基于52单片机电子时钟的设计摘要本次设计的多功能时钟系统采用STC89C52单片机为核心器件,利用其定时器/计数器定时和记数的原理,结合液晶显示电路、时钟芯片DS1302电路、电源电路以及按键电路来设计计时器。

将软硬件有机地结合起来,使得系统能够实现液晶显示,显示有年、月、日、时、分、秒以及星期,还可以设置闹钟和整点报时。

其中软件系统采用单片机汇编语言编写程序,包括显示程序、闹钟程序、中断、延时程序,按键消抖程序等,并在keil中调试运行,硬件系统利用PROTEUS 强大的功能来实现,简单且易于观察,在仿真中就可以观察到实际的工作状态。

关键词:STC89C52芯片;时钟芯片DS1302;单片机汇编语言;液晶显示电路1 设计任务及要求分析1.1 设计任务:基于单片机的电子时钟设计1.2 要求:1.2.1 用LCD液晶作为显示设备1.2.2 可以分别设定小时、分钟和秒,复位后时间为 00 00 001.2.3 能实现日期的设置年、月、日1.3 扩展要求:如闹钟功能、显示星期、整点音乐报时等2 系统方案2.1 系统整体方案的论证电路原理设计是基于小系统板包括电源电路、复位电路、按键电路、DS1302时钟电路、液晶显示驱动电路、输出控制电路。

电源部分是用电池来提供的3v-5v,晶体振荡器采用的是12MHz的石英晶体振荡器。

整个系统用单片机为中央控制器,由单片机执行采集时钟芯片的时间信号并通过显示模块来输出信号及相关的控制功能。

时钟芯片产生时钟信号,利用单片机的I/O口传给单片机;并通过I/O口实现LCD的显示。

系统设有4个独立式按键可以对时间年、月、日和星期进行调整,还可以设置闹钟。

具体如图2.1所示:图2.1 系统整体框图3硬件设计与实现3.1单片机最小系统STC89C52是一款非常适合单片机初学者学习的单片机,它完全兼容传统的8051,8031的指令系统,他的运行速度要比8051快最高支持达33MHz的晶体震荡器,在此系统中使用12MHz的晶振。

C52单片机电子时钟电路设计 课程设计

C52单片机电子时钟电路设计 课程设计

C52单片机电子时钟电路设计课程设计单片机原理及应用课程设计题目: C52单片机电子时钟电路设计姓名: 陶鹏鹏专业: 电子科学与技术班级: 121班指导教高海涛师:安徽科技学院数理学院目录1、基于单片机的电子时钟电路设计.........1.1设计任务与要求...................1.1.1设计目的:.................1.1.2设计要求:.................1.2方案设计 ........................2、单片机应用系统简介...................2.1AT89C52单片机的功能结构..........2.2单片机的引脚定义及功能...........2.3 定时/计数器....................2.3.1定时/计数器结构............2.3.2工作原理...................2.4键盘接口技术 ....................2.5复位操作 ........................2.6 显示控制模块....................3、硬件电路设计.........................3.1电子时钟的电路图.................3.2单元电路设计 ....................3.2.1晶振、复位电路模块.........3.2.2键盘控制模块...............3.2.3蜂鸣器电路模块.............3.2.4显示器电路模块.............4、软件设计.............................4.1系统主程序设计...................4.2主程序清单 ......................4.3系统仿真与调试...................5、结论与心得...........................摘要电子钟是一种利用数字电路来显示秒、分、时的计时装置,与传统的机械钟相比,它具有走时准确、显示直观、无机械传动装置等优点,因而得到广泛应用。

52单片机时钟课程设计

52单片机时钟课程设计

52单片机时钟课程设计一、课程目标知识目标:1. 学生能理解并掌握52单片机的基本原理及其在时钟设计中的应用。

2. 学生能描述时钟电路的工作原理,包括时钟晶振、分频器等组成部分。

3. 学生能运用C语言编写程序,实现对时钟的显示、调整和时间计算功能。

技能目标:1. 学生能独立完成52单片机的时钟电路连接和程序编写。

2. 学生通过实验操作,培养动手能力和问题解决能力,能够调试并优化时钟程序。

3. 学生能够运用所学知识,结合实际需求,设计简单的时钟应用项目。

情感态度价值观目标:1. 学生通过学习单片机时钟设计,培养对电子技术和编程的兴趣,激发创新意识。

2. 学生在团队协作中,学会分享、交流和合作,提高沟通能力。

3. 学生认识到科技对社会生活的影响,增强社会责任感和时代使命感。

课程性质:本课程为实践性较强的电子技术课程,结合理论教学和实验操作,旨在培养学生的动手能力、编程能力和创新能力。

学生特点:学生已具备一定的电子技术基础知识,对编程有一定了解,但对单片机应用尚处于起步阶段。

教学要求:教师需结合学生特点,注重理论与实践相结合,关注个体差异,引导学生主动探究,培养其解决问题的能力。

通过课程学习,使学生能够将所学知识应用于实际项目中。

二、教学内容本课程教学内容主要包括以下几部分:1. 52单片机基础知识:介绍52单片机的结构、工作原理、引脚功能等,结合教材相关章节,让学生对单片机有基本的认识。

2. 时钟电路原理:讲解时钟电路的组成,包括时钟晶振、分频器等,分析时钟信号的产生、传输和作用。

3. C语言编程:复习C语言基础知识,重点讲解与52单片机编程相关的内容,如寄存器操作、I/O口编程、中断处理等。

4. 时钟程序设计:详细讲解如何利用52单片机实现时钟功能,包括时钟显示、调整和时间计算等,结合教材实例,让学生动手实践。

5. 实验操作与调试:指导学生进行时钟电路的连接、程序下载和调试,培养学生动手能力和问题解决能力。

基于STC89C52单片机时钟的设计与实现

基于STC89C52单片机时钟的设计与实现

基于STC89C52单片机时钟的设计与实现1. 本文概述本文主要介绍了基于STC89C52单片机和DS1302时钟芯片的电子时钟设计与实现。

该电子时钟系统具有年月日等基本时间显示功能,并集成了秒表计时处理、闹钟定时、蜂鸣器和温度显示等附加功能。

系统采用LCD1602作为液晶显示器件,通过单片机对时钟和温度等数据进行处理后传输至LCD进行显示。

用户可以通过按键对时间进行调节,同时,单片机还通过扩展外围接口实现了温度采集等功能。

本文的目标是提供一个功能丰富、易于操作的电子时钟系统,为学习和应用单片机技术提供一个实用的案例。

2. 系统设计要求在设计基于STC89C52单片机的时钟系统时,我们需要考虑以下几个关键的设计要求:时钟系统必须具备基本的时间显示功能,能够以小时、分钟和秒为单位准确显示当前时间。

系统还应支持设置闹钟功能,允许用户设定特定的时间点进行提醒。

系统需要保证长时间稳定运行,具备良好的抗干扰能力,确保在各种环境下都能准确计时。

还应具备一定的容错能力,即使在操作失误或外部干扰的情况下,也能保证系统的正常运行。

用户界面应简洁直观,便于用户快速理解和操作。

时钟的显示部分应清晰可见,即使在光线较暗的环境下也能保持良好的可视性。

同时,设置和调整时间的操作应简单易懂,方便用户进行日常使用。

在设计时钟系统时,应考虑到未来可能的功能扩展,如温度显示、日期显示等。

系统的设计应具有一定的灵活性和扩展性,以便在未来可以轻松添加新的功能模块。

鉴于时钟系统可能需要长时间运行,能耗是一个重要的考虑因素。

设计时应选择低功耗的元件,并优化电源管理策略,以延长电池寿命或减少能源消耗。

在满足上述所有要求的同时,还需要控制成本,确保产品的市场竞争力。

这可能涉及到对单片机的编程优化、选择性价比高的外围元件等措施。

通过满足上述设计要求,我们可以确保开发出一个功能完善、稳定可靠、用户友好、易于扩展、节能环保且成本效益高的STC89C52单片机时钟系统。

单片机数字秒表课程设计

单片机数字秒表课程设计

单片机数字秒表课程设计一、课程目标单片机数字秒表课程设计旨在通过实践操作,使学生在知识与技能、过程与方法、情感态度价值观三方面得到全面发展。

1. 知识目标:(1)掌握单片机的基本原理和结构;(2)了解数字秒表的工作原理;(3)熟悉C语言编程和单片机编程环境。

2. 技能目标:(1)能够运用所学知识设计并实现一个简单的数字秒表;(2)培养动手实践能力,提高问题解决能力;(3)提高团队协作和沟通表达能力。

3. 情感态度价值观目标:(1)激发学生对单片机及电子技术的学习兴趣,培养科技创新精神;(2)培养学生严谨的科学态度和良好的学习习惯;(3)增强学生的自信心和成就感,培养克服困难的意志。

课程性质:本课程为实践性课程,注重理论联系实际,强调动手能力培养。

学生特点:本课程针对初中年级学生,他们在前期的学习中已具备一定的电学基础和编程知识,对新鲜事物充满好奇心。

教学要求:教师需结合学生特点,以引导为主,注重启发式教学,充分调动学生的积极性和主动性,将课程目标分解为具体的学习成果,便于教学设计和评估。

二、教学内容根据课程目标,教学内容主要包括以下几部分:1. 单片机原理及结构:涉及单片机的内部组成、工作原理、引脚功能等,对应教材第二章内容。

2. 数字秒表原理:介绍数字秒表的基本工作原理,包括计时、计数、显示等,对应教材第四章内容。

3. C语言编程:复习C语言基础知识,重点掌握数组、循环、函数等编程技巧,对应教材第五章内容。

4. 单片机编程环境:学习如何使用编程软件(如Keil)进行程序编写、编译和下载,对应教材第六章内容。

5. 实践操作:设计并实现一个简单的数字秒表,分小组进行实践操作,培养动手能力。

教学大纲安排如下:第一周:回顾单片机原理及结构,学习数字秒表原理;第二周:复习C语言基础知识,学习单片机编程环境;第三周:编写数字秒表程序,进行调试;第四周:分组实践,完成数字秒表的设计与制作。

教学内容具有科学性和系统性,确保学生在掌握理论知识的基础上,通过实践操作提高综合能力。

52单片机秒表课程设计

52单片机秒表课程设计

52单片机秒表课程设计一、课程目标知识目标:1. 学生能理解并掌握52单片机的基本原理和功能;2. 学生能掌握秒表的计时原理,并能运用C语言编程实现对秒表的启动、停止、复位及时间显示功能;3. 学生了解并掌握电子元器件的基本使用方法,如按键、LED等。

技能目标:1. 学生能运用所学知识,完成52单片机的硬件连接及程序编写;2. 学生通过实际操作,提高动手能力,培养解决实际问题的能力;3. 学生能够独立思考,分析并解决程序编写过程中遇到的问题。

情感态度价值观目标:1. 学生在学习过程中,培养对电子技术的兴趣,提高学习积极性;2. 学生通过团队协作,培养沟通、合作能力,增强团队意识;3. 学生在课程实践中,体验科技的魅力,培养创新精神和实践能力;4. 学生认识到知识在实际应用中的价值,增强学习责任感和使命感。

本课程针对高中年级学生,结合课程性质、学生特点和教学要求,明确以上课程目标,旨在让学生在掌握基本知识的同时,提高实践操作能力和团队协作能力,培养创新精神和科技素养。

课程目标具体、可衡量,为后续的教学设计和评估提供依据。

二、教学内容本章节教学内容紧密围绕课程目标,结合教材相关章节,具体安排如下:1. 52单片机基本原理及功能介绍:包括单片机内部结构、工作原理、指令系统等,对应教材第3章;- 硬件连接:介绍单片机与外围电路的连接方法,如按键、LED等,对应教材第4章;- C语言编程基础:回顾并巩固C语言基础知识,为单片机编程打下基础,对应教材第5章。

2. 秒表功能实现:- 计时原理讲解:分析秒表的计时原理,对应教材第6章;- 程序编写:运用C语言编写程序,实现秒表的启动、停止、复位及时间显示功能,对应教材第7章;- 硬件与软件结合:将编写好的程序烧录至单片机,进行实际操作,调试并优化程序,对应教材第8章。

3. 实践操作与团队协作:- 学生分组进行硬件连接、编程、调试等实践活动,培养动手能力;- 鼓励学生相互交流、合作,共同解决问题,提高团队协作能力。

利用51单片机制作一个秒表的详细过程

利用51单片机制作一个秒表的详细过程

利用51单片机制作一个秒表的详细过程利用51单片机制作一个秒表的详细过程前面的话:和很多朋友一样,在学51单片机的过程中我们肯定会涉及到制作一个秒表,牵涉到把单片机的多个部分组合起来使用,这对于我们初学者来说可能显得有些困难,我同大家一样,百思不得其解,最后头都弄大了才把这个秒表制作出来,为了给以后的朋友们一些思路,一些参考,所以在这里我把自己制作的整个详细过程整理出来供大家参考。

我调试出来是没有问题的,各方面都稳定运行,由于我水平有限,中间可能会有不对的地方,欢迎大家指正,我们一起学习,一起进步!我将分为三个部分来介绍:1.整体思路,2.硬件电路方面,3.软件编程方面。

1.整体思路利用51单片机制作秒表时,我介绍精确到十分位(即0.1s)的制作,并让其拥有启动,暂停,复位三个功能。

用到的单片机部分:定时器部分,独立按键的检测与应用,数码管的显示,并结合一些简单的程序即可实现。

用5位数码管来进行显示,分别显示秒的十分位,秒的个位,秒的十位,分的个位,分的十位。

用定时器定时50ms,2个定时器中断即是0.1s,即秒的十分位,20个定时器中断即是1s,60个1s即是1分钟,通过程序将5位数码管的值分离出来,并进行显示。

这就是我在数码管显示方面的思路,如果不是太清楚,结合我下面软件编程方面的程序来看你可能就会明白,我会在那部分做详细介绍,看完了可能你就懂了。

利用独立按键设置启动/暂停键和清零键,利用独立按键的检测,若启动/暂停按键按下,秒表则启动或者暂停,按下复位键,秒表清零复位。

我在程序后面全都有注释,不用担心。

看完你就会明白了。

这是我制作的的流程图:“ms100”表示秒的十分位,'s'表示秒的个位,“s1”表示秒的十位,“min”表示分的个位,“min1”表示分的十位。

“cnt”表示秒的计数位,即多少个一秒,定时满一秒加1,“minu”表示分的计数位,即多少个一分钟,一分钟加1,这个流程图提供了大致思路,要结合下面的程序部分一起看。

基于STC89C52的电子时钟的设计(有闹钟调时间)

基于STC89C52的电子时钟的设计(有闹钟调时间)

单片机课程设计基于STC89C52的电子时钟的设计电路图程序:#include <reg52.h>sbit beep=P1^0; //蜂鸣器sbit l1=P1^1; //第一个红灯sbit l2=P1^2; //第一个绿灯sbit w4=P1^4; //第1位sbit w3=P1^5; //第2位sbit w2=P1^6; //第3位sbit w1=P1^7; //第4位sbit k1=P3^2; //按键1 +sbit k2=P3^3; //按键2 —sbit k3=P3^6; //按键3 时分调整sbit k4=P3^7; //按键4 功能选择秒表闹钟时间unsigned int a,b,c,d,e,f,num,num1,num2,num3,sum;unsigned char code table[]={0xc0 ,0xf9,0xa4,0xb0,0x99, //15-i0x92,0x82,0xf8,0x80,0x90}; //0011 1111 1100 0000 void keyscan();void sound();void time();void display(); // 时间显示void display2(); // 秒表显示void delay(unsigned int t){unsigned int i,j;for(i=t;i>0;i--)for(j=110;j>0;j--);}void init(){num=45;num2=59;num3=11;TMOD=0x11;TH1=(65536-45872)/256;TL1=(65536-45872)%256;EA=1;ET1=1;TR1=1;beep=0;delay(300);beep=1;delay(500);}void main(){init();while(1){keyscan();display();time();}}void sound(){beep=0;delay(100);beep=1;}void time(){if(num==59) //整点报时 2 miao {beep=0;}else if(num==0) //整点报时{beep=1;}}void keyscan() //按键检测{if(k3==0){TR1=0;sum++;delay(30);}switch(sum){case 1: if(k1==0){num2++;sound(); //蜂鸣叫while(!k1)if(num2==60){num2=0;}break;}if(k2==0){num2--;sound(); //蜂鸣叫while(!k2)if(num2==-1){num2=59;}break;}break;case 2: if(k1==0){num3++;sound(); //蜂鸣叫while(!k1)if(num3==24){num3=0;}break;}if(k2==0){num3--;sound(); //蜂鸣叫while(!k2)if(num3==-1){num3=23;}break;}break;case 3: sum=1;TR1=1;break;}if(k4==0){P0=table[0];w1=0;w2=0; //初始化w3=0;w4=0;while(1){display2();}}}void display(){a=num/10;b=num%10;c=num2/10; //时分秒的个位和十位d=num2%10;e=num3/10;f=num3%10;P0=table[e];w1=0; //第1位delay(2);w1=1;P0=table[f];w2=0; //第2位delay(2);w2=1;P0=table[c];w3=0; //第3位delay(2);w3=1;P0=table[d];w4=0; //第4位delay(2);w4=1;}void display2() {P0=table[e];w1=0; //第1位delay(2);w1=1;P0=table[f];w2=0; //第2位delay(2);w2=1;P0=table[c];w3=0; //第3位delay(2);w3=1;P0=table[d];w4=0; //第4位delay(2);w4=1;}void T1_time()interrupt 3{TH1=(65536-45872)/256;TL1=(65536-45872)%256;num1++;if(num1==20){l1=~l1;num1=0;num++;if(num==60){l2=~l2;num=0; //秒到60跳到0num2++;if(num2==60){num2=0; //分到60跳到0num3++;if(num3==13) //时位到13 跳到0{num3=1;}}} //num记秒num2计分num3计时}}。

基于STC89C52RC单片机的秒表程序设计

基于STC89C52RC单片机的秒表程序设计

基于STC89C52RC单片机的秒表程序设计。

(长安大学单片机公选课考试题目)。

数码管为六位,单片机P0口为段选,P1口位选(列扫描)。

键盘为P2口矩阵键盘。

#include<reg52.h>#include<intrins.h>char shzh[6];char h=0,m=0,s=0;char num=0,Lnum1,Lnum2,Lnum3,Lnum4,flag1;#define TH ((65536-57596)/256)#define TL ((65536-57596)%256)//时间计算过程char XS[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};void delay(char x){while(x>0){ _nop_();x--;}}void timer0() interrupt 1 using 1{TH0=TH;TL0=TL;num++;if(num>=16){ num=0;s++;}if(s==60){s=0;m++;if(m==60){m=0;h++;if(h==24){h=0; m=0; s=0;}}}}void display(){char i;shzh[0]=h/10;shzh[1]=h%10;shzh[2]=m/10;shzh[3]=m%10;shzh[4]=s/10;shzh[5]=s%10;P1=0x00;for(i=4;i<6;i++){P0=XS[shzh[i]];delay(5);P0=0x00;if(i!=5) P1=P1+0x20;}}/*****时显示******/void display1(){shzh[0]=h/10;shzh[1]=h%10;P1=0x00;P0=XS[shzh[0]];delay(5);P0=0x00;P1=0x20;P0=XS[shzh[1]];delay(5);P0=0x00;}/*********分显示******/ void display2(){shzh[2]=m/10;shzh[3]=m%10;P1=0x40;P0=XS[shzh[2]];delay(5);P0=0x00;P1=0x60;P0=XS[shzh[3]];delay(5);P0=0x00;}/*********秒显示********/void display3(){shzh[4]=s/10;shzh[5]=s%10;P1=0x80;P0=XS[shzh[4]];delay(5);P0=0x00;P1=0xa0;P0=XS[shzh[5]];delay(5);P0=0x00;}keyscan(){P2=0xf0;if((P2&0xf0)!=0xf0){delay(100);if((P2&0xf0)!=0xf0){if(P2==0xe0) Lnum1=1; //设置键if(P2==0xd0) Lnum2=1; //加一键if(P2==0xb0) Lnum3=1; //减一键if(P2==0x70) Lnum4=1; //保存键}}}main(){int k;TMOD=0X01;TH0=TH;TL0=TL;ET0=1;EA=1;TR0=1;while(1){keyscan();if(Lnum1==1){ TR0=0;flag1++;if(flag1>=4) flag1=0;}/*****加一****/if(Lnum2==1){if(flag1==1){s=0;if(s==60) s=0;}if(flag1==2){s=0;if(m==60) m=0;}if(flag1==3){s=0;if(h==24) h=0;}}/*****减一******/if(Lnum3==1){if(flag1==1){s--;if(s<=0) s=59;}if(flag1==2){m--;if(m<=0) m=59;}if(flag1==3){h--;if(h<=0) h=23;}}Lnum1=0;Lnum2=0;Lnum3=0;if(Lnum4==1){TR0=1;flag1=0;Lnum4=0;}if(flag1==0) display();if(flag1==1){for(k=0;k<400;k++) { display1();display2();display3();}}if(flag1==2){for(k=0;k<400;k++) { display1();display2();display3();}}if(flag1==3){for(k=0;k<400;k++){ display1();display2();display3();}}}}(注:可编辑下载,若有不当之处,请指正,谢谢!)。

单片机简易秒表正计时时间可设置

单片机简易秒表正计时时间可设置

第一章设计内容和要求1.1设计任务用AT89C52设计一个4位的LED数码作为多功能“秒表”。

1.2设计目的1.学习数码管显示的结构和工作流程,实现数码管分组显示数字组合。

2.学习有关单片机的内容,进一步了解AT89C52芯片的相关功能。

3.复习C语言的相关知识。

4.培养自学能力和探索解决问题的能力。

1.3设计要求显示时间为00分00秒-59分59秒,每1秒自动加1,另外设计一个“开始/暂停”键、一个“记录/查询”键、一个“清零”键、一个“模式切换”键、一个“时间设置”键、一个“复位”键。

秒表要求正计时时,可记录并且查询10组数据,倒计时时,时间用户可设置,并且时间到时蜂鸣器报警。

1.4设计创新在基本设计基础上添加了正向查询10条记录后蜂鸣器同时报警。

1.5设计意义简易秒表具有读取方便,显示直观,功能多样,电路简洁,成本低廉等诸多优点,符合电子仪器仪表的发展趋势,具有广阔的市场前景。

本次设计将基于单片机的工作原理,设计简易秒表的基本电路,深入的了解其工作原理,掌握其基本的工作特点。

同时简易秒表在生活中应用广泛,从实际出发,不断创新。

第二章方案设计与选择2.1技术可行性20世纪以来,微电子,IC集成电路行业发展迅速,其中单片机行业发展最引人注目。

单片机利用大规模集成电路技术把中央处理器和数据存储器(RAM),程序存储器(ROM)及其他I/O通信口集成在一块芯片上,构成最小的计算机系统。

如今的单片机发展集成了更多的特殊功能单元,例如A/D,D/A转换器,通信控制,DMA,PWM控制输出单元等。

因此,只要外加一些扩展电路及必要的通道接口就可以构成各种计算机应用系统。

单片机除了具备体积小,价格低,速度快,用途广,可靠性高等特点,在硬件结构和指令设置上还有以下独特之处:1.存储器ROM和RAM是严格分工的。

前者存放程序,常数和数据表格,后者存放临时数据和变量。

2.采用面向控制的指令系统,构成的应用系统有较大的可靠性。

52单片机的秒表

52单片机的秒表

52单片机的秒表1 单片机的应用领域目前单片机渗透到我们生活的各个领域,几乎很难找到哪个领域没有单片机的踪迹。

导弹的导航装置,飞机上各种仪表的控制,计算机的网络通讯与数据传输,工业自动化过程的实时控制和数据处理,广泛使用的各种职能IC卡,名用豪华车辆的安全保障系统,摄像机、全自动洗衣机的控制,以及程控玩具、电子宠物等等,这些都离不开单片机。

更不用说自动控制领域的机器人、智能仪表、医疗器械了。

因此,的学习、开发与应用将造就一批计算机应用与智能化控制的科学家、工程师。

单片机广发应用于仪器仪表、家用电器、医用设备、航空航天、专用设备的智能化管理及过程控制等领域,大致可分为如下几个范畴:1.1 在智能仪器仪表上的应用单片机具有体积小、功耗低、控制功能强、扩展灵活、微型化和使用方便等优点,广泛应用与仪器仪表中,结合不同类型的传感器,可实现诸如电压、频率、湿度、温度、流量、速度、厚度、角度、长度、硬度、元素、压力等物理量的测量。

采用单片机控制使得仪器仪表数字化、智能化、微型化,且功能比起采用电子或数字电路更加强大。

例如精密的测量设备(示波器,各种分析仪)。

1.2在工业控制中的应用用单片机可以构成形式多样的控制系统、数据采集系统。

例如工厂流水线的智能化管理,电梯智能化控制、各种报警系统,与计算机联网构成二极管控制系统等。

1.3在家用电器中的应用可以这样说,现在的家用电器基本上都采用了单片机控制,从电饭煲、洗衣机、电冰箱、空调机、彩电、其他音响视频器材、再到电子称量设备,五花八门,无所不在。

1.4在计算机网络和通信领域中的应用现代的单片机普遍具备通信接口,可以很方便的与计算机进行数据通信,为在计算机网络和通信设备间的应用提供了极好的物质条件,现在的通信设备基本上实现了单片机智能控制,从手机、电话机、小型程控交换机、楼宇自动通信呼叫系统、列车无线通信、再到日常工作中随处可以兼得移动电话,集群移动通信,无线电对讲机等。

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

#include<reg52.h>#define uint unsigned int#define uchar unsigned char#define bit(x)(1<<x)unsigned int a[12]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x80}; unsigned char c=-1; //调时间用的unsigned char b[12]={0};unsigned char d[6]={0,0,5,1,9,1}; //调闹钟用的unsigned char f=0;unsigned char e[4]={0};uchar u=0; //音乐用uchar Count; //同上#include<intrins.h>#define wr_second 0x80#define wr_minute 0x82#define wr_hour 0x84#define rd_second 0x81#define rd_minute 0x83#define rd_hour 0x85//#define wr_day 0x86#define rd_day 0x87#define wr_month 0x88#define rd_month 0x89#define wr_year 0x8c#define rd_year 0x8d//#define write_protect 0x8esbit CLK=P1^0; //实时时钟时钟线引脚sbit DIO=P1^1; //实时时钟数据线引脚sbit RST =P1^2; //实时时钟复位线引脚sbit ACC0 = ACC^0;sbit ACC7 = ACC^7;//sbit return0=P3^3;sbit left=P3^4 ;sbit stop=P3^5;sbit up=P1^6;sbit yinyue=P1^7;sbit fiction=P3^2;sbit Speak =P1^4; // 风频器nb//uchar s,m,h,day,mon,year;uchar q=0; // 中断用uchar clock=0;void delay(unsigned ms){unsigned i,j;for(i=0;i<ms;i++)for(j=0;j<150;j++);}void show(int x,int y){P2=~bit(x);P0=a[y];delay(1);}//时间//////////////////////////////////////////////////////////////////////////////////////////////// //////// //写void DS1302_wr(uchar addr,uchar dat) //addr: DS1302地址, dat 要写的数据{unsigned char i,temp;RST = 0;CLK = 0;RST = 1;//ACC=addr;// 地址,命令for(i=8;i>0;i--){ CLK = 0;temp=addr;DIO=(bit)(temp&0x01) ;addr=addr>>1;CLK=1;}for(i=8;i>0;i--){CLK = 0;temp=dat;DIO=(bit)(temp&0x01);dat >>= 1;CLK=1;}RST=0;}// 读unsigned char DS1302_rd(unsigned char addr){unsigned char i,temp,dat1,dat2;RST = 0;CLK = 0;RST = 1;// 地址,命令for(i=8;i>0;i--){CLK = 0;temp=addr;DIO=(bit)(temp&0x01);addr>>=1;CLK=1;}for(i=8;i>0;i--){ACC7=DIO;CLK=1;ACC>>=1;CLK=0;}RST=0;dat1=ACC;dat2=dat1/16;dat1=dat1%16;dat1=dat1+dat2*10;return(dat1);}void intial(void) // ds1302初始化{DS1302_wr(write_protect,0x00);//DS1302_wr(wr_second,0x56);//DS1302_wr(wr_minute,0x34);//DS1302_wr(wr_hour,0x12);//DS1302_wr(wr_day, 0x07);// DS1302_wr(wr_month,0x12);//DS1302_wr(wr_year,0x11);// DS1302_wr(write_protect,0x80);}//////////////////////////////////////////////////////////////////////////////////////////////////////void show_b() //时间日期数码管显示数{//uchar i;b[0]=s%10;b[1]=s/10;b[2]=m%10;b[3]=m/10;b[4]=h%10;b[5]=h/10;//b[6]=day%10;b[7]=day/10;b[8]=mon%10;b[9]=mon/10;b[10]=year%10;b[11]=year/10;}void show_time() //显示时间函数{show_b();show(0,b[0]);show(1,b[1]);show(2,10);show(3,b[2]);show(4,b[3]);show(5,10);show(6,b[4]);show(7,b[5]);}void show_day() //显示日期函数{show_b();show(0,b[6]);show(1,b[7]);show(2,b[8]);show(3,b[9]);show(4,b[10]);show(5,b[11]);show(6,0);show(7,2);}/////////////////////////////////////////////////////////////////////////////////////void ddd(void) //从ds1302读出时、分、秒及日期{s=DS1302_rd(rd_second);m=DS1302_rd(rd_minute);h=DS1302_rd(rd_hour);day=DS1302_rd(rd_day);mon=DS1302_rd(rd_month);year=DS1302_rd(rd_year);}//////////////////////////////////////////////////////////////////////////////////////void int_init(void) //开中断{EA=1; //全局中断开EX0=1; //外部中断0开EX1=1; //外部中断1开IT0=1; //边沿触发,为0则为低电平触发IT1=1; //边沿触发,为0则为低电平触发ET1=1; // 计数器1开}void init_time() //中断初始化{TMOD=0x10;TR1=1; // TCON}//////////*void int0_Key() interrupt 0 using 1{u++; //q功能键转化}*/void fictions(){if(fiction==0){while(fiction==0);q++;}}void int1_Key() interrupt 2 using 2{clock=0; //关闹钟}/////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////// void clock_out() //闹钟程序{while(clock){Speak=1;delay(1);Speak=0;delay(1);}}void move() // 调小数点{if(left==0){while(left==0);c++;if(c==7) c=-1;}}void move_time() //调时间{move();if(up==0){uchar a;while(up==0);switch(c){//case -1: break;case 0: a=s%10+s/10*16;a=a+0x01;if(a>=96)a=a-0x60;DS1302_wr(wr_second,a);break;case 1: a=s%10+s/10*16;a=a+0x10;if(a>=96)a=a-0x60;DS1302_wr(wr_second,a);break;//case 2: break;case 3: a=m%10+m/10*16;a=a+0x01;if(a>=96)a=a-0x60;DS1302_wr(wr_minute,a);break;case 4: a=m%10+m/10*16;a=a+0x10;if(a>=96)a=a-0x60;DS1302_wr(wr_minute,a);break;//case 5: break;case 6: a=h%10+h/10*16;a=a+0x01;if(a>=36)a=0x00;DS1302_wr(wr_hour,a);break;/*case 7: a=h%10+h/10*16;a=a+0x10;if((a&0xf0)>=32)a=0x00+b[4];DS1302_wr(wr_hour,a);break; */ default : break;}}show_time();}void move_day() //调日期{move();if(up==0){uchar a;while(up==0);switch(c){//case -1: break;case 0: a=day%10+day/10*16;a=a+0x01;if(a>49)a=0x01;DS1302_wr(wr_day,a);break;case 1: /* a=day%10+day/10*16;a=a+0x10;if(a>=65)a=a-0x30;DS1302_wr(wr_day,a);break;*/c=c+1;case 2: a=mon%10+mon/10*16;a=a+0x01;if(a>18)a=0x01;DS1302_wr(wr_month,a);break;case 3: /* a=mon%10+mon/10*16;a=a+0x10;if(a>=34)a=a-0x10;DS1302_wr(wr_month,a);break;*/c=c+1;case 4: a=year%10+year/10*16;a=a+0x01;if(a>153)a=0x00;DS1302_wr(wr_year,a);break;case 5: a=year%10+year/10*16;a=a+0x10;if(a>153)a=a-0x90;DS1302_wr(wr_year,a);break;/*case 7: a=h%10+h/10*16;a=a+0x10;if((a&0xf0)>=32)a=0x00+b[4];DS1302_wr(wr_hour,a);break;*/ default : break;}}////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void show_naozhong(){show(0,d[0]);show(1,d[1]);show(2,10);show(3,d[2]);show(4,d[3]);show(5,10);show(6,d[4]);show(7,d[5]);}void move_naozhong(){move();if(up==0){while(up==0);switch(c){//case -1: break;case 0: d[0]++;if(d[0]==10) d[0]=0;break;case 1: d[1]++;if(d[1]>=6) d[1]=0;break;//case 2: break;case 3: d[2]++;if(d[2]==10) d[2]=0;break;case 4: d[3]++;if(d[3]>=6) d[3]=0;break;//case 5: break;case 6: d[4]++;if(d[4]==10){d[4]=0;d[5]++;}break;default : break;}}}uchar counter=0;void init_inttime() interrupt 3{TH1=0xfc;TL1=0x0B;counter++;if (counter==10){counter=0;e[0]++;if(e[0]==10){e[0]=0;e[1]++;if(e[1]==10){e[1]=0;e[2]++;if(e[2]==10){e[2]=0;e[3]++;if(e[3]==6)e[3]=0;}}}}}/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////unsigned char code SONG[] ={ //祝你平安0x26,0x20,0x20,0x20,0x20,0x20,0x26,0x10,0x20,0x10,0x20,0x80,0x26,0x20,0x30,0x20, 0x30,0x20,0x39,0x10,0x30,0x10,0x30,0x80,0x26,0x20,0x20,0x20,0x20,0x20,0x1c,0x20, 0x20,0x80,0x2b,0x20,0x26,0x20,0x20,0x20,0x2b,0x10,0x26,0x10,0x2b,0x80,0x26,0x20, 0x30,0x20,0x30,0x20,0x39,0x10,0x26,0x10,0x26,0x60,0x40,0x10,0x39,0x10,0x26,0x20, 0x30,0x20,0x30,0x20,0x39,0x10,0x26,0x10,0x26,0x80,0x26,0x20,0x2b,0x10,0x2b,0x10, 0x2b,0x20,0x30,0x10,0x39,0x10,0x26,0x10,0x2b,0x10,0x2b,0x20,0x2b,0x40,0x40,0x20, 0x20,0x10,0x20,0x10,0x2b,0x10,0x26,0x30,0x30,0x80,0x18,0x20,0x18,0x20,0x26,0x20, 0x20,0x20,0x20,0x40,0x26,0x20,0x2b,0x20,0x30,0x20,0x30,0x20,0x1c,0x20,0x20,0x20, 0x20,0x80,0x1c,0x20,0x1c,0x20,0x1c,0x20,0x30,0x20,0x30,0x60,0x39,0x10,0x30,0x10,0x20,0x20,0x2b,0x10,0x26,0x10,0x2b,0x10,0x26,0x10,0x26,0x10,0x2b,0x10,0x2b,0x80, 0x18,0x20,0x18,0x20,0x26,0x20,0x20,0x20,0x20,0x60,0x26,0x10,0x2b,0x20,0x30,0x20, 0x30,0x20,0x1c,0x20,0x20,0x20,0x20,0x80,0x26,0x20,0x30,0x10,0x30,0x10,0x30,0x20, 0x39,0x20,0x26,0x10,0x2b,0x10,0x2b,0x20,0x2b,0x40,0x40,0x10,0x40,0x10,0x20,0x10, 0x20,0x10,0x2b,0x10,0x26,0x30,0x30,0x80,0x00,};void Time0_Init(){TMOD = 0x01;IE = 0x82;TH0 = 0xDC;TL0 = 0x00;}void Time0_Int() interrupt 1{TH0 = 0xDC;TL0 = 0x00;Count++; //长度加1}void Delay_xMs(uint x){uint i,j;for(i=0; i<x; i++){for(j=0; j<3; j++);}}void Play_Song(uchar i){uchar Temp1,Temp2;uint Addr;Count = 0; //中断计数器清0Addr = i ;while(u){Temp1 = SONG[Addr++];if (Temp1 == 0xFF) //休止符{TR0 = 0; // 停止计数Delay_xMs(100);}else if (Temp1 == 0x00) //歌曲结束符{u=0;}else{Temp2 = SONG[Addr++];TR0 = 1;while(1){Speak = ~Speak;Delay_xMs(Temp1);if(Temp2 == Count){Count = 0;break;}}}}}void change(){if(yinyue==0){while(yinyue==0);u++;}}//////////////////////////////////////////////////////////////////////////////////////////////// void main(){intial();int_init();while(1){ddd(); //显示时间if(q%3==0){show_time();move_time();}if(q%3==1) //显示日期{show_day();move_day();}if(q%3==2) //闹钟调试{show_naozhong();move_naozhong();}if(u%2==1) //音乐功能{Time0_Init(); //定时器0中断初始化Play_Song(0); //为祝你平安}show(c,11); //小数点显示fictions(); //功能键扫描change();if(h==(d[5]*10+d[4])&&m==(d[3]*10+d[2])&&s==(d[1]*10+d[0])) clock=1;clock_out();}}。

相关文档
最新文档