首先说下我所用到的主要器件器件:STC89C52,AT24C08,DS18B20,MAX232
实验源代码:
//接上18B20温度传感器(另购)后数码管显示出当前温度
#include
#include
#include
#define uchar unsigned char
#define uint unsigned int
sbit DS=P1^0; //define interface
uint temp; // variable of temperature
uchar flag,dat1; // sign of the result positive or negative
uchar code table[]={
0xC0,0xF9,0xA4,0xB0,
0x99,0x92,0x82,0xF8,
0x80,0x90,0x88,0x83,
0xC6,0xA1,0x86,0x8E};
/*uchar code table1[]={
0x40,0x79,0x24,0x30,
0x19,0x12,0x02,0xF8,
0x80,0x90,0x88,0x83,
0xC6,0xA1,0x86,0x8E};*/
sbit wela1 = P1^4;
sbit wela2 = P1^5;
sbit wela3 = P1^6;
/*unsigned char code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,
0x87,0xff,0xef};
*/
/*********************************************
串口通信部分
*********************************************/
void RS232_Init()
{
TMOD=0x20;//设置定时器1为工作方式2
TH1=0xfd;
TL1=0xfd;
TR1=1;
REN=1;
SM0=0;
SM1=1;
EA=1;
ES=1;
}
/*-----------------------发送数据函数----------------------------*/
void USART_Transmit(unsigned char buf)
{
SBUF=buf; //发送数据
while(TI==0); //等待发送结束
TI=0; //清除发送结束标志
}
/*********************************************
AT24C08读写部分
********************************************/
/**************************************************************
隶属模块:AT24C08存储模块
函数名称:AT24C08_Delay1ms(uint x)
函数功能: 延时1ms
入口参数: x
返回参数:无
修改时间: 2011-7-10
修改者: 彭瑞
***************************************************************/
void AT24C08_Delay1ms(uint x)
{
uint i;
while(x--)
for(i=0;i<165;i++);
}
/**************************************************************
隶属模块:AT24C08存储模块
函数名称:AT24C08_Start()
函数功能: 起始函数
入口参数: 无
返回参数:无
修改时间: 2011-7-10
修改者: 彭瑞
***************************************************************/
void AT24C08_Start()
{AT24C08_SDA_1();AT24C08_SCL_1();NOP();AT24C08_SDA_0();NOP();AT24C08_SCL_0();}
/**************************************************************
隶属模块:AT24C08存储模块
函数名称:AT24C08_Stop()
函数功能: 停止函数
入口参数: 无
返回参数:无
修改时间: 2011-7-10
修改者: 彭瑞
***************************************************************/
void AT24C08_Stop()
{AT24C08_SDA_0();AT24C08_SCL_1();NOP();AT24C08_SDA_1();NOP();AT24C08_SCL_0();}
/**************************************************************
隶属模块:AT24C08存储模块
函数名称:AT24C08_Ack()
函数功能: 应答函数
入口参数: 无
返回参数:无
修改时间: 2011-7-10
修改者: 彭瑞
***************************************************************/
void AT24C08_Ack()
{AT24C08_SDA_0();NOP();AT24C08_SCL_1();NOP();AT24C08_SCL_0();}
/**************************************************************
隶属模块:AT24C08存储模块
函数名称:AT24C08_NO_Ack()
函数功能: 无应答函数
入口参数: 无
返回参数:无
修改时间: 2011-7-10
修改者: 彭瑞
***************************************************************/
void AT24C08_NO_Ack()
{AT24C08_SDA_1();AT24C08_SCL_1();NOP();AT24C08_SCL_0();}
/**************************************************************
隶属模块:AT24C08存储模块
函数名称:AT24C08_Writ_Byte(uchar dat)
函数功能: 写函数
入口参数: dat
返回参数:t
修改时间: 2011-7-10
修改者: 彭瑞
***************************************************************/
uchar AT24C08_Writ_Byte(uchar dat)
{
uchar i;
uchar t;
AT24C08_SDA_1();AT24C08_SCL_0();
for(i=0;i<8;i++)
{
if(dat&0x80)AT24C08_SDA_1();
else AT24C08_SDA_0();
AT24C08_SCL_1();NOP();
AT24C08_SCL_0();
dat<<=1;
}
NOP();
AT24C08_SDA_1();NOP();
AT24C08_SCL_1();NOP();
t=(AT24C08_CONT & (1<0)
i--;
count--;
}
}
void dsreset(void) //send reset and initialization command
{
uint i;
DS=0;
i=103;
while(i>0)i--;
DS=1;
i=4;
while(i>0)i--;
}
bit tmpreadbit(void) //read a bit
{
uint i;
bit dat;
DS=0;i++; //i++ for delay
DS=1;i++;i++;
dat=DS;
i=8;while(i>0)i--;
return (dat);
}
uchar tmpread(void) //read a byte date
{
uchar i,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tmpreadbit();
dat=(j<<7)|(dat>>1); //读出的数据最低位在最前面,这样刚好一个字节在DAT里
}
return(dat);
}
void tmpwritebyte(uchar dat) //write a byte to ds18b20
{
uint i;
uchar j;
bit testb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb) //write 1
{
DS=0;
i++;i++;
DS=1;
i=8;while(i>0)i--;
}
else
{
DS=0; //write 0
i=8;while(i>0)i--;
DS=1;
i++;i++;
}
}
}
void tmpchange(void) //DS18B20 begin change
{
dsreset();
delay(1);
tmpwritebyte(0xcc); // address all drivers on bus
tmpwritebyte(0x44); // initiates a single temperature conversion
}
uint tmp() //get the temperature
{
float tt;
uchar a,b;
dsreset();
delay(1);
tmpwritebyte(0xcc);//访问总线上的器件
tmpwritebyte(0xbe);//从器件上读取值
a=tmpread();
b=tmpread();
temp=b;
temp<<=8; //two byte compose a int variable
temp=temp|a;
tt=temp*0.0625;
temp=tt*10+0.5;//四舍五入
return temp;
}
void readrom() //read the serial
{
uchar sn1,sn2;
dsreset();
delay(1);
tmpwritebyte(0x33);
sn1=tmpread();
sn2=tmpread();
}
void delay10ms() //delay
{
uchar a,b;
for(a=10;a>0;a--)
for(b=60;b>0;b--);
}
void display(uint temp) //显示程序
{
uchar A1,A2,A2t,A3;
A1=temp/100;
A2t=temp%100;
A2=A2t/10;
A3=A2t%10;
wela3=1;
P2=table[A1]; //显示百位
delay(1);
wela3=0;
wela2=1;
P2=table[A2]-0x80; //显示十位
delay(1);
wela2=0;
wela1=1;
P2=table[A3]; //显示个位
delay(1);
wela1=0;
}
void main()
{
uint i;
uchar a,dat;
RS232_Init();
tmpchange();
// delay(200);
//for(a=10;a>0;a--)
//{
//display(tmp());
//}
for(i=0;i<1024;i++){
tmpchange();
dat=400-tmp();
AT24C08_Write_One_Dat(i,dat);
for(a=20;a>0;a--)
display(400-dat);
}
do{
display(888);
if(flag==1)
{
ES=0;
flag=0;
for(i=0;i<1024;i++){
AT24C08_Read_One_Dat(i);
USART_Transmit(dat1);
}
ES=1;
}
}while(1);
}
/*---------------------发送字符串函数--------------------------*/
void USART_Transmit_str() interrupt 4
{
uchar a;
RI=0;
// P1=SBUF;
a=SBUF;
flag=1;
}
AT24C08.h源代码:
#ifndef _short_type_H_
#define _short_type_H_
#define uchar unsigned char
#define uint unsigned int
#endif
#define sla 0xa0
#define NOP() _nop_();_nop_();_nop_();_nop_();_nop_()
#define AT24C08_CONT P1
#define AT24C08_SDA 2
#define AT24C08_SCL 1
#define AT24C08_SDA_1() AT24C08_CONT |= (1<
由于最近时间比较忙,这里过多的话就不说了。