前言
今天刷了第十四届的省赛,不得不说这个难度确实比之前的几届都要高,就比如说平常省赛不会考的555出现在了省赛中,逻辑性也很强。其次还有很多小陷阱。并且很多外设同时考察,一不小心就会陷入陷阱之中。本人第一次尝试2个小时以为差不多完成的时侯发现题意理解错了,重新写了一次用了大概快到5个小时了。所以大家动手之前一定要深刻理解题意,其次再去码。
笔者应该是全部实现了,如有需要者可点赞收藏找我下载源代码。同时欢迎大家指正发现错误。
main.c(主文件)
#include "reg52.h"
#include "user.h"
#include "ds1302.h"
#include "iic.h"
#include "ds18b20.h"
sfr P4=0xc0;
sbit R1=P3^0;
sbit R2=P3^1;
sbit R3=P3^2;
sbit R4=P3^3;
sbit C1=P4^4;
sbit C2=P4^2;
sbit C3=P3^5;
sbit C4=P3^4;
void Display_info();
unsigned char flq;//数据是否有效
unsigned char ui=1;//默认时间显示界面(系统界面选择)
unsigned char Wr_time[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};
unsigned char Re_time[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};
unsigned char Timer[7]={0x50,0x03,0x13,0x03,0x04,0x03,0x24};
unsigned int count_f=0;//频率产生
unsigned int dat_f=0;//一秒总频率
unsigned char count_t=0;//1秒计时
unsigned int count_flag=0;//3秒计时
unsigned int temp_x;//温度转换取得温度
unsigned char hot=30;//参数
unsigned char sun;//初始正常光照
unsigned char stat_led=0xff;//led状态
unsigned char flag=0;//亮暗状态检测
unsigned char cnt=0;//采集次数
unsigned char temp_new_display[100]=0;//实时采集温度
unsigned int temp_old[100]=0;
unsigned char i;//最大值平均值循环计数
unsigned int sum=0;//总值
unsigned int sum_junzhi=0;//温度平均值
unsigned int wet_junzhi=0;//湿度平均值
unsigned int wet_sum=0;//湿度总值
unsigned char temp_max=0;//温度最大值
unsigned char wet_max=0;//湿度最大值
unsigned char wet_new[100]=0;//实时采集湿度
unsigned int temp_new_noeffect=0;
unsigned char hour,min=0;
unsigned char count_long=0;
unsigned char S9_flag=0;
unsigned char stat_led4=0;
unsigned char count_led=0;
/************************电压采集********************/
unsigned char Get_Pcf8591()
{
unsigned int x;
I2CStart();
I2CSendByte(0x90);
I2CWaitAck();
I2CSendByte(0x41);
I2CWaitAck();
I2CStart();
I2CSendByte(0x91);
I2CWaitAck();
x=I2CReceiveByte();
I2CSendAck(1);
I2CStop();
return x;
}
void Time555()
{
TMOD=0x16;
TH0=0xff;
TL0=0xff;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
EA=1;
ET0=1;
ET1=1;
TR0=1;
TR1=1;
}
void Service_count()interrupt 1
{
count_f++;
}
void Service_timer()interrupt 3
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
count_t++;
if(count_t==20)
{
dat_f=count_f;
count_t=0;
count_f=0;
}
if(S9_flag==1)//S9按下
{
count_long++;//开始计数
}
if(flag==1)//定时器内检测状态,开始3秒计时。
{
count_flag++;
if(count_flag==60)
{
flag=0;
count_flag=0;
}
}
if(stat_led4==1)
{
count_led++;
stat_led&=~0x08;
if(count_led==2)
{
count_led=0;
stat_led|=0x08;
}
select573(4,stat_led);
}
}
/************************时间采集********************/
void Write_1302()
{
unsigned char i;
Write_Ds1302_Byte(0x8e,0x00);
for(i=0;i<7;i++)
{
Write_Ds1302_Byte(Wr_time[i],Timer[i]);
}
Write_Ds1302_Byte(0x8e,0x80);
}
void Read_1302()
{
unsigned char i;
for(i=0;i<7;i++)
{
Timer[i]=Read_Ds1302_Byte(Re_time[i]);
}
}
/*************************初次温度读取**************/
void Initds18b20()
{
unsigned char LSB,MSB;
init_ds18b20();
Write_DS18B20(0

最低0.47元/天 解锁文章
2万+

被折叠的 条评论
为什么被折叠?



