蓝桥杯单片机第六届温度记录器
难点:如何记录十个温度数据并显示;定义一个数组,来记录温度数据,通过按键按下次数来确定显示第几个温度数据
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
蓝桥杯单片机第六届温度记录器相关推荐
- 蓝桥杯单片机第六届省赛题详细讲解(温度记录器)
看之前强烈建议先自己做一遍!!! 演示效果 题目讲解 代码 main.c ds1302.c ds1302.h onewire.c onewire.h 工程文件 演示效果 题目讲解 首先我们从系统框图看 ...
- 蓝桥杯单片机第七届省赛-模拟风扇控制系统
九层妖塔 起于垒土 ● 改编自国信长天蓝桥杯官方蓝皮书例程,按照自己的习惯进行了补充和修改 蓝桥杯单片机第七届省赛-模拟风扇控制系统 Notes1:按键按下后在某些情况下给一定的缓冲时间 Notes2 ...
- 蓝桥杯单片机第十三届第二场
第十三届蓝桥杯单片机第二场 文章目录 第十三届蓝桥杯单片机第二场 前言 一.赛题分析 二.程序调试步骤 三.部分源程序 主函数部分 DAC处理函数 数码管处理函数 ADC处理函数 超声波处理函数 LE ...
- 蓝桥杯单片机第十届国赛练习
单片机型号:IAP15F2K60S2. 蓝桥杯第十届国赛有串口,本文着手进行一番练习, 文末会附上整个工程下载地址. 这一届赛题的练习对我来说还是有些难度 我看题后做了以下几个设计方面的点总结列举: ...
- 蓝桥杯单片机第十届国赛
今天是第十三届蓝桥杯单片机国赛的比赛时间,刚比完,简单说一下感想,这次国赛必须要用到三个定时器,昨天刚看了定时器2的使用,不太熟练,所以写的也不是很好,超声波和频率有点冲突,就个人而言,我觉得这一届最 ...
- 蓝桥杯单片机第十三届第二场考后归纳总结
提示:一个第十三届蓝桥杯单片机 考生的考后总结 文章目录 前言 一.第十三届考的是什么? 二.数据代码 总结 一.第十三届考的是什么? 1.电位器RB2的电压测量,用DAC输出 2.超声波测距 3. ...
- 蓝桥杯单片机第十届省赛题程序实现
文章目录 main.c iic.c main.c #include<reg52.h> #include<intrins.h> #include<iic.h>sbit ...
- 【蓝桥杯】第六届蓝桥杯大赛个人赛省赛(软件类) Java大学C组 -题目与答案
第六届蓝桥杯大赛个人赛省赛(软件类) Java大学C组 -题目与答案 1.结果填空(满分3分) 2.结果填空(满分5分) 3.结果填空(满分9分) 4.代码填空(满分11分) 5.代码填空(满分15分 ...
- 蓝桥杯单片机第十届省赛
如果有用请点赞,还会继续更新的 题目: 好久没有更新了,今天又写了一个第十届的,感觉这次就是555的频率计数时那个定时器的使用有点小注意事项,要用定时器0来计数,定时器1来计时,同时定时器1要计数55 ...
最新文章
- Hibernate Tomcat JNDI数据源配置(转)
- 查找最晚入职员工的所有信息---牛客网SQL实战篇
- php个人云存储,使用OwnCloud搭建个人私有云存储
- 领域模型架构 eShopOnWeb项目分析 上
- jsr 正则验证_Java数据校验(Bean Validation / JSR303)
- javascript 事件冒泡处理方式
- DataBseDesign工作笔记003---ERStudio使用笔记_基本使用方法详解
- 在类库文件无法使用Server.MapPath
- Kotlin入门(8)空值的判断与处理
- unity android 版本,Unity2019与Android混合开发
- 一流程序员都有哪些高效编程习惯?
- mac install: /usr/bin/unrar: Operation not permitted
- 【最详细】数据结构(C语言版 第2版)课后习题答案全集 严蔚敏 等 编著
- 自定义网站地址栏图标
- 微信扫码点餐帮助商家赚钱的方法
- Qt的对话框与窗口--自定义的对话框
- 杀戮空间2游戏开服架设好后怎么查找自己服务器
- 查看Linux内核修改及更新记录方法
- 相差为2的两个素数称为孪生素数
- php下单免单,淘客免单新玩法
热门文章
- 为什么Wi-Fi用的最多是1,6,11 信道
- DBA,SYSDBA,SYSOPER三者的区别
- 走近棒球运动·美国职业棒球大联盟·MLB棒球创造营
- Altium Designer原理图设计
- 神经网络计算机,什么是神经网络计算机?
- 众数、极差、四分位差、方差、标准差、离散系数 Python求解
- MTK 功能机6261a下调试震动开关的LED跑马灯驱动
- 阿里大鱼短信平台使用-Java版
- @TableId can‘t more than one in Class: “com.example.CloseContactSearcher.entity.Activity“.
- 2011年12月IE6浏览器的全球市场份额已经降至7.7%