📄 ds130218b20.c
字号:
#include <reg52.h> //268384947071
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
//gloable valuaue
uchar a=0;
//**1602端口
#define databus P0 //lcd数据口
sbit dc=P2^0; //寄存器选择,dc=1选数据;dc=0,选指令
sbit rw=P2^1; //读写选择,rw=1读;rw=0写
sbit cs=P2^2; //使能信号
//**1602端口
/************************************************************/
//**18B20端口
sbit DQ=P2^6; /*18b20操作命令代码 跳过ROM 0xCC 发送温度转换 0xBE 写EEPROM 0x4E*/
uchar decimalH[]={00,06,12,18,25,31,37,43,50,56,62,68,75,81,87,93};
uchar decimalL[]={00,25,50,75,00,25,50,75,00,25,50,75,00,25,50,75};
uchar ResultTemperatureH ,ResultTemperatureLH,ResultTemperatureLL;//整数,小数高位,小数低位
uchar ResultSignal;//符号位
bit dis_flag;
//**18B20端口
/************************************************************/
//**74165引脚连接
sbit sh_ld=P2^5;
sbit clk_165=P2^4;
sbit in=P2^3;
uchar dd[2]; //按键防止多加
//**74165引脚连接
/************************************************************/
//DS1302引脚连接
sbit T_clk=P1^0;
sbit T_io=P1^1;
sbit T_rst=P1^2;
uchar year_1302,month_1302,day_1302,week_1302,hour_1302,min_1302,sec_1302;
uchar set_year,set_month,set_day,set_week,set_hour,set_min,set_sec;
uchar disp[14];
uchar disp_set[14];
uchar set_flag=0;
uchar set_no=0;
uchar alarm=0;
sbit p27=P2^7;
//DS1302引脚连接
/************************************************************/
/**********lcd1602程序***********/
void lcd_delay5ms() //短延时函数
{
uint i=5552;
while(i--);
}
void wait_for_en() //lcd忙检测函数
{
databus=0xff;
cs=1;
dc=0;
rw=1;
_nop_();
_nop_();
_nop_();
while(databus&0x80)
{ cs=0;
_nop_();
_nop_();
cs=1;
_nop_();
_nop_();
}
cs=0;
}
void lcd_wrcmd(uchar lcdcmd,uchar attribc) //lcd写控制字
{
if(attribc) wait_for_en();
dc=0; rw=0; _nop_();
databus=lcdcmd; _nop_();
cs=1; _nop_(); _nop_();
cs=0;
}
void lcd_wrdata(uchar lcddata) //lcd写一个字节
{
wait_for_en();
dc=1; rw=0; _nop_();
databus=lcddata; _nop_();
cs=1; _nop_(); _nop_();
cs=0;
}
void lcdreset() //lcd复位
{
lcd_wrcmd(0x38,0); //
lcd_delay5ms();
lcd_wrcmd(0x38,0);
lcd_delay5ms();
lcd_wrcmd(0x38,0);
lcd_delay5ms();
lcd_wrcmd(0x38,1);
lcd_wrcmd(0x08,1);
lcd_wrcmd(0x01,1); //清零
lcd_wrcmd(0x06,1);
lcd_wrcmd(0x0c,1);
}
void locateXY(uchar posx,uchar posy) //lcd定位
{
posy&=1;
posx&=15;
if(posy) posx|=0x40; //若y为1(显示第二行),地址码+0X40
posx|=0x80; //指令码为地址码+0X80
lcd_wrcmd(posx,0);
}
void lcd_disonechar(uchar x,uchar y,uchar lcd_data) //在指定位置显示一个字符
{
locateXY(x,y);
lcd_wrdata(lcd_data);
}
void lcd_dis_string(uchar x,uchar y,uchar *ptr) //从指定开始显示字符串
{
uchar i,length=0;
while(ptr[length]!=0) {length++;}
for(i=0;i<length;i++)
{
lcd_disonechar(x++,y,ptr[i]);
if(x==16)
{
x=0;y=1;
}
}
}
/**********lcd1620程序***********/
/**************************18b20程序****************************/
void Delay15(uchar n)
{ do{ _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
_nop_(); _nop_(); _nop_(); _nop_(); _nop_();
_nop_(); _nop_(); _nop_();
n--;
}while(n);
}
void Delay10ms(uchar delay_num)
{
uchar i;
while(delay_num--)
{
for(i=0;i<125;i++)
{;}
}
}
unsigned char Read18B20(void)
{ uchar ch;
uchar q ;
for(q=0;q<8;q++)
{
ch=ch>>1;
DQ=0;
_nop_();
DQ=1;
_nop_();_nop_();_nop_();_nop_();
if(DQ==1) ch=ch|0x80;
else ch=ch&0x7f;
Delay15(3);
DQ=1;
}
return (ch);
}
void Write18B20(uchar ch)
{ uchar i;
for(i=0;i<8;i++)
{
DQ=0;
Delay15(1);
DQ=ch&0x01;
Delay15(3);
DQ=1;
ch=ch>>1;
_nop_();
}
}
void Init18B20(void)
{ DQ=0;
Delay15(33);//至少延时480us
DQ=1;
Delay15(10);//至少延时100us
/*if(DQ==1) return 0; //初始化失败
else return 1;
DQ=1; Delay15(18); */
}
void covert_18b20()
{
uchar TemH,TemL;//k=0;
Init18B20();
Write18B20(0xCC);//跳过ROM
_nop_();
//Write18B20(0x4E);//写EEPROM
// Write18B20(0x00);//Th
//Write18B20(0x00);//Tl
Write18B20(0x7f);//12 bits温度分辨率
Init18B20();
Write18B20(0xCC);//跳过ROM
_nop_();
Write18B20(0x44);//发送温度转换指令
Delay10ms(25);
Delay10ms(25);
Delay10ms(25);
Delay10ms(25);//等待1s转换
Init18B20();
Write18B20(0xCC);//跳过ROM
Write18B20(0xBE);//发送温度转换指令
TemL=Read18B20(); //读低位温度值
TemH=Read18B20(); //读高位温度值
Delay10ms(2);
TemH=(TemH<<4)|(TemL>>4);
TemL=TemL&0x0f; //取低4位
if(TemH&0x80)
{ TemH=~TemH+1;
TemH&=0x7f;
if(TemL!=0) TemH-=1;
TemL=~TemL+1;
TemL&=0x0f;
ResultSignal=1; //负
}
else ResultSignal=0; //正
ResultTemperatureLH=decimalH[TemL];
ResultTemperatureLL=decimalL[TemL];
ResultTemperatureH=TemH;
}
void Display_18b20(void)
{
uchar i,j,q;
q=ResultTemperatureH/100;
i=ResultTemperatureH/10%10;
j=ResultTemperatureH%10;
// lcd_dis_string(8,1,"T:");
lcd_dis_string(8,1," ");
if(ResultSignal) lcd_disonechar(9,1,'-');
else lcd_disonechar(9,1,'+');
if(q!=0) {
lcd_disonechar(10,1,q|0x30);lcd_disonechar(11,1,i|0x30);
lcd_disonechar(12,1,j|0x30); lcd_disonechar(13,1,'.');
lcd_disonechar(14,1,(ResultTemperatureLH/10)|0x30);
lcd_disonechar(15,1,(ResultTemperatureLH%10)|0x30);
}
else if(q==0&&i!=0) {
lcd_disonechar(10,1,i|0x30);lcd_disonechar(11,1,j|0x30);
lcd_disonechar(12,1,'.');
lcd_disonechar(13,1,(ResultTemperatureLH/10)|0x30);
lcd_disonechar(14,1,(ResultTemperatureLH%10)|0x30);
lcd_disonechar(15,1,(ResultTemperatureLL/10)|0x30);
}
else if(q==0&&i==0) {
lcd_disonechar(10,1,j|0x30);
lcd_disonechar(11,1,'.');
lcd_disonechar(12,1,(ResultTemperatureLH/10)|0x30);
lcd_disonechar(13,1,(ResultTemperatureLH%10)|0x30);
lcd_disonechar(14,1,(ResultTemperatureLL/10)|0x30);
lcd_disonechar(15,1,(ResultTemperatureLL%10)|0x30);
}
}
/**************************18b20程序****************************/
/******************************************************/
/**************************1302程序****************************/
//-----延时
void delay(uchar n)
{
uchar i,j;
for(i=0;i<n;i++)
for(j=0;j<n;j++);
}
void v_RTinputByte(uchar indata)
{
uchar i;
for(i=8;i>0;i--)
{
if((indata&0x01)!=0) T_io=1; else T_io=0;
T_clk=1;T_clk=0;delay(4);
indata>>=1;
}
}
uchar v_RToutputByte()
{
uchar i,da=0;
for(i=8;i>0;i--)
{
if(T_io!=0) da=da|0x80;
else da=da|0x00;
if(i>1) da>>=1;
T_clk=1;T_clk=0;delay(4);
}
return (da);
}
//-----读1302某个地址的数据---------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -