单片机89C52RC串口读取am2320温湿程序_第1页
单片机89C52RC串口读取am2320温湿程序_第2页
单片机89C52RC串口读取am2320温湿程序_第3页
单片机89C52RC串口读取am2320温湿程序_第4页
单片机89C52RC串口读取am2320温湿程序_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、/ AM 系列读 IIC 使用范例/单片机 : AT89S52 或 STC89C52RC/ 功能 :串口发送温湿度数据 波特率 9600/ 晶振 :12M (用户系统时钟如不是12M 请更改相关宏定义及注释的延时时间 )/ 编译环境 : Keil3/ 公司 :奥松电子/*/#include reg52.h#include #define USE_T2#define FOSC 12000000#define BAUD 9600/端口位定义,可修改sbit SDA=P1A0;sbit SCL=P1;/内部数据定义#define IIC_Add 0xB8/器件地址#define IIC_RX_Len

2、gth 15unsigned char IIC_TX_Buffer=0x03,0x00,0x04; / 读温湿度命令(无 CRC 校验) unsigned char IIC_RX_BufferIIC_RX_Length = 0x00;/ 读回的温湿度unsigned char Uart_RX_Buffer30 = 0x00; unsigned char *String;unsigned char WR_Flag;/字符串定义#define S_Function Function: 03 04#define S_Temp Temp:#define S_RH RH:#define S_CRCT C

3、RC: True#define S_CRCF CRC: Wrong#define S_Data Data: #define S_NotS Sensor Not Connectedvoid Ack(void);void NoAck(void); void delay10us(void) / 这个延时函数 要大于 5US 以上_nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_(); void delay1ms(unsigned int t)unsigned int i;unsigned int j;for(j=t;j0;j-) for(i=124;i

4、0;i-);void InitUART(void)unsigned int iTmpBaud;unsigned long lTmpBaud; iTmpBaud = 0;/首先选定定时器 2 作为波特率发生器 ,16位定时器 ,自动装载SCON = 0x50;/SM0 SM1 SM2 REN TB8 RB8 TI RI/0 1 0 1 0 00 0PCON = 0x00;/PCON 的地址是 87H, 这里 SMOD =0T2CON = 0x30;0T2MOD = 0x00;/TF2 EXF2 RCLK TCLK EXEN2 TR2 C(/T2) CP(/RL2) /0 0 1 1 0 0 0/

5、 / / / / / / T2OE DCEN/0 0 0 0 0 0 0 0/fosc = 22.1184M,6T: 144, 设置波特率/(RCAP2H,RCAP2L) = 65536- fosc/(n*Baud) 。 n:32(12T-mode),16:(6T-mode) lTmpBaud = FOSC/BAUD;lTmpBaud /= 32;/12T-modeiTmpBaud = lTmpBaud & 0xFFFF;iTmpBaud = 65536 - iTmpBaud;RCAP2H = (iTmpBaud8) & 0x0FF;RCAP2L = iTmpBaud & 0x0FF;RI =

6、 0;/清除接收中断标志REN = 1;/允许串行接收ES = 1;/允许串行中断TR2 = 1;/启动定时器 1EA=1;/ 开总中断/串口发送void UARTSend(char UCHAR)SBUF=UCHAR;while(TI=0);TI=0;void UARTRead(void) interrupt 4char temp;if(RI)RI=0;temp = SBUF;/*/送起始位 sda=1-0void I2C_Start()SDA=1;SCL=1;delay10us();SDA=0;delay10us();SCL=0;/*/送停止位 sda=0-1void I2C_Stop()S

7、DA=0;delay10us();SCL=1;delay10us();SDA=1;/*/主应答 ( 包含 ack:sda=0 和 no_ack:sda=0) void Ack(void) / 设置 SDA 口为输出SDA=0;SCL=0; delay10us();SCL=1;delay10us();SCL=0;SDA=1;void NoAck(void) / 设置 SDA 口为输出 SDA=1;SCL=0; delay10us();SCL=1; delay10us();SDA=1;SCL=0;/ 检测 SDA 是否回 ACK bit Test_Ack() / 设置 SDA 口为输入 bit A

8、CK_Flag=0; SCL=0;SDA=1; delay10us();SCL=1; delay10us(); if(SDA=0)ACK_Flag = 1;elseACK_Flag = 0;SCL=0;return ACK_Flag;/* /字节发送程序/发送C(可以是数据也可是地址),送完后接收从应答 /不考虑从应答位 void SendData(unsigned Char buffer) unsigned Char BitCnt=8;/ 一字节 8 位/设置 SDA 口为输出doSCL=0; delay10us();if(buffer&0x80)=0) / 判断最高位是 0 还是 1SDA

9、=0; elseSDA=1;SCL=1; delay10us();buffer=buffer1;/ 将 buffer 中的数据左移一位 BitCnt-;while(BitCnt);SCL=0;/*/字节接收程序/接收器件传来的数据,此程序应配合|主应答函数 |i2c_ack_main() 使用/return: uchar 型 1 字节unsigned char ReceiveData()unsigned char BitCnt=8,IIC_RX_Data=0;unsigned char temp=0;SDA=1;/读入数据 设置 SDA 口为输入doSCL=0; delay10us();IIC

