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

📄 hello.c

📁 uart,mcu,linux,embedded soc
💻 C
📖 第 1 页 / 共 2 页
字号:
//**************************************************************
void read24c02()				/*读24c02的存储值*/
{uchar i;
   TRcvAddress(0xa0,0,&bufdata[0],7);  
   for(i=0;i<6;i++)
    {dispbuf[i]=bufdata[i];
    }
}		/*返回上一层程式*/
/******************************************************/
void write24c02()			/*写24c02的存储值*/
{
	TSendAddress(0xa0,0,dispbuf,7);	 /* 向有子地址器件写入6字节数据函数 */
}
/*******************************************************************/
//   24C02芯片读写        起动总线函数               
//函数原型: void  Start();  
//功能:     启动总线,发送24c02启动条件.  
//==================================================================
void Start()
{SDA=0;
nop;
nop;
   SCL=0;
   SDA=1;   	/*发送起始条件的数据信号*/
   nop;
   SCL=1;
   nop;    	/*起始条件建立时间大于4.7us,延时*/
   nop;
   nop;
   nop;
   nop;    
   SDA=0;   	/*发送起始信号*/
   nop;    	/* 起始条件锁定时间大于4us*/
   nop;
   nop;
   nop;
   nop;       
   SCL=0;   	/*钳住总线,准备发送或接收数据 */
   nop;
   nop;
   SDA=1;
}
//==================================================================
//                      结束总线函数               
//函数原型: void  Stop();  
//功能:     结束总线,发送24c02结束条件.  
//==================================================================
void Stop()
{
  SCL=0; 
  SDA=0;  	/*发送结束条件的数据信号*/
  nop;   	/*发送结束条件的时钟信号*/
  SCL=1;  	/*结束条件建立时间大于4us*/
  nop;
  nop;
  nop;
  nop;
  nop;
  SDA=1;  	/*发送总线结束信号*/
  nop;
  nop;
  nop;
  nop;
  SCL=0;
}
//==================================================================
//                 89X52发数据或地址给24c02 字节数据发送函数               
//函数原型: void  SendByte(uchar c);
//功能:   将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对
//        此状态位进行操作.(不应答或非应答都使acknow=0)     
//     	  发送数据正常,acknow=1; acknow=0表示被控器无应答或损坏。
//==================================================================
void  SendByte(uchar c)
{ uchar count;
for(count=0;count<8;count++)  /*要传送的数据长度为8位*/
    {if((c<<count)&0x80)
         SDA=1;                /*判断发送位*/
     else  
         SDA=0;                
     nop;
     SCL=1;               /*置时钟线为高,通知被控器开始接收数据位*/
      nop; 
      nop;             /*保证时钟高电平周期大于4us*/
      nop;
      nop;
      nop;         
     SCL=0; 
    }
    nop;
    nop;
    SDA=1;                /*8位发送完后释放数据线,准备接收应答位*/
    nop;
    nop;   
    SCL=1;
    nop;
    nop;
    nop;
    if(SDA==1)
      acknow=0;        /* 24c02无应答 */     
    else 
      acknow=1;        /* 发送数据正常 */
    SCL=0;
    nop;
    nop;
}
//==================================================================
//                 89X52从24c02读数据字节数据接收函数               
//函数原型: uchar  RcvByte();
//功能:  	  用来接收从器件传来的数据,并判断总线错误(不发应答信号),
//          发完后请用应答函数应答从机。  
//==================================================================
uchar  RcvByte()
{uchar retc=0;
 uchar count;
SDA=1;             		/*置数据线为输入方式*/
for(count=0;count<8;count++)
   {    nop;           
        SCL=0;                  /*置时钟线为低,准备接收数据位*/
        nop;
        nop;                 /*时钟低电平周期大于4.7us*/
        nop;
        nop;
        nop;
        SCL=1;                  /*置时钟线为高使数据线上数据有效*/
        nop;
        nop;
        retc=retc<<1;
        if(SDA==1)
        retc=retc+1;  /*读数据位,接收的数据位放入retc中 */
        nop;
        nop; 
  }
  SCL=0;    
  nop;
  nop;
  return(retc);
}
//==================================================================
//                     主机89X52应答子函数
//函数原型:  void Ack(bit a);
//功能:      主控器进行应答信号(可以是应答或非应答信号,由位参数a决定)
//==================================================================
void Ack(bit a)
{if(a==0)                   
     SDA=0;     	     /*在此发出应答或非应答信号 */
  else                       /* 应答 a=0  非应答 a=1 */ 
     SDA=1;
  nop;
  nop;
  nop;      
  SCL=1;
  nop;
  nop;                    /*时钟低电平周期大于4us*/
  nop;
  nop;
  nop;  
  SCL=0;                     /*清时钟线,钳住I2C总线以便继续接收*/
  nop;
  nop;    
}
//==================================================================
//                 用户接口函数                                   
// 有无子地址表示是否向芯片的特定地址写数据  
//          向有子地址器件写入6字节数据函数  对应数据资料中的写模式             
//函数原型: bit  TSendAddress(uchar slaaddress,uchar subaddress,uchar * s,uchar no);  
//功能:     从启动总线到发送从地址,子地址,数据,结束总线的全过程,从器件
//          地址slaaddress,子地址subaddress,发送内容是s指向的内容,no=字节数
//          如果返回1表示操作成功,否则操作有误。
//注意:    使用前必须已结束总线。
//==================================================================
bit TSendAddress(uchar slaaddress,uchar subaddress,uchar * s,uchar no) /* 向有子地址器件写入6字节数据函数 */
{
uchar i;
   Start(); 	              	/*启动总线*/
   SendByte(slaaddress);        /*发送器件地址*/
   if(acknow==0)
   return(0);
   SendByte(subaddress);        /*发送器件子地址*/
   if(acknow==0)
   return(0);
   for(i=0;i<no;i++)
   {
     SendByte(s[i]);   	        /*发送数据*/
     if(acknow==0)
     return(0);
   }   
   Stop();  			        /*结束总线*/ 
   return(0);
}
//==================================================================
//                    向有子地址器件读取4字节数据函数               
//函数原型: bit  TRcvAddress(uchar slaaddress,uchar subaddress,uchar * s,uchar no);  
//功能:     从启动总线到发送从地址,子地址,读数据,结束总线的全过程,从器件
//          地址slaaddress,子地址subaddress,读出的内容放入s, no=字节数
//           如果返回1表示操作成功,否则操作有误。
//注意:    使用前必须已结束总线。
//==================================================================
bit TRcvAddress(uchar slaaddress,uchar subaddress,uchar * s,uchar no)
{ 
	uchar i; 
   Start();                             /*启动总线*/
   SendByte(slaaddress);                /*发送器件从地址*/
   if(acknow==0)
   return(0);
   SendByte(subaddress);               /*发送器件子地址*/
   if(acknow==0)
   return(0);
   Stop();                   /*结束总线*/ 
   Start();			 /*重新启动总线*/
   SendByte(slaaddress+1);
   if(acknow==0)
   return(0);
   for(i=0;i<no;i++)
    {* s=RcvByte();               /*接收数据*/
     Ack(0);                     /*发送应答位*/
     s++;
    }                   
     * s=RcvByte();               /*接收数据*/
     Ack(1);
     Stop();                   /*结束总线*/ 
     return(1);
}
//******************************************************************
void service_int0 () interrupt 1 using 2   	/*设定每隔3000us中断扫描一次数码管*/
{
        ptr1++;				/*扫描指标加1*/
        TH0=(65536-2000)/256;		/*每隔4000US扫描一次*/
        TL0=(65536-2000)%256;
        while (ptr1>5) ptr1=0;		/*ptr1>5表示6个数码管都已经扫描过*/
        P0=(ptr1<<4)|dispbuf[ptr1];	/*将扫描值左移至高4位元再加上资料码*/
}					/*返回主程式*/
/********************************************************/
void rec_timer1_intr () interrupt 3 using 3   	/*TIMER1中断副程式--秒计时器*/
{
	TH1=(65536-59200)/256;		//重设TIMER1计数值
	TL1=(65536-59200)%256;
	dispbuf[8]=0x09;				//蜂鸣器设定开/二次分频
	if(b1==0)					//中断次数完成否,是则表1秒到了
	{
		b1=100;				//重设中断次数
		P3_6=1;				//秒SEC加1
		TR1=0;
		dispbuf[8]=0x01;		//蜂鸣器关
		clear();
		//send_to_Led_a();		//串行发送到DTLED-6副程式
		//send_to_Comm1();//huzm	
		//LCD_disple();//huzm
	}
	TF1=0;
	b1--;						/*中断次数减1*/
  
}		/*返回主程式*/
/********************************************************/

