📄 zpfinaln.c
字号:
/******************************************************************************/
/**
/** 功能描述:通过AT89S/C52,11.0592MHz,DS18B20和6位数码管,采集温度并在数码管上实时显示。
/** 并有相应的不同颜色的led和蜂鸣器指示。
/** 创 建 人:chiusir@yahoo.cn 日期:2008-04-06 */
/** 修 改 人: 日期:2008-04-18 */
/** 其他说明:
/******************************************************************************/
#include<regx51.h>
#include <intrins.h>
#define U8 unsigned char
#define U16 unsigned int
sbit SIO = P2^0;
sbit redled =P3^0;
sbit greenled =P3^1;
sbit blueled =P3^2;
sbit BZ =P3^3;
//0,1,2,3,4,5,6,7,8,9,-
U8 code LED_IMG[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};
/*******************************************************************************
*** 函 数 名: void DLY_us(U8 x)
*** 功能描述: 微秒级延时;
*** 全局变量: NO !
*** 输 入: x !
*** 输 出: NO !
*** 修 改 人: 日期:2008-04-18
*** 函数说明:
*** //1-5,2-7,3-9 ,5--16.5us,10-30.4,22-52,25-58,35-78,61-125,125-250,250--500us
/******************************************************************************/
void DLY_us(U8 x) //x取值1~255;
{
while(--x);
}
/*******************************************************************************
*** 函 数 名: void DLY_ms(U16 x)
*** 功能描述: 毫秒级延时;
*** 全局变量: NO !
*** 输 入: U16 x !
*** 输 出: NO !
*** 修 改 人: 日期:2008-04-18
*** 函数说明:
/******************************************************************************/
void DLY_ms(U8 x) //x取值1~255;
{
U8 i,j;
for(i=0;i<x;i++)
for(j=0;j<200;j++)
{
_nop_();
_nop_();
}
}
/*******************************************************************************
*** 函 数 名: void Init1820()
*** 功能描述:
*** 全局变量: NO !
*** 输 入: NO !
*** 输 出: NO !
*** 修 改 人: 日期:2008-04-18
*** 函数说明:
/******************************************************************************/
void Init1820()
{
SIO = 1;
_nop_();
SIO = 0; //拉低数据线,准备Reset OneWire Bus;
DLY_us(125); //延时500us,Reset One-Wire Bus.
DLY_us(125);
SIO = 1; //提升数据线;
DLY_us(15); //延时35us;
while(SIO) //等待Slave 器件Ack 信号;
{
_nop_();
}
DLY_us(60); //延时125us;
SIO = 1; //提升数据线,准备数据传输;
}
/*******************************************************************************
*** 函 数 名: static void DS18B20_WR(U8 cmd)
*** 功能描述: 写一个字节;
*** 全局变量: NO !
*** 输 入: cmd:8bit;
*** 输 出: NO !
*** 函数说明: cmd主要有Rom操作指令和E2Ram操作指令两种;
/******************************************************************************/
void WR1820(U8 cmd)
{
U8 i;
for(i=0;i<8;i++)
{
if(cmd & 0x01) //低位在前;
{
SIO = 0; //结束Recovery time;
_nop_();
_nop_();
_nop_();
SIO = 1;
} //发送数据;
else
SIO = 0; //结束Rec time;
_nop_();
_nop_();
_nop_();
//SIO = 0; } //发送数据;
DLY_us(30); //等待Slave Device采样;
SIO = 1; //Recovery;
_nop_(); //Recovery Time Start;
cmd >>= 1;
}
}
/*******************************************************************************
*** 函 数 名: U8 RD1820(void)
*** 功能描述: 读取一个字节;
*** 全局变量: NO !
*** 输 入: NO !
*** 输 出: 8bit data;*
*** 函数说明: 读之前必须首先写1;
/******************************************************************************/
U8 RD1820(void)
{
U8 i;
U8 tmp=0;
SIO = 1;
_nop_(); //准备读;
for(i=0;i<8;i++)
{
tmp >>= 1; //低位先发;
SIO = 0; //Read init;
_nop_(); //1us;
SIO = 1; //必须写1,否则读出来的将是不预期的数据;
DLY_us(2); //延时7us;
_nop_();
if(SIO) //在12us处读取数据;
tmp |= 0x80;
DLY_us(30); //延时55us;
SIO = 1;
_nop_(); //恢复One Wire Bus;
}
return tmp;
}
/*******************************************************************************
*** 函 数 名: U16 RD_T();
*** 功能描述: 读取温度;
*** 全局变量: NO !
*** 输 入: NO !
*** 输 出: 16bit data;
*** 函数说明: 读之前必须首先写1;
/******************************************************************************/
U16 RD_T()
{
U16 tp;
U8 tmbuf[2];
Init1820();
WR1820(0xcc);
//delay_ms(2);
WR1820(0x44);
// _nop_();
// SIO=1;
// delay_ms(250); //多个1820时要延时,单个就不用,数据手册里看
// delay_ms(250);
// delay_ms(250);
Init1820();
WR1820(0xcc);
WR1820(0xbe);
tmbuf[0]=RD1820();
tmbuf[1]=RD1820();
Init1820();
tp=tmbuf[1]*256+tmbuf[0];
return(tp);
}
/*******************************************************************************
*** 函 数 名: void Show_8LED(U16 dig)
*** 功能描述: 把数字转化为5位LED显示
*** 全局变量: NO !
*** 输 入: 从DB18B20读取的16位原始数据:低11位数据位,高5位为符号位!
//0,1,2,3,4,5,6,7,8,9,-
U8 code LED_IMG[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};
P0.0--4依次为符号位,百位,十位,个位,十分为,百分位
P1接8段数码管
*** 输 出: NO !
*** 函数说明:
/******************************************************************************/
void Show_8LED(int tmv)
{
U8 ge,shi,bai,shifen,baifen,neg=0;
if(tmv<0)
{
tmv=-tmv;
neg=1;
}
bai=tmv/10000;
shi=(tmv%10000)/1000;
ge =(tmv%1000)/100;
shifen=(tmv%100)/10;
baifen=tmv%10;
for(tmv=0;tmv<80;tmv++)
{
if(neg)
{
P0=0x01; //符号位
P1=LED_IMG[10];
DLY_ms(3); //this is the smallest interval
}
P0=0x02;
P1=LED_IMG[bai]|0X80;
DLY_ms(3);
P0=0x04;
P1=LED_IMG[shi]|0X80;
DLY_ms(3);
P0=0x08;
P1=LED_IMG[ge]&0x7f; //dot always.
DLY_ms(3);
P0=0x10;
P1=LED_IMG[shifen]|0X80;
DLY_ms(3);
P0=0x20;
P1=LED_IMG[baifen]|0X80;
DLY_ms(3);
P1=0xff;
}
}
/*******************************************************************************
*** 函 数 名: void Beep(U16 cnt)
*** 功能描述: 蜂鸣器鸣响
*** 全局变量: NO !
*** 输 入: CNT-时间长短 !
*** 输 出: NO !
*** 函数说明:
/******************************************************************************/
void Beep(U16 cnt)
{
while(cnt--)
{
BZ=1;
DLY_us(200); //
BZ=0;
DLY_us(50);
}
}
/*******************************************************************************
**** main()
*******************************************************************************/
void main(void)
{
U16 y;
float x;
U8 neg_flag=0,i;
P0=0xff;
P1=0x00;
P3=0xff;
DLY_ms(250);
P3=0x00; //cancel noise
for(i=0;i<6;i++) //1.5s
{
DLY_ms(250);
}
Show_8LED(-12345);
DLY_ms(250);
DLY_ms(250);
Show_8LED(-6789);
DLY_ms(250);
DLY_ms(250);
while(1)
{
y=RD_T();
if(y<2001)
{
neg_flag=0;
y&=0x07ff;
}
else
{
neg_flag=1;
y=~y+1;
}
x=y*6.25;
if(neg_flag)
x=-x;
Show_8LED((int)x);
P3|=0x07;
if(y<480) //30--480
greenled=0;
else if(y<615) //40--615
blueled=0;
else if(y<2001){ //60--960,
redled=0;
Beep(1000);
}
else
greenled=0;
for(i=0;i<8;i++) //2s
{
DLY_ms(250);
}
}
}
/*******************************************************************************
**** End Of File
*******************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -