一、使用到的模块

数码管,独立按键,LED,DS1302,ds18b20


二、代码部分

实验平台:CT107D
实验芯片:stc15f2k60s2
实验现象:完成题目要求
代码如下

onewire.c

#include "stc15f2k60s2.h"sbit DQ = P1^4;  //单总线接口//单总线延时函数
void Delay_OneWire(unsigned int t)  //STC89C52RC
{t = t*12;while(t--);
}//通过单总线向DS18B20写一个字节
void Write_DS18B20(unsigned char dat)
{unsigned char i;for(i=0;i<8;i++){DQ = 0;DQ = dat&0x01;Delay_OneWire(5);DQ = 1;dat >>= 1;}Delay_OneWire(5);
}//从DS18B20读取一个字节
unsigned char Read_DS18B20(void)
{unsigned char i;unsigned char dat;for(i=0;i<8;i++){DQ = 0;dat >>= 1;DQ = 1;if(DQ){dat |= 0x80;}        Delay_OneWire(5);}return dat;
}//DS18B20设备初始化
bit init_ds18b20(void)
{bit initflag = 0;DQ = 1;Delay_OneWire(12);DQ = 0;Delay_OneWire(80);DQ = 1;Delay_OneWire(10); initflag = DQ;     Delay_OneWire(5);return initflag;
}unsigned int duwendu()
{unsigned char high,low;unsigned int temp;init_ds18b20();Write_DS18B20(0xcc);Write_DS18B20(0x44);Delay_OneWire(200);init_ds18b20();Write_DS18B20(0xcc);Write_DS18B20(0xbe);low =   Read_DS18B20();high = Read_DS18B20();temp = high<<8;temp |= low;temp = temp*0.0625;return temp;
}

onewire.h

#ifndef __ONEWIRE_H
#define __ONEWIRE_Hunsigned char rd_temperature(void);  //; ;
unsigned int duwendu();#endif

ds1302.c

#include <stc15f2k60s2.h>
#include <intrins.h>sbit SCK=P1^7;
sbit SDA=P2^3;
sbit RST = P1^3;   // DS1302复位                                             void Write_Ds1302(unsigned  char temp)
{unsigned char i;for (i=0;i<8;i++)        { SCK=0;SDA=temp&0x01;temp>>=1; SCK=1;}
}   void Write_Ds1302_Byte( unsigned char address,unsigned char dat )
{RST=0;    _nop_();SCK=0; _nop_();RST=1;     _nop_();  Write_Ds1302(address);    Write_Ds1302(dat);      RST=0;
}unsigned char Read_Ds1302_Byte ( unsigned char address )
{unsigned char i,temp=0x00;RST=0; _nop_();SCK=0; _nop_();RST=1; _nop_();Write_Ds1302(address);for (i=0;i<8;i++)   {       SCK=0;temp>>=1; if(SDA)temp|=0x80; SCK=1;} RST=0;    _nop_();SCK=0; _nop_();SCK=1; _nop_();SDA=0; _nop_();SDA=1; _nop_();return (temp);
}void set_sfm(unsigned char shi,unsigned char fen,unsigned char miao)
{Write_Ds1302_Byte(0x8e,0x00);//关闭保护位Write_Ds1302_Byte(0x80,(miao/10)*16+miao%10);//设置秒Write_Ds1302_Byte(0x82,(fen/10)*16+fen%10);//设置分Write_Ds1302_Byte(0x84,(shi/10)*16+shi%10);//设置小时Write_Ds1302_Byte(0x8e,0x80);//打开保护位
}

ds1302.h

#ifndef __DS1302_H
#define __DS1302_Hvoid Write_Ds1302(unsigned char temp);
void Write_Ds1302_Byte( unsigned char address,unsigned char dat );
unsigned char Read_Ds1302_Byte( unsigned char address );
void set_sfm(unsigned char shi,unsigned char fen,unsigned char miao);
#endif

mian.c

