首先说下我所用到的主要器件器件: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< AT24C08_SCL_0(); return t; } /************************************************************** 隶属模块:AT24C08存储模块 函数名称:AT24C08_Read_Byte() 函数功能: 读函数 入口参数: 无 返回参数:dat 修改时间: 2011-7-10 修改者: 彭瑞 ***************************************************************/ uchar AT24C08_Read_Byte() { uchar i,dat; AT24C08_SDA_1();AT24C08_SCL_1(); for(i=0;i<8;i++) { dat<<=1; AT24C08_SCL_1(); if((AT24C08_CONT & (1< AT24C08_SCL_0(); } AT24C08_Ack(); return dat; } /************************************************************** 隶属模块:AT24C08存储模块 函数名称:AT24C08_Write_One_Dat(uchar add,uchar dat) 函数功能: 写一字节函数 入口参数: add,dat 返回参数:无 修改时间: 2011-7-10 修改者: 彭瑞 ***************************************************************/ int AT24C08_Write_One_Dat(uchar add,uchar dat) { EA=0; AT24C08_Start(); if(AT24C08_Writ_Byte(sla))return 0; if(AT24C08_Writ_Byte(add))return 0; if(AT24C08_Writ_Byte(dat))return 0; AT24C08_Stop(); AT24C08_Delay1ms(10); EA=1; return 1; } /************************************************************** 隶属模块:AT24C08存储模块 函数名称:AT24C08_Write_Mul_Dat(uchar add,uchar dat) 函数功能: 写多字节函数 入口参数: add,dat 返回参数:无 修改时间: 2011-7-10 修改者: 彭瑞 ***************************************************************/ void AT24C08_Write_Mul_Dat(uchar add,uchar *s,uchar n) { uchar i; EA=0; for(i=0;i {while(!AT24C08_Write_One_Dat(add+i,s[i])); } EA=1; } /************************************************************** 隶属模块:AT24C08存储模块 函数名称:AT24C08_Read_One_Dat(uchar add) 函数功能: 读一字节函数 入口参数: add,dat 返回参数:无 修改时间: 2011-7-10 修改者: 彭瑞 ***************************************************************/ int AT24C08_Read_One_Dat(uchar add) { EA=0; AT24C08_Start(); if(AT24C08_Writ_Byte(sla))return 0; if(AT24C08_Writ_Byte(add))return 0; AT24C08_Start(); if(AT24C08_Writ_Byte(sla|0x01))return 0; dat1=AT24C08_Read_Byte();AT24C08_NO_Ack(); AT24C08_Stop(); EA=1; return 1; } /************************************************************** 隶属模块:AT24C08存储模块 函数名称:AT24C08_Read_Mul_Dat(uchar add) 函数功能: 读多字节函数 入口参数: add,s,n 返回参数:无 修改时间: 2011-7-10 修改者: 彭瑞 ***************************************************************/ void AT24C08_Read_Mul_Dat(uchar add,uchar *s,uchar n) { uchar i; EA=0; for(i=0;i { while(!AT24C08_Read_One_Dat(add+i)); s[i]=dat1; } EA=1; } /************************************************************** 隶属模块:AT24C08存储模块 函数名称:AT24C08_Clear() 函数功能: 清空 入口参数: 无 返回参数:无 修改时间: 2011-7-10 修改者: 彭瑞 ***************************************************************/ void AT24C08_Clear() { uchar i; EA=0; for(i=0;i<256;i++) { AT24C08_Write_One_Dat(i,0xff); } EA=1; } /********************************************* 温度采集部分 *********************************************/ void delay(uint count) //delay { uint i; while(count) { i=200; while(i>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< #define AT24C08_SDA_0() AT24C08_CONT &=~(1< #define AT24C08_SCL_1() AT24C08_CONT |= (1< #define AT24C08_SCL_0() AT24C08_CONT &=~(1< /*unsigned char code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd, 0x87,0xff,0xef}; */ void AT24C08_Start();//开始 void AT24C08_Stop();//结束 void AT24C08_Ack();//应答 void AT24C08_NO_Ack();//无应答 uchar AT24C08_Writ_Byte(uchar dat);//写数据 uchar AT24C08_Read_Byte();//读数据 int AT24C08_Write_One_Dat(uchar add,uchar dat);//写一字节数据 void AT24C08_Write_Mul_Dat(uchar add,uchar *s,uchar n);//写多字节数据 int AT24C08_Read_One_Dat(uchar add);//读一字节数据 void AT24C08_Read_Mul_Dat(uchar add,uchar *s,uchar n);//读多字节数据 void AT24C08_Clear();//清存储空间数据 void AT24C08_Delay1ms(uint x);//延时1ms /****************串口通信*********************/ void RS232_Init(); void USART_Transmit(unsigned char buf); void delay(uint count); void display(uint temp);//数码管先显示 #endif
上一篇:STC89C52串口应用实例
下一篇:单片机利用串口通信传送温度
推荐阅读最新更新时间:2024-03-16 16:06