//2011.11.5.22.17 最新
#include <STC89.H>
#include <stdio.h>
#include <math.h>
#include "i2c.h"
#include "1602.h"
#include "adc0832.h"
#include "1838.h"
#include <stdlib.h>
uchar gg;
bit flag2;
extern bit irpro_ok,irok;
sbit speak = P2^0;
sbit LED = P2^1;
int lim_up,lim_dow,alarms;
float temperature;
sbit IRIN = P3^2; //遥控输入脚
uint speak_f,led_f;
uchar IR_buf[4]={0x00,0x00,0x00,0x00};//IR_buf[0]、IR_buf[1]为用户码低位、用户码高位接收缓冲区
// IR_buf[2]、IR_buf[3]为键数据码和键数据码反码接收缓冲区
uchar idata temp_buf[16],up_buf[10],down_buf[10] ,alarms_buf[10];
uchar idata Str[7];
void key_task(void);
void EX0_init(void);//外部中断初始化
void Timer_init(void);//定时器初始化
void GetTemperature(void );//读取温度
void seri_init (void );
void main()
{
uchar kk,vb;
Timer_init();//初始化定时器0和1
EX0_init();
I2C_init();//I2C总线初始化函数声明
LCD_Init();//初始化液晶
DelayMs(20);//延时有助于稳定
LCD_Clear();//清屏
Lcd_User_Chr( );
seri_init ( );
LCD_Write_Char(14,0,0x01);
LCD_Write_Char(15,0,'C'); //写入字符C
while(!read_nbyte(0xae,1,&lim_up,2)); //从EEPROM中加载设置
while(!read_nbyte(0xae,4,&lim_dow,2));
while(!read_nbyte(0xae,6,&alarms,2));
while(1)//主循环
{
if(irok) //如果接收好了进行红外处理
{
Ircordpro();
irok=0;
}
if(irpro_ok) //如果处理好后进行工作处理,如按对应的按键后显示对应的数字等
{
Ir_work();
}
GetTemperature( );
sprintf(temp_buf,"Temp :%7.2f ",temperature);//转换温度值
sprintf(alarms_buf,"A:%d ", alarms); //转换温度下限
sprintf(up_buf,"H:%d ", lim_up); //转换温度上限
sprintf(down_buf,"L:%d ", lim_dow); //转换温度下限
if(temperature<=lim_dow||temperature>=lim_up) //报警条件
{
alarms++; //报警次数加1
while(!write_nbyte(0xae,6,&alarms,2)); //掉电保护
sprintf(alarms_buf,"A:%d ",alarms); //转换温度下限
while(temperature<=lim_dow||temperature>=lim_up)
{
GetTemperature( );
vb =1;
LED = 1;
flag2=1;
sprintf(temp_buf,"Temp :%7.2f ",temperature);//转换温度值
key_task( );
sprintf(alarms_buf,"A:%d ", alarms); //转换温度下限
sprintf(up_buf,"H:%d ", lim_up); //转换温度上限
sprintf(down_buf,"L:%d ", lim_dow);
Str[0] = lim_up;
Str[1] = lim_dow;
Str[2] = alarms;
Str[3] = (int)temperature/10;
Str[4] = (int)temperature%10;
Str[5] = (temperature-(int)temperature)*100;
Str[6] = vb;
if(irok) //如果接收好了进行红外处理
{
Ircordpro();
irok=0;
}
if(irpro_ok) //如果处理好后进行工作处理,如按对应的按键后显示对应的数字等
{
Ir_work();
}
}
}
LED = 1;
flag2 = 0;
speak =1;
vb =0;
key_task();
Str[0] = lim_up;
Str[1] = lim_dow;
Str[2] = alarms;
Str[3] = (int)temperature/10;
Str[4] = (int)temperature%10;
Str[5] = (temperature-(int)temperature)*100;
Str[6] = vb;
}
}
void Timer1_isr( ) interrupt 3
{
LCD_Write_String(0,0,temp_buf); //显示第一行
LCD_Write_String(0,1,up_buf); //显示第二行
LCD_Write_String(6,1,down_buf); //显示第二行
LCD_Write_String(12,1,alarms_buf);
TH1=(65536-65000)/256;
TL1=(65536-65000)%256;
if(flag2)
speak=~speak;
}
void key_task(void)
{
uchar num,old_key;
old_key=(P1&0Xf8);
if(old_key!=0xf8)
{
DelayMs(10);
if((P1&0Xf8)==old_key)
{
switch(old_key)
{
case 0xf0 : lim_up++;
sprintf(up_buf,"H:%d ",lim_up);
while((P1&0Xf8)==0xf0)
{
num++;
DelayMs(10);
if(num==160) //表示长按键操作
{
num=0;
while((P1&0Xf8)==0xf0)
{
DelayMs(120);
sprintf(up_buf,"H:%d ", lim_up);
lim_up++;
}
}
}
while(!write_nbyte(0xae,1,&lim_up,2)); //掉电保护
break;
case 0xe8 : lim_up--;
sprintf(up_buf,"H:%d ",lim_up);
while((P1&0Xf8)==0xe8)
{
num++;
DelayMs(10);
if(num==160) //表示长按键操作
{
num=0;
while((P1&0Xf8)==0xe8)
{
DelayMs(120);
sprintf(up_buf,"H:%d ", lim_up);
lim_up--;
}
}
}
while(!write_nbyte(0xae,1,&lim_up,2)); //掉电保护
break;
case 0xd8 : lim_dow++;
sprintf(down_buf,"L:%d ",lim_dow);
while((P1&0Xf8)==0xD8)
{
num++;
DelayMs(10);
if(num==160) //表示长按键操作
{
num=0;
while((P1&0Xf8)==0xd8)
{
DelayMs(120);
sprintf(down_buf,"L:%d ", lim_dow);
lim_dow++;
}
}
}
while(!write_nbyte(0xae,4,&lim_dow,2)); //掉电保护
break;
case 0xb8 : lim_dow--;
sprintf(down_buf,"L:%d ",lim_dow);
while((P1&0Xf8)==0xb8)
{
num++;
DelayMs(10);
if(num==160) //表示长按键操作
{
num=0;
while((P1&0Xf8)==0xb8)
{
DelayMs(120);
sprintf(down_buf,"L:%d ",lim_dow);
lim_dow--;
}
}
}
while(!write_nbyte(0xae,4,&lim_dow,2)); //掉电保护
break;
case 0x78 : alarms=0;
while(!write_nbyte(0xae,6,&alarms,2));
sprintf(alarms_buf,"A:%d ",alarms);
break;
default : break;
}
}
}
}
void Timer_init(void)
{
TMOD=0x12;
EA=1;
ET1=1;
TH1=(65536-65000)/256;
TL1=(65536-65000)%256;
TR1=1;
TH0=0x00; //重载值
TL0=0x00; //初始化值
ET0=1; //开中断
TR0=1;
PT0 =1; //此处的优先级的设置很重要
PX0=1;
}
void EX0_init(void)
{
IT0=1;
EX0=1;
IRIN=1;
}
void GetTemperature( )
{
float v1,v2,v3,v;
v=ADC_read(channel_0);
v=5.0/256*v;
v1=5.0/256*ADC_read(channel_0);
DelayMs(10);
v2=5.0/256*ADC_read(channel_0);
DelayMs(10);
v3=5.0/256*ADC_read(channel_0);
DelayMs(10);
v =(v1+v2+v3)/3;
temperature = 1.0/(1.0 /298.0161+1.0/4000*log(5/v-1))-273.15;
}
void seri_isf() interrupt 4
{
uchar Temp; //定义临时变量
if(RI) //判断是接收中断产生
{
RI=0; //标志位清零
Temp=SBUF;
if(Temp=='a')
lim_up++;
if(Temp=='b')
lim_up--;
if(Temp=='c')
lim_dow++;
if(Temp=='d')
lim_dow--;
if(Temp=='e')
alarms=0;
if(Temp=='s')
{
for(gg=0;gg<8;gg++)
{
SBUF= Str[gg];
while(!TI);
TI =0;
LED = ~LED;
}
}
}
if(TI)
{
TI=0;
}
}
void seri_init (void )
{
SCON = 0X50;
T2CON = 0X30;
T2MOD = 0X00;
RCAP2H =65500/256;//很给力的设置啊!!!
RCAP2L =65500%256;
ES = 1;
TR2 = 1;//启动定时器2
PCON = 0X00;
}
没有合适的资源?快使用搜索试试~ 我知道了~
danpianji-.zip_上位机报警
共45个文件
lst:7个
obj:7个
c:6个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 48 浏览量
2022-09-21
09:10:13
上传
评论
收藏 129KB ZIP 举报
温馨提示
采用51单片机,开发工具为KEIL.主要功能是实现一个多功能温度计。采用1602液晶显示和配合上位机软件共同完成环境温度的检测与报警功能。系统可以通过按键或者上位机修改报警温度上下限。并将数值保存在外置的EEPROM中,以便开机的时候自动加载。
资源推荐
资源详情
资源评论
收起资源包目录
danpianji-.zip (45个子文件)
单片机温度计上位机(含源码)
Form1.frm 23KB
工程1.vbp 735B
Form1.frx 5KB
chenyang.exe 44KB
MSSCCPRJ.SCC 190B
工程1.vbw 50B
单片机温度计
1838
1838.c 3KB
1838.h 94B
delay
delay.c 738B
delay.h 654B
24c02
i2c.c 3KB
i2c.h 303B
user
main.OBJ 28KB
sss.uvproj 14KB
main.c 7KB
main.uvopt 53KB
STARTUP.LST 14KB
sss.plg 213B
sss_uvproj.bak 14KB
1602.obj 12KB
main.plg 214B
sss_uvopt.bak 58KB
main.LST 16KB
sss 64KB
adc0832.lst 3KB
sss.uvopt 58KB
1602.lst 8KB
sss.lnp 133B
delay.lst 2KB
sss.hex 19KB
STARTUP.A51 6KB
delay.obj 1KB
1838.lst 6KB
main.uvproj 13KB
i2c.lst 7KB
1838.obj 10KB
STARTUP.OBJ 749B
main_uvopt.bak 53KB
i2c.obj 12KB
adc0832.obj 7KB
sss.M51 50KB
1602
1602.h 545B
1602.c 4KB
adc0832
adc0832.h 510B
adc0832.c 1KB
共 45 条
- 1
资源评论
寒泊
- 粉丝: 76
- 资源: 1万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功