带闹钟功能及测温的时钟控制器功能设计

求单片机时钟设计!!要求:时钟可调 日历可调 闹钟可调 带温度检测 LCD1602显示 带D_百度知道
求单片机时钟设计!!要求:时钟可调 日历可调 闹钟可调 带温度检测 LCD1602显示 带D
要求!求单片机时钟设计!!:时钟可调 日历可调 闹钟可调 带温度检测
LCD1602显示 带DSN仿真图及完全程序
程序带说明!带报告!高分悬赏
有的话可以Q聊或发来邮箱AA! 时分秒可调!!带程序求单片机时钟设计.com灰常感谢!!!:闹钟!!年月日可调!!!最好带上温度显示!LCD1602显示!!!要求
提问者采纳
找本书看看吧,很多单片机的教程
提问者评价
其他类似问题
按默认排序
其他4条回答
金融,该装置以美国全球定位系统(GLOBAL POSITIONING SYSTEM、无积累误差。装置有标准RS232,免操作维护,无硬盘和风扇设计、性价比高,缩写为GPS)为时间基准、国防、IT等领域、冶金、医疗、全自动智能化运行、稳定性好、DCF77、交通,可以适应各种不同设备的对时需要;SNTP网络对时等接口形式、RS422&#47、石化、政府机关、不受地域气候等环境条件限制、脉冲、广电、IRIG-B,广泛应用于电力、NTP&#47、通信,可以同时跟踪12颗卫星,以高速芯片进行控制、教育、水利,对时精度达0。
该装置采用SMT表面贴装技术生产、功能强.1μS、安防,精度高;485,适合无人值守、操作简单HR-906卫星同步时钟是我公司开发研制的应用GPS技术授时的标准时间显示和发送的装置
你直接可以到网上搜郭天祥的视频,里面专门有一节教你写时钟程序的(用的好像是ds12c887),你可以参考一下,等别人发答案来,还不如自己去找。
这个程序比较好用,用的是12864,比较有用希望对你有帮助#include &reg51.h&#include &intrins.h&#include &stdlib.h& #define uchar unsigned char#define uint
unsigned int#include&intrins.h&#define uchar unsigned char#define uint unsigned intuchar shijian[6]={0x1,0x1,0x0,0x2,0x5,0x8};uchar zi[]={&时分秒&};uchar j,char z,z1;uchar m,mark=0,bz=0;uint k=4000;/* 端口定义*/#define LCD_data
//数据口sbit inter_0=P3^2;sbit LCD_RS
//寄存器选择输入 sbit LCD_RW
//液晶读/写控制sbit LCD_EN
//液晶使能控制sbit LCD_PSB =
//串/并方式控制void delay_1ms(uint x) { uint i,j; for(j=0;j&x;j++)
for(i=0;i&110;i++); }
/*******************************************************************//*
*//*写指令数据到LCD
*//*RS=L,RW=L,E=高脉冲,D0-D7=指令码。
*//*******************************************************************/void write_cmd(uchar cmd){
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
P0 = delay_1ms(5);
LCD_EN = 1; delay_1ms(5);
LCD_EN = 0;
}/*******************************************************************//*
*//*写显示数据到LCD
*//*RS=H,RW=L,E=高脉冲,D0-D7=数据。
*//*******************************************************************/void write_dat(uchar dat){
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 0;
P0 = delay_1ms(5);
LCD_EN = 1; delay_1ms(5);
LCD_EN = 0;
}/*********************************************************//*
*//* 设定显示位置
*//*********************************************************/void lcd_pos(uchar X,uchar Y){
else if (X==1)
else if (X==2)
else if (X==3)
pos = X+Y ;
write_cmd(pos);
//显示地址}/*******************************************************************//*
LCD初始化设定
*//*******************************************************************/void lcd_init(){
LCD_PSB = 1;
//并口方式
write_cmd(0x30);
//基本指令操作
delay_1ms(5);
write_cmd(0x0C);
//显示开,关光标
delay_1ms(5);
write_cmd(0x01);
//清除LCD的显示内容
delay_1ms(5);}/*********************************************************//*
*//* 主程序
*//*********************************************************/main(){IT0=1;EX0=1;EA=1; P1=0XF0;TMOD=0X2;TH0=0X6;TL0=0X6;EA=1;ET0=1;TR0=1;i=0;delay_1ms(10);
lcd_init();
lcd_pos(0,1);
write_dat(zi[0]);
write_dat(zi[1]);
lcd_pos(0,3);
write_dat(zi[2]);
write_dat(zi[3]);
lcd_pos(0,5);
write_dat(zi[4]);
write_dat(zi[5]);
while(1) { z=1; z1=0;
P1=0XF0; lcd_pos(0,0);
while(i&2)
{write_dat(shijian[i]+0x30);
} lcd_pos(0,2);
while(i&4)
{write_dat(shijian[i]+0x30);
}lcd_pos(0,4);
while(i&6)
{write_dat(shijian[i]+0x30);
lcd_pos(0,0);delay_1ms(5);
write_cmd(0x0f);
delay_1ms(5);
while(!bz);
while(mark)
if(key==12)
{z--;write_cmd(0x10);delay_1ms(5);write_cmd(0x10);delay_1ms(5);bz=0;if((2*(z-1)+(z1-1))==-3){for(x=0;x&6;x++){write_cmd(0x14);delay_1ms(5);}z=3;z1=0;}}
else if(key==13)
{z++;write_cmd(0x14);delay_1ms(5);write_cmd(0x14);delay_1ms(5);bz=0;if((2*(z-1)+(z1-1))&=5){for(x=0;x&6;x++){write_cmd(0x10);delay_1ms(5);}z=1;z1=0;}}
else if(key&=9)
{z1++;write_dat(key+48);delay_1ms(5);shijian[2*(z-1)+(z1-1)]=if((2*(z-1)+(z1-1)&5)&&(z1%2==0)){write_cmd(0x14);delay_1ms(5);}else if(2*(z-1)+(z1-1)&=5){for(x=0;x&5;x++){write_cmd(0x10);delay_1ms(5);}z=1;z1=0;}bz=0;}
else if(key==15)
{write_cmd(0x0c);delay_1ms(5);mark=0;}
while(!bz);
}/*************************************/count0 (void) interrupt 1{k--;if(k==0x0){++shijian[5];k=4000;if (shijian[5]==0x0a){shijian[5]=0x0;++shijian[4];if(shijian[4]==0x6){shijian[4]=0x0;++shijian[3];if (shijian[3]==0x0a){shijian[3]=0x0;++shijian[2];if(shijian[2]==0x6){shijian[2]=0x0;++shijian[1];if((shijian[0]==0x0)&&(shijian[1]==0x0a)){shijian[1]=0x0;++shijian[0];}else if((shijian[0]==0x1)&&(shijian[1]==0x2)){shijian[1]=0x0;shijian[0]=0x0;}}}}}}}/*******************************************/int_0(void) interrupt 0 {delay_1ms(15); if(inter_0==0){uchar n=0,m=0, uchar scan[4]={0xfe,0xfd,0xfb,0xf7}; uchar table[4][4]={0x7e,0xbe,0xde,0xee,0x7d,0xbd,0xdd,0xed,0x7b,0xbb,0xdb,0xeb,0x77,0xb7,0xd7,0xe7}; uchar num[4][4]={12,1,4,7,0,2,5,8,13,3,6,9,11,10,15,14}; while(n&4) {P1=scan[n];temp=P1;m=0; while(m&4) {if(temp==table[n][m]) else
} n++; } next: key=num[n][m];
bz=1; if(key==14) mark=1; }
P1=0XF0; }
可惜不是我想要的
再说了你这也没有图
给你推荐个网站,工程师威客网,那里有这方面的高手,全免费的,百度搜索工程师威客网
您可能关注的推广
lcd1602的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁您所在位置: &
&nbsp&&nbsp&nbsp&&nbsp
带整点报时与闹钟功能的数字钟研究设计论文.doc16页
本文档一共被下载:
次 ,您可免费全文在线阅读后下载本文档
文档加载中...广告还剩秒
需要金币:150 &&
你可能关注的文档:
··········
··········
某某某某大学 XXXXXXXXXXXXXXXXX UNIVERSITY
电子综合实践设计报告
题目:带整点报时与闹钟功能的数字钟
完成人员:XXX XXXXXXXX
业: 电子信息工程
指导教师: 禽兽
XXXXXXXXXXX学院电子系
Ⅰ、设计任务与要求 4
1.1 基本设计任务 4
1.2 控制设计任务 4
1.3 软件设计任务 5
Ⅱ、方案设计与论证 5
2.1 显示方案 5
2.2 控制方案 5
2.3 语音芯片方案 5
Ⅲ、总体设计 6
3.1 系统硬件电路设计 6
3.1.1 显示及控制模块 6
3.1.2 语音报时模块 8
3.2 系统软件设计 8
3.2.1 软件计时的分析与计算 8
3.2.2 系统软件设计 9
Ⅳ、测试结果及结果分析 9
4.1 测试仪器及工具 9
4.2 测试步骤 9
4.2.1 预备工作 9
4.2.2 正式测试 10
4.3 测试结果 10
4.4 测试结果分析 10
Ⅴ、创新点 11
5.1 添加语音报时模块 11
5.2 实用性 11
Ⅵ、总结与心得 11
参考文献 11
附件一:参考程序 12
附件二:总原理图 15
附件三:元器件清单 16
摘要:命题要求设计数字钟。本设计是以STC89C51单片机为核心器件,应用ISD3等器件,实现命题要求。经过测试,该数字钟达到所有命题所要求的技术指标。在此基础之上,本设计添加了语音模块,使设计更为人性化。
关键词:数字钟;闹钟;调整;整点报时。
Ⅰ、设计任务与要求
本任务为:数字钟。设计任务具体内容如下:
1.1 基本设计任务
依据命题题意,本设计采用89C51进行24小时计时并显示。要求其显示时间范围是00:00:00~23:59:59,具备有时分秒校准功能。数字钟上面要带有闹钟,闹钟与时钟之间能随时切换,闹钟具备时分秒设置功能。
1.2 控制设计任务
由于本设计采用手动校准时钟与手动设置闹钟方案,所以要求用较少的按键来达到切换闹钟与时钟、时钟时分秒校准、闹钟时分
正在加载中,请稍后...带闹钟功能的石英钟机芯拆解-电子产品世界论坛
带闹钟功能的石英钟机芯拆解
外观,正面除了多了一个定时的指针以外跟普通机芯没啥区别。
背面,和普通机芯相比多了一个定时调整杆、闹钟开关以及蜂鸣器的小孔。
侧面还有两根线,是用在照明的小电珠及其开关上的。内部这两根线直接和电池两端相连。
打开四个卡扣即可开壳。壳子上主要是些固定齿轮的凹槽,另外还有闹钟开关。开关被卡住了,取不下来。
齿轮分两层,上层的电机和秒针组件跟普通机芯一模一样。关键部分在下层。
电机及秒针组件可以整个拿下。左上角灰色的零件为电机的转子,因为里面有黑色的磁体所以呈灰色。中间带金属针的齿轮就是秒针的齿轮了。最右边的齿轮在减速后把转动传递给下层齿轮组。
背面,可以看到驱动秒针的金属针以及传动给下层齿轮的部分(秒针左侧)。
下层齿轮都在这了。
左侧电路板的右侧偏下边缘上有个触点,它全权负责闹钟的开关。接通到电池负极的时候蜂鸣器就会响,断开的时候就不响,也就是说闹钟的开关完全由机械部分负责控制,在芯片里面蜂鸣电路跟走时电路除了共用电源以外互不相干。
这台闹钟曾经被它的主人从床上摔下来过。从这张图可以看出来摔得很是不轻,PCB 连接电机的焊点中的一个已经脱落了。
把调整杆、分针齿轮什么的都拿掉,就只剩下跟定时有关的部分了。定时是全权由时针负责的。由于表的分针在走的时候时针也是跟着走的,所以这样仍然可以精确到分钟。
右侧的两片金属的连接部分是铆死的,仅仅起电气连接的作用。
电路板和蜂鸣器,蜂鸣器应该跟你家台机机箱上自检报警用的那种蜂鸣器差不多。
PCB 和电池槽是这样用卡子连接的。
定时的奥妙就在这三个屁大的零件里面了,他们由下往上依次是定时指针齿轮、小时指针齿轮和一个淡粉红色的部件。上面压着的与电池负极和 PCB 上触点相连的金属片已经被拆除。
这样应该就清楚了。两个指针的齿轮都有一样的镂空,而粉红色的部件则是有对应的凸起。当时针和定时针重合时,两者齿轮上的镂空也就重合了,粉红色的零件得以被有弹性的金属片压下(这个过程类似于钥匙开锁时锁芯里面发生的过程),接着金属片的末端接触到 PCB 上的触点,将触点与电池负极接通,于是闹钟蜂鸣电路开始工作,你就听到了哔哔哔的声音。当闹钟开关被拨到 OFF 时,开关末端的塑料片会分开金属片和触点,此时蜂鸣电路无论如何都不会工作。另外,粉红色零件上的凸起是带斜边的,这样随着走时,时针和定时针齿轮上的镂空不再重合,它就又升上去了,分离金属片和触点,闹铃结束。这个斜边也使得你只能向一个方向调整定时指针,反向调整的话时针会被定时指针带着走。
定时针是固定在壳体上的,阻尼很大,这样它就不会受到时针走动的影响了。
最后把粉红色零件和时针齿轮重合起来,看看效果。三个槽子不是中心对称的,否则 12 小时之内闹钟就要闹三次了。然而三个或者以上数量的槽子又是有必要的,否则粉红色零件被撑起来时会向一边偏,无法保证切断电路,原因在于不在一条线上的三个点能确定一个平面。
匿名不能发帖!请先 [
Copyright (C) 《电子产品世界》杂志社 版权所有单片机电子钟程序完美版(带闹钟温度功能)
单片机&嵌入式
单片机应用
嵌入式操作系统
学习工具&教程
学习和开发单片机的必备工具
(有问必答)
(带你轻松入门)
电子元件&电路模块
当前位置: >>
>> 浏览文章
单片机电子钟程序完美版(带闹钟温度功能)
本电子钟已经全部测试OK,带闹钟功能,年月日时分秒星期温度,四个按键可设置闹钟调节时间,温度可以显示正125度到负的55度之间,时间走时的话,我测试了一个月,误差不到1分钟。本人已经录制成视频,视频里面有详细的介绍,感兴趣的可以看看
。视频及多图还有源代码的地址:&
#include &reg52.h&
#include &intrins.h&
#define uchar unsigned char
#define uint unsigned int
sbit rs=P1^0;//寄存器选择
sbit rw=P1^1;//读写信号线
sbit lcden=P1^2;//led使能端
sbit scl=P1^3;//时钟线
sbit rst=P1^5;//复位线
sbit io=P1^4;//数据口
sbit key_set_time=P3^4;//设置时间键
sbit key_add=P3^5;//加键
sbit key_minus=P3^6;//减键
sbit key_set_alarm=P3^7;//设置闹钟键
sbit bee=P1^6;//蜂鸣器接口
sbit dq=P1^7;//ds18b20测温
uchar getTimebuf[7];//存放时间数据
uchar time[]={&
&};//时间格式字符串
uchar date[]={&20
&};//日期格式字符串
uchar weeklist[]={&SunMonTueWedThuFriSat&};//星期字符列表
uchar week[]={&
&};//星期格式字符串
//设定秒分时日月星期年的时候count的值分别为1235647
//是否进入闹钟设置界面 123分别代表开关 分 小时的设置
int isO//闹钟是否开启
默认不开启
int fen,//闹钟的分钟小时
int isR//闹钟是否在响
uchar isInit_1302;//是否初始化时钟完毕
int temp_//温度正负标志
void delay(uint x){
while(x--){
for(y=100;y&0;y--);
void write_1602com(uchar com){
//1602写指令
void write_1602data(uchar dat){
//1602写数据
void init_1602(){
//初始化1602液晶
write_1602com(0x38);//设置显示模式
write_1602com(0x0c);//显示开关及光标是否显示和闪动
write_1602com(0x06);//光标移动方向
write_1602com(0x01);//清屏
void write_ds1302_byte(uchar temp){
//ds1302写一个字节数据
for(i=0;i&8;i++){
io=temp&0x01;//将数据放到IO口上
scl=0;//scl为低时准备数据
scl=1;//上升沿写入
void write_ds1302(uchar add,uchar dat){
//向地址add写入数据dat
write_ds1302_byte(add);
write_ds1302_byte(dat);
uchar read_ds1302(uchar add){
//ds1302读数据
write_ds1302_byte(add);//首先写入要读的数据处的地址
for(i=0;i&8;i++){
if(io==1){
dat|=0x80;
scl=0;//下降沿读取数据
void read_time(uchar curr_time[]){
uchar ucAddr = 0x81;
for (i=0;i&7;i++){
curr_time[i] = read_ds1302(ucAddr);//格式为: 秒 分 时 日 月 星期 年
ucAddr += 2;
void set_time(uchar *pSecDa){
//设定时间
uchar ucAddr = 0x80;
write_dse,0x00);
for(i =7;i&0;i--){
write_ds1302(ucAddr,*pSecDa); //秒 分 时 日 月 星期 年
ucAddr+=2;
write_dse,0x80);
void init_ds1302(){
//ds1302初始化
isInit_1302=read_ds);//读出时钟状态
if(isInit_){//说明没有初始化
write_dse,0x00);//关闭写保护
以后一直开着
write_ds,0xa5); //辅助电源充电命令 一个二极管
一个2K电阻
write_ds,0x00);//秒 CH置0 开启时钟
write_ds,0x59);//分
write_ds,0x10);//时
write_ds,0x07);//日
write_ds,0x05);//月
write_dsa,0x04);//星期
write_dsc,0x14);//年
write_dse,0x80);
char int_to_char(int temp){
//把0到9对应的数字转为字符
char x='0';
switch(temp){
case 0:x='0';
case 1:x='1';
case 2:x='2';
case 3:x='3';
case 4:x='4';
case 5:x='5';
case 6:x='6';
case 7:x='7';
case 8:x='8';
case 9:x='9';
int ds18b20_read_temp();
void display(){
uchar bai,shi,ge,point,
read_time(getTimebuf);//时时读取时间
time[6]=(getTimebuf[0])/16+48;//格式化时间秒
time[7]=(getTimebuf[0])%16+48;
time[3]=(getTimebuf[1])/16+48;//格式化时间分
time[4]=(getTimebuf[1])%16+48;
time[0]=(getTimebuf[2])/16+48;//格式化时间小时
time[1]=(getTimebuf[2])%16+48;
date[8]=getTimebuf[3]/16+48;//格式化日期日
date[9]=getTimebuf[3]%16+48;
date[5]=getTimebuf[4]/16+48;//格式化日期月
date[6]=getTimebuf[4]%16+48;
date[2]=getTimebuf[6]/16+48;//格式化日期年
date[3]=getTimebuf[6]%16+48;
week[0]=weeklist[(getTimebuf[5]%10)*3];//格式化星期
week[1]=weeklist[(getTimebuf[5]%10)*3+1];
week[2]=weeklist[(getTimebuf[5]%10)*3+2];
write_1602com(0x80+1);
for(num=0;num&10;num++){
write_1602data(date[num]);
write_1602data(' ');
for(num=0;num&3;num++){
write_1602data(week[num]);
write_1602com(0x80+0x40);
for(num=0;num&8;num++){
write_1602data(time[num]);
//显示温度值
write_1602com(0x80+0x40+8);//设置数据指针
temperature=ds18b20_read_temp();
bai=temperature/;
shi=temperature%x30;
ge=temperature%100/10+0x30;
point=temperature%100%10+0x30;
if(temp_flag==1){//说明为正数
不显示符号位 125.6 25.7两种
fuhao=0x20;//显示空白
if(bai==0x30){
bai=0x20;//如果百位为0
if(shi==0x30){
shi=0x20;//如果百位为0
write_1602data(fuhao);
write_1602data(bai);
write_1602data(shi);
fuhao=0x2d;//显示负号
write_1602data(0x20);//因为负数最低到55,所以不显示百位
if(shi==0x30){
write_1602data(0x20);
write_1602data(fuhao);
write_1602data(fuhao);
write_1602data(shi);
write_1602data(ge);
write_1602data('.');
write_1602data(point);
write_1602data(0xdf);
write_1602data('C');
void display_alarm(uchar add,int dat){
//把设定的时分显示出来
write_1602com(add);
write_1602data(int_to_char(x));
write_1602com(add+1);//防止写后地址自动向后加一
光标闪烁看不到
write_1602data(int_to_char(y));
write_1602com(add+1);
void init_alarm(){
//闹钟设置界面
只有首次进入才执行
uchar code x[]=&SET ALARM&;
if(alarm==0){
write_1602com(0x01);//清屏
write_1602com(0x80+3);//设置数据指针
for(i=0;i&9;i++){
write_1602data(x[i]);
display_alarm(0x80+0x40+5,shi);//载入闹钟的时分
write_1602com(0x80+0x40+7);
write_1602data(':');
display_alarm(0x80+0x40+8,fen);
if(isOpen){//初始化的时候如果已经设定闹钟则显示ON
write_1602com(0x80+0x40+13);
write_1602data(' ');
write_1602data('O');
write_1602data('N');
write_1602com(0x80+0x40+13);
write_1602data('O');
write_1602data('F');
write_1602data('F');
void key_scan(){
uchar code tips1[]=&SET SUCCESS&;//闹钟设置成功的提示
uchar code tips2[]=&CANCEL SUCCESS&;//取消闹钟的提示
if(key_set_time==0){//检测是否按下
delay(10);//消抖
if(key_set_time==0){//再次检测是否按下
while(!key_set_time);//检测是否松开
delay(10);//延时消抖
while(!key_set_time);//再次检测是否松开
if(alarm==0){//当没有显示闹钟界面时才显示时间设定
write_ds,0x80);//让时钟停止
if(count==8){
//继续走时,说明时间已经设定好了
write_1602com(0x0c);//让光标消失
write_ds,0);//让时钟继续
set_time(getTimebuf);//写入新的时间
switch(count){
write_1602com(0x80+0x40+7);//在秒的位置
write_1602com(0x80+0x40+4);//在分的位置
write_1602com(0x80+0x40+1);//在时的位置
write_1602com(0x80+14);//在星期的位置
write_1602com(0x80+10);//在日的位置
write_1602com(0x80+7);//在月的位置
write_1602com(0x80+4);//在年的位置
write_1602com(0x0f);//让光标闪烁
if(key_add==0){//检测是否按下
delay(10);//消抖
if(key_add==0){//再次检测是否按下
while(!key_add);//检测是否松开
delay(10);//延时消抖
while(!key_add);//再次检测是否松开
if(count!=0){
switch(count){
//在秒的位置
getTimebuf[0]++;
if(getTimebuf[0]==0x5a){
getTimebuf[0]=0;
if(getTimebuf[0]==0x4a){
getTimebuf[0]=0x50;
if(getTimebuf[0]==0x3a){
getTimebuf[0]=0x40;
if(getTimebuf[0]==0x2a){
getTimebuf[0]=0x30;
if(getTimebuf[0]==0x1a){
getTimebuf[0]=0x20;
if(getTimebuf[0]==0x0a){
getTimebuf[0]=0x10;
time[6]=(getTimebuf[0])/16+48;//格式化时间秒
time[7]=(getTimebuf[0])%16+48;
write_1602com(0x80+0x40+6);//在秒的位置
write_1602data(time[6]);
write_1602com(0x80+0x40+7);//在秒的位置
write_1602data(time[7]);
write_1602com(0x80+0x40+7);//让光标在秒的位置闪烁
//在分的位置
getTimebuf[1]++;
if(getTimebuf[1]==0x5a){
getTimebuf[1]=0;
if(getTimebuf[1]==0x4a){
getTimebuf[1]=0x50;
if(getTimebuf[1]==0x3a){
getTimebuf[1]=0x40;
if(getTimebuf[1]==0x2a){
getTimebuf[1]=0x30;
if(getTimebuf[1]==0x1a){
getTimebuf[1]=0x20;
if(getTimebuf[1]==0x0a){
getTimebuf[1]=0x10;
time[3]=(getTimebuf[1])/16+48;//格式化时间分
time[4]=(getTimebuf[1])%16+48;
write_1602com(0x80+0x40+3);//在分的位置
write_1602data(time[3]);
write_1602com(0x80+0x40+4);//在分的位置
write_1602data(time[4]);
write_1602com(0x80+0x40+4);//让光标在分的位置闪烁
//在时的位置
getTimebuf[2]++;
if(getTimebuf[2]==0x24){
getTimebuf[2]=0;
if(getTimebuf[2]==0x1a){
getTimebuf[2]=0x20;
if(getTimebuf[2]==0x0a){
getTimebuf[2]=0x10;
time[0]=(getTimebuf[2])/16+48;//格式化时间小时
time[1]=(getTimebuf[2])%16+48;
write_1602com(0x80+0x40+0);//在小时的位置
write_1602data(time[0]);
write_1602com(0x80+0x40+1);
write_1602data(time[1]);
write_1602com(0x80+0x40+1);
//在星期的位置
getTimebuf[5]++;
if(getTimebuf[5]==0x08){
getTimebuf[5]=0x01;
if((getTimebuf[5]%10)*3==21){//轮完了
week[0]=weeklist[0];
week[1]=weeklist[1];
week[2]=weeklist[2];
week[0]=weeklist[(getTimebuf[5]%10)*3];//格式化星期
week[1]=weeklist[(getTimebuf[5]%10)*3+1];
week[2]=weeklist[(getTimebuf[5]%10)*3+2];
write_1602com(0x80+12);
write_1602data(week[0]);
write_1602com(0x80+13);
write_1602data(week[1]);
write_1602com(0x80+14);
write_1602data(week[2]);
write_1602com(0x80+14);
//在日的位置
getTimebuf[3]++;
if(getTimebuf[3]==0x32){
getTimebuf[3]=0x01;
if(getTimebuf[3]==0x2a){
getTimebuf[3]=0x30;
if(getTimebuf[3]==0x1a){
getTimebuf[3]=0x20;
if(getTimebuf[3]==0x0a){
getTimebuf[3]=0x10;
date[8]=(getTimebuf[3])/16+48;
date[9]=(getTimebuf[3])%16+48;
write_1602com(0x80+9);
write_1602data(date[8]);
write_1602com(0x80+10);
write_1602data(date[9]);
write_1602com(0x80+10);
//在月的位置
getTimebuf[4]++;
if(getTimebuf[4]==0x13){
getTimebuf[4]=0x01;
if(getTimebuf[4]==0x0a){
getTimebuf[4]=0x10;
date[5]=(getTimebuf[4])/16+48;
date[6]=(getTimebuf[4])%16+48;
write_1602com(0x80+6);
write_1602data(date[5]);
write_1602com(0x80+7);
write_1602data(date[6]);
write_1602com(0x80+7);
//在年的位置
getTimebuf[6]++;
if(getTimebuf[6]==0x9a){
getTimebuf[6]=0x00;
if(getTimebuf[6]==0x8a){
getTimebuf[6]=0x90;
if(getTimebuf[6]==0x7a){
getTimebuf[6]=0x80;
if(getTimebuf[6]==0x6a){
getTimebuf[6]=0x70;
if(getTimebuf[6]==0x5a){
getTimebuf[6]=0x60;
if(getTimebuf[6]==0x4a){
getTimebuf[6]=0x50;
if(getTimebuf[6]==0x3a){
getTimebuf[6]=0x40;
if(getTimebuf[6]==0x2a){
getTimebuf[6]=0x30;
if(getTimebuf[6]==0x1a){
getTimebuf[6]=0x20;
if(getTimebuf[6]==0x0a){
getTimebuf[6]=0x10;
date[2]=(getTimebuf[6])/16+48;
date[3]=(getTimebuf[6])%16+48;
write_1602com(0x80+3);
write_1602data(date[2]);
write_1602com(0x80+4);
write_1602data(date[3]);
write_1602com(0x80+4);
if(alarm!=0){
switch(alarm){
//调节闹钟的开与关
if(isOpen==0){
write_1602com(0x80+0x40+13);
write_1602data(' ');
write_1602data('O');
write_1602data('N');
write_1602com(0x80+0x40+13);
write_1602data('O');
write_1602data('F');
write_1602data('F');
//防止写后地址自动向后加一
光标闪烁看不到
write_1602com(0x80+0x40+15);
//调节闹钟的分
if(fen==60){
display_alarm(0x80+0x40+8,fen);
//调节闹钟的小时
if(shi==24){
display_alarm(0x80+0x40+5,shi);
if(key_minus==0){//检测是否按下
delay(10);//消抖
if(key_minus==0){//再次检测是否按下
while(!key_minus);//检测是否松开
delay(10);//延时消抖
while(!key_minus);//再次检测是否松开
if(count!=0){
switch(count){
//在秒的位置
getTimebuf[0]--;
if(getTimebuf[0]==0xff){
getTimebuf[0]=0x59;
if(getTimebuf[0]==0x4f){
getTimebuf[0]=0x49;
if(getTimebuf[0]==0x3f){
getTimebuf[0]=0x39;
if(getTimebuf[0]==0x2f){
getTimebuf[0]=0x29;
if(getTimebuf[0]==0x1f){
getTimebuf[0]=0x19;
if(getTimebuf[0]==0x0f){
getTimebuf[0]=0x09;
time[6]=(getTimebuf[0])/16+48;//格式化时间秒
time[7]=(getTimebuf[0])%16+48;
write_1602com(0x80+0x40+6);//在秒的位置
write_1602data(time[6]);
write_1602com(0x80+0x40+7);//在秒的位置
write_1602data(time[7]);
write_1602com(0x80+0x40+7);//让光标在秒的位置闪烁
//在分的位置
getTimebuf[1]--;
if(getTimebuf[1]==0xff){
getTimebuf[1]=0x59;
if(getTimebuf[1]==0x4f){
getTimebuf[1]=0x49;
if(getTimebuf[1]==0x3f){
getTimebuf[1]=0x39;
if(getTimebuf[1]==0x2f){
getTimebuf[1]=0x29;
if(getTimebuf[1]==0x1f){
getTimebuf[1]=0x19;
if(getTimebuf[1]==0x0f){
getTimebuf[1]=0x09;
time[3]=(getTimebuf[1])/16+48;//格式化时间分
time[4]=(getTimebuf[1])%16+48;
write_1602com(0x80+0x40+3);//在分的位置
write_1602data(time[3]);
write_1602com(0x80+0x40+4);//在分的位置
write_1602data(time[4]);
write_1602com(0x80+0x40+4);//让光标在分的位置闪烁
//在时的位置
getTimebuf[2]--;
if(getTimebuf[2]==0xff){
getTimebuf[2]=0x23;
if(getTimebuf[2]==0x1f){
getTimebuf[2]=0x19;
if(getTimebuf[2]==0x0f){
getTimebuf[2]=0x09;
time[0]=(getTimebuf[2])/16+48;//格式化时间小时
time[1]=(getTimebuf[2])%16+48;
write_1602com(0x80+0x40+0);//在小时的位置
write_1602data(time[0]);
write_1602com(0x80+0x40+1);
write_1602data(time[1]);
write_1602com(0x80+0x40+1);
//在星期的位置
getTimebuf[5]--;
if(getTimebuf[5]==0){
getTimebuf[5]=0x07;
if((getTimebuf[5]%10)*3==21){//轮完了
week[0]=weeklist[0];
week[1]=weeklist[1];
week[2]=weeklist[2];
week[0]=weeklist[(getTimebuf[5]%10)*3];//格式化星期
week[1]=weeklist[(getTimebuf[5]%10)*3+1];
week[2]=weeklist[(getTimebuf[5]%10)*3+2];
write_1602com(0x80+12);
write_1602data(week[0]);
write_1602com(0x80+13);
write_1602data(week[1]);
write_1602com(0x80+14);
write_1602data(week[2]);
write_1602com(0x80+14);
//在日的位置
getTimebuf[3]--;
if(getTimebuf[3]==0){
getTimebuf[3]=0x31;
if(getTimebuf[3]==0x2f){
getTimebuf[3]=0x29;
if(getTimebuf[3]==0x1f){
getTimebuf[3]=0x19;
if(getTimebuf[3]==0x0f){
getTimebuf[3]=0x09;
date[8]=(getTimebuf[3])/16+48;
date[9]=(getTimebuf[3])%16+48;
write_1602com(0x80+9);
write_1602data(date[8]);
write_1602com(0x80+10);
write_1602data(date[9]);
write_1602com(0x80+10);
//在月的位置
getTimebuf[4]--;
if(getTimebuf[4]==0){
getTimebuf[4]=0x12;
if(getTimebuf[4]==0x0f){
getTimebuf[4]=0x09;
date[5]=(getTimebuf[4])/16+48;
date[6]=(getTimebuf[4])%16+48;
write_1602com(0x80+6);
write_1602data(date[5]);
write_1602com(0x80+7);
write_1602data(date[6]);
write_1602com(0x80+7);
//在年的位置
getTimebuf[6]--;
if(getTimebuf[6]==0xff){
getTimebuf[6]=0x99;
if(getTimebuf[6]==0x8f){
getTimebuf[6]=0x89;
if(getTimebuf[6]==0x7f){
getTimebuf[6]=0x79;
if(getTimebuf[6]==0x6f){
getTimebuf[6]=0x69;
if(getTimebuf[6]==0x5f){
getTimebuf[6]=0x59;
if(getTimebuf[6]==0x4f){
getTimebuf[6]=0x49;
if(getTimebuf[6]==0x3f){
getTimebuf[6]=0x39;
if(getTimebuf[6]==0x2f){
getTimebuf[6]=0x29;
if(getTimebuf[6]==0x1f){
getTimebuf[6]=0x19;
if(getTimebuf[6]==0x0f){
getTimebuf[6]=0x09;
date[2]=(getTimebuf[6])/16+48;
date[3]=(getTimebuf[6])%16+48;
write_1602com(0x80+3);
write_1602data(date[2]);
write_1602com(0x80+4);
write_1602data(date[3]);
write_1602com(0x80+4);
if(alarm!=0){
switch(alarm){
//调节闹钟的开与关
if(isOpen==0){
write_1602com(0x80+0x40+13);
write_1602data(' ');
write_1602data('O');
write_1602data('N');
write_1602com(0x80+0x40+13);
write_1602data('O');
write_1602data('F');
write_1602data('F');
//防止写后地址自动向后加一
光标闪烁看不到
write_1602com(0x80+0x40+15);
//调节闹钟的分
if(fen&0){
display_alarm(0x80+0x40+8,fen);
//调节闹钟的小时
if(shi&0){
display_alarm(0x80+0x40+5,shi);
if(key_set_alarm==0){//检测是否按下
delay(10);//消抖
if(key_set_alarm==0){//再次检测是否按下
while(!key_set_alarm);//检测是否松开
delay(10);//延时消抖
while(!key_set_alarm);//再次检测是否松开
if(count==0){//时间在正常走动的时候才能设置闹钟
init_alarm();
alarm++;//说明进入闹钟设置界面
if(alarm==4){
alarm=0;//说明闹钟设置完毕
write_1602com(0x01);//清屏以便显示时间
write_1602com(0x0c);//关闭光标
//显示设置成功或取消的提示
if(isOpen){
write_1602com(0x80+2);
for(i=0;i&11;i++){
write_1602data(tips1[i]);
write_1602com(0x80+1);
for(i=0;i&14;i++){
write_1602data(tips2[i]);
//延时2ms后清屏显示时间
delay(2000);
write_1602com(0x01);
switch(alarm){
write_1602com(0x80+0x40+15);
write_1602com(0x80+0x40+9);
write_1602com(0x80+0x40+6);
write_1602com(0x0f);
void beep(){
//检测闹钟
if(time[0]==int_to_char(shi/10)&&time[1]==int_to_char(shi%10)&&time[3]==int_to_char(fen/10)&&time[4]==int_to_char(fen%10)){
isRing=1;//闹钟响起,此时如果进入闹钟设置界面 改变时分,闹钟就关闭了
delay(250);
delay(250);
isRing=0;//关闭闹钟或者一分钟后闹钟自动关闭
void delay1(int i){
while(i--);
void ds18b20_init(){
uchar x=0;
delay1(8);
//稍做延时
//单片机将DQ拉低
delay1(80); //精确延时 大于 480us
//拉高总线
delay1(14);
//稍做延时后 如果x=0则初始化成功 x=1则初始化失败
delay1(20);
uchar ds18b20_read(){
//读一个字节
uchar i=0;
uchar dat = 0;
for (i=8;i&0;i--)
dq = 0; // 给脉冲信号
dq = 1; // 给脉冲信号
dat|=0x80;
delay1(4);
return(dat);
void ds18b20_write(char dat){
//写一个字节
uchar i=0;
for (i=8; i&0; i--)
dq = dat&0x01;
delay1(5);
int ds18b20_read_temp(){
//读取温度
ds18b20_init();
ds18b20_write(0xCC); //跳过读序列号的操作
ds18b20_write(0x44); //启动温度转换
ds18b20_init();
ds18b20_write(0xCC); //跳过读序列号的操作
ds18b20_write(0xBE); //读取温度寄存器
前两个代表温度
low=ds18b20_read();//低八位数据
high=ds18b20_read();//高八位数据
//此处有正负之分
if(tmp&=63488){//ffff f000 --&(f800)
temp_flag=0;
//8位全为1时,加1才进位
if((~low)==0xff){//判断low取反加1之后是否进位
high=(~high)+1;
low=(~low)+1;
tmp=high*256+
temp_flag=1;
value=tmp*0.0625;
t=value*10+((temp_flag==1)?+0.5:-0.5);//放大十倍输出并四舍五入
void main(){
init_1602();
init_ds1302();
if(isOpen){//只有开启闹钟的时候才检测
beep();//不断检测闹钟
key_scan();
if(count==0&&alarm==0){//没有设定时间
也没有在闹钟界面的时候时间才显示
display();
【】【】【】【】
上一篇:下一篇:
CopyRight @
单片机教程网
, All Rights Reserved

我要回帖

更多关于 控制器功能 的文章

 

随机推荐