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

📄 main.c

📁 基于51单片机实现UART通信 SPI通信 和IIC通信
💻 C
字号:
#include	"Includes.h"
 
 unsigned char datTem[2]={0x00,0x00};      //温度值储存  datTem[1]高8位  datTem[0]低8位
 unsigned char IIC_Adress=0;		 //AT24C04的内部地址
 unsigned char  key=0;				//键盘扫描键值
 unsigned char uart_receive_date=0;	//串口接收数据

 unsigned char code uart_transmit[]={"uart transmit"};
 unsigned char code spi_transmit[]={"SPI transmit"};

 void send_char_uart( unsigned char date); //串口发送
 void com_init();    //串口初始化
/*********************LCD初始化后显示"hello"****************************************/
void  hello(void)                                                   
{  
    unsigned  char X[15]={"Hello all right"},a=0x80,i;
            WriteCommandLCM(0x01,1);
            for(i=0;i<15;i++,a++){
                                   display_lcm(X[i],a);
                                   Delay_Xms(5); Delay_Xms(5);
                                  }
            for(i=0;i<200;i++){
                                Delay_Xms(5); Delay_Xms(5);
                               }
            WriteCommandLCM(0x01,1);
}
/***************显示温度************/
void  temp_view(unsigned char *ddate)  
 {
   unsigned int  temp1=0,temp0=0,a,b,c,g,h,i,j,z;
   if((ddate[0]==0xFF)&&(ddate[1]==0xFF)){ ddate[0]=0;ddate[1]=0;}
   z=ddate[1]&0xF0;
    if(z>0) 				                     //正负温度符号判断显示
        display_lcm('-',0xc0);
    else  
        display_lcm('+',0xc0);
	if(z==0){								                //正温度处理
             temp1= ((ddate[1]&0x0F)<<4)+((ddate[0]&0xF0)>>4);
             temp0=(ddate[0]&0x0F)*625;
      		  }
    else {													   //负温度处理
	       temp1= (((~ddate[1])&0x0F)<<4)+(((~ddate[0]+8)&0xF0)>>4);
           temp0=((~ddate[0]+1)&0x0F)*625;
		  }
    a=(temp1%1000)/100;
      display_lcm(a+'0',0xc1);
    b=(temp1%100)/10;
      display_lcm(b+'0',0xc2);
    c=(temp1%10)/1;
      display_lcm(c+'0',0xc3); 
	   
      display_lcm('.',0xc4);    // 显示小数点

    g=(temp0%10000)/1000;
      display_lcm(g+'0',0xc5); 
    h=(temp0%1000)/100;
      display_lcm(h+'0',0xc6); 
    i=(temp0%100)/10;
      display_lcm(i+'0',0xc7); 
    j=(temp0%10)/1;
      display_lcm(j+'0',0xc8);
	  key=keyscan();
 }

/****************保存温度'A'***********/
void save_temp(void)
 {
        unsigned char save_string[]={"save temp"};
        unsigned char judge,i=5;

		diaplay_string(save_string,9);
		if(IIC_Adress>=255) IIC_Adress=0;
 retry: judge=IICWrite(IIC_Adress,datTem,2);
        if(judge==0&&i>0) {i--; goto retry;}
	    IIC_Adress+=2;
		key=0;
		key=keyscan();
		WriteCommandLCM(0x01,1);
 }
/*********************查看记录串口发送********/
void view_uart(void)
 { 
   unsigned char  baiwei=0,gewei=0,shiwei=0;
   unsigned int   shifen=0,baifen=0,qianfen=0,wanfen=0;

   baiwei=((((datTem[1]&0x0F)<<4)+((datTem[0]&0xF0)>>4))%1000/100)+48;
   shiwei=((((datTem[1]&0x0F)<<4)+((datTem[0]&0xF0)>>4))%100/10)+48;
   gewei=((((datTem[1]&0x0F)<<4)+((datTem[0]&0xF0)>>4))%10/1)+48;
   shifen=(((datTem[0]&0x0F)*625)%10000/1000)+48;
   baifen=(((datTem[0]&0x0F)*625)%1000/100)+48;
   qianfen=(((datTem[0]&0x0F)*625)%100/10)+48;
   wanfen=(((datTem[0]&0x0F)*625)%10/1)+48;

    key=keyscan();
   diaplay_string(uart_transmit,13);
   send_char_uart(baiwei);
   send_char_uart(shiwei);
   send_char_uart(gewei);
   send_char_uart('.');
   send_char_uart(shifen);
   send_char_uart(baifen);
   send_char_uart(qianfen);
   send_char_uart(wanfen);
   send_char_uart(' ');
   WriteCommandLCM(0x01,1); 
 }
