难点:如何记录十个温度数据并显示;定义一个数组,来记录温度数据,通过按键按下次数来确定显示第几个温度数据

main.c

#include <STC15F2K60S2.H>
#include <DS1302.H>
#include <ONEWIRE.H>void Timer2Init()     //1毫秒@12.000MHz
{AUXR &= 0xFB;     //定时器时钟12T模式T2L = 0x18;        //设置定时初值T2H = 0xFC;        //设置定时初值AUXR |= 0x10;      //定时器2开始计时IE2|=0X04;EA=1;
}void Device_ctrl(unsigned char p2date,unsigned char p0date)
{P0=p0date;P2=P2&0X1F|p2date;P2&=0X1F;
}unsigned char smg_count;
unsigned char smg_du[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
unsigned char interval_time[]={1,5,30,60};
unsigned int  time;
unsigned char interval_display[8];
unsigned char time_display[8];
unsigned char caiji_display[8];
unsigned char temp_shouji[10];
unsigned char key_press=0;
unsigned char display_mode;
unsigned char shi,fen,miao;
unsigned int smg_count_flag;
unsigned int temp_duqu;
unsigned int duqu;
bit smg_flag;
bit temp_flag;void set_sfm(unsigned char shi,unsigned char fen,unsigned char miao)
{Write_Ds1302_Byte(0x8e,0);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);
}void start_temp()
{init_ds18b20();Write_DS18B20(0xcc);Write_DS18B20(0x44);
}
float read_temp()
{unsigned char low,high;float temp;init_ds18b20();Write_DS18B20(0xcc);Write_DS18B20(0xbe);low=Read_DS18B20();high=Read_DS18B20();temp=(high<<8)|low;temp=temp*0.0625;return temp;
}unsigned int temp_count;
unsigned char temp_cishu=1;
unsigned char temp_number=1;
void temp_process()
{if(temp_flag){if(temp_count>time*1000){temp_count=0;temp_duqu=read_temp();temp_shouji[temp_cishu]=temp_duqu;temp_cishu++;if(temp_cishu==10){temp_cishu=0;display_mode=2;temp_flag=0;Device_ctrl(0x80,~0X01);}start_temp();}}}
void smg_show()
{unsigned char i;Device_ctrl(0XC0,0);if(display_mode==0){Device_ctrl(0xe0,~interval_display[i]);}if(display_mode==1){Device_ctrl(0xe0,~time_display[i]);}if(display_mode==2){Device_ctrl(0xe0,~caiji_display[i]);}Device_ctrl(0xc0,0x01<<i);i=(i+1)%8;
}void smg_process()
{EA=0;shi=Read_Ds1302_Byte(0x85);fen=Read_Ds1302_Byte(0x83);miao=Read_Ds1302_Byte(0x81);shi=shi/16*10+shi%16;fen=fen/16*10+fen%16;miao=miao/16*10+miao%16;EA=1;if(smg_count>3){smg_count=0;interval_display[0]=0x00;interval_display[1]=0x00;interval_display[2]=0x00;interval_display[3]=0x00;interval_display[4]=0x00;interval_display[5]=0x40;caiji_display[0]=0x40;caiji_display[3]=0x00;caiji_display[4]=0x00;caiji_display[5]=0x40;if(display_mode==0){time=interval_time[key_press];interval_display[6]=smg_du[time/10];interval_display[7]=smg_du[time%10];}if(display_mode==1){time_display[0]=smg_du[shi/10];time_display[1]=smg_du[shi%10];time_display[3]=smg_du[fen/10];time_display[4]=smg_du[fen%10];time_display[6]=smg_du[miao/10];time_display[7]=smg_du[miao%10];if(smg_flag){time_display[2]=0x00;time_display[5]=0x00;}else{time_display[2]=0x40;time_display[5]=0x40;}}if(display_mode==2){caiji_display[1]=smg_du[temp_number/10];caiji_display[2]=smg_du[temp_number%10];duqu=temp_shouji[temp_number];caiji_display[6]=smg_du[duqu/10];caiji_display[7]=smg_du[duqu%10];}}
}unsigned char Trig_btn;
unsigned char Cont_btn;
unsigned int  key_count;
void key_btn()
{unsigned char readdate=P3^0xff;Trig_btn=readdate&(Cont_btn^readdate);Cont_btn=readdate;
}void key_process()
{if(key_count>10){key_count=0;key_btn();if(Trig_btn==0x08)//s4{key_press++;if(key_press==4){key_press=0;}}if(Trig_btn==0x04)//s5{if(display_mode==0){display_mode=1;temp_flag=1;}}if(Trig_btn==0x02)//s6{if(display_mode==2){Device_ctrl(0x80,0XFF);temp_number++;if(temp_number==11){temp_number=1;}}}if(Trig_btn==0x01)//s7{if(display_mode==2){display_mode=0;}}}
}
void main()
{Timer2Init();set_sfm(23,59,50);start_temp();Device_ctrl(0xa0,0x00);Device_ctrl(0x80,0xff);while(1){smg_process();key_process();temp_process();}
}void timer2service()  interrupt 12
{key_count++;smg_count++;smg_show();smg_count_flag++;temp_count++;if(smg_count_flag>1000){smg_count_flag=0;smg_flag=~smg_flag;}
}

DS1302.C

#include "ds1302.h"                                    //写字节
void Write_Ds1302(unsigned  char temp)
{unsigned char i;for (i=0;i<8;i++)        { SCK = 0;SDA = temp&0x01;temp>>=1; SCK=1;}
}   //向DS1302寄存器写入数据
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;
}//从DS1302寄存器读出数据
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);
}

