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

📄 io.c

📁 迁入式船口模拟程序
💻 C
字号:
#include <reg51f.h>
sbit BT_REC    =P1^0;
sbit BT_SND    =P1^1;
/**********************************************
    
    IO 口模拟232通讯程序
    
    使用两种方式的C程序 占用定时器0 
    
**********************************************/

#define MODE_QUICK

#define F_TM F0

#define TIMER0_ENABLE     TR0=1; TL0 = 0xC0; TH0 = 0xFE; 
#define TIMER0_DISABLE        TR0=0;

sbit ACC0=   ACC^0;
sbit ACC1=   ACC^1;
sbit ACC2=   ACC^2;
sbit ACC3=   ACC^3;
sbit ACC4=   ACC^4;
sbit ACC5=   ACC^5;
sbit ACC6=   ACC^6;
sbit ACC7=   ACC^7;

void IntTimer0() interrupt 1 using 0
{
    F_TM = 1;
	TH0 = 0xFE;    
    TL0 = 0xC0;
}
//发送一个字符
void PSendChar(unsigned char inch)
{
#ifdef MODE_QUICK    
    ACC=inch;

    F_TM = 0;
    BT_SND=0;        //start bit 
    TIMER0_ENABLE;    //启动
    while(!F_TM);
    
    BT_SND=ACC0;    //先送出低位
    F_TM=0;
    while(!F_TM);
    
    BT_SND=ACC1;    
    F_TM=0;
    while(!F_TM);
    
    BT_SND=ACC2;    
    F_TM=0;
    while(!F_TM);

    BT_SND=ACC3;    
    F_TM=0;
    while(!F_TM);

    BT_SND=ACC4;    
    F_TM=0;
    while(!F_TM);
    
    BT_SND=ACC5;    
    F_TM=0;
    while(!F_TM);

    BT_SND=ACC6;    
    F_TM=0;
    while(!F_TM);
    
    BT_SND=ACC7;    
    F_TM=0;
    while(!F_TM);

    BT_SND=1;    
    F_TM=0;
    while(!F_TM);
    
    
    TIMER0_DISABLE;    //停止timer
#else
    unsigned char ii;
    
    ii=0;
    
    F_TM=0;
    BT_SND=0;        //start bit 
    TIMER0_ENABLE;    //启动
    while(!F_TM);
    
    while(ii<8)
    {
        if(inch&1)
        {
            BT_SND=1;
        }
        else
        {
            BT_SND=0;
        }
        F_TM=0;
        while(!F_TM);
        ii++;
        inch>>=1;
    }
        BT_SND=1;    
        F_TM=0;
        while(!F_TM);

#endif    
    TIMER0_DISABLE;    //停止timer
}
//接收一个字符
unsigned char PGetChar()
{
#ifdef MODE_QUICK    

    F_TM=0;
    TIMER0_ENABLE;    
    while(!F_TM);    //等过起始位
    ACC0=BT_REC;
    
    TL0 = 0xC0;
	TH0 = 0xFE;

    F_TM=0;
    while(!F_TM);
    ACC1=BT_REC;
    
    F_TM=0;
    while(!F_TM);
    ACC2=BT_REC;
    
    F_TM=0;
    while(!F_TM);
    ACC3=BT_REC;
    
    F_TM=0;
    while(!F_TM);
    ACC4=BT_REC;
    
    F_TM=0;
    while(!F_TM);
    ACC5=BT_REC;
    
    F_TM=0;
    while(!F_TM);
    ACC6=BT_REC;
    
    F_TM=0;
    while(!F_TM);
    ACC7=BT_REC;
    
    F_TM=0;
    
    while(!F_TM)
    {
        if(BT_REC)
        {
            break;
        }        
    }
    TIMER0_DISABLE;    //停止timer
    return ACC;
#else
    unsigned char rch,ii;
    TIMER0_ENABLE;    
    F_TM=0;
    ii=0;
    rch=0;
    while(!F_TM);    //等过起始位
    
    while(ii<8)
    {
        rch>>=1;
        if(BT_REC)
        {
            rch|=0x80;
        }
        ii++;
        F_TM=0;
        while(!F_TM);
                
    }
    F_TM=0;
    while(!F_TM)
    {
        if(BT_REC)
        {
            break;
        }
        
    }
    TIMER0_DISABLE;    //停止timer
    return rch;
    
#endif    
    
}
//检查是不是有起始位
bit StartBitOn()
{
    return (BT_REC == 0);
    
}
void InitComm(void)
{

	TMOD = 0x21;
	PCON = 0x80;
	TCON = 0x51;
	SCON = 0x70;
	TH1 = 0xfb;
	TL1 = 0xfb;
	TI=0;
	RI=0;
}
/*********************************************************************/
void	sendcode(unsigned char c)
{
	unsigned char test;

	SBUF=c;
	test=0;
	while(TI==0);
	TI=0;
}
/*********************************************************************/
void main()
{
    unsigned char gch,i;
	unsigned char temp[14] = {"GOOD MORNING!"};
   
//    TMOD=0x22;        /*定时器1为工作模式2(8位自动重装),0为模式2(8位自动重装) */
//    PCON=00;
	
	InitComm();
    TR0=0;            //在发送或接收才开始使用
    TF0=0;        
    TH0 = 0xFE;       //9600bps 就是 1000000/9600=104.167微秒 执行的timer是104.167*18.432/6= 160 
    TL0 = 0xC0;
    ET0=1;
    EA=1;
    
//    PSendChar(0x55);
//    PSendChar(0xaa);
//    PSendChar(0x00);
//    PSendChar(0xff);
	for(i=0;i<14;i++)
		sendcode(temp[i]);
	i = 0;
    while(1)
    {
        if((StartBitOn())&&(i<3))
        {
            temp[i] = PGetChar();
			i ++;
        }
/*		if(i == 7)
		{	for(i=0;i<7;i++)
            	PSendChar(temp[i]);
			i = 0;
		}
*/		if(i == 3)
		{	for(i=0;i<7;i++)
            	sendcode(temp[i]);
			i = 0;
		}
//		for(i=0;i<14;i++)
//		 sendcode(temp[i]);

    }
}    

⌨️ 快捷键说明

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