/**************查看记录'B'***************/
void  over_record(void)
 {
        unsigned char view_string[]={"view records"};
		unsigned int record_adress=0;
	    unsigned char j,judge1;

    do{     diaplay_string(view_string,12);
	    if(uart_receive_date!=0) display_lcm(uart_receive_date,0x8f);
		key=0;
	    key=keyscan();
retry1: judge1=IICRead(datTem,record_adress,2);
        key=keyscan();
	    if(judge1==0&&j>0) {j--; goto retry1;}
	    key=keyscan();
        temp_view(datTem);
	    key=keyscan();
	    if(key=='C'){ key=0;
		              if(record_adress>=256) record_adress=0; 
	                  record_adress+=2; }
	    if(uart_receive_date=='C'){ uart_receive_date=0;
		                            if(record_adress>=256) record_adress=0; 
	                                record_adress+=2; }
	    key=keyscan();
	    if(key=='D'){ key=0;
		              if(record_adress<=0) record_adress=256;
	                  record_adress-=2; 
					}
	    if(uart_receive_date=='D'){ uart_receive_date=0;
		                            if(record_adress<=0) record_adress=256;
	                                record_adress-=2;
								  }
            if(key=='G')  { key=0;view_uart();}
            if(uart_receive_date=='G'){ uart_receive_date=0;view_uart();}
	    key=keyscan();
	    if(key=='E'){ WriteCommandLCM(0x01,1); break;}
		if(uart_receive_date=='E') {WriteCommandLCM(0x01,1);break; }
       }while(key!='E');
  }
/****************自动保存温度'F'***********/
void auto_save_temp(void)
 {
   unsigned int i;
   unsigned char auto_save_string[]={"auto save temp"};

   do{
      diaplay_string(auto_save_string,14);
	  if(uart_receive_date!=0) display_lcm(uart_receive_date,0x8f);
      key=0;
      for(i=0;i<1000;i++){
	                       Delay_Xms(5);
						  }
	  save_temp();
	  temp_view(datTem);
	  key=keyscan();
	  if(key=='E'){WriteCommandLCM(0x01,1);break; }
	  if(uart_receive_date=='E') {WriteCommandLCM(0x01,1);break; }
	 }while(key!='E');
  }
/***************主函数***********************************/
void main()
{  
   unsigned char  baiwei=0,gewei=0,shiwei=0,gao=0,di=0;
   unsigned int   shifen=0,baifen=0,qianfen=0,wanfen=0;
 	 
   LCMInit();
   IICInit();
   com_init();
   hello();
   do{ 	
       Read_onetemp(datTem);
       temp_view(datTem);
	   if(uart_receive_date!=0) display_lcm(uart_receive_date,0x8f);
	   
	      baiwei=((((datTem[1]&0x0F)<<4)+((datTem[0]&0xF0)>>4))%1000/100)+48;	  //显示位处理,一边后续显示
		  shiwei=((((datTem[1]&0x0F)<<4)+((datTem[0]&0xF0)>>4))%100/10)+48;
          gewei=((((datTem[1]&0x0F)<<4)+((datTem[0]&0xF0)>>4))%10/1)+48;
		  shifen=(((datTem[0]&0x0F)*625)%10000/1000)+48;
		  baifen=(((datTem[0]&0x0F)*625)%1000/100)+48;
		  qianfen=(((datTem[0]&0x0F)*625)%100/10)+48;
		  wanfen=(((datTem[0]&0x0F)*625)%10/1)+48;

		  key=keyscan();
	   switch(key-'A')     //键盘控制
	          {
			   case 0: { save_temp(); } break;	      //A  存储温度
			   case 1: { over_record();} break;	      //B  查看记录
			   case 2: {} break;				      //C  上一个
			   case 3: {} break;				      //D  下一个
			   case 4: {} break;				      //E  返回
			   case 5: {auto_save_temp();} break;     //F  5秒自动存储温度 
			   case 6: {  							  //G  串口数据发送
			              diaplay_string(uart_transmit,13);
						  send_char_uart(baiwei);
			              send_char_uart(shiwei);
						  send_char_uart(gewei);
						  send_char_uart('.');
						  send_char_uart(shifen);
						  send_char_uart(baifen);
						  send_char_uart(qianfen);
						  send_char_uart(wanfen);
						  send_char_uart(' ');
			              WriteCommandLCM(0x01,1); 
				        } break;	  
			   case 7: {  diaplay_string(spi_transmit,12);	  //H   SPI通信	
						  gao=datTem[1];
						  di=datTem[0];
			   			  MOSI=0;
			              SPI_Transmit(gao);
						  SPI_Transmit(di);
						  MOSI=1;
						  WriteCommandLCM(0x01,1);} break;				      
			   default :  {} break;
		  }
        switch(uart_receive_date-'A')	  //UART控制
	          {
			   case 0: { save_temp(); } break;	        //A  存储温度
			   case 1: { over_record();} break;	        //B  查看记录
			   case 2: {} break;				        //C  上一个
			   case 3: {} break;				        //D  下一个
			   case 4: {} break;				        //E  返回
			   case 5: {auto_save_temp();} break;       //F  5秒自动存储温度 
			   case 6: {  							    //G  串口数据发送
			             diaplay_string(uart_transmit,13);
						  send_char_uart(baiwei);
			              send_char_uart(shiwei);
						  send_char_uart(gewei);
						  send_char_uart('.');
						  send_char_uart(shifen);
						  send_char_uart(baifen);
						  send_char_uart(qianfen);
						  send_char_uart(wanfen);
						  send_char_uart(' ');
			              WriteCommandLCM(0x01,1); 
				        } break;	  
			   case 7: {  diaplay_string(spi_transmit,12);	  //H   SPI通信	
						  gao=datTem[1];
						  di=datTem[0];
			   			  MOSI=0;
			              SPI_Transmit(gao);
						  SPI_Transmit(di);
						  MOSI=1;
						  WriteCommandLCM(0x01,1);} break;				     
			   default :  {} break;
		  }	
       if(uart_receive_date!=0) display_lcm(uart_receive_date,0x8f);
      uart_receive_date=0;    
     }while(1);
}

/************************************************
UART 串口通信程序
*************************************************/
/*************串口初始化*********************/
void com_init()		
 { 
  TMOD=0x20;			  //定时器1方式2
  TH1=0xfd;			      //波特率9600
  TL1=0xfd;
  SCON=0x50;			  //串口工作方式1,允许接收 
  PCON= 0x00;             // 波特率不倍增   
  TR1=1;				  //启动定时
  IE=0x90;			      //开串口中断 等效于 EA=1;ES=1;EX0=1
 }
 

/*************向串口发送一个字符*********************/
void send_char_uart( unsigned char date) 
{  
   EA=0;
   SBUF=date; 
   while(TI==0);
   TI= 0 ;
   EA=1;
} 

/************串口中断函数*********************/
void Uart_receive(void) interrupt 4  //串口中断接收
 {	
   EA=0;   
   if(RI)				   
      {
        uart_receive_date=SBUF;
		RI=0;
	  }	
   else TI=0;	   //发送中断。则无操作
   EA=1;	
  }
/************INT0中断函数********************
void SPI_INT0(void) interrupt 0  
 {
    EA=0;
    uart_receive_date=SPI_Receive();
	EA=1;
 }*/
/************************************************
THE END OF FILE
*************************************************/

⌨️ 快捷键说明

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