单片机时钟程序:通过键设计当前时间,设定闹钟,时间一到,报警

作者&投稿:佘萍 (若有异议请与网页底部的电邮联系)
求助一单片机程序,可通过键盘设置时钟和闹钟~

把按键检测,和执行按键功能,分开。

参考如下程序:
void main(){ mm = 0, kk = 0; while(1) { kk = keyscan(); //返回0、1、2、3 if(kk == 0) display(shi, fen, miao); //没有按就正常走时 if(kk == 1) {mm++; if(mm == 4) mm = 0;} //改变项目 if(kk == 2) { switch(mm) { case 1 : if(miao < 59) miao++; break; case 2 : if(fen < 59) fen++; break; case 3 : if(shi < 23) shi++; break; } } if(kk == 3) { switch(mm) { case 1 : //相应项目--; break; case 2 : //相应项目--; break; case 3 : //相应项目--; break; } } }}

STC,AT的51芯片我都做过,你这HC6800就没做过.

这是我以前写的一段程序,希望对你能有帮助

我的程序,首先有一点,肯定是调试通过的,不像我以前找的一些网络程序,貌似可以,就是不能执行结果。

/*DS1302时钟芯片显示设置
功能:显示 时间 日期 星期
引脚说明:DS1302三引脚 CLK = P1^5; IO=P1^6; RST=P1^7;
设计整理:创达科技 陈仲库
技术服务:kuzi00@163.com QQ:86828048
整理时间:2007年5月26日
*/
#define uchar unsigned char
#define uint unsigned int

sbit DS1302_CLK = P1^5; //实时时钟时钟线引脚
sbit DS1302_IO = P1^6; //实时时钟数据线引脚
sbit DS1302_RST = P1^7; //实时时钟复位线引脚
sbit ACC0 = ACC^0;
sbit ACC7 = ACC^7;

typedef struct __SYSTEMTIME__
{
uchar Second;
uchar Minute;
uchar Hour;
uchar Week;
uchar Day;
uchar Month;
uchar Year;
uchar DateString[9];
uchar TimeString[9];
}SYSTEMTIME; //定义的时间类型

void DS1302_WR_Byte(uchar d) //实时时钟写入一字节(内部函数)
{
uchar i;
ACC = d;
for(i=8; i>0; i--)
{
DS1302_IO = ACC0; //相当于汇编中的 RRC
DS1302_CLK = 1;
DS1302_CLK = 0;
ACC = ACC >> 1;
}
}

uchar DS1302_RD_Byte(void) //实时时钟读取一字节(内部函数)
{
uchar i;
for(i=8; i>0; i--)
{
ACC = ACC >>1; //相当于汇编中的 RRC
ACC7 = DS1302_IO;
DS1302_CLK = 1;
DS1302_CLK = 0;
}
return(ACC);
}

void DS1302_Write(uchar ucAddr, uchar ucDa) //ucAddr: DS1302地址, ucData: 要写的数据
{
DS1302_RST = 0;
DS1302_CLK = 0;
DS1302_RST = 1;
DS1302_WR_Byte(ucAddr); // 地址,命令
DS1302_WR_Byte(ucDa); // 写1Byte数据
DS1302_CLK = 1;
DS1302_RST = 0;
}

uchar DS1302_Read(uchar ucAddr) //读取DS1302某地址的数据
{
uchar ucData;
DS1302_RST = 0;
DS1302_CLK = 0;
DS1302_RST = 1;
DS1302_WR_Byte(ucAddr|0x01); // 地址,命令
ucData = DS1302_RD_Byte(); // 读1Byte数据
DS1302_CLK = 1;
DS1302_RST = 0;
return(ucData);
}

void DS1302_SetTime(uchar Address, uchar Value) // 设置时间函数
{
DS1302_Write(0x8E,0x00); //写保护
DS1302_Write(Address, ((Value/10)<<4 | (Value%10)));
}

void DS1302_GetTime(SYSTEMTIME *Time)
{
uchar ReadValue;
ReadValue = DS1302_Read(0x80);
Time->Second = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
ReadValue = DS1302_Read(0x82);
Time->Minute = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
ReadValue = DS1302_Read(0x84);
Time->Hour = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
ReadValue = DS1302_Read(0x86);
Time->Day = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
ReadValue = DS1302_Read(0x8a);
Time->Week = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
ReadValue = DS1302_Read(0x88);
Time->Month = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
ReadValue = DS1302_Read(0x8c);
Time->Year = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
}

void DateToStr(SYSTEMTIME *Time)
{
Time->DateString[0] = Time->Year/10 + '0';
Time->DateString[1] = Time->Year%10 + '0';
Time->DateString[2] = '-';
Time->DateString[3] = Time->Month/10 + '0';
Time->DateString[4] = Time->Month%10 + '0';
Time->DateString[5] = '-';
Time->DateString[6] = Time->Day/10 + '0';
Time->DateString[7] = Time->Day%10 + '0';
Time->DateString[8] = '\0';
}

void TimeToStr(SYSTEMTIME *Time)
{
Time->TimeString[0] = Time->Hour/10 + '0';
Time->TimeString[1] = Time->Hour%10 + '0';
Time->TimeString[2] = ':';
Time->TimeString[3] = Time->Minute/10 + '0';
Time->TimeString[4] = Time->Minute%10 + '0';
Time->TimeString[5] = ':';
Time->TimeString[6] = Time->Second/10 + '0';
Time->TimeString[7] = Time->Second%10 + '0';
Time->DateString[8] = '\0';
}

void DS1302_Init(void)
{
uchar Second=DS1302_Read(0x80);
if(Second&0x80) DS1302_SetTime(0x80,0);
//时间设置初始化 秒 分 时
DS1302_SetTime(0x80,30);
DS1302_SetTime(0x82,59);
DS1302_SetTime(0x84,23);
DS1302_SetTime(0x8A,6); //周
DS1302_SetTime(0x86,26); //天
DS1302_SetTime(0x88,5); //月
DS1302_SetTime(0x8C,7); //年
}
/*调用说明
DS1302_Init();初始化
DS1302_GetTime(&CurrentTime);//取得当前时间
DateToStr(&CurrentTime); //取得当前日期
TimeToStr(&CurrentTime); //取得当前时间
// 数据处理 CurrentTime.DateString 格式"07-05-26"
// CurrentTime.TimeString 格式"00;00;00"

*/


DS1302芯片+单片机实现,我有AVR及51单片机的,包括仿真的都有,需要代做就联系我。


用单片机设计一个时钟,可显示时和分,可以调时间,也要有闹钟功能,要有设...
其实不用定时中断也能实现功能:include<reg51.h> 主函数 unsigned char tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};定义0-9数组 unsigned int tmp;定义变量 void delay(unsigned int xms)定义延时函数 {unsigned int j,i;for(i=0;i<xms;i++)for(j=0;j<100...

单片机时钟是独立按键控制吗
该机器是独立按键控制。单片机时钟需要使用独立按键调节和控制,可调节时间显示、日期和闹钟等功能,使用期间较为便捷。片机时钟设置:1、使用数码管显示时间。2、使用单片机内部定时实现走时。3、通过按键设置时间,设置时对应显示位置闪烁。

51单片机做数字电子钟
᠑...  设计一个数字电子钟,要求可以进行时、分、秒显示,最大显示时间为23:59:59,并且可以通过按键进行时、分调整。 画出硬件连接电路图,说明各个控制信号的作用。 画出程序流程图,编写程序,硬件连接调试,直至正确。 编写课程设计报告。 3、给定条件 在Dais-52PH+单片机实验箱中,有一片8155...

...一个4位的共阴数码管通电的状态下显示时间的程序
include <reg52.h> define uint unsigned int define uchar unsigned char sbit PRESS1=P1^0;sbit PRESS2=P1^1;sbit PRESS3=P1^2;uint a[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};\/\/0到9 uint b[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};int miao=...

基于MCS-51单片机的数字时钟系统设计
利用MCS-51单片机的汇编指令或C51编写程序.用DS1302做的时钟芯片,我要设计原理图和程序.我邮相是13721059129@139.com因为是做多路时钟 而51单片机只能做两路 所以要用到DS1302时钟芯片 :(1)具有时钟和日历的显示和调整功能,并可互相切换,时钟以24小时制控制时间;(2)具有闹钟功能,并设有闹钟启用标志;(3)具有多...

单片机实训总结范文5篇
★ 单片 机实 训心得 体会 ★ ★ 实 训总 结报 告范 文 ★ ★ 实 训总 结与心 得体会 ★ ★ 实 习实训总 结报 告 ★ ▼ 单片机实训总结范文篇一: 通过今次单片机实训,使我对单片机的认识有了更深刻的理解。系统以51单片机为核心部件,利用汇编软件编程,通过键盘控制和数码管显示实现了基本...

单片机秒表功能实现的原理?
利用单 片机内定时器,一次定时50ms,定义4 个变量,分别是时、 分、秒和中断次数,每中断一次中断次数变量加1,累积20次,即是1S,然后秒加1,够60秒后秒清0,分加1,60 分后,分清0,时加1,24小时后 ,小时清0,这些都在中断程序中完成,主程序中不断地显示时间,这就是一个时钟。在此...

操作系统为什么要引入中断
不一定,有些中断是可以屏蔽的,比如一次时钟中断产生,cpu跳去执行中断入口处的程序,在进入中断后,为了不引起混乱,中断程序通过指令设置屏蔽标志,这样,以后的时间中断就不会再引起CPU的中断了,在时钟中断程序执行完毕任务后,再次通过指令取消屏蔽标志,以后的时间中断就可以引起CPU中断,并再次进入时钟中断程序。 CPU是...

利用CPU的定时器定时,设计一个电子时钟
利用CPU的定时器定时,设计一个电子时钟 20 主要类容:1、利用CPU的定时器定时,设计一个电子时钟,使七段数码管输出记时值,格式如下:XXXXXX由左向右分别为:时、分、秒2、利用蜂鸣器实现整点报时功能最好有电路图和程序请发到... 主要类容: 1、利用CPU的定时器定时,设计一个电子时钟,使七段数码管输出记时值...

时钟周期、指令周期、机器周期、总线周期都是什么意思?
1、时钟周期也称为振荡周期, 定义为时钟脉冲的倒数 (可以这样来理解, 时钟周期就是单 片机外接晶振的倒数, 例如 12M 的晶振, 它的时间周期就是 1\/12 us) , 是计算机中最基本的、 最小的时间单位。2、机器周期。在计算机中, 为了便于管理, 常把一条指令的执行过程划分为若干个阶段, 每一阶段...

榆次区13936914980: 51单片机 用按键设定时钟时间的原理 -
暴耍天眩: 给你个思路.程序自己写 void intterupt0(void) interrupt 0 { while(k4==1){if(k1==0){delay(10);while(k1==0);p++;}else if(k2==0){delay(10);while(k2==0);*p=*p++;}else if(k3==0){delay(10);while(k3==0);*p=*p--;}DISPLAY(); //显...

榆次区13936914980: 单片机电子钟通过按键设置时间这段怎么写?用汇编,讲讲实现的语法!切换 时 分 的设置时应如何使用中断
暴耍天眩: 很容易!你可以设置一个全局位变量,和一个全局字节变量.像 REVISION_BIT BIT 00H REVISION_COUNT EQU 30H,首先清零REVISION_BIT,表示正常计时状态.1表示调整状态.当第按下调整键时首先判断是调整状态还是正常状态,如果是正常计时状态则就转换为时间调整状态同时清零REVISION_COUNT,如果是时间调整状态的话则REVISION_COUNT加1.当加到2时又清零.如果是在调整状态下且REVISIO—COUNT为0则可以调整时间的分,如果是1则可以调整时间的时.按一下开始键进入正常计时状态,同时启动计时.

榆次区13936914980: 51单片机电子钟 通过按键调整时间 这块程序怎么写(方法) -
暴耍天眩: 汇编的我不知道,C语言的倒是很多的,建议你去看下郭天祥的《十天学会单片机》视频教程的第十讲,里面讲的非常的清楚的,以下是哪段教程的程序,比你如果只是不知道方法的话,可以去看下,肯定能得到解决的思路的............ #include<...

榆次区13936914980: 求助一单片机程序,可通过键盘设置时钟和闹钟 -
暴耍天眩: 把按键检测,和执行按键功能,分开.参考如下程序: void main(){ mm = 0, kk = 0; while(1) { kk = keyscan(); //返回0、1、2、3 if(kk == 0) display(shi, fen, miao); //没有按就正常走时 if(kk == 1) {mm++; if(mm == 4) mm = 0;} //改变项目 if(kk == ...

榆次区13936914980: 用单片机设计电子时钟,设计一个按键对时钟进行选择、两个按键对时间进行调整和一个按键对调整进行确认 -
暴耍天眩: 调整之后,楼主是否把时间又写进1302了呢,差不多就重新调用一次1302初始化

榆次区13936914980: 单片机课程设计(数字时钟 要求:显示年月日 时分秒能通过按键设置初值.能进行阴阳 -
暴耍天眩: 设计一个按键,或者定时自动切换. 显示的话就是将数据传送给显示模块(调用显示程序).

榆次区13936914980: 单片机c语言时钟程序 -
暴耍天眩: 试试这个: void time0_int(void) interrupt 1 {TH0 = (65536-10000) / 256;TL0 = (65536-10000) % 256;i++;if (i == 1) {P1_1 = !P1_1; i = 0;dispa[0]++;if (dispa[0] > 9) {P1_1 = !P1_1; dispa[0] = 0;dispa[1]++;if (dispa[1] > 5) {P1_1 = !P1_1; ...

榆次区13936914980: 51单片机简单电子时钟程序,通过按键设置时间,并且通过DS1302 寄存时间 -
暴耍天眩: 你这不是已经有仿真图了吗,也显示时间了,那是谁的仿真图,不是你自己的吗. 那DS1302不是寄存时间,就是一片时钟芯片,它就完成时钟计时的,有时间和日期的.但都需要写程序读出时间和日期.

榆次区13936914980: 利用单片机设计一个30秒计时器程序 -
暴耍天眩: P1 段码 P2 位选 p2.0(个位) p2.1(十位) P3.0 按键 启动 0时表示按下 P3.1 按键 停止 P3.2 按键 重置 12M 晶振 FLAG EQU 30H ; =0 停止 =1开始 =2重置 TIME EQU 31H ; 每过一秒 置1 ,通过主程序对其清0 计时 CON EQU 32H ; 记录当前...

榆次区13936914980: 电子钟的设计(带按键调整) 任务要求:利用AT89C51单片机设计简易电子钟(六位),通过6位共阴 -
暴耍天眩: #include#define uchar unsigned char...要是PROTEUS的话差不多是这样,要是不想麻烦搞个74595的话P1就直接连(有没有都一样有的话比较整洁,没有的话程序上省点脑筋)主按键就用INT0,我没用P0口是因为懒得加上拉电阻,高低电平暂时先设成低的,思路就是P2口片选,当INT0触发时,你可以用while循环兜住不让出去,第一次是片选前两位“时”,第二次分第三次秒,如果第四次按下P32,也就是进入中断后第三次按下按键,结束中断,调到main.思路应该是这样当然肯定漏洞很多,先吃个饭再看看.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网