📄 510test.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 + -