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

📄 com.c

📁 Keilc51编写的51单片机模拟串口程序
💻 C
字号:
#include <REG51.H>                /* special function register declarations   */
                                  /* for the intended 8051 derivative         */

#include <stdio.h>                /* prototype declarations for I/O functions */
#define INBUF_LEN 4 //数据长度 
unsigned char connect[6] ={0x05,0x82,0x01,0x01,0x83} ;
unsigned char reset[13] ={0x05,0xc2,0x01,0x07,0x10,0x00,0x05,0x00,0x00,0x00,0x00,0xd1} ;
unsigned char pay[13] ={0x05,0xc2,0x01,0x07,0x30,0x00,0x05,0x00,0x01,0x00,0x00,0xf0} ;
unsigned char inbuf1[INBUF_LEN]; 
unsigned char inbuf2[11] ={"Operation "}	; 
unsigned char inbuf3[13] ={"completed!\n"}	 ;
unsigned char inbuf4[10] ={"failed!\n"} ;
unsigned char checksum,count3;
unsigned char odat=0;
unsigned char rec[5]={0xff,0xff,0xff,0xff,0xff};
unsigned int selch;
bit read_flag= 0 ;
sbit P1_0 = P1^0;
sbit P1_1 = P1^1;
sbit P1_2 = P1^2;
sbit P1_3 = P1^3;
sbit P0_4 = P0^4;
sbit P0_5 = P0^5;
sbit P0_6 = P0^6;
sbit P0_7 = P0^7;

//查询计数器溢出标志位
void WaitTF0( void )
{
     while(!TF0);
     TF0=0;
}

//计数器初始化
void S2INI(unsigned int sel) 	
{
     TMOD =0x02;                //计数器0,方式2
	 if(sel==9600) TH0=	0x30;
	 else if (sel==19200)  TH0=	0x9a;
	 else if (sel==38400)  TH0=	0xd0;
	 else TH0=	0x30;
	 //TH0=sel;                    //指令周期s=(1/9600)/(1*2000000)=208	,256-208=48=0x30	 14400 		117= 0x75		   19200  154=0x9a	   38400 204=0xCC  
	 TL0=TH0;       
     TR0=0;          //开始计数
     TF0=0;

}

void WByte(unsigned char input) 
{
    //发送启始位
     unsigned char  i=8;
     TR0=1;	 
	 //WaitTF0();

	 if(selch==1)
	 { 
    	 P1_1=(bit)1;
     	 WaitTF0();//发送8位数据位
         while(i--)
     	{
         P1_1=(bit)((~input)&0x01);     //先传低位给P0_1
         WaitTF0();
         input=input>>1;
     	}
     //发送校验位(无)
     //发送结束位
     P1_1=(bit)0; 
	 WaitTF0();
	 }
	 else if(selch==2)
	 {
    	 P1_3=(bit)1;
     	 WaitTF0();
  		  //发送8位数据位
         while(i--)
     	{
         P1_3=(bit)((~input)&0x01);     //先传低位给P0_3
         WaitTF0();
         input=input>>1;
     	}
     //发送校验位(无)
     //发送结束位
     P1_3=(bit)0; 
	 }

	 else if(selch==3)
	 {
    	 P0_5=(bit)1;
     	 WaitTF0();
  		  //发送8位数据位
         while(i--)
     	{
         P0_5=(bit)((~input)&0x01);     //先传低位给P0_5
         WaitTF0();
         input=input>>1;
     	}
     //发送校验位(无)
     //发送结束位
     P0_5=(bit)0; 
	 }
	 else if(selch==4)
	 {
    	 P0_7=(bit)1;
     	 WaitTF0();
  		  //发送8位数据位
         while(i--)
     	{
         P0_7=(bit)((~input)&0x01);     //先传低位给P0_7
         WaitTF0();
         input=input>>1;
     	}
     //发送校验位(无)
     //发送结束位
     P0_7=(bit)0; 
	 }
     WaitTF0();
     TR0=0;
}    

RByte()
{	  
     unsigned char  i=8; 
	 unsigned char j=0;
                              //启动Timer0
    // TL0=TH0;
    // WaitTF0();                    //等过起始位
     //发送8位数据位
    if(selch==1)
	{
		if(P1_0==1)
		{
			TR0=1;
			WaitTF0();
			while(i--)
			{	
				
				j=~(P1_0);
				odat=odat|(j<<(8-i));  //check
     	  		WaitTF0(); 
			}
		}
	 }

	 else if(selch==2)
	 {
		if(P1_2==1)
		{
			WaitTF0();
			while(i--)
			{
		  		j=~(P1_2);
				odat=odat|(j<<(8-i));
     	 		WaitTF0(); 
			};
		}
	 }

	 else if(selch==3)
	 {
		if(P0_4==1)
		{
			WaitTF0();
			while(i--)
			{
		  		j=~(P0_4);
				odat=odat|(j<<(8-i));
     	  		WaitTF0(); 
			}
		}
	 }

	 else if(selch==4)
	 {
		if(P0_6==1)
		{
			WaitTF0();
			while(i--)
			{
		  		j=~(P0_6);
				odat=odat|(j<<(8-i));
     	  		WaitTF0(); 
			}
		}
	 }
	TR0=0;
    return odat;
	
}	  

 
void init_serialcomm( void ) 																							     
{ 
SCON = 0x50 ; //SCON: serail mode 1, 8-bit UART, enable ucvr 
TMOD = 0x20 ; //TMOD: timer 1, mode 2, 8-bit reload 
PCON |= 0x80 ; //SMOD=1; 
TH1 = 0xF4 ; //Baud:4800 fosc=11.0592MHz 
IE |= 0x90 ; //Enable Serial Interrupt 
TR1 = 1 ; // timer 1 run

//TI=1; 
} 

//向串口发送一个字符 
void send_char_com( unsigned char  ch) 
{ 
SBUF=ch; 
while (TI== 0 ); 
TI= 0 ; 
} 

//向串口发送一个字符串,strlen为该字符串长度 

void send_string_com( unsigned char  *str, unsigned int strlen) 
{ 
unsigned int k= 0 ; 
do 
{ 
send_char_com(*(str + k)); 
k++; 
} while (k < strlen); 
} 


//串口接收中断函数 

void serial () interrupt 4 using 3 
{ 
	if (RI) 
	{ 
		unsigned char  ch; 
		RI = 0 ; 
		ch=SBUF; 
		if (ch> 127 ) 
		{ 
			count3= 0 ; 
			inbuf1[count3]=ch; 
			checksum= ch- 128 ; 
		} 
		else 
		{ 
			count3++; 
			inbuf1[count3]=ch; 
			checksum ^= ch; 
			if ( (count3==(INBUF_LEN- 1 )) && (!checksum) ) 
			{ 
				read_flag= 1 ; //如果串口接收的数据达到INBUF_LEN个,且校验没错, 
				//就置位取数标志 
				count3=0;
			} 
		} 
	} 
} 


//延时模块
delay()
{
	int t;
	for(t=1;t<20000;t++);
} 


main() 
{ 

//init_serialcomm(); //初始化串口 
//while ( 1 ) 
//{ 
// 	if (read_flag) //如果取数标志已置位,就将读到的数从串口发出 
//	{ 
//		read_flag= 0 ; //取数标志清0 	
//    if((inbuf1[0]==0x90)&&(inbuf121]==0x40)&&(inbuf1[2]==0x45)&&(inbuf1[3]==0x15))
 //		 {   
				int i=0;
				int j=0;
				selch=1;
				S2INI(38400);
				while(1) 
				{
					 for(j=0;j<4;j++)
					 {
					 	RByte();
						rec[j]=odat;
						}
					delay();

				   if((rec[0]==0x12)&&(rec[1]==0x34)&&(rec[2]==0x56)&&(rec[3]==0x78))
				   {
				    for(i=0;i<4;i++)
					 	WByte(rec[i]);
						delay();
						delay();
					for(i=0;i<5;i++)
					{					  
						WByte(connect[i]);
					} 
					delay();
					delay();
					for(i=0;i<12;i++)
					{					  
						WByte(reset[i]);
					}   
					delay();
					delay();
					for(i=0;i<12;i++)
					{					  
						WByte(pay[i]);
					}
					delay();
					delay();
				   	}
			//	}  
//				delay();
//				init_serialcomm(); //初始化串口 
//				delay();
//				send_string_com(inbuf2,10);	
//				send_string_com(inbuf3,12);
//}
//else 
//send_string_com(inbuf3,20);
	
//	} 
//} 
	} 
} 


/*

MODE COM1 4800,0,8,1 
ASSIGN COM1 <SIN> SOUT
sin 输入 sout 输出,把单片机串口绑定到计算机串口COM1

*/

⌨️ 快捷键说明

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