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

📄 master.c

📁 主从机同时软件模拟单总线(包括协议以及源代码)要求加精
💻 C
字号:
/***********************************
filename:   master_901.c
fuction:   主机单总线简单模拟
作者:   辣花旮
时间:    2004。9.23
基本功能描述: 我要利用单总线一次性完成32bit的传输,SAL32就是那个32位的数据,
SAL32_0为最低位,SAL32_21为最高位,至于为什么最低为是SAL32^7,最高位是SAL32^24,大家不放软件模拟一下看看。。。这一点当时还真浪费了我不少时间       
**********************************/
#include"aduc834.h"
#include"外部变量.h"
#include<intrins.h>
extern control();
unsigned long data dk;
unsigned long data AL32
sbit AL32_0 =SAL32^7;
sbit AL32_31 =SAL32^24;//
bit sub_error;
void m_us100()               //delay 100.09us
{}
void m_us50()                 //delay 10
{}
void m_us15()                    //delay 15.26
{}
void al_sent()
 {static unsigned int backt,tim;
  unsigned int i;
  AL2=1;
  dk=AL32;
  AL1=1;
  AL1=0;//拉低总线,开始联络
  m_us100();
  m_us100();
  m_us100();
  m_us100();
  m_us100();
  AL1=1;AL1=1;//5秒后拉高总线,等待恢复  
  backt=0;
  sent_tt++;
  if(sent_tt>=8){sent_tt=0;sent_cont=0;}           //判断下位机工况,如果在8次试联络中,下位机超过3次,认为下位机非正常工作
  while(AL1==1)
        {backt++; 
        if(backt>600){sent_cont++;backt=0;break;}//如果一定的时间内上位机无答复,认为本次联络失败		                            
        }
   if(sent_cont>=3){sub_error=1;}
        else{sub_error=0;} 
  tim=0;
  backt=0; 
  while(AL1==0)
       {
        tim++;backt++;
        if(backt>=600){break;}	//如果低电平持续时间太长,认为本次失败。	
       }
 
  m_us15();
  AL2=1;
  if(tim>=5)                //握手成功,开始通讯
       {for(i=0;i<32;i++)
	       {EA=0;
		AL1=0;AL1=0;
	        m_us15();
	        AL1=AL_0;  
	        EA=1;        //这部分禁止中断,其余时间,可以中断
                AL32=_lrol_(AL32,1);//此处绝对不能用"<<"来移位,因为这是32位数据。                         
                m_us50();
                AL1=1;
	        m_us15();
	       }
        }
  AL32=dk;
 }

⌨️ 快捷键说明

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