首先說下我所用到的主要器件器件:STC89C52,AT24C08,DS18B20,MAX232
實驗源代碼:
#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串口應用實例
下一篇:單片機利用串口通信傳送溫度
推薦閱讀
史海拾趣