⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 i2ctest.c

📁 电子时钟
💻 C
字号:
					//i1c test//
				
					#include	"ADUC812.h"
					#include	"math.h"
					#include	"intrins.h"
					#include	"string.h"
					#include	"stdio.h"
					
					sbit 	led=P2^1;
					sbit 	speak=P2^3;
					sbit	SDA=P3^2;
					sbit	SCL=P3^3;	
					#define	deviceadd 0xa0
					
					
					//************* Delay  *********//	
					void delay(int n)
					{
						int	i;
						for(i=0;i<=n;i++)
						{
							_nop_();
						}
					}
					
					//************* Delay N ms *********//	
					void delay_ms(int n)
					{
						int	i,j;
						for(i=0;i<=n;i++)
						{
							for(j=0;j<=50;j++)			//** Delay 1 ms **//
							{
								_nop_();
							}
						}
					}
					
					
					//**************Start**********//
					void I2C_start(void)
					{
						SDA=1;
						SCL=1;
						delay(3);
						SDA=0;
						delay(3);
						SCL=0;
					}
					
					//*************Stop***********//
					void I2C_stop(void)
					{
						SDA=0;
						SCL=1;
						delay(3);
						SDA=1;
						delay(3);
						SCL=0;
					}
					
					//*************Ack**************//
					void I2C_ack(void)
					{
						SDA=0;
						SCL=1;
						delay(3);
						SCL=0;
						SDA=1;
					}
					
					//*************No Ack*********//
					void I2C_nack(void)
					{
						SDA=1;
						SCL=1;
						delay(3);
						SCL=0;
						SDA=0;
					}
					
					//*********Check ack signal*******//
					bit I2C_Cack(void)
					{
						bit a;
						SDA=1;
						SCL=1;
						delay(1);
						a=SDA;
						delay(1);
						SCL=0;
						delay(3);
						if(a==1)
						{
							return 	1;
						}
						else
						{
							return	0;
						}
					}
						
					//**********Send a Bety*********//
					void I2C_Send_byte(char da)
					{
						unsigned char i;
						for(i=0;i<8;i++)
						{
							if((da<<i)&0x80)
							{
							SDA=1;			//send "1"//
							SCL=1;
							delay(3);
							SCL=0;
							SDA=0;
							delay(3);
							}
							else
							{
							SDA=0;			//send "0"//
							SCL=1;
							delay(3);
							SCL=0;
							delay(3);	
							}
						}
					}
						
					//*************receive a byte *********//
					unsigned char I2C_Receive_byte(void)
					{
						unsigned char i,da=0;
						bit	a;
						for(i=0;i<8;i++)
						{
							SDA=1;
							SCL=1;
							delay(3);
							a=SDA;
							delay(3);
							SCL=0;
							if(a==1)
							{
								da=da<<1;
								da=da|0x01;
							}
							else
							{
								da=da<<1;
							}
						}
						return da;
					}
												
					//**********Send n bety ,n<16,page[0-7],add[0-255].error return 0********//
					bit I2C_Send_Nbyte(unsigned char page,unsigned char add,unsigned char *buffer,unsigned char n)
					{
						unsigned char i;
							
						I2C_start();			//send start//			
						
						I2C_Send_byte(0xa0|(page<<1));	//send device address//
						if(I2C_Cack()==1)
						{
							I2C_stop();
							return 0;
						}
						
						I2C_Send_byte(add);		//send data address//
						if(I2C_Cack()==1)
						{
							I2C_stop();
							return 0;
						}
						
						for(i=0;i<n;i++)		//send data//
						{
							I2C_Send_byte(buffer[i]);
							if(I2C_Cack()==1)
							{
								I2C_stop();
								return 0;
							}
						}
						
						I2C_stop();			//send stop//
						return 1;
					}			
						
					
					//***********receive n byte n<16,page[0-7],add[0-255],error return 0*********//
					bit I2C_Receive_Nbyte(unsigned char page,unsigned char add,unsigned char *buffer,unsigned char n)
					{
						unsigned char i;
						
						I2C_start();			//send start//						
						
						I2C_Send_byte(0xa0|(page<<1));		//send device address//
						if(I2C_Cack()==1)
						{
							I2C_stop();
							return 0;
						}
						
						I2C_Send_byte(add);		//send data address//
						if(I2C_Cack()==1)
						{
							I2C_stop();
							return 0;
						}
						
						I2C_stop();			//send stop//
						
						I2C_start();			//send start//
						
						I2C_Send_byte(0xa1|(page<<1));		//send device address read//
						if(I2C_Cack()==1)
						{
							I2C_stop();
							return 0;
						}
	
						for(i=0;i<n;i++)		//send data//
						{
							buffer[i]=I2C_Receive_byte();
							if(i!=n)
							{
								I2C_ack();
							}
							else
							{
								I2C_nack();
							}
						}
							
						I2C_stop();			//send stop//
									
						return 1;
					}		
								
					
					//********main************//
					void main(void)
					{	
						unsigned char buffer[8],i;
						
						SCON = 0x52;
						TMOD=0x29;	
						TH1=0xfd;
						TL1=0xfd;					//** 9600 baud **//
						TR1=1;						//** start timer 1 **//
						TI=1;
						EA=1;	
						
					/*	I2C_start();
						I2C_Send_byte(0x64);
						if(I2C_Cack()==1)
						{
							I2C_stop();
						}
						I2C_Send_byte(0x00);
						if(I2C_Cack()==1)
						{
							I2C_stop();
						}
						I2C_stop()*/;
				while(1)
				{		
						I2C_start();
						I2C_Send_byte(0x65);
						if(I2C_Cack()==1)
						{
							I2C_stop();
						}
						
						for(i=0;i<8;i++)
						{
							buffer[i]=I2C_Receive_byte();
							if(i!=8)
							{ 
								I2C_ack();
							}
							else
							{
								I2C_nack();
							}
						}
						
						I2C_stop();
						
						for(i=0;i<8;i++)
						{
							printf(",%x,\n",(int)buffer[i]);
						}
						delay_ms(2000);
					}
						while(1);
					}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -