#include<reg52.h>
#include <intrins.h> //包含 左移、右移及空指令
//#include <ds18b20.h>
#include <lcd1602.h>
#include <1302.h>
#include <key.h>
#include<sht11.h>
#define uchar unsigned char
#define uint unsigned int
sbit gaobao=P1^0; //j电器1 高电平,断电器(un2003控制)低电平动作
sbit xiaxian=P1^1;
sbit beep=P1^5;
//float tt; //温度带小数变量
uchar t0num; //T0中断次数
uchar year1602,month1602,day1602,hour1602,min1602,sec1602;
uchar yc,mc,dc,hc,fc,sc; //年月日时分秒定时参数
uchar who,wmo,wso,whc,wmc,wsc; //时分秒周循环定时参数
bit w1,w2,w3,w4,w5,w6,w7; //周循环定时参数
void gbtz(uchar date);
void stoptime();
void key1scan(); //选择模式 按键1
void tempmode(); //温度上下限控制
void addkey(uchar addnum); //加1
void deckey(uchar decnum); //减1
void initime(); //初始化时间为10-12-31
void read1302ram();
//void temptest();
uchar weeknum(uchar y,uchar m,uchar d);
void initime() //初始化时间10-12-31 23:59 周5
{ //长按s4才启动
lock_1302(0); //去写保护
write1302_byte(0x80,0x55); //sec
write1302_byte(0x82,0x59); //min
write1302_byte(0x84,0x23); //hour
write1302_byte(0x86,0x31); //day
write1302_byte(0x88,0x12); //month
write1302_byte(0x8a,0x04); //week
write1302_byte(0x8c,0x10); //year
write1302_byte(0xc0,0); //ontemp
write1302_byte(0xc2,0); //offtemp
write1302_byte(0xc4,0); //yc
write1302_byte(0xc6,0); //mc
write1302_byte(0xc8,0); //dc
write1302_byte(0xca,0); //hc
write1302_byte(0xcc,0); //fc
write1302_byte(0xce,0); //sc
write1302_byte(0xd0,0); //w1
write1302_byte(0xd2,0); //w2
write1302_byte(0xd4,0); //w3
write1302_byte(0xd6,0); //w4
write1302_byte(0xd8,0); //w5
write1302_byte(0xda,0); //w6
write1302_byte(0xdc,0); //w7
write1302_byte(0xe0,0); //who
write1302_byte(0xe2,0); //wmo
write1302_byte(0xe4,0); //wso
write1302_byte(0xe6,0); //whc
write1302_byte(0xe8,0); //wmc
write1302_byte(0xea,0); //wsc
write1302_byte(0xec,0); //dw,温控标志
lock_1302(1); //开写保护
}
void gettime()
{
year=read1302_byte(0x8d); //1302读时间
week=read1302_byte(0x8b);
month=read1302_byte(0x89);
day=read1302_byte(0x87);
hour=read1302_byte(0x85);
min=read1302_byte(0x83);
sec=read1302_byte(0x81);
}
void disptime()
{
uchar shi,ge; //BCD 十位个位
gettime();
write_com(0x80); //1602首行
write_date('2'); //写一个字符
write_date('0');
shi=((year>>4)&0x0f);
ge=(year&0x0f);
write_date(0x30+shi);
write_date(0x30+ge);
write_date('-');
shi=((month>>4)&0x01);
ge=(month&0x0f);
write_date(0x30+shi);
write_date(0x30+ge);
write_date('-');
shi=((day>>4)&0x03);
ge=(day&0x0f);
write_date(0x30+shi);
write_date(0x30+ge);
write_com(0x80+0xd);
write_date('w');
write_date('e');
write_date('t');
write_com(0x80+0x40+0x01); //第二行
shi=((hour>>4)&0x03);
ge=(hour&0x0f);
write_date(0x30+shi);
write_date(0x30+ge);
write_date(':');
shi=((min>>4)&0x07);
ge=(min&0x0f);
write_date(0x30+shi);
write_date(0x30+ge);
write_date(':');
shi=((sec>>4)&0x07);
ge=(sec&0x0f);
write_date(0x30+shi);
write_date(0x30+ge);
}
void t0() interrupt 1 //定时器0中断入口函数
{
TH0=(65536-50000)/256;// T0定时器初值
TL0=(65536-50000)%256;//
if(s4==0)
{
t0num++;
if(t0num>100)//修改此参数更改长按s4初始化1302时间
{
t0num=0;
TR0=0; //T0停止
while(s4==0);
initime(); //初始化1302
}
}
else TR0=0; //T0停止
}
void init0()
{
TMOD=0X01; //T0,方式1 ,16位定时器
TH0=(65536-50000)/256;//50MS T0定时器初值
TL0=(65536-50000)%256;
EA=1; //开总中断
ET0=1; //T0 暂停
}
void twobcd()
{
uchar a,b;
a=sec/10;
a=a<<4;
b=sec%10;
sec=a|b;
a=min/10;
a=a<<4;
b=min%10;
min=a|b;
a=hour/10;
a=a<<4;
b=hour%10;
hour=a|b;
a=year/10;
a=a<<4;
b=year%10;
year=a|b;
a=month/10;
a=a<<4;
b=month%10;
month=a|b;
a=day/10;
a=a<<4;
b=day%10;
day=a|b;
a=week/10;
a=a<<4;
b=week%10;
week=a|b;
}
void bcdtwo()
{
uchar a,b;
sec=sec&0x7f; //bcd28,00101000=40,
a=sec>>4; //a=0010=2
a=10*a; //a=20
b=sec&0x0f; //b=00001000=8
sec=a+b; //sec=20+8=28
a=(sec/16)<<4;//a=1<<4=00010000
b=sec%16; //b=00001100
sec=a|b; //sec=00011100=28 2进制
min=min&0x7f;
a=min>>4;
a=10*a;
b=min&0x0f;
min=a+b;
a=(min/16)<<4;
b=min%16;
min=a|b;
hour=hour&0x7f;
a=hour>>4;
a=10*a;
b=hour&0x0f;
hour=a+b;
a=(hour/16)<<4;
b=hour%16;
hour=a|b;
a=year>>4;
a=10*a;
b=year&0x0f;
year=a+b;
a=(year/16)<<4;
b=year%16;
year=a|b;
month=month&0x1f;
a=month>>4;
a=10*a;
b=month&0x0f;
month=a+b;
a=(month/16)<<4;
b=month%16;
month=a|b;
day=day&0x3f;
a=day>>4;
a=10*a;
b=day&0x0f;
day=a+b;
a=(day/16)<<4;
b=day%16;
day=a|b;
week=week&0x0f;
a=week%16;
week=a;
}
void stoptime()
{
lock_1302(0);//去写保护
sec=read1302_byte(0x81);
write1302_byte(0x80,(sec|0x80));
lock_1302(1);//开写保护
}
void timeset()
{
lock_1302(0); //去写保护
write1302_byte(0x80,sec);
write1302_byte(0x82,min);
write1302_byte(0x84,hour);
write1302_byte(0x86,day);
write1302_byte(0x88,month);
write1302_byte(0x8a,week);
write1302_byte(0x8c,year);
lock_1302(1); //开写保护
}
void read1302ram()
{
ontemp=read1302_byte(0xc1);
offtemp=read1302_byte(0xc3);
yc=read1302_byte(0xc5);
mc=read1302_byte(0xc7);
dc=read1302_byte(0xc9);
hc=read1302_byte(0xcb);
fc=read1302_byte(0xcd);
sc=read1302_byte(0xcf);
w1=read1302_byte(0xd1);
w2=read1302_byte(0xd3);
w3=read1302_byte(0xd5);
w4=read1302_byte(0xd7);
w5=read1302_byte(0xd9);
w6=read1302_byte(0xdb);
w7=read1302_byte(0xdd);
who=read1302_byte(0xe1);
wmo=read1302_byte(0xe3);
wso=read1302_byte(0xe5);
whc=read1302_byte(0xe7);
wmc=read1302_byte(0xe9);
wsc=read1302_byte(0xeb);
dw=read1302_byte(0xed);
}
void didi()
{
beep=0;
delay(500);
beep=1;
delay(500);
}
void nem_jing()
{
if(dw==1)
{
shidu=n_shi*10+n_ge;
if(shidu>ontemp)
{
gaobao=0;
didi();
}
else
gaobao=1;
if(shidu<offtemp)
{
xiaxian=0;
didi();
}
else
xiaxian=1;
}
}
/////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////
//**********************************************
/////////////////////////////////////////
void main()
{
gaobao=0; //继电器不动作
xiaxian=0;
ini1602(); //初始化1602
init0(); //T0中断初始化,
read1302ram(); //读1302,主电掉电,也可保存
while(1)
{
if(s4==0)//按下s4键
{
TR0=1;//启动T0 功能长按s4约五秒(秒显示停)初始化1302(掉电时用)
}
disptime(); //显示时间
// display_temp();//显示温度
convert_SHT(&aa,SHT_TEMP); //温度转换
convert_SHT(&aa,SHT_HUMI); //湿度转换
caculation_SHT(&aa); //温度和湿度的补偿
float_convert(&aa); //将浮点数转换成整型,各个位的数分别保存
write_com(0x80+0x40+13);//1602光标第二行第13位
write_date(0x30+n_shi);
write_date(0x30+n_ge);
write_date(0x25);
// write_com(0x80+0x40+15);
// Print(aa.num_temp);
// write_date(0x30+n_shi);
// write_date(0x30+n_ge);
// write_date(0x30+a);//百位
// write_date(0x30+b); //十位
key1scan(); //设置键按下的操作
// temptest(); //判断温度是否到设定值,相应继电器动作
nem_jing();
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
本资源内容概要: 这是基于51单片机的时钟SHT10湿度采集显示定时报警设计,包含了电路图源文件(Altiumdesigner软件打开)、C语言程序源代码(keil软件打开)、元件清单(excel表格打开)。 本资源适合人群: 单片机爱好者、电子类专业学生、电子diy爱好者。 本资源能学到什么: 可以通过查看电路学习电路设计原理,查看代码学习代码编写原理。 本资源使用建议: 建议使用者需要具备一定电子技术基础,掌握一些常用元器件原理,例如三极管、二极管、数码管、电容、稳压器等。了解C语言基础设计原理,能看懂基础的电路图,具备一定的电路图软件使用能力。
资源推荐
资源详情
资源评论
收起资源包目录
107、基于51单片机时钟SHT10湿度采集显示定时报警电路图proteus仿真及程序.rar (47个子文件)
107、基于51单片机时钟SHT10湿度采集显示定时报警电路图proteus仿真及程序
proteus仿真
time.DSN 105KB
time.PWI 1KB
Last Loaded time.DBK 103KB
程序代码
时钟.hex 17KB
time 58KB
时钟.M51 67KB
time_Uv2.Bak 2KB
sht11.h 5KB
time_uvproj.bak 13KB
1302.h 980B
时钟_Opt.Bak 2KB
time.plg 1KB
time.opt.bak 1021B
时钟 58KB
time.uvopt 58KB
ds18b20.h 2KB
key.h 11KB
时钟.lnp 40B
时钟_Uv2.Bak 0B
time.OBJ 67KB
time.LST 17KB
lcd1602.h 1KB
时钟.Opt 2KB
wendupanduan.h 0B
time_uvopt.bak 58KB
time_Opt.Bak 1013B
time.lnp 40B
time.c 7KB
时钟.plg 203B
time.M51 66KB
时钟.Uv2 2KB
time.uvproj 13KB
time.Uv2.bak 2KB
PCB电路图
PCB1.PcbDoc 399KB
__Previews
PCB1.PcbDocPreview 43KB
Sheet1.SchDocPreview 65KB
PCB_Project1.PrjPCBStructure 48B
History
PCB_Project1.~(1).PrjPCB.Zip 5KB
Sheet1.SchDoc 161KB
PCB_Project1.PrjPCB 50KB
PCB1.PcbDoc.htm 5KB
PCB1 PCB ECO 2010-8-22 21-29-35.LOG 6KB
Project Outputs for PCB_Project1
PCB_Project1.OutJob 3KB
PCB1.pcbdoc_viewstate 2KB
Project Logs for PCB_Project1
PCB1 PCB ECO 2011-05-27 01-18-08 AM.LOG 746B
PCB1 PCB ECO 2011-05-27 01-15-43 AM.LOG 832B
Sheet1.pdf 253KB
共 47 条
- 1
资源评论
>行者<
- 粉丝: 205
- 资源: 135
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功