⑴ 用单片机做闹钟你是什么思路
用单片机做闹钟,选一时钟芯片,如DS1302,单片机用51或pic或其它系列都可,单片机和时钟芯片用i/o连接好。显示选LED,LCD都运行,加蜂鸣器用单片机控制。功能要求,编程序实现了。
⑵ 单片机 闹钟
不知道你原来的系统有哪些资源。
至少需要有设置时钟与闹钟的按键,遥控键也算,以及时间显示。
传统的方法,一般是加时钟芯片,最主要的是时钟芯片要加电池,一般是加钮扣电池,这样停电或关机的时候,时钟继续跑,不会停。
当然,如果你的系统是一直加电的,不用时钟芯片和电池也没问题,直接用CPU跑时钟,就是费点电。但注意,一旦断电,时钟归零,闹钟就没法用了。如果只是偶尔继电,加超级电容的方法也很不错。
还有一种比较新的办法是用电波钟模块,每次开机的时候,自动获取国家天文台的标准授时。这个方法特别适合自己动手的玩家,淘宝上有BPC模块买。但是这个抛开专利的问题不谈,据说接收的时候白天与晚上差别是很大的,白天开机,可能很长时间收不到信号。实际做钟表,里面除了每天定点对时,其余时间都是自己用时钟芯片跑表的。
⑶ 51单片机定时闹铃(c语言)
我来发一个C语言51单片机时钟程序,希望能帮到你 /* 程序功能:带定时闹铃时钟 */ /*---------------------------------------------------------------*/ #include <AT89X51.H> /*包含器件配置文件*/ #define uchar unsigned char #define uint unsigned int char DATA_7SEG[10]={0xC0,0xF9,0xA4,0xB0,0x99, 0x92,0x82,0xF8,0x80,0x90,};/*0~9的数码管段码*/ uchar hour=0,min=0,sec=0; /*时、分、秒单元清零*/ uchar deda=0; /*5mS计数单元清零*/ bit d_05s=0; /*0.5秒标志*/ uchar set=0; /*模式设定标志*/ uchar m=0; uchar flag=0; /*RAM掉电标志*/ void delay(uint k); /*延时?函数*/ void conv(); /*走时单元转换*/ void disp(); /*走时时间显示?函数*/ /*------------------------走时?函数部分 ----------------------*/ /*定时器T0 5mS初始化*/ void init_timer() { TMOD=0x01; TH0=-(4800/256); TL0=-(4800%256); IE=0x82; TR0=1; } /*---------------------------------*/ /*5mS定时中断服务?函数*/ void T0_srv(void) interrupt 1 { TH0=-(4800/256); TL0=-(4800%256); deda++; } /*----------------------------------*/ /*时、分、秒单元及走时单元转换*/ void conv() { if(deda<=100)d_05s=0; else d_05s=1; if(deda>=200){sec++;deda=0;} if(sec==60){min++;sec=0;} if(min==60){hour++;min=0;} if(hour==24){hour=0;} } /*------------------------ 显示?函数部分 ----------------------*/ /*走时时间显示?函数*/ void disp() { P0=DATA_7SEG[hour/10];P2=0xf7;delay(1); P0=DATA_7SEG[hour%10];P2=0xfb;delay(1); if(d_05s==1){if(P2_2==0)P0_7=0;else P0_7=1;} delay(1); P0=DATA_7SEG[min/10];P2=0xfd;delay(1); P0=DATA_7SEG[min%10];P2=0xfe;delay(1); } /*---------------------- 调整时间?函数部分 -------------------*/ /*调整走时时间*/ void set_time() {uchar m; if(P2_5==0)delay(1); if(P2_5==0)hour++; if(hour==24)hour=0; for(m=0;m<30;m++) { disp(); if(P2_2==0)P0_7=0; else P0_7=1; delay(1); } if(P2_6==0)delay(1); if(P2_6==0)min++; if(min==60)min=0; for(m=0;m<30;m++) { disp(); if(P2_2==0)P0_7=0; else P0_7=1; delay(1); } } /*------------------ 按键扫描、延时等?函数部分-------------------*/ /*走时时间程序?函数*/ void time() { conv(); /* 走时单元转换?函数 */ disp(); /* 走时时间显示?函数 */ } /*------------------------------------*/ /*扫描按键?函数*/ void scan_key() { delay(1); if(P2_4==0)set++; if(set>=2)set=0; if(set==1)flag=0x55; F0:if(P2_4==0)goto F0; /*按键未释放,在此等候*/ } /*------------------------------*/ /*延时?函数*/ void delay(uint k) { uint i,j; for(i=0;i<k;i++){ for(j=0;j<121;j++) {;}} } /*----------------------- 主函数 ------------------------- */ /*主函数*/ void main() { init_timer(); /*定时器T0初始化*/ while(1) /*无限循环*/ { if(P2_4==0)scan_key(); /*有按键,调用按键扫描?函数*/ switch(set) /*根据set键值散转*/ { case 0:time(); break; /*走时时间程序*/ case 1:set_time();break; /*走时时间调整*/ default:break; /*其它退出*/ } if(flag!=0x55) /*判断掉电标志*/ { P0=0xc0; P2=0xc0; delay(100); P2=0xff; delay(400); } } }
⑷ 用C语言写51单片机闹钟程序
//*********************************************************
//实现功能:本程序实现在P1口模拟一个流水灯程序
//*********************************************************
#include <reg51.h>
#define p_out P1 //宏定义输出的i/o口为P1
//******************时间延迟函数**********************
//描 述:用指令实现延时一段时间
//入口参数:int i,为时间延迟参数
//****************************************************
void delay_time(int i)
{
while(i)
i--;
}
//******************主函数***************************
//描 述:实现在P1口模拟一个流水灯程序
//****************************************************
void main(void)
{unsigned char i=0; //初始化一个局部变量为0
p_out=0xff; //初始化将要输出的i/o口,输出高电平,熄灭所有灯
while(1)
{
for(i=0;i<8;i++)
{
p_out=~(1<<i);//点亮一个灯,
delay_time(50000); //延迟一段时间
p_out=0xff;//熄灭所有灯
}
}
}
//**************************************
//****************************************************
//实现功能:把键盘输入的键盘码,用led显示出来
//****************************************************
#include <reg51.h>
#define p_key P1
#define led_date P0
#define choose_p P2
unsigned char change(unsigned char i);
unsigned int display_num=0;
//******************时间延迟函数**********************
//描 述:用指令实现延时一段时间
//入口参数:int i,为时间延迟参数
//****************************************************
void delay_time(int i)
{
while(i)
i--;
}
//******************按键扫描函数**********************
//描 述:对4*4键盘进行扫描,程序只适合4*4键盘使用,
// 键盘占用一组完整的i/o口,在使用这个程序前
// 要宏定义p_key为用户实际连接键盘的i/o口
// #define p_key Pn;//(n=0、1、2、3)
//返回参数:若有检测到按键就返回按键的编号,否则返回0xff
//****************************************************
unsigned char read_key(void)
{
unsigned char j,key,key_buf=0;
p_key=0xff;
//检测是否有建按下//
p_key=0xf0;
key=p_key;
if(key==0xf0)
{
return(0xff);//没按键按下,返回0xff
}
//有按下,延时去抖//
delay_time(5000);
//确认是否有建按下//
p_key=0xf0;
key=p_key;
if(key==0xf0)
{
return(0xff);//没按键按下,返回0xff
}
//真的有按键按下,扫描是哪一行有按键按下//
for(j=0;j<4;j++)
{key=p_key&(0x10<<j);
if (key)
{
key=p_key;
}
else
{
key_buf=j*4;
p_key=~(0x10<<j);//第j行的按键按下了,第j行输出0,其他的i/o口输出1
//扫描是第j行的哪个按键按下//
for(j=0;j<4;j++)
{
key=p_key&(1<<j);
if (key)
{
key=p_key;
}
else
{
key_buf+=j;
return(key_buf);//扫描到按键的确定位置,返回按键的编号
}
}
}
}
//没扫描到按键,//
return(0xff);
}
//***************七段数码管显示函数*******************
//描 述:对四位的扫描型七段数码管进行扫描显示,在使用
// 前要定义一个全局变量display_num
// unsigned int display_num;
//入口参数:unsigned int num,要显示的数字(0-9999)
//****************************************************
void display(unsigned int num)
{
if(num<10000)
{
display_num=num;
}
choose_p|=3;//先关显示
led_date=change(display_num/1000);//得到千位的数字,并转换成七段码型
choose_p&=0xfe;//选通千位
delay_time(50);//延时一段时间
choose_p|=1;//关显示
display_num=display_num%1000;
led_date=change(display_num/100);//得到百位的数字,并转换成七段码型
choose_p&=0xfd;//选通百位
delay_time(50);//延时一段时间
choose_p|=2;//关显示
display_num=display_num%100;
led_date=change(display_num/10);//得到十位的数字,并转换成七段码型
choose_p&=0xfb;//选通十位
delay_time(50);//延时一段时间
choose_p|=4;//关显示
led_date=change(display_num%10);//得到个位的数字,并转换成七段码型
choose_p&=0xf7;//选通十位
delay_time(50);//延时一段时间
choose_p|=8;//关显示
}
//****************数字-码型转换函数*******************
//描 述:把数字转换成七段码型,此程序仅配合共阳的七
// 段数码管使用
//入口参数:unsigned char i,要转换的数字(0-9),
//返回参数:转换后的七段码型,0xff表示转换失败
//****************************************************
unsigned char change(unsigned char i)
{
switch(i)
{
case 0:
return(0xc0);//0的七段码型
case 1:
return(0xf9);//1的七段码型
case 2:
return(0xa4);//2的七段码型
case 3:
return(0xb0);//3的七段码型
case 4:
return(0x99);//4的七段码型
case 5:
return(0x92);//5的七段码型
case 6:
return(0x82);//6的七段码型
case 7:
return(0xf8);//7的七段码型
case 8:
return(0x80);//8的七段码型
case 9:
return(0x90);//9的七段码型
default:
return(0xff);//转换失败
}
}
//*********************主函数*************************
//描 述:把键盘输入的键盘码,用led显示出来
//****************************************************
int main(void)
{unsigned char i;
while(1)
{
i=read_key();//扫描键盘
if(i<16)
display((unsigned int)i);//有效的键盘值
else
display(0xffff);//数据无效
}
}
//两个程序加起来就可以完成你要求的功能,有说明,你认真看一下吧。
⑸ 如何用单片机实现闹钟功能
如果要求精度不高的话就用单片机自带的定时计数器。将定时计数器设定50ms中断一次,中断20次就是一秒,60秒后分加一秒计数单元清零,分满60小时加一分清零,以后以此类推。定时就是将你要设定的时间与当前的时间依次比较,比较不等程序继续执行,比较相等开闹钟。
⑹ 单片机闹钟程序显示时间
可以直接在单片机里面然后进行一个编程,就可以直接设置显示时间。
⑺ 51单片机设计一个电子钟,如何实现闹钟功能
用C语言If条件语句实现循环,当达到某一条件时给某一I/O端口传递信号,该I/O端口接蜂鸣器即可。电子技术中的计数器也可对此有帮助,设置60.60.24的程序,即可实现报时。
⑻ 单片机设置多个闹钟C程序
建立一个闹钟结构体
struct
ALARM
{
unsigned
char
hour;
unsigned
char
min;
unsigned
char
onoff;
};
struct
ALARM
alarms[6];
就有6个闹钟了,而其中的下标就是闹钟序号。
然后就根据时钟(一般分钟就够了)进位信号,逐个查询各闹钟是否开启,若开启则进行时钟与闹钟的时间比较,如果时间相符则闹钟给出定时时间到的信号,以驱动闹铃响起等。
⑼ 用51单片机定时器编写一个定时闹钟
问题不是很清晰!
首先,定时器溢出时间较短,需要在定时器中断外另设计数单元;
其次,什么叫“检验对准时间”?我的理解是:使用一段程序来检验当前时间与设定时间(闹钟的定时值)的差值,差值为零时报时。基于该理解,有两种方式(根据你自己的情况自选):
1)先设计出一个时钟,然后将时钟值与设定值比对,具体语句可以使用“异或”(两时间相同时,异或值为零),或cjne指令;本人倾向于后者(如:万一出现干扰在两值相同时没有比较,前者就失效了,而后者还能继续比较)。
2)
预置一个变量,每个固定时间间隔(使用定时中断)减一,到零时报时;但要注意,直接在定时中断程序中减一时一定要在中断中判断到零否,否可能则会出现不报时的问题。
⑽ 如何制作单片机闹钟
这个你可以直接使用一个大面积的芯片,然后将它插在闹钟上面,这样的话就就可以制作一个简单的闹钟了,特别的简单。