#include "reg52.h"
#include "intrins.h"
#include "LCD1602.h"
#include "LCD1602.c"
#define uchar unsigned char
#define uint unsigned int
#define DATA P1
sbit START=P3^2; //启动信号
sbit EOC=P3^1; //转换结束信号
sbit OE=P3^0; //输出使能
sbit a=P3^5;
sbit b=P3^4;
sbit c=P3^3;
sbit set=P2^4;
sbit jia=P2^5;
sbit jian=P2^6;
sbit DQ=P2^3;
uchar flag=0;shi=10,fen=0,miao=50,set_flag;
uchar bai1,shi1,ge1;
uchar TD,flagDOT=0;
uchar tempH,tempL,num;//定义一些变量
uint voltage;
double data tvdata;
void delay(void) //????
{
uint i;
for(i=0;i<10;i++);
}
void delay_s(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void timer0_init() //定时器初始化
{
TMOD=0X01;//设置定时器0为工作方式一
TH0=(65536-50000)/256; //设置了50ms的初值从15536开始加
TL0=(65536-50000)%256;
ET0=1;//定时器T0允许位 开定时器0中段
TR0=1;//设置to允许控制位 启动定时器0
EA=1;//总中断
}
void delay_t(uint t)//延时函数
{
for(;t>0;t--);
}
void reset()//18b20复位信号
{
uchar presence=1;
while(presence)//等待18b20复位信号完成
{
while(presence)//等待18b20复位信号完成确定一下
{
DQ=1;_nop_();_nop_();
DQ=0;
delay_t(50);
DQ=1;
delay_t(6);
presence=DQ;
}
delay_t(45);
presence=~DQ;
}
DQ=1;
}
void write_byte(uchar val)//像18b20写值
{
uchar i;
for(i=8;i>0;i--)
{
DQ=1;_nop_();_nop_();
DQ=0;_nop_();_nop_();_nop_();_nop_();_nop_();
DQ=val&0x01;
delay_t(6);
val=val>>1;
}
DQ=1;
_nop_();
}
uchar read_byte(void)//像18b20读值
{
uchar i;
uchar value=0;
for(i=8;i>0;i--)
{
DQ=1;_nop_();_nop_();
value>>=1;
DQ=0;
_nop_();_nop_();_nop_();_nop_();
DQ=1;
_nop_();_nop_();_nop_();_nop_();
if(DQ)
value|=0x80;
delay_t(6);
}
DQ=1;
return(value);
}
void read_temp()//根据温度传感器的手册 读取温度
{
uchar ch1,ch2;
uchar tltemp;
flagDOT=0;
reset();
write_byte(0xcc);
write_byte(0x44);
reset();
write_byte(0xcc);
write_byte(0xbe);
ch1=read_byte();
ch2=read_byte();
if((ch2&0xf8)!=0x00)//判断高五位 得到温度正负标志
{
flagDOT=1;
ch1=~ch1; //取反
ch2=~ch2; //取反
tltemp=ch1+1; //低位加1
ch1=tltemp;
if(tltemp>255) ch2++; //如果低8位大于255,向高8位进1
tempH=ch2*16+ch1/16; //实际温度值=(TH*256+TL)/16,即:TH*16+TL/16
//这样得出的是温度的整数部分,小数部分被丢弃了
tempL=(ch1%16)*10/16; //计算温度的小数部分,将余数乘以10再除以16取整,
}
tempH=ch2*16+ch1/16; //实际温度值=(TH*256+TL)/16,即:TH*16+TL/16
//这样得出的是温度的整数部分,小数部分被丢弃了
tempL=(ch1%16)*10/16; //计算温度的小数部分,将余数乘以10再除以16取整,
//这样得到的是温度小数部分的第一位数字(保留1位小数)
num=(ch2<<4)|(ch1>>4);
tempH=num/10;
tempL=num-tempH*10;
TD=(ch1%16)*10/16;
}
void show_main_face()
{
WriteAddress(0x00);
Print("time: : : ");
WriteAddress(0x40);
Print("V: . ");
WriteAddress(0x47);
Print("Temp: . ");
}
void keyscan()
{
if(jia==0)
{
delay_s(5);
if(jia==0)
{
switch(set_flag)
{
case 1:shi++; if(shi==23)shi=0; WriteAddress(0x05);
WriteData(shi/10+0x30);
WriteData(shi%10+0x30);
WriteAddress(0x06);
Write_com(0x0f);break;
case 2:fen++; if(fen==59)fen=0; WriteAddress(0x08);
WriteData(fen/10+0x30);
WriteData(fen%10+0x30);
WriteAddress(0x09);
Write_com(0x0f);break;
case 3:miao++;if(miao==59)miao=0;WriteAddress(0x0b);
WriteData(miao/10+0x30);
WriteData(miao%10+0x30);
WriteAddress(0x0c);
Write_com(0x0f);break;
}
}
while(!jia);
}
if(jian==0)
{
delay_s(5);
if(jian==0)
{
switch(set_flag)
{
case 1:shi--; if(shi==0)shi=23; WriteAddress(0x05);
WriteData(shi/10+0x30);
WriteData(shi%10+0x30);
WriteAddress(0x06);
Write_com(0x0f);break;
case 2:fen--; if(fen==0)fen=59; WriteAddress(0x08);
WriteData(fen/10+0x30);
WriteData(fen%10+0x30);
WriteAddress(0x09);
Write_com(0x0f);break;
case 3:miao--;if(miao==0)miao=59;WriteAddress(0x0b);
WriteData(miao/10+0x30);
WriteData(miao%10+0x30);
WriteAddress(0x0c);
Write_com(0x0f);break;
}
}
while(!jian);
}
}
void fun()
{
a=0;b=0;c=0;
START=1;
START=0;
while(EOC==0);
OE=1;
tvdata=P1;
OE=0;
delay();
voltage=(tvdata*5/255)*100;
}
void main()
{
//uchar temp;
LcdInt();
timer0_init();
Write_com(0x01); //清屏幕指令,将以前的显示内容清除
delay_s(5);
show_main_face();
while(1)
{
read_temp();//读取温度
//qian1=tempH/10;//将温度的值分离出来
bai1=tempH%10;
shi1=tempL;
ge1=TD;
//temp=tempH*10+tempL; //将温度合成
if(set==0)
{
delay_s(5);
if(set==0)
{
set_flag++;
if(set_flag==4)
set_flag=0;
switch(set_flag)
{
case 0:Write_com(0x0c);TR0=1;Write_com(0x01);delay_s(5);show_main_face();break;
case 1:TR0=0;WriteAddress(0x06);Write_com(0x0f);break;
case 2:WriteAddress(0x09);Write_com(0x0f);break;
case 3:WriteAddress(0x0c);Write_com(0x0f);break;
}
}
while(!set);
}
if(set_flag==0)
{
WriteAddress(0x05);
WriteData(shi/10+0x30);
WriteData(shi%10+0x30);
WriteAddress(0x08);
WriteData(fen/10+0x30);
WriteData(fen%10+0x30);
WriteAddress(0x0b);
WriteData(miao/10+0x30);
WriteData(miao%10+0x30);
WriteAddress(0x42);
WriteData(voltage/100+0x30);
WriteAddress(0x44);
WriteData(voltage%100/10+0x30);
WriteData(voltage%100%10+0x30);
WriteAddress(0x4c);
WriteData(bai1+0x30);
WriteAddress(0x4d);
WriteData(shi1+0x30);
WriteAddress(0x4f);
WriteData(ge1+0x30);
}
keyscan();
fun();
}
}
void timer0() interrupt 1 //中断号为1
{
unsigned char tt;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
tt++;
if(tt==20)
{
tt=0;
miao++;
if(miao==60)
{
fen++;
miao=0;
}
if(fen==60)
{
shi++;
fen=0;
}
if(shi==24)
{
shi=0;
}
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
程序.zip (18个子文件)
程序
LCD1602.h 303B
51程序.uvproj 14KB
51程序.uvgui.lumui 90KB
51程序.uvgui.29642 89KB
Objects
51程序.obj 25KB
51程序 22KB
51程序.lnp 95B
51程序.hex 7KB
51程序.build_log.htm 1007B
LCD1602.c 4KB
51程序.uvgui.Administrator 69KB
51程序.c 6KB
Listings
51程序.lst 13KB
51程序.m51 27KB
51程序.uvopt 5KB
仿真
Last Loaded 最小系统.DBK 107KB
最小系统.DSN 107KB
最小系统.PWI 1KB
共 18 条
- 1
资源评论
Lumu-i
- 粉丝: 42
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功