当前位置:网站首页>蓝桥杯单片机第六届温度记录器
蓝桥杯单片机第六届温度记录器
2022-07-02 03:29:00 【超561】
难点:如何记录十个温度数据并显示;定义一个数组,来记录温度数据,通过按键按下次数来确定显示第几个温度数据
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
边栏推荐
- Analyse de 43 cas de réseaux neuronaux MATLAB: Chapitre 42 opérations parallèles et réseaux neuronaux - - opérations parallèles de réseaux neuronaux basées sur CPU / GPU
- 傅里叶级数
- halcon图像矫正
- Eight steps of agile development process
- 焱融看 | 混合云时代下,如何制定多云策略
- 终日乾乾,夕惕若厉
- Basic syntax of unity script (8) - collaborative program and destruction method
- 蓝桥杯单片机省赛第十一届
- 【DesignMode】建造者模式(Builder model)
- Account management of MySQL
猜你喜欢
uniapp 使用canvas 生成海报并保存到本地
[designmode] Prototype Pattern
Unity脚本的基础语法(6)-特定文件夹
蓝桥杯单片机省赛第十二届第二场
One of the future trends of SAP ui5: embrace typescript
[C Advanced] brother Peng takes you to play with strings and memory functions
Uniapp uses canvas to generate posters and save them locally
NLog使用
What do you know about stock selling skills and principles
MySQL index, transaction and storage engine
随机推荐
C # joint halcon out of halcon Environment and various Error Reporting and Resolution Experiences
Pycharm2021 delete the package warehouse list you added
PY3, PIP appears when installing the library, warning: ignoring invalid distribution -ip
js生成随机数
ThreadLocal详解
微信小程序中 在xwml 中使用外部引入的 js进行判断计算
Eight steps of agile development process
Download and use of the super perfect screenshot tool snipaste
Xlwings drawing
Haute performance et faible puissance Cortex - A53 Core Board | i.mx8m mini
PHP array processing
数据库文件逻辑结构形式指的是什么
JIT deep analysis
IPhone 6 plus is listed in Apple's "retro products" list
蓝桥杯单片机省赛第十二届第一场
In wechat applet, the externally introduced JS is used in xwml for judgment and calculation
Global and Chinese market of gynaecological health training manikin 2022-2028: Research Report on technology, participants, trends, market size and share
What is the binding path of SAP ui5
Apple added the first iPad with lightning interface to the list of retro products
蓝桥杯单片机省赛第十一届第二场