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

📄 510test.c

📁 此程序可以驱动所有基于iic的器件
💻 C
字号:
#include	"register.h"
int led_data=0;
/*void LED_ACT()
{
  int j=16,l=0,k=0,i;
        *PFDATDIR=*PFDATDIR&0xFF8F;//UPDDATE置0                      
        while(j--)
         {           
               k=led_data&0x8000;
               k=k>>11;//IOPF4
               k=k&0x0010;
               l=*PFDATDIR&0xFFEF;
               *PFDATDIR=l|k;//IOPF4
               led_data=led_data<<1;//上述为数据输入
               
               *PFDATDIR=*PFDATDIR&0XFFDF;  //CLK置0 IOPF5
               for(i=8;i>0;i--){}//延时150ns以上
               
               *PFDATDIR=*PFDATDIR|0x2020;//CLK置1
               for(i=8;i>0;i--){}//延时150ns以上
          }
         *PFDATDIR=*PFDATDIR|0x4040;//UPDDATE置1 iopf6
         for(i=8;i>0;i--){}//延时150ns以上 
         *PFDATDIR=*PFDATDIR&0xFF8F;//UPDDATE置0                      
}*/

void  initial()
{
	     asm(" setc INTM");
	     asm(" setc	SXM");				// 符号位扩展有效
		 asm(" clrc	OVM");				// 累加器中结果正常溢出
	 	 asm(" clrc	CNF");				// B0被配置为数据存储空间
	 	 //*SCSR2=*SCSR2|0X0020;
	 	 //*WDCR=0x2F;				//  使能看门狗  E8?
	  	 *WDCR=0xE8;				// 软件禁止看门狗
	 	 *SCSR1=0x83FF;				// CLKIN=15M,CLKOUT=4*CLKIN=30M
	     *IMR=0x00;				// 禁止所有中断
	     *IFR=0xFF;				// 清除全部中断标志,"写1清0"

        *MCRA=0X0083;//scitx scirx pwm2
        *MCRB=0xFE00;//iopd0
        *MCRC=0x0180;//cap4  cap5
                
        *PADATDIR=0xFD03;
        *PBDATDIR=0xFF00;  
        *PCDATDIR=0x2FD0;//IOPC7 IOPC6 IOPC4输入
        *PDDATDIR=0xFF00;                   
        *PEDATDIR=0xFF00;//IOPE7 cap4引脚
        *PFDATDIR=0xF50A;//IOPF1:DETECT  输入 IOPF2:8255CS 低电平 IOPF3 PreOrDelay    
        
		*T2CNT=0X0000;	 // T2计数器清0
		*T2CON=0X1704;	 // T2为连续增计数模式,128分频,且选用内部时钟源
		*T2PER=11000;	 // 设置T2的周期寄存器,0.0352秒周期

		*T4CNT=0X0000;	 // T3计数器清0
		*T4CON=0X1004;	 // T3为连续增计数模式,1分频,且选用内部时钟源
		*T4PER=10000;

		*T3CNT=0X0000;	 // T3计数器清0
		*T3CON=0X1004;	 // T3为连续增计数模式,1分频,且选用内部时钟源
		*T3PER=65535;
			
		*T1CNT=0X0000;	 // T1计数器清0
		*T1CON=0X1704;	 // T1为连续增计数模式,128分频,且选用内部时钟源
		*T1PER=0xBEBC;	 // 设置T1的周期寄存器,1/1280 秒 0.78125ms
		
		*ACTRA=*ACTRA|0X0008;
		*ACTRA=*ACTRA&0X0008;
		*CMPR1=0X5F5E;//   T1PER/2
		*COMCONA=0XA600;
		
        *EVAIFRB=0XFFFF;	// 清除EVB中断标志,写"1"清0
		*EVBIFRA=0XFFFF;	// 清除EVB中断标志,写"1"清0
        *EVBIFRB=0XFFFF;	// 清除EVB中断标志,写"1"清0
        *EVBIFRC=0XFFFF;	// 清除EVB中断标志,写"1"清0
                
        *EVAIMRB=0x0001;//开TIMER2周期中断        
		*EVBIMRA=0x0400;//开TIMER3周期中断
        *EVBIMRB=0X0000;	// 暂不允许TIMER4周期中断
        *EVBIMRC=0X0000;	// 暂不允许CAPTURE4中断

		
		*ADCTRL1=0X2F88;   	// 使能校准		
        *ADCTRL2=0X4000;    //校准一次

		*ADCTRL1=0X6FE0;   	// 采样时间窗口预定标位ACQ PS3-ACQ PS0为9,输入阻抗3K
			                // 转换时间预定标位CPS为0,AD为启动停止模式,排
			                // 序器为级连工作方式,且禁止特殊的两种工作模式
	                
		*ADCTRL2=0X0000; 	//用EVB的一个事件信号触发AD转换,
		                    // 且用中断模式1
		*ADCTRL2=*ADCTRL2|0x4242;
		*MAXCONV=0X50;	    // 6通道
		*CHSELSEQ1=0XFFFF;
		*CHSELSEQ2=0XFFFF;
		*CHSELSEQ3=0X4000;
		*CHSELSEQ4=0XFF44;
		*ADCTRL1=0X2FC0;
		//*GPTCONB=0X6400;	// 使能T4周期中断标志触发AD转换0x0100;FF7F;
		//*GPTCONB=0XF000;  //无事件启动AD
		*CAPCONB=0X2250;  // 设置捕获单元4为检测上升沿,且选择TIMER3为时钟,
                          // 捕获单元6为检测上升沿,且选择TIMER4为时钟
		*SCICCR=0x7;           		//1个停止位,不使能奇偶校验,空闲线多处理
		//器模式,8位字符
		*SCICTL1=0x13;         	//使能接收和发送,SLEEP=0 禁止休眠
		//方式 , 禁止接收错误中断,TXWAKE=0 即没
		//有选定的发送特征
		*SCICTL2=0x00;          	//禁止接收和发送中断
	    *SCIHBAUD=0x01;//*SCIHBAUD=0x00;
  	    *SCILBAUD=0x03;  //*SCILBAUD=0xC2;	//波特率=19200B/S//*SCIHBAUD=0x1;
        *SCICTL1=0x33;          	//使SCI脱离复位状态
        *SCIPRI=0x54;           	//SCI中断(接收和发送中断)为高 先级中断,0x60为低
        asm(" clrc INTM");
}
void delay_250nsec(int j)
{
	int i;
	for(i=0;i<j;i++);
}
int hadle8255(int code,int hadle)//hadle:0-write 1-read
{
    int i,k;
   // asm(" setc INTM"); 
    *PADATDIR=*PADATDIR|0x7818;//CS read write 均高
    *PFDATDIR=*PFDATDIR|0x0404;  
    *PFDATDIR=*PFDATDIR&0xFFFB; //CS 为低    
	switch(code)
	{
	  case 0://A口
         *PADATDIR=*PADATDIR&0xFF9F;
		  break;
	  case 1://B口
          *PADATDIR=*PADATDIR&0xFFBF;
          *PADATDIR=*PADATDIR|0x2020;
		  break;
	  case 2://C口
          *PADATDIR=*PADATDIR&0xFFDF;
          *PADATDIR=*PADATDIR|0x4040;
		  break;
	  case 3://CTRL 口
          *PADATDIR=*PADATDIR|0x6060;
		  break;    
	  default:break;
	}
	switch(hadle)
	{
	  case 0://write
          *PADATDIR=*PADATDIR&0xFFEF;
		  break;	
	  case 1://read    
	      *PBDATDIR=*PBDATDIR&0X00FF;
          *PADATDIR=*PADATDIR&0xFFF7;
          delay_250nsec(250);
          k=*PBDATDIR&0x00FF;  
		  break;
      default:
      	  break;
	}
    *PADATDIR=*PADATDIR|0x1818;//read write 均高
    *PFDATDIR=*PFDATDIR|0x0404;//CS高 
    if(hadle==1)
 	      return(k);                             	
   // asm(" clrc  INTM");			// 返回前开中断	
}
void maxsend(int chip,long int data)
{    
     int i,tempj,tempi=1,j=8,tem1,tem2,k,num,ch[3],maxmask=0x80,maxshift=2;
     if(chip==3)
         tempi=1000;
     *PEDATDIR=*PEDATDIR|0x0808;                   //LDAC设置为1 IOPE3
     *PEDATDIR=*PEDATDIR&0xFFEF;                   //将SCLK设置为低
     for(i=5*tempi;i>0;i--){}//大于50ns5000
     switch(chip)
     {
     case 1:
          ch[0]=data;
          num=1;
          j=12;
          maxmask=0x800;
          maxshift=6;
          *PCDATDIR=*PCDATDIR&0xFFF7;                //将max510cs设置为0 IOPC3
          break;
     case 2:
          ch[2]=data%256;
          ch[1]=(data>>8)%256;
          ch[0]=data>>16;
          num=3;
          *PCDATDIR=*PCDATDIR&0xFFEF;                //将max5321cs设置为0 IOPC4 61106120 放大环节
          break;     
     case 3:
          ch[2]=data%256;
          ch[1]=(data>>8)%256;
          ch[0]=data>>16;
          num=3;
          *PCDATDIR=*PCDATDIR&0xFFDF;                //将max3cs设置为0 IOPC5 max532 电流线圈
          break;
     default:break;
     }
     for(k=0;k<num;k++)
     {
      tempj=j;
      while(tempj--)
          {      
                tem1=ch[k]&maxmask;               
                tem1=tem1>>maxshift;
                tem1=tem1&0x000020;
                tem2=*PEDATDIR&0xFFDF; //IOPE5
                *PEDATDIR=tem2|tem1;
                ch[k]=ch[k]<<1;
                for(i=5*tempi;i>0;i--){}                      //延时
                *PEDATDIR=*PEDATDIR|0x1010;         //sclk置1 IOPE4
                for(i=5*tempi;i>0;i--){}   //延时 
                *PEDATDIR=*PEDATDIR&0xFFEF;        //sclk置0 
          }
     }
     switch(chip)
     {
     case 1:
          *PCDATDIR=*PCDATDIR|0x0808;                //将max510cs设置为1 IOPC3
          break;
     case 2:
          *PCDATDIR=*PCDATDIR|0x1010;                //将max5321cs设置为1 IOPC4 61106120 放大环节
          break;     
     case 3:
          *PCDATDIR=*PCDATDIR|0x2020;                //将max3cs设置为1 IOPC5 max532 电流线圈
          break;
     default:break;
     }
     for(i=8*tempi;i>0;i--) {}//延时100ns以上
     //*PEDATDIR=*PEDATDIR&0xFFF7;                     //LDAC设置为低
     //for(i=8*tempi;i>0;i--) {}
     //*PEDATDIR=*PEDATDIR|0x0808;                 //LDAC设置为高
}
void ad420(long int ch)
{     
      int i,j=32,l;
      long int k;
      *PBDATDIR=*PBDATDIR&0xFFF8; //LATCH CLK DATAIN置0
      hadle8255(2,0);
      while(j--)
         {           
               k=ch&0x80000000;
               k=k>>29;//IOPB2
               k=k&0x00000004;
               l=*PBDATDIR&0xFFFB;
               *PBDATDIR=l|k;//IOPB2
               ch=ch<<1;//上述为数据输入
             
               *PBDATDIR=*PBDATDIR&0XFFFD;  //CLK置0 IOPB1
               hadle8255(2,0);
               //上述为clock输入0
               for(i=8;i>0;i--){}//延时150ns以上
               
               *PBDATDIR=*PBDATDIR|0x0002;//CLK置1
               hadle8255(2,0);                 //写C口
               //上述为clock输入1  
               for(i=8;i>0;i--){}//延时150ns以上
               
          }
       *PBDATDIR=*PBDATDIR&0xFFF9;  // CLK DATAIN置0       
       *PBDATDIR=*PBDATDIR|0x0001; //LATCH置1
       hadle8255(2,0); 
       for(i=5;i>0;i--){}      
       *PBDATDIR=*PBDATDIR&0xFFF8;  //LATCH设置为0 CLK DATAIN置0
       hadle8255(2,0);
}
main() 
{
        initial(); 
        
        while(1)
        {
        //	led_data=0x55CC;
	     /*maxsend(1,768+255);//max510  A +0X300
         maxsend(1,1792+128);//max510 B +0X700   1.5v 1
	     maxsend(1,2816+128);//max510 C +0XB00   0.5v 16
         maxsend(1,3840+255);//max510 D +0XF00   
         maxsend(1,512);*/
         ad420(0xffff7fff);
        }
}
        

⌨️ 快捷键说明

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