/******************************************************************/
/*
//串口接收中断函数 
void serialRecCom() interrupt 4 using 3 
{ 
	if (RI) 
	{ 
		unsigned char ch; 
		RI = 0 ; 
		ch=SBUF; 	
		send_to_Comm1();
	} 
} */
/***********************************************************************/
/******************************************************/
void Rd1302()				/*读时钟芯片DS1302*/
{
	char i,j,ts0,conb;
	conb=0x81;
	clocktmp[0]=0;
	clocktmp[1]=0;
	clocktmp[2]=0;
	ts0=conb;
	for(j=0;j<3;j++)
	{
	   clk=RST=0;					/*DS1302系统初始化*/
		nop;nop;
		RST=1;
		for(i=0;i<8;i++)			/*写控制字到DS1302*/
		  {
	 	 	clk=0;					/*清时钟*/
			if(conb&0x01) 
					DINOUT=1;
			else    DINOUT=0;
	 		clk=1;					/*时钟上升沿,发送数据有效*/
			conb=conb>>1;	
			nop;
		  }
		conb=ts0=ts0+2;
		clk=0;
		for(i=0;i<7;i++)			/*读时钟芯片的时分秒单元*/
		{
		if(DINOUT==1) 
				clocktmp[j]=clocktmp[j]|0x80;
		else  	clocktmp[j]=clocktmp[j]&0x7f;
		clk=1;
		clocktmp[j]=clocktmp[j]>>1;	/*接收暂存单元*/	
		nop;
		clk=0;					/*时钟下降沿,接收数据有效*/
		}
		delay(5);
		RST=0;
		delay(10);
	   }	
	dispbuf[1]=clocktmp[0]&0x0f;	//转换秒分时显示单元
	dispbuf[2]=clocktmp[0]>>4&0x07;
	dispbuf[3]=clocktmp[1]&0x0f;
	dispbuf[4]=clocktmp[1]>>4&0x07;
	dispbuf[5]=clocktmp[2]&0x0f;
	dispbuf[6]=clocktmp[2]>>4&0x03;	
nop;
}		/*返回主程式*/

