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

📄 c8051020最终应用程序.c

📁 C8051020最终应用程序
💻 C
字号:




#include <c8051f020.h>                    // SFR declarations
#include <stdio.h>
#include <intrins.h>
sbit   P11=P1^1;
sbit   P30= P3^0;
sbit   P31= P3^1;
sbit   P32= P3^2;
sbit   P33=P3^3;
sbit   P34=P3^4;

//char data keyflag;   //定时器2和键盘中断标志  (由int改为char,看好不好使)

char adval2;
char adval1;
int  ef2;
int m;
int n;
int ef1;
char data keyflag;   //定时器2和键盘中断标志  (由int改为char,看好不好使)
char keyvalue;
char data danflag;
char data shuangflag;
char  command;
int v;
void Serial_Init()
{
	
	CKCON |= 0x20;       //定时器2使用系统时钟
	T2CON=0x30;       //用定时器2作UART0的波特率发生器 
	RCAP2H=0xFF;
	RCAP2L=0xB8;      //波特率是9600 (不分频是FFB8,CKCON=0X20;分频是FFFA,CKCON=0X00)
	PCON|=0x80;	
	SCON0=0x50;      //配置UART0为方式1,禁止接收 ;允许接收 0x50 182 page
	IE |= 0x10;		
	TI0=0;
	RI0=0;				//清除UART接收 发送完成标志
	TR2=1;				//启动定时器2
  	
 }


void SYSCLK_Init(void)//时钟配置
{
     int j;

	 OSCXCN=0x67;				//启动外部振荡器  22.1184mhz
	 for(j=0;j<256;j++);		//等待振荡器起振
	 while(!(OSCXCN & 0x80));	//等待晶体振荡器稳定
	 OSCICN=0x88;

	 CKCON=0x20;	//定时器2使用系统时钟(用于串口时钟)
	 				//定时器0,1,4使用系统时钟的12分频
}



//初始化配置 

void config()  /////端口初始化
{
	WDTCN = 0xde;
	WDTCN = 0xad;
	//交叉开关配置
	XBR0=0x04;   	//UART0的RX0,TX0连接到2个端口引脚    
	XBR1=0x94;		//INT0联到P0.2
	XBR2=0xc0;	//交叉开关允许
	P0MDOUT=0xff;
	IE |= 0x05;   //INT0中断允许
	P1MDOUT=0x00;//设计成漏极开路,使成为输入引脚,重要
	P1=0xff;
	P2MDOUT=0x00;
    P2=0xff;
	P3MDOUT=0xff;
  

    P74OUT=0xf3;
      //P74OUT=0xff;
	P5=0xff;

	
     	_nop_();
     	_nop_();
     	_nop_();
    	return;
 }
//延时
void delay(unsigned int  x1)//延时
{
        while(--x1)
	{   }
	return;
}


