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

📄 采集部分程序.c

📁 2013电子设计大赛手写板G题
💻 C
字号:
#include<reg51.h>
#include<intrins.h>
/***********
晶振用14.31818M
*************/
#define uchar unsigned char
#define uint  unsigned int						include
sbit ST=P0^3;
sbit OE=P0^4;
sbit EOC=P0^2;
sbit  SCL=P0^0;     //I2C  时钟 
sbit  SDA=P0^1;     //I2C  数据 
sbit EROM=P0^6;		//使能ROM操作
sbit key=P0^5;		  //E2PROM存储控制
sbit key2= P0^7;      //E2PROM读取控制



#define bo1200  0xC2;   //波特率1200
#define bo2400  0xE1;	 //波特率2400

//unsigned char v[4],VVP;  //保存最大值和最小值
unsigned int k1=0;
unsigned int k2=0;
unsigned int mun;




void init_T1(void)				//串口初始化
{
 EA=0;            //暂时关闭中断
 TMOD&=0x0F;     //定时器1模式控制在高4位
 TMOD|=0x20;    //定时器1工作在模式2,自动重装模式
 SCON=0x50;     //串口工作在模式1
 TH1=bo1200;    //计算定时器重装值bo1200=0xe6;bo2400=0xF3
 TL1=bo1200;   
 PCON|=0x80;     //串口波特率加倍
// ES=1;         //串行中断允许
 TR1=1;          //启动定时器1
// REN=1;        //允许接收 
  EA=1;         //允许中断
  TI=0;
  RI=0;
}

void trans(unsigned char dat)  //串口发送函数
{
 SBUF=dat;			   
 while(!TI);
 TI=0;
}					 

void Delay(unsigned int i)//延时函数
{
  unsigned int j;
  for(;i>0;i--)
  {
   for(j=0;j<125;j++)
  {;}
  }
}



void delay_us()
{
  _nop_();        /*起始条件建立时间大于4.7us,延时*/
  _nop_();
  _nop_();
  _nop_();
  _nop_();  
  _nop_();
  _nop_();
  _nop_();        
}

void delay_ms()
{
  unsigned int i;
  for(i=0;i<20000;i++);
}



void Start_I2c()
{
  SDA=1;         /*发送起始条件的数据信号*/
  delay_us();
  SCL=1;
 delay_us();
  SDA=0;         /*发送起始信号*/
 delay_us();  
}
void Stop_I2c()
{
  SDA=0;      /*发送结束条件的数据信号*/
 delay_us();
  SCL=1;      
 delay_us();
  SDA=1;      /*发送I2C总线结束信号*/
 delay_us();
}
void Ack_I2c()			//应答函数
{
    uchar i=0;
	SCL=1;
    delay_us();
	while(SDA==1&&i<200)
	i++;
	SCL=0;
    delay_us();
}
void No_ack()		//非应答函数
{
	SDA=1;
    delay_us();
	SCL=1;
    delay_us();
	SCL=0;
    delay_us();
}

void init()
{
  SDA=1;
  SCL=1;
}

void wr_byte(uchar date)	   //写一个字节,该函数将数据写入24C02
{
   uchar i;
   SCL=0;	//IC总线在写数据时,在时钟低电平的时候改变数据,高电平的时候传送数据
   delay_us();
   for(i=0;i<8;i++)  /*要传送的数据长度为8位*/
    {
     if((date<<i)&0x80)
	     SDA=1;            /*判断发送位*/
     else  
	     SDA=0;
	 delay_us();	                 
     SCL=1;         /*置时钟线为高,通知被控器开始接收数据位*/  
//IC总线在写数据时,在时钟低电平的时候改变数据,高电平的时候传送数据
     delay_us();  
     SCL=0;
	 delay_us(); 
    }
    SDA=1;                /*8位发送完后释放数据线,准备接收应答位*/
    delay_us();
}


uchar re_byte()			//读一个字节,该函数将数据读出24C02
{
  uchar i,temp=0;
  SCL=0;
  delay_us();
  SDA=1;
  delay_us();
  for(i=0;i<8;i++)
  {
	 temp<<=1;
	 if(SDA)
	 {
	   temp|=0x01;
	 }
	 SCL=1;
	 delay_us();
	 SCL=0;
  }
  return temp;
}


void write(uchar add,uchar dat)
{
   init();
  Start_I2c();
  wr_byte(0xa0); 
  Ack_I2c();
  wr_byte(add);
  Ack_I2c();
  wr_byte(dat);
  Ack_I2c();
  Stop_I2c();
}


uchar read(uchar add)
{
  uchar value;
  init();
  Start_I2c();
  wr_byte(0xa0);      //写器件地址,前面四位是芯片24C02本身确定的,它不变,之后三位是引脚地址,因为我们都接地了,所以这三位都为0,最后一位位读写位,写的话为0,读为1
  Ack_I2c();
  wr_byte(add);		//希望写到哪个地址
  Ack_I2c();
  Start_I2c();
  wr_byte(0xa1);   	//写数据
  Ack_I2c();
  value=re_byte();
  No_ack();
  Stop_I2c();
  return value;
}


void main()

{
   P2=0XFF; 
   P1=0xFF;	  
   P0=0XFF;
   delay_ms();   
   init_T1();			  //设置串口发送波特率

   ST=0;
   Delay(5); 
	ST=1;       //清空AD寄存器
  Delay(5); 

   k1=0;
   k2=0;
  
	while(1)
	  {
	   
       ST=0;              //开启转换
       while(!EOC);
	   OE=1;
       mun=P1;
	   P2=mun;
       OE=0;
	   ST=1;
    //   Delay(1);			 //如果实物不稳定,可以用这个延迟试试

	   while((!key)&&(!EROM))				  //开关KEY闭合	,进行EPROM存储
	     {
	         ST=0;              //开启转换
             while(!EOC);
	         OE=1;
	         P1=0xff;
	         mun=P1;
        	 P2=mun;
  	         if(k1<254)
			 write(k1++,mun);
	         OE=0;
             ST=1;             //关闭转换
             Delay(1);	  // 如果实物不稳定,可以用这个延迟试试	,否则去掉,以免影响速度
	         k2=0;	 
	      }
	   
	        while((!key2)&&(!EROM))			  //当KEY2按下,开始 读取EPROM数据,并串口发送出去
	         {
			     
                 if(k2<254)		  
			      {
			         mun=read(k2++);   	 //读取EPROM中的数据
					 P2=mun;			 //  用P2口发送给单片机B进行显示
			         trans(mun);         //	 用串口发送出去
                     
                     k1=0;
			       }
				  	
                }
		 
		 
		 }
	   
}	   	    

⌨️ 快捷键说明

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