10、_RX_Data=_crol_(IIC_RX_Data,1);/ 数据左移一位BitCnt-;SCL=1;delay10us(); if(SDA=1)IIC_RX_Data = IIC_RX_Data|0x01;/ 低位置 1elseIIC_RX_Data = IIC_RX_Data&0x0fe; / 低位清 0 while(BitCnt);SCL=0;return IIC_RX_Data;*bit WriteNByte(unsigned char sla,unsigned char *s,unsigned char n)unsigned char i;I2C_Start();/启动 I2CS

11、en dData(sla);/发送器件地址if(!Test_Ack()WR_Flag = 1;return(0);for(i=0;in;i+)/ 写入 8 字节数据SendData(*(s+i);if(!Test_Ack()WR_Flag = 1;return(0);I2C_Stop();return(1);bit ReadNByte(unsigned char Sal, unsigned char *p,unsigned char n)unsigned char i;I2C_Start(); / 启动 I2CSendData(Sal)| 0x01); /发送器件地址if(!Test_Ack(

12、)WR_Flag = 1;return(0);delay10us();delay10us();但是最好不要太delay10us(); / 延时时间必须大于 30us 只要大于 30us 以上的值都可以 长 ,测试时,试过 25MS 都 OK !for(i=0;in-1;i+)/读取字节数据*(p+i)=ReceiveData(); / 读取数据Ack();*(p+n-1)=ReceiveData();NoAck();I2C_Stop();return(1);/计算 CRC 校验码unsigned int CRC16(unsigned char *ptr, unsigned char len)u

13、nsigned int crc=0xffff;unsigned char i;while(len-)crc 人=*ptr+;for(i=0;i=1; crcA=0xa001;elsecrc=1;return crc;/检测 CRC 校验码是否正确unsigned char CheckCRC(unsigned char *ptr,unsigned char len) unsigned int crc;crc=(unsigned int)CRC16(ptr,len-2); if(ptrlen-1=(crc8) & ptrlen-2=(crc & 0x00ff) return 0xff;elsere

14、turn 0x0;void Waken(void)I2C_Start();/ 启动 I2CSendData(IIC_Add); / 发送器件地址/ 唤醒指令时 传感器不会回 ACK 但是第一定要发检测 ACK 的Test_Ack();时钟 否则会出错delay1ms(2); / 至少延时 1 个 Ms 说明书里, 有个最大值 ,实际当中 你只要大 于 1MSI2C_Stop();void UART_PutString(unsigned char *buf )while(*buf) UARTSend(*buf+);void UART_PutStringAndNum(unsigned char *

15、buf ,unsigned int num)unsigned char a3,i;a3 = 0+num%10;a2 = .;a1 = 0+num/10%10;a0 = 0+num/100%10; while(*buf)UARTSend(*buf+);UARTSend( );for(i=0;i4;i+) UARTSend(ai);void UART_PutStringAnd_Data(unsigned char *buf ,unsigned char *bufdata)unsigned char a2,i,j;while(*buf)UARTSend(*buf+);UARTSend( );for(

16、i=0;i8;i+)a0 = bufdatai/16;a1 = bufdatai%16; for(j=0;j9) aj = (aj-10)+A;else aj = aj+0; UARTSend(aj); UARTSend( );void UARTSend_Nbyte(void)int Tmp;if(WR_Flag = 0) if(CheckCRC(IIC_RX_Buffer,8)String = S_Function; / Function: 03 04 UART_PutString(String);UARTSend( );UARTSend( );String = S_RH;/RH:Tmp =

17、 IIC_RX_Buffer2*256+IIC_RX_Buffer3; UART_PutStringAndNum(String,Tmp);UARTSend( );UARTSend( ); String = S_Temp; /Temp:Tmp = IIC_RX_Buffer4*256+IIC_RX_Buffer5; UART_PutStringAndNum(String,Tmp);UARTSend( );UARTSend( );String = S_CRCT;/CRC: True; UART_PutString(String);else String = S_Data;/Data: ;UART_

18、PutStringAnd_Data(String,IIC_RX_Buffer);UARTSend( );UARTSend( );String = S_CRCF;/CRC: Wrong;UART_PutString(String);elseString = S_NotS;/Sensor Not Connected;UART_PutString(String);UARTSend(0x0A);void Clear_Data (void)int i;for(i=0;iIIC_RX_Length;i+)IIC_RX_Bufferi = 0x00;/ 接收数据清零void main(void)SCL = 1;SDA = 1; / 上电时保证两总线为高InitUART();Clear_Data

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论