void keytab()//键盘应用程序
{   
     unsigned char idata   scancode;   
	 unsigned char idata   keycode;
     //P7口高4位对应接上拉电阻的4行,低4位对应无上拉电阻的4列。

	delay(200);               //有键按下,去抖动
	if((P7 & 0xf0)==0xf0)   return;  //如果检测不到,推出键盘处理程序

	scancode=0xfe;
    while(scancode !=0xff)     //循环扫描是否有键按下
	{
            P7=scancode;
            keycode=P7;
            if((keycode & 0xf0)!=0xf0)        break ;  //说明有键按下
            scancode=((keycode<<1)|0xf0);
	}
       	keycode=~keycode;
       	_nop_();

//////////////////////////////////////////////////////////////////////		
	if(keycode==0x43)//单通道
		{      P31=0;//关闭时钟
				keyvalue=0;
          if(danflag==0)
			{danflag=1;
			 shuangflag=0;}
			  SBUF0=0x55;
             while (TI0==0);
	        TI0=0;
			 SBUF0=0xaa;
             while (TI0==0);
	          TI0=0;
		   command |= 0x01;//设置命令字

			 command &=0xfd;
			 SBUF0=command;
             while (TI0==0);
	         TI0=0;
            
           P6 &=0xfd;
           delay(1000);
              

               P6|=0x04;

             P31=1;
			 
			  }
		
	
///////////////////////////////////////////////////////////////////
	if(keycode==0x83)//双踪
		{P31=0;
			keyvalue=1; 
			if(shuangflag==0)
			{danflag=0;
			  shuangflag=1;}
               SBUF0=0x55;
             while (TI0==0);
	        TI0=0;
			  SBUF0=0xaa;
             while (TI0==0);
	          TI0=0;
			  command |= 0x02;
			 command &=0xfe;

			 SBUF0=command;
             while (TI0==0);
	         TI0=0;
			 P6 &=0xfd;
          
              delay(1000);

               P6|=0x04;

             P31=1;
		}




/////////////////////////////////////////////////////////////////////

			if(keycode==0x13)//采样率1k,2
		{  P31=0;
		   P32=1;
           P33=0;
           P34=0;
		 
          SBUF0=0x55;
           while (TI0==0);
	        TI0=0;
		  SBUF0=0xaa;
             while (TI0==0);
	        TI0=0;
		   command &= 0xcf;
		   command |=0x04;
		   SBUF0=command;
             while (TI0==0);
	         TI0=0;
			 
           P6 &=0xfd;
           delay(1000);
           delay(1000);
           P6|=0x04;
           P31=1;
			keyvalue=2; 
		}
//////////////////////////////////////////////////
			if(keycode==0x23)//采样率20k
		{   P31=0;
		   P32=1;
           P33=1;
           P34=0;
		 
          SBUF0=0x55;
           while (TI0==0);
	        TI0=0;
		  SBUF0=0xaa;
             while (TI0==0);
	        TI0=0;
		   command &= 0xef;
		   command |=0x0c;
		   SBUF0=command;
             while (TI0==0);
	         TI0=0;
			 
           P6 &=0xfd;
           delay(1000);
           delay(1000);
           P6|=0x04;
           P31=1;
		     
			keyvalue=3; 
		}

	

///////////////////////////////////////////////////////////////200k
		if(keycode==0x41)
		{   P31=0;
           
		   P32=0;
           P33=0;
           P34=1;
		   
	
		   
             SBUF0=0x55;
             while (TI0==0);
	        TI0=0;
		   SBUF0=0xaa;
             while (TI0==0);
	        TI0=0;
		 command &= 0xf3;
		   command |=0x10; 
           SBUF0=command;
             while (TI0==0);
	         TI0=0;
			 
           P6 &=0xfd;
           delay(1000);
              delay(1000);

               P6|=0x04;
             P31=1;
		   keyvalue=4; 
		}
		//////////////////////////////////////////////////////////1M
			if(keycode==0x81)
		{P31=0;
          
      
		   P32=1;
           P33=0;
           P34=1;
		   
		   
		   command &= 0xf7;
		   command |=0x14;
            SBUF0=0x55;
             while (TI0==0);
	        TI0=0;
		   SBUF0=0xaa;
             while (TI0==0);
	        TI0=0;
		  
           SBUF0=command;
             while (TI0==0);
	         TI0=0;
			
           P6 &=0xfd;
           delay(1000);
              delay(1000);

               P6|=0x04;
             P31=1;
			keyvalue=5; 
		}
		///////////////////////////////////////////////////////////2M
		if(keycode==0x11)
		{P31=0;
          
       
		   P32=0;
           P33=1;
           P34=1;
		   
		   
		   command &= 0xfb;
		   command |=0x18;
            SBUF0=0x55;
             while (TI0==0);
	        TI0=0;
		   SBUF0=0xaa;
             while (TI0==0);
	        TI0=0;
		  
           SBUF0=command;
             while (TI0==0);
	         TI0=0;
			 
           P6 &=0xfd;
           delay(1000);
              delay(1000);

               P6|=0x04;
             P31=1;
			keyvalue=6; 
		}
   	    	if(keycode==0x21)/////////////////////////////////20M
		{  P31=0;
          
         
		   P32=1;
           P33=1;
           P34=1;
		   
		   
		   
		   command |=0x1c;
            SBUF0=0x55;
             while (TI0==0);
	        TI0=0;
		   SBUF0=0xaa;
             while (TI0==0);
	        TI0=0;
		  
           SBUF0=command;
             while (TI0==0);
	         TI0=0;
			
           P6 &=0xfd;
           delay(1000);
              delay(1000);

               P6|=0x04;
             P31=1;
			keyvalue=7; 
		}
		if(keycode==0x4f)
	   	{
	   		keyvalue=8; 
		}		
	   	if(keycode==0x8f)
	   	{
	   	 	keyvalue=9;   
		}								
			if(keycode==0x1f)
	   	{
	   		keyvalue=10;
		}	
		if(keycode==0x2f)
	   	{
	   		keyvalue=11; 
		}	
		if(keycode==0x47)
		{
			keyvalue=12;
		}
		
		if(keycode==0x87)
		{
			keyvalue=13; 
		}
								
								
		if(keycode==0x17)
		{
			keyvalue=14; 
		}
	
		
		
									
		if(keycode==0x27)
		{
			keyvalue=15; 
		}
    _nop_();

 	P7 = 0xf0;
              
    return;
}
void Key_Int0(void) interrupt 0 using 3
{
	

	EX0=0;
  P31=0;
     
	if (keyflag==0) keyflag=1;   //相当于键盘处理程序执行完后才能再次接收按键,否则不进行键盘处理
	EX0=1;

		
}

