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

📄 scom.c

📁 模拟串口
💻 C
字号:
#include <reg51.h>
sbit BT_SND = P1^7;//定义连接方式,发送端
sbit BT_REC = P1^6;//定义连接方式,接受端
#define TIMER0_ENABLE  TL0=TH0; TR0=1;//开启定时器并装入初值
#define TIMER0_DISABLE TR0=0;//关闭定时器
#define F_TM F0              //定义中断标志
#define FALSE 0              //接收过程错误标志
#define TRUE  1              //接收到正确数据标志
void Inttime0();
void SendChar(unsigned char);
unsigned char GetChar(char);
main()
{
	while(1);
}
//=============初始化定时器================================
void Inttime0()
{
	TMOD=0x02;	/*定时器0为模式2(8位自动重装) */
	TR0=0;		//在发送或接收才开始使用
	TF0=0; 		//清定时器溢出标志
	TH0=0XA0; 	//9600是1000000/9600=104.167微秒104.167*11.0592/12=96  (256-96=0XA0)
	TL0=TH0;
	ET0=1;		//开定时器中断
	EA=1;		//开CPU中断
}
//=========================================================
//=============定时器中断子程序============================
void IntTimer0() interrupt 1
{
	F_TM=1;		//定时器溢出引起中断,置标志位
}
//=========================================================
//=============发送一个字符================================
void SendChar(unsigned char ch)
{
    
	unsigned char i;
	i=0;
	F_TM=0;   	//关中断标志
	BT_SND=0; 	//发送起始位 
	TIMER0_ENABLE; 	//启动定时器
	while(!F_TM); 	//检测到中断标志后开始发送一个字符(8位)
	while(i<8)
        {
		if(ch&1)
                {
                	BT_SND=1;
                }
                else
                {
                	BT_SND=0;
                }
		F_TM=0;		//发送一位之后关标志准备发送下一位
        	while(!F_TM);
        	i++;
        	ch>>=1;
	}
	BT_SND=1; 	//发送停止位
	F_TM=0;
	while(!F_TM); 
	TIMER0_DISABLE; //停止定时器
}
//=========================================================
//=============接收一个字符================================
unsigned char GetChar(char *ndata)
{   
	unsigned char i=0,ch=0;	//i:位计数,ch:接收的字符存储位置
        unsigned int  count=0;	//超时计数器
        TIMER0_ENABLE ;		//启动定时器
	//=============检测起始位和超时====================    
	while(1)       
	{   
    		F_TM=0;
       		while(!F_TM);	//等待中断
    		if(!BT_REC)	//等待开始位
    		break;
        	count++;
        	if(count>30000)		
           	return FALSE;	//超时后错误
	}
	//=================================================
	//=============接收一个字节的数据==================
	F_TM=0;
	while(!F_TM);		//等待溢出准备接收一个字节的数据
	while(i<8)
		{
                	ch>>=1;
                	if(BT_REC)
                     		ch|=0x80;
                	i++;
                	F_TM=0;
                	while(!F_TM);
              	}
        //=================================================
	F_TM=0;
	while(!F_TM)    	//接收停止位
        	{
             		if(BT_REC)
                     	break;	//接收完后返回
             	}
       	TIMER0_DISABLE ;	//停止定时器
       	*ndata = ch;		//将接收的数据以ndata指针返回
       	return TRUE;		//正确接送数据
}
//=========================================================

⌨️ 快捷键说明

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