2020-01-20 19:06发布
xiaoseaip 发表于 2015-4-7 11:13 把程序贴上来看看
chenhai 发表于 2015-4-7 20:37 其他功能按键都好着,就是复位键有问题,愁死我了
chenchaoting 发表于 2015-4-7 20:39 你确定你的按钮没装反?用万用表试试是不是按下通,放开断
chenhai 发表于 2015-4-7 20:10 这是完整的电路图,谢谢了
最多设置5个标签!
程序有点多,我就贴个main.c了
/*******************************************************************************
* 文件名 : 18B20数字温度计加DS1302实时显示时间
* 说明 : LCD1602显示温度值及当前时间。
*******************************************************************************/
#include <reg51.h>
#include "lcd.h"
#include "temp.h"
#include "ds1302.h"
#include "at24c02.h"
#include "key.h"
/*******************************************************************************/
unsigned char address,_Caiyang,address_1;//温度数据保存初始地址;采样时间;按键操作地址值
unsigned int reserve_time,Set_time=1200;
void _interrupt(void);//中断配置
void reserve_data(void);//保存数据
void anjian(void); //按键操作
/*******************************************************************************
* 函数名 : void main(void)
* 函数功能 : 主函数
* 输入 : 无
* 输出 : 无
*******************************************************************************/
void main(void)
{
_interrupt();
LcdInit(); //初始化LCD1602
Ds1302Init(); //初始化DS1302
LcdDisplay_temp(Ds18b20ReadTemp()); //1602显示温度初始值
while(1)
{
// if(_Caiyang>=100) //_Caiyang=100,则采样时间为5秒
// {
LcdDisplay_temp(Ds18b20ReadTemp());//lcd实时显示当前温度值
// _Caiyang = 0;//重新计数
// }
Ds1302ReadTime(); //读取时间
LcdDisplay_1302(); //lcd实时显示当前时间
reserve_data();
if(KeyScan()==4)
anjian();
}
}
/*******************************************************************************
* 函数名 : void reserve_data(unsigned int reserve_time,unsigned int Set_time)
* 函数功能 : 温度数据保存函数
* 输入 :无
* 输出 : 无
*******************************************************************************/
void reserve_data(void) //1分钟保存一次数据
{
if(reserve_time>=Set_time)
{
At24c02Write_temp(address,Ds18b20ReadTemp());//
reserve_time = 0;
if(address==254)
{
address = 0;
}
address += 2;
}
}
/*******************************************************************************
*函数名 : void _interrupt(void)
*函数功能 : 中断配置函数
*输入 : 无
*输出 : 无
*******************************************************************************/
void _interrupt(void)
{
TMOD=0x01; //定时器0工作方式1,16位计时器
TH0=(65536-50000)/256; //50毫秒中断一次
TL0=(65536-50000)%256;
EA=1; //开总中断
ET0=1; //定时器0中断允许
//EX0=1; //外部中断INT0的中断允许
TR0=1; //允许定时器0计数
//IT0 = 0; //低电平触发中断
}
/*******************************************************************************
*函数名 : void anjian(void)
*函数功能 : 按键操作函数
*输入 : 无
*输出 : 无
*******************************************************************************/
void anjian(void)
{
while(1)
{
if(KeyScan()==1)
{
if(address_1==254)
{
address_1=0;
}
address_1 = address_1+2;
}
if(KeyScan()==2)
{
if(address_1==0)
{
address_1=254;
}
address_1 = address_1-2;
}
if(KeyScan()==3)
{
break;
}
LcdDisplay_temp(At24c02Reading_temp(address_1));//lcd显示当前地址中保存的温度数据
//LcdDisplay_temp(At24c02Reading_temp(address_1));
Ds1302ReadTime(); //读取时间
LcdDisplay_1302(); //lcd实时显示当前时间
}
}
/*******************************************************************************
*函数名 : void time0() interrupt 1
*函数功能 : 定时器重装初始值
*输入 : 无
*输出 : 无
*******************************************************************************/
void time0() interrupt 1
{
TH0=(65536-50000)/256; //高八位,装入初值
TL0=(65536-50000)%256; //低八位,装入初值
_Caiyang++; //每50毫秒_Caiyang加1,最多加到255
reserve_time++; //每50毫秒reserve_time加1,最多加到65535
}
你确定你的按钮没装反?用万用表试试是不是按下通,放开断
已经用万用表测过了,没有按下去时,9脚和vcc是不通的,按下去时才是通着的
单纯看电路是没啥问题,会不会是元器件的问题
一周热门 更多>