void fasong(void) interrupt 2 using 3
{
	  EX1=0;//关中断0

	  P31=0;//关闭写信号

 if(danflag==1)
{	  
 ef2=0;
addr2:  if(ef2<=1024)

      {ef2=ef2+1;//7202中有1024个储存单元,所以计1024个数,如果到了1024个数就是取完了,继续下一次传输
     
   
	   P30=1;
       delay(50);//50是20k的读取速度
       P30=0;
     delay(50);
	   
      adval2=P2;
       SBUF0=adval2;
   while (TI0==0);
	   TI0=0;
      goto addr2;}
  else {
        P6 &=0xfd;//复位,使7202读写指针回到开始位置
        delay(1000);
        P6|=0x04;
	    P31=1;//开通写信号
        }
	   }
if(shuangflag==1)//双踪传输数据
{ef2=0;
  addr12:if(ef2<=1024)

      {ef2=ef2+1;
     
   
	   P30=1;
       delay(50);//50是20k的读取速度
       P30=0;
     delay(50);
	   m+=1;
      adval2=P2;
       SBUF0=adval2;
   while (TI0==0);
	   TI0=0;
      P6 |=0x01;//产生读取7202数据方波
      delay(50);
      P6 &=0xfe;
       delay(50);
      n+=1;
       adval1=P1;
       SBUF0=adval1;

       while (TI0==0);
	   TI0=0;
      goto addr12;}
  else {
        P6 &=0xfd;//复位,使7202读写指针回到开始位置
        delay(1000);
        P6|=0x04;
	    P31=1;//开通写信号
	   
	   }
	
       }
  	
EX1=1;


		
}

void main (void) //初始化要根据各个器件的逻辑(谁先谁后,否则7202出错)
{
    Serial_Init();
	SYSCLK_Init();
	config();
	//选151工作频率	
P32=1;
P33=0;
P34=0;
 //cpld初始化
P4=0x00;
delay(1000);
P4=0x02;
////////// 

//复位7202///

P6 &=0xfd;
delay(1000);
delay(1000);

P6|=0x04;



//初始化各个标志和命令字(command)八位命令字***  ###  $$   中的   ***为空掉没用到 ###为调节AD采样率 $$调节通道
	keyflag=0;
	danflag=1;
	shuangflag=0;
command=0x05;
	P7 = 0xf0;  //P7口高4位对应接上拉电阻的4行,低4位对应无上拉电阻的4列。
	  EA=1;
	  while(1)
	{if (keyflag==1)
			{
				keytab();
				keyflag=0;
				}
	
			
}
}

















⌨️ 快捷键说明

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