void Rec_com1_intr () interrupt 4 using 1   	//串行口中断副程式
{ 
	uchar v,i=0;
	  while(RI!=1);			/*接收完成否*/	
	   {
	   	RI=0;
		v=SBUF;				/*接收的数据存入C*/	
		 //buf_rec_com1=SBUF;//huzm
		 
		#if 1
		if(v==0xa0)			/*是否是识别码"A0"*/
		   {while(RI!=1);		/*接收完成否*/	
		     bufuart[i]=v;
	             for(i=1;i<7;i++) 
					{while(RI!=1);		/*接收完成否*/	
					bufuart[i]=SBUF;	/*接收的数据存入C*/	
					RI=0;			/*清除接收完成标志位RI*/	
	   				}
	       }
		else	delay(10);	
		#endif
		//delay(10);//huzm
		//send_to_Comm1();
	 	RI=0;
		
	   }	
	  send_to_Led_a();//huzm
  /*
dispbuf[0]=bufuart[6];
dispbuf[1]=bufuart[5];
dispbuf[2]=bufuart[4];
dispbuf[3]=bufuart[3];
dispbuf[4]=bufuart[2];
dispbuf[5]=bufuart[1];
*/
}					/*返回主程式*/

//**************************************************************
void send_to_Comm1(void)			/*宣告串口serial发送副程式*/	
{ 
	//uchar i=0;//huzm
//	
	uchar sec,min,hour;
	sec=((dispbuf[2]<<4)&0xf0)|(dispbuf[1]&0x0f);
	min=((dispbuf[4]<<4)&0xf0)|(dispbuf[3]&0x0f);
	hour=((dispbuf[6]<<4)&0xf0)|(dispbuf[5]&0x0f);
	//
 	IE=0x8f; 		 
	SBUF=hour;		//根据扫描指标到TAB中取ASCII码由SBUF发送出去
	//for( i=0; i<rec_comm1_len; i++)//huzm
	{
		//SBUF=buf_rec_com1;//huzm	
		while(TI!=1);			/*发送完成否?*/
		TI=0;					/*是,则清除发送完成旗标TI=0*/
	 	delay(20);
	}
	
	#if 1
	SBUF=min;		/*根据扫描指标到TAB中取ASCII码由SBUF发送出去*/
	//SBUF=dispbuf_huzm[0];
	//SBUF=dispbuf[0];
	//dispbuf[0]++;	
	while(TI!=1);			/*发送完成否?*/
	TI=0;					/*是,则清除发送完成旗标TI=0*/
 	delay(20);
	SBUF=sec;		/*根据扫描指标到TAB中取ASCII码由SBUF发送出去*/
	while(TI!=1);			/*发送完成否?*/
	TI=0;					/*是,则清除发送完成旗标TI=0*/
 	delay(20);
	#endif
	
	 IE=0x9f;
}

main()					/*主程式*/
{
/*
 	TMOD=0x11;	
	TH1=256-(28800/9600);
	TH0=(65536-3000)/256;	
    TL0=(65536-3000)%256;
    TR0=0;				
	T2CON=0x38;
	TL2=0xfd;			
	TH2=0xff;			
	RCAP2L=0xdc;		
	RCAP2H=0xff;		
	TH2=256-(28800/9600);
	TR2=1;				
	SCON=0x50;
	IE=0;
	IP=0x10;
	read24c02();
	P1=0xff;
	*/
while(1)
	{
			#if 0
					//scan();    	 		//呼叫键盘扫描副程式有按FLAG0会为1
			/*
					if(FLAG0==1) 
						{
						temp();			//判断有按键输入否?
						}
					else
						*/
						{
							//FLAG4=FLAG5=0;
							//if(FLAG2==1)
							{
							Rd1302();				/*读时钟芯片DS1302*/
							if(dispbuf[1]!=clockbak)	/*秒加一*/	
						    	{
								clockbak=dispbuf[1];
								send_to_Led_a();		/*串行发送到DTLED-6副程式*/	
								send_to_Comm1();		//宣告串口serial发送副程式
							}
							}
						}
			#endif
			//Rec_com1_intr();//huzm
			//send_to_Comm1();
	}
}

⌨️ 快捷键说明

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