DS1302.H

#ifndef __DS1302_H
#define __DS1302_H#include <STC15F2K60S2.H>
#include <intrins.h>sbit SCK = P1^7;
sbit SDA = P2^3;
sbit RST = P1^3; void Write_Ds1302(unsigned char temp);
void Write_Ds1302_Byte( unsigned char address,unsigned char dat );
unsigned char Read_Ds1302_Byte( unsigned char address );#endif

ONEWIRE.C

#include "onewire.h"//单总线内部延时函数
void Delay_OneWire(unsigned int t)
{t=t*12;while(t--);
}//单总线写操作
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);
}//单总线读操作
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;
}

ONEWIRE.H

#ifndef __ONEWIRE_H
#define __ONEWIRE_H#include <STC15F2K60S2.H>sbit DQ = P1^4;  void Delay_OneWire(unsigned int t);
void Write_DS18B20(unsigned char dat);
unsigned char Read_DS18B20(void);
bit init_ds18b20(void);#endif

蓝桥杯单片机第六届温度记录器相关推荐

  1. 蓝桥杯单片机第六届省赛题详细讲解(温度记录器)

    看之前强烈建议先自己做一遍!!! 演示效果 题目讲解 代码 main.c ds1302.c ds1302.h onewire.c onewire.h 工程文件 演示效果 题目讲解 首先我们从系统框图看 ...

  2. 蓝桥杯单片机第七届省赛-模拟风扇控制系统

    九层妖塔 起于垒土 ● 改编自国信长天蓝桥杯官方蓝皮书例程,按照自己的习惯进行了补充和修改 蓝桥杯单片机第七届省赛-模拟风扇控制系统 Notes1:按键按下后在某些情况下给一定的缓冲时间 Notes2 ...

  3. 蓝桥杯单片机第十三届第二场

    第十三届蓝桥杯单片机第二场 文章目录 第十三届蓝桥杯单片机第二场 前言 一.赛题分析 二.程序调试步骤 三.部分源程序 主函数部分 DAC处理函数 数码管处理函数 ADC处理函数 超声波处理函数 LE ...

  4. 蓝桥杯单片机第十届国赛练习

    单片机型号:IAP15F2K60S2. 蓝桥杯第十届国赛有串口,本文着手进行一番练习, 文末会附上整个工程下载地址. 这一届赛题的练习对我来说还是有些难度 我看题后做了以下几个设计方面的点总结列举: ...

  5. 蓝桥杯单片机第十届国赛

    今天是第十三届蓝桥杯单片机国赛的比赛时间,刚比完,简单说一下感想,这次国赛必须要用到三个定时器,昨天刚看了定时器2的使用,不太熟练,所以写的也不是很好,超声波和频率有点冲突,就个人而言,我觉得这一届最 ...

  6. 蓝桥杯单片机第十三届第二场考后归纳总结

    提示:一个第十三届蓝桥杯单片机  考生的考后总结 文章目录 前言 一.第十三届考的是什么? 二.数据代码 总结 一.第十三届考的是什么? 1.电位器RB2的电压测量,用DAC输出 2.超声波测距 3. ...

  7. 蓝桥杯单片机第十届省赛题程序实现

    文章目录 main.c iic.c main.c #include<reg52.h> #include<intrins.h> #include<iic.h>sbit ...

  8. 【蓝桥杯】第六届蓝桥杯大赛个人赛省赛(软件类) Java大学C组 -题目与答案

    第六届蓝桥杯大赛个人赛省赛(软件类) Java大学C组 -题目与答案 1.结果填空(满分3分) 2.结果填空(满分5分) 3.结果填空(满分9分) 4.代码填空(满分11分) 5.代码填空(满分15分 ...

  9. 蓝桥杯单片机第十届省赛

    如果有用请点赞,还会继续更新的 题目: 好久没有更新了,今天又写了一个第十届的,感觉这次就是555的频率计数时那个定时器的使用有点小注意事项,要用定时器0来计数,定时器1来计时,同时定时器1要计数55 ...

最新文章

  1. Hibernate Tomcat JNDI数据源配置(转)
  2. 查找最晚入职员工的所有信息---牛客网SQL实战篇
  3. php个人云存储,使用OwnCloud搭建个人私有云存储
  4. 领域模型架构 eShopOnWeb项目分析 上
  5. jsr 正则验证_Java数据校验(Bean Validation / JSR303)
  6. javascript 事件冒泡处理方式
  7. DataBseDesign工作笔记003---ERStudio使用笔记_基本使用方法详解
  8. 在类库文件无法使用Server.MapPath
  9. Kotlin入门(8)空值的判断与处理
  10. unity android 版本,Unity2019与Android混合开发
  11. 一流程序员都有哪些高效编程习惯?
  12. mac install: /usr/bin/unrar: Operation not permitted
  13. 【最详细】数据结构(C语言版 第2版)课后习题答案全集 严蔚敏 等 编著
  14. 自定义网站地址栏图标
  15. 微信扫码点餐帮助商家赚钱的方法
  16. Qt的对话框与窗口--自定义的对话框
  17. 杀戮空间2游戏开服架设好后怎么查找自己服务器
  18. 查看Linux内核修改及更新记录方法
  19. 相差为2的两个素数称为孪生素数
  20. php下单免单,淘客免单新玩法

热门文章

  1. 为什么Wi-Fi用的最多是1,6,11 信道
  2. DBA,SYSDBA,SYSOPER三者的区别
  3. 走近棒球运动·美国职业棒球大联盟·MLB棒球创造营
  4. Altium Designer原理图设计
  5. 神经网络计算机,什么是神经网络计算机?
  6. 众数、极差、四分位差、方差、标准差、离散系数 Python求解
  7. MTK 功能机6261a下调试震动开关的LED跑马灯驱动
  8. 阿里大鱼短信平台使用-Java版
  9. @TableId can‘t more than one in Class: “com.example.CloseContactSearcher.entity.Activity“.
  10. 2011年12月IE6浏览器的全球市场份额已经降至7.7%