#include<stc15f2k60s2.h>
#include<ds1302.h>
#include<onewire.h>#define uchar unsigned char
#define uint unsigned intsbit buzz = P0^6;
sbit relay = P0^4;bit temp_flag = 0;
bit blink_flag = 0;
bit alarm_flag = 0;
bit led_blink_flag = 0;
bit read_time_flag = 0;uchar code duan[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00,0x40,0x39};//定义段码数组
uchar disbuff[8];//定义显示数字数字
uchar keysta[] = {1,1,1,1};
uchar kaymap[] = {1,2,3,4};
uchar trg,cont;
uchar boot_time = 0;
uchar shi,fen,miao;
uchar shi_set=0,fen_set=0,miao_set=0;
uchar temp;
uchar sec;
uchar mode = 0;//0为显示,1为时钟设置,2为闹钟设置
uchar time_count1 = 0 ;
uchar time_count2 = 0 ;void closebuzz()
{P2 = P2&0x1f|0xa0;buzz = 0;relay = 0;P2 = 0x00;
}void keyscan()
{uchar keydate = P3^0xff;trg = keydate&(keydate^cont);cont = keydate;
}void keyfun()
{if(alarm_flag == 0){if((trg == 0x01)&&(mode == 0)){mode = 1;}if((trg == 0x01)&&(mode == 1)){if(++time_count1==4){time_count1 = 0;set_sfm(shi,fen,miao);mode = 0;}}if((trg == 0x02)&&(mode == 0)){mode = 2;}if((trg == 0x02)&&(mode == 2)){if(++time_count2==4){time_count2 = 0;mode = 0;}}if(trg == 0x04){if((mode == 1)&&(time_count1 == 1))if(++shi == 24)shi=0;  if((mode == 1)&&(time_count1 == 2))if(++fen == 60)fen=0;if((mode == 1)&&(time_count1 == 3))if(++miao == 60)miao=0;if((mode == 2)&&(time_count2 == 1))if(++shi_set == 24)shi_set=0;   if((mode == 2)&&(time_count2 == 2))if(++fen_set == 60)fen_set=0;if((mode == 2)&&(time_count2 == 3))if(++miao_set == 60)miao_set=0;}if(trg == 0x08){if((mode == 1)&&(time_count1 == 1)){if(shi == 0)shi=24;shi--;}    if((mode == 1)&&(time_count1 == 2)){if(fen == 0)fen=60;fen--;}if((mode == 1)&&(time_count1 == 3)){if(miao == 0)miao=60;miao--;}if((mode == 2)&&(time_count2 == 1)){if(shi_set == 0)shi_set=24;shi_set--;}  if((mode == 2)&&(time_count2 == 2)){if(fen_set == 0)fen_set=60;fen_set--;}if((mode == 2)&&(time_count2 == 3)){if(miao_set == 0)miao_set=60;miao_set--;}}if((mode == 0)&&(cont == 0x08)){temp_flag = 1;}if((mode == 0)&&(cont == 0x00)){temp_flag = 0;}}if((trg != 0x00)&&(alarm_flag == 1)){alarm_flag = 0;sec = 0;}
}void shownum()//显示数字函数
{if(mode == 0){disbuff[0]=shi/10;disbuff[1]=shi%10;disbuff[2]=11;disbuff[3]=fen/10;disbuff[4]=fen%10;disbuff[5]=11;disbuff[6]=miao/10;disbuff[7]=miao%10; }if(mode == 1){       if((blink_flag == 1)&&(time_count1 == 1)){disbuff[0]=shi/10;disbuff[1]=shi%10;disbuff[2]=11;disbuff[3]=fen/10;disbuff[4]=fen%10;disbuff[5]=11;disbuff[6]=miao/10;disbuff[7]=miao%10;    }if((blink_flag == 0)&&(time_count1 == 1)){disbuff[0]=10;disbuff[1]=10;disbuff[2]=11;disbuff[3]=fen/10;disbuff[4]=fen%10;disbuff[5]=11;disbuff[6]=miao/10;disbuff[7]=miao%10;   }if((blink_flag == 1)&&(time_count1 == 2)){disbuff[0]=shi/10;disbuff[1]=shi%10;disbuff[2]=11;disbuff[3]=fen/10;disbuff[4]=fen%10;disbuff[5]=11;disbuff[6]=miao/10;disbuff[7]=miao%10;   }if((blink_flag == 0)&&(time_count1 == 2)){disbuff[0]=shi/10;disbuff[1]=shi%10;disbuff[2]=11;disbuff[3]=10;disbuff[4]=10;disbuff[5]=11;disbuff[6]=miao/10;disbuff[7]=miao%10;   }if((blink_flag == 1)&&(time_count1 == 3)){disbuff[0]=shi/10;disbuff[1]=shi%10;disbuff[2]=11;disbuff[3]=fen/10;disbuff[4]=fen%10;disbuff[5]=11;disbuff[6]=miao/10;disbuff[7]=miao%10;   }if((blink_flag == 0)&&(time_count1 == 3)){disbuff[0]=shi/10;disbuff[1]=shi%10;disbuff[2]=11;disbuff[3]=fen/10;disbuff[4]=fen%10;disbuff[5]=11;disbuff[6]=10;disbuff[7]=10; }}if(mode == 2){      if((blink_flag == 1)&&(time_count2 == 1)){disbuff[0]=shi_set/10;disbuff[1]=shi_set%10;disbuff[2]=11;disbuff[3]=fen_set/10;disbuff[4]=fen_set%10;disbuff[5]=11;disbuff[6]=miao_set/10;disbuff[7]=miao_set%10;    }if((blink_flag == 0)&&(time_count2 == 1)){disbuff[0]=10;disbuff[1]=10;disbuff[2]=11;disbuff[3]=fen_set/10;disbuff[4]=fen_set%10;disbuff[5]=11;disbuff[6]=miao_set/10;disbuff[7]=miao_set%10;   }if((blink_flag == 1)&&(time_count2 == 2)){disbuff[0]=shi_set/10;disbuff[1]=shi_set%10;disbuff[2]=11;disbuff[3]=fen_set/10;disbuff[4]=fen_set%10;disbuff[5]=11;disbuff[6]=miao_set/10;disbuff[7]=miao_set%10;   }if((blink_flag == 0)&&(time_count2 == 2)){disbuff[0]=shi_set/10;disbuff[1]=shi_set%10;disbuff[2]=11;disbuff[3]=10;disbuff[4]=10;disbuff[5]=11;disbuff[6]=miao_set/10;disbuff[7]=miao_set%10;   }if((blink_flag == 1)&&(time_count2 == 3)){disbuff[0]=shi_set/10;disbuff[1]=shi_set%10;disbuff[2]=11;disbuff[3]=fen_set/10;disbuff[4]=fen_set%10;disbuff[5]=11;disbuff[6]=miao_set/10;disbuff[7]=miao_set%10;   }if((blink_flag == 0)&&(time_count2 == 3)){disbuff[0]=shi/10;disbuff[1]=shi%10;disbuff[2]=11;disbuff[3]=fen/10;disbuff[4]=fen%10;disbuff[5]=11;disbuff[6]=10;disbuff[7]=10; }}if(temp_flag == 1){disbuff[0]=10;disbuff[1]=10;disbuff[2]=10;disbuff[3]=10;disbuff[4]=10;disbuff[5]=temp/10;disbuff[6]=temp%10;disbuff[7]=12;   }
}void display()//数码管扫描函数
{static uchar index = 0;P2 = P2&0x1f|0xe0;P0 = 0xff;P2 = 0x00;P2 = P2&0x1f|0xc0;P0 = 1<<index;P2 = 0x00;P2 = P2&0x1f|0xe0;P0 = ~duan[disbuff[index]];P2 = 0x00;index++;index &= 0x07;}void Timer0Init(void)      //2毫秒@12.000MHz
{AUXR |= 0x80;     //定时器时钟1T模式TMOD &= 0xF0;       //设置定时器模式TL0 = 0x40;       //设置定时初值TH0 = 0xA2;        //设置定时初值TF0 = 0;       //清除TF0标志TR0 = 1;      //定时器0开始计时ET0 = 1;EA = 1 ;
}void time0() interrupt 1
{static uint count;static uchar alarm,count_time;if(++count==500){blink_flag = ~blink_flag;count = 0;if(alarm_flag == 1){sec++;}}if((++alarm == 100)&&(alarm_flag == 1)){led_blink_flag = ~led_blink_flag;     alarm = 0;}if(++count_time == 150){count_time = 0;read_time_flag = 1;}display();keyscan();keyfun();
}void led_set()
{if((alarm_flag == 1)&&(led_blink_flag == 1)){P2 = P2&0x1f|0x80;P0 = ~0x01;P2 = 0x00;}if((alarm_flag == 1)&&(led_blink_flag == 0)){P2 = P2&0x1f|0x80;P0 = ~0x00;P2 = 0x00;}if(alarm_flag == 0){P2 = P2&0x1f|0x80;P0 = ~0x00;P2 = 0x00;}
}void main()
{uchar shi_temp,fen_temp,miao_temp;closebuzz();Timer0Init();set_sfm(23,59,55);//设置时间temp = (uchar)duwendu();while(1){shownum();led_set();if((mode != 1)&&(read_time_flag == 1)){read_time_flag = 0;//读取时间shi_temp =Read_Ds1302_Byte(0x85);fen_temp=Read_Ds1302_Byte(0x83);miao_temp=Read_Ds1302_Byte(0x81);//将读取到的BCD码转化为十进制shi = shi_temp/16*10+shi_temp%16;fen = fen_temp/16*10+fen_temp%16;miao = miao_temp/16*10+miao_temp%16;if((shi == shi_set)&&(fen == fen_set)&&(miao == miao_set))alarm_flag = 1;    }if(temp_flag == 1){temp = (uchar)duwendu();}if(sec >= 5){alarm_flag = 0;sec = 0;  }}
}

蓝桥杯——第八届省赛_基于单片机的电子钟程序设计与调试相关推荐

  1. 蓝桥杯之单片机设计与开发——第八届省赛_基于单片机的电子钟程序设计与调试

    目前在准备蓝桥杯,自己写了往届的赛题,调试以后觉得没什么问题.希望大家能给出一些建议,指出其中的错误和不足,也真挚地希望能给大家提供一些方法和思路.共勉! 赛题 main.c #include < ...

  2. 【蓝桥杯单片机组第八届省赛】— 基于单片机的电子钟程序设计与调试

    目录 1.初赛试题 2.试题分析与代码 3.代码分析 1.初赛试题

  3. 【蓝桥杯第八届省赛_电子钟】

    蓝桥杯第八届省赛_电子钟 修改版本 基础知识学习来自小蜜蜂老师 yyds 下面代码功能没有完全实现 有误还望大佬指正 总结分析: 第八届题目难度从我个人来说明显会比第七届难了很多,当然也可能是我自己这 ...

  4. 基于单片机的电子钟程序设计与调试

    1.初赛试题 1.1 基本要求 (1)使用 CT107D 单片机竞赛板, 完成"电子钟" 功能的程序设计与调试: (2)设计与调试过程中,可参考组委会提供的"资源数据包& ...

  5. 蓝桥杯--第八届省赛试题-电子钟程序设计

    蓝桥杯-第八届省赛试题-电子钟程序设计 题目: 思路 1.显示温度使用大赛提供的onewire.c,只需自己添加读取函数. 2.设计时钟程序,或者使用DS1302.c(这里使用的是自己写的函数) 3. ...

  6. 蓝桥杯第八届省赛JAVA真题----k倍区间

    标题: k倍区间 给定一个长度为N的数列,A1, A2, ... AN,如果其中一段连续的子序列Ai, Ai+1, ... Aj(i <= j)之和是K的倍数,我们就称这个区间[i, j]是K倍 ...

  7. 蓝桥杯第八届省赛JAVA真题----油漆面积

    标题:油漆面积 X星球的一批考古机器人正在一片废墟上考古. 该区域的地面坚硬如石.平整如镜. 管理人员为方便,建立了标准的直角坐标系. 每个机器人都各有特长.身怀绝技.它们感兴趣的内容也不相同. 经过 ...

  8. 蓝桥杯第八届省赛JAVA真题----9数算式

    标题:9数算式 观察如下的算式: 9213 x 85674 = 789314562 左边的乘数和被乘数正好用到了1~9的所有数字,每个1次. 而乘积恰好也是用到了1~9的所有数字,并且每个1次. 请你 ...

  9. 蓝桥杯第八届省赛JAVA真题----字母组串

    标题:字母组串 由 A,B,C 这3个字母就可以组成许多串. 比如:"A","AB","ABC","ABA"," ...

最新文章

  1. GnuPG如何安全地分发私钥(1)GnuPG的用法
  2. anaconda python 版本对应关系
  3. ssm 异常捕获 统一处理_统一异常处理介绍及实战,看这篇就对了
  4. MySQL日期与时间函数
  5. MBR与GPT的分区结构
  6. 你真的理解图像处理算法SIFT吗?
  7. Gnome即将满18岁,适用于Docker,Kali Linux 2.0的新工具以及更多新闻
  8. 1799元起!66W超级快充+120Hz全视屏 荣耀Play5 活力版正式发布
  9. Linux下的Python Socket网络编程(聊天机器人)
  10. Android SeekBar和RatingBar示例教程
  11. Java语言速览:StackOverflow
  12. C语言写一个计算器的三种方法
  13. spyder python下载_【spyder编程软件下载】spyder官方下载 v2.1.0 最新版-七喜软件园...
  14. 使用subs和evals函数对sympy中的符号进行赋值并且设置数值位数
  15. 使用 FFmpeg 生成 ts 切片并使用 AES-128 加密
  16. “空城计”不灵了,产城融合才有未来
  17. 大数据之clickhouse_clickhouse的基础介绍及基础使用
  18. 自顶向下学习 RocketMQ(九):回溯消费
  19. Linux查看目录结构
  20. KVM+WebVirtMgr部署安装笔记

热门文章

  1. 如何直接打开Visual Studio 2013 的帮助文档
  2. Kettle的转换使用bat执行
  3. windows之win10无法使用小米随身wifi
  4. vue中props设置默认值
  5. 随感-想到哪儿写到哪儿
  6. elasticsearch 与 传统数据库的区别与选用
  7. 合伙做生意长久的原则
  8. java float 运算_java float除法的问题
  9. 第7章 EL和JSTL
  10. 飞鸽传书 “ bind()error=10048 ”的解决办法