原创 数字集成电路参数测试仪源程序

2007-1-25 14:55 2423 2 4 分类: MCU/ 嵌入式

/****************************************Copyright (c)**************************************************
**                               Guangzou ZLG-MCU Development Co.,LTD.
**                                      graduate school
**                                 http://www.zlgmcu.com
**
**--------------File Info-------------------------------------------------------------------------------
** File name:   main.c
** Last modified Date:  2004-09-16
** Last Version:  1.0
** Descriptions:  The main() function example template
**
**------------------------------------------------------------------------------------------------------
** Created by:   lls
** Created date:  2006-09-16
** Version:    1.0
** Descriptions:  The original version
**
**------------------------------------------------------------------------------------------------------
** Modified by:   
** Modified date:  2006-09-21
** Version:
** Descriptions:  
**
*******************************************************************************************************
** 功能   :
**    上位机使用EasyARM软件全仿真的DOS窗口观察。
** 说明   :
**    通讯波特率115200,8位数据位,1位停止位,无奇偶校验。
*******************************************************************************************************
*/
#include "config.h"
#include "stdio.h"
#include "math.h"
uint32 DA_OUT,DCT;


uint32 value[6][7];
/*数组:六个参数的标准值(比较错误时用)*/
uint32 biaozhunzhi[6]={0.8*413,                      //VIL            
                       2.0*413,                      //VIH
                       2.7*413,                      //VOH
                       0.5*413,                      //VOL
                       4*1024/2480,                  //IIL
                       8*1024/2480};                 //IOL
                                   
  /*数组:继电器使用情况*/
uint32 a[6][3]={(1<<8) |(1<<17),(1<<8),(1<<17),      //J1 J7     
                (1<<9) |(1<<18),(1<<9),(1<<18),      //J2 J8
                (1<<10)|(1<<19),(1<<10),(1<<19),     //J3 J9
          (1<<12)|(1<<20),(1<<12),(1<<20),     //J4 J10
          (1<<13)|(1<<23),(1<<13),(1<<23),     //J5 J11
          (1<<16)|(1<<27),(1<<16),(1<<27)};    //J6 J12
 
uint8 ay[7]={1,2,3,4,5,6,7};                         //数组:六个参数的名称
uint8 fm1,fm2,fm3,fm4,fm5,fm6;                       //非门编号      
uint8 zj_flag;                     //三角波过顶标志  
uint8  rcv_buf[18];
uint8  rcv_dat0;
 
  /*实际电路中各参数要修正的偏差系数*/
const float ad01x = 1.905;                           //AD0.1测VOH                        
const float ad03x = 1.905;        //AD0.3测VIH                       
const float ad05x = 0.500;        //AD0.5测IIL
const float ad15x = 0.500;        //AD1.5测VIL
const float ad16x = 0.500;        //AD1.6测VOL
const float ad17x = 1.900;        //AD1.7测IOL(看为高电平)


  /*模拟开关CD4051 GPIO口*/
#define A0  1<<16                                    //P1.16  IO1DIR                       
#define A1  1<<17                          //P1.17  IO1DIR                   
#define A2  1<<24                             //P1.24  IO1DIR


  /*继电器 GPIO口*/                                      
#define J1  1<<8                           //P0.8   IO0DIR  非门1 (左)
#define J2  1<<9                           //P0.9   IO0DIR  非门2
#define J3  1<<10                           //P0.10  IO0DIR  非门3
#define J4  1<<12                          //P0.12  IO0DIR  非门4
#define J5  1<<13                          //P0.13  IO0DIR  非门5
#define J6  1<<16                          //P0.16  IO0DIR  非门6


#define J7  1<<17                          //P0.17  IO0DIR  非门1 (右)
#define J8  1<<18                          //P0.18  IO0DIR  非门2
#define J9  1<<19                          //P0.19  IO0DIR  非门3
#define J10 1<<20                          //P0.20  IO0DIR  非门4
#define J11 1<<23                             //P0.23  IO0DIR  非门5
#define J12 1<<27                          //P0.27  IO0DIR  非门6


  /*LED灯 GPIO口*/
const uint32 LED1 = (1 << 18);            //P1.18  IO1DIR  控制LED1低电平点亮
const uint32 LED2 = (1 << 19);            //P1.19  IO1DIR  控制LED2低电平点亮
const uint32 LED3 = (1 << 20);            //P1.20  IO1DIR  控制LED3低电平点亮
const uint32 LED4 = (1 << 21);            //P1.21  IO1DIR  控制LED4低电平点亮
const uint32 LED5 = (1 << 22);            //P1.22  IO1DIR  控制LED5低电平点亮
const uint32 LED6 = (1 << 23);            //P1.23  IO1DIR  控制LED6低电平点亮
 
  /*key1 UART0 SPI BEEP DAC GPIO口*/
#define UART0 0x05                         //P0.0  P0.1控制UART0,发送到PC机显示
#define SPI   0x00005500                   //P0.4 P0.5 P0.6 P0.7连接SPI,数码管显示用                          
#define DAC   2<<18                        //P0.25连接到DAC   
#define key1  1<<25                        //P1.25连接到按键key1   
 
  /*AD GPIO口*/
#define AD01  1<<24                        //P0.28连接到AD0.1测VOH
#define AD03  1<<28                        //P0.30连接到AD0.3测VIH
#define AD05  1<<20                        //P0.26连接到AD0.5测IIL
#define AD15  3<<30                      //P0.15连接到AD1.5测VIL
#define AD16  2<<10                        //P0.21连接到AD1.6测VOL
#define AD17  1<<12                        //P0.22连接到AD1.7测IOL


#define UART_BPS  115200                   // 通讯波特率115200
#define HC595_CS  (1 << 29)              // P0.29口为74HC595的片选
uint32  IODIR0;
/*
*******************************************************************************************************
** 函数名称 :DelayNS()
** 函数功能 :长软件延时
** 入口参数 :dly 延时参数,值越大,延时越久
** 出口参数 :无
*******************************************************************************************************
*/
void DelayNS (uint32 dly)
{
 uint32 m;
 for ( ; dly>0; dly--)
    for (m=0; m<5000; m++);
}
/*
*******************************************************************************************************
** 函数名称 :UART0_Init()
** 函数功能 :初始化串口0:波特率115200,8位数据位,1位停止位,无奇偶校验。
** 入口参数 :无
** 出口参数 :无
*******************************************************************************************************
*/
void UART0_Init (void)
{
 uint16 Fdiv;
 U0LCR = 0x83;                   // DLAB = 1
 Fdiv = (Fpclk / 16) / UART_BPS;
 U0DLM = Fdiv / 256;
 U0DLL = Fdiv % 256;
 U0LCR = 0x03;
}
/*
*********************************************************************************************************
** 函数名称 :UART0_GetByte()
** 函数功能 :从串口接收1字节数据,使用查询方式接收。
** 入口参数 :无
** 出口参数 :接收到的数据
*********************************************************************************************************
*/
uint8 UART0_GetByte (void)
{
 uint8 rcv_dat;
 
 while ((U0LSR & 0x01) == 0);
 
 rcv_dat = U0RBR;
 
 rcv_dat0=rcv_dat-48;
 
 return (rcv_dat); 
}
/*
*********************************************************************************************************
** 函数名称 :UART0_GetStr()
** 函数功能 :从串口接收
** 入口参数 : s 指向接收数据数组的指针
**    n 接收的个数
** 出口参数 : 无
*********************************************************************************************************
*/
void UART0_GetStr (uint8 *s, uint32 n)
{  
    uint8 i="0";
 for ( ; n>0; n--)
 {
  *s++ = UART0_GetByte();
  rcv_buf[i++]=rcv_dat0;
 }    
   
          biaozhunzhi[0]=(rcv_buf[0]*100+rcv_buf[1]*10+rcv_buf[2]) /100;
          biaozhunzhi[1]=(rcv_buf[3]*100+rcv_buf[4]*10+rcv_buf[5]) /100;
          biaozhunzhi[2]=(rcv_buf[6]*100+rcv_buf[7]*10+rcv_buf[8]) /100;
          biaozhunzhi[3]=(rcv_buf[9]*100+rcv_buf[10]*10+rcv_buf[11])/100;
          biaozhunzhi[4]=(rcv_buf[12]*100+rcv_buf[13]*10+rcv_buf[14])/100;
          biaozhunzhi[5]=(rcv_buf[15]*100+rcv_buf[16]*10+rcv_buf[16])/100;
}
/*
*******************************************************************************************************
** 函数名称 :UART0_SendByte()
** 函数功能 :向串口发送字节数据,并等待数据发送完毕。
** 入口参数 :data  要发送的数据
** 出口参数 :无
*******************************************************************************************************
*/
void UART0_SendByte (uint8 data)
{
 U0THR = data;
 while ((U0LSR & 0x40) == 0);    // 等待数据发送完毕
}
/*
*******************************************************************************************************
** 函数名称 :PC_DispChar()
** 函数功能 :向PC机发送显示字符。
** 入口参数 :x  显示字符的横坐标
**     y  显示字符的纵坐标
**     chr 显示的字符,不能为ff
**     color 显示的状态,包括前景色、背景色、闪烁位。
**     与DOS字符显示一样:0~3,前景色,4~6,背景色,7,闪烁位。
** 出口参数 :无 
*******************************************************************************************************
*/
void PC_DispChar (uint8 x, uint8 y, uint8 chr, uint8 color)
{
 UART0_SendByte(0xff);        // 起始字符
 UART0_SendByte(x);
 UART0_SendByte(y);
 UART0_SendByte(chr);
 UART0_SendByte(color);
}
/*
*******************************************************************************************************
** 函数名称 :ISendStr()
** 函数功能 :向上位机发送字符串。
** 入口参数 :x  显示字符的横坐标
**     y  显示字符的纵坐标
**     color 显示的状态,包括前景色、背景色、闪烁位。
**     与DOS字符显示一样:0~3,前景色,4~6,背景色,7,闪烁位。
**     str 要发送的字符串,以'\0'结束
** 出口参数 :无 
*******************************************************************************************************
*/
void ISendStr (uint8 x, uint8 y, uint8 color, char *str)
{
 while (1)
 {
  if (*str == '\0') break;               // 结束字符
  PC_DispChar(x++, y, *str++, color);
  if (x >= 80)
  {
   x = 0;
   y++;
  }
 }
}
/*
*******************************************************************************************************
** 函数名称:MSPI_Init()
** 函数功能:初始化SPI接口,设置为主机。
** 入口参数:无
** 出口参数:无
********************************************************************************************************
*/
void  MSPI_Init(void)
{   IODIR0=IODIR;
    IODIR = HC595_CS;
    S0PCCR = 0x52;              // 设置SPI时钟分频
  S0PCR  =(0 << 3) |    // CPHA = 0, 数据在SCK 的第一个时钟沿采样
    (1 << 4) |    // CPOL = 1, SCK 为低有效
    (1 << 5) |    // MSTR = 1, SPI 处于主模式
    (0 << 6) |    // LSBF = 0, SPI 数据传输MSB (位7)在先
    (0 << 7);    // SPIE = 0, SPI 中断被禁止
}
/*
*******************************************************************************************************
** 函数名称:MSPI_SendData()
** 函数功能:向SPI总线发送数据。
** 入口参数:data   待发送的数据
** 出口参数:返回值为读取的数据
*******************************************************************************************************
*/
uint8  MSPI_SendData(uint8 data)

    IOCLR = HC595_CS;           // 片选74HC595
    SPI_SPDR = data;
    while( 0 == (SPI_SPSR & 0x80));  // 等待SPIF置位,即等待数据发送完毕
    IOSET = HC595_CS;
    return(SPI_SPDR);
}
/* 此表为LED0~F以及L、P的字模 */
uint8 const DISP_TAB[19] = {
//   0    1     2    3    4    5    6    7    8    9   
 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8, 0x80,0x90,
//   A    b      C    d    E      F
 0x88, 0x83, 0xC6, 0xA1,0x86, 0x8E,
//   L     P    C
  0xC7, 0x8C,0xC6 };
/*
*********************************************************************************************************
** 函数名称 :DA ()
** 函数功能 :向端口送出DA值。
** 调试说明 :
*********************************************************************************************************
*/
void DA (void)
{
  if(DA_OUT<1023)
    {
      DA_OUT++;
      DACR=(DA_OUT<<6);
    }
}
/*
*********************************************************************************************************
** 函数名称 :csh0()
** 函数功能 :测量VIL VIH
** 调试说明 :
*********************************************************************************************************
把各个参数的值存到数组value里,其对应关系如下:
VIL    value[0]
VIH    value[1]
VOH    value[2]
VOL    value[3]
IIL    value[4]
IOL    value[5]
*********************************************************************************************************
*/
void csh0 (void)                                  
{
 uint32 data,data1;
 DA_OUT=0;
 DA();
 
 if(DA_OUT>=240)
   {
     IO1PIN=(IO1PIN |(0x3f<<18))&(~(1<<19));        //LED2 测量VIH
        /*先测AD1.6,将其值作为条件测AD0.3  VIH*/
        AD1CR = (1 << 6)|((Fpclk / 1000000 - 1) << 8)|(0 << 16)|(0 << 17)|(1 << 21)|(0 << 22)|(1 << 27)|(1 << 24); 
        while((AD1DR & (0x80000000) )==0); 
        data1= (AD1DR >> 6) & 0x3ff;                  //读取ADC结果,并清除DONE标志位
        data1=data1*ad16x;
        AD0CR = (1 << 3)|((Fpclk / 1000000 - 1) << 8)|(0 << 16)|(0 << 17)|(1 << 21)|(0 << 22)|(1 << 27)|(1 << 24);
        while((AD0DR & (0x80000000) )==0);
        if ((data1<=510)&(data1>=490))            //0.5V左右的范围
        {
       fm2=(fm2+1)%7;
       value[fm2-1][1]= data1;
        }  
    }
  
  
    else  
   {
           IO1PIN=(IO1PIN |(0x3f<<18))&(~(1<<18));//LED1 测量VIL
             /*先测AD0.1,将其值作为条件 VIL*/
           AD0CR = (1 << 1)|((Fpclk / 1000000 - 1) << 8)|(0 << 16)|(0 << 17)|(1 << 21)|(0 << 22)|(1 << 27)|(1 << 24);          
      while((AD0DR & (0x80000000) )==0);
      data= (AD0DR >> 6) & 0x3ff;                  //读取ADC结果,并清除DONE标志位
           data="data"*ad01x;
      AD1CR = (1 << 5)|((Fpclk / 1000000 - 1) << 8)|(0 << 16)|(0 << 17)|(1 << 21)|(0 << 22)|(1 << 27)|(1 << 24);
           while((AD1DR & (0x80000000) )==0);
           if((data>=2690)&(data<=2710))                        //AD0.1 VOH="2".7V为条件  测AD1.5 VIL="0".8V
       {
         fm1=(fm1+1)%7;
      value[fm1-1][0]= data;
      //fm1+=1;
    }
          }
  
 } 


/*
*********************************************************************************************************
** 函数名称 :csh1()
** 函数功能 :测量VOH VOL
** 调试说明 :
*********************************************************************************************************
*/
void csh1 (void)                                    
{  
    uint32 data,data1,data2,data3;
    uint16 ddd1,ddd2;                            //DA输出值


/*AD1.5*k输出VIL=0.8V为条件  测量AD0.1  VOH="2".7V*/     
    IO1PIN=(IO1PIN |(0x3f<<18))&(~(1<<20));        //LED3   测量VOH  
    ddd1=165;
loop1: DACR=(ddd1<<6);                                     
    DelayNS(1);
    AD1CR = (1 << 5)|((Fpclk / 1000000 - 1) << 8)|(0 << 16)|(0 << 17)|(1 << 21)|(0 << 22)|(1 << 27)|(1 << 24);
    while((AD1DR & (0x80000000))==0);
    data= (AD1DR >> 6) & 0x3ff;                  //读取ADC结果,并清除DONE标志位
    data="data"*ad15x;
   
    if(data<=803)
     { if (data>=797)                 //判断是否为0.8V
        {
         DelayNS(1);
         AD0CR = (1 << 1)|((Fpclk / 1000000 - 1) << 8)|(0 << 16)|(0 << 17)|(1 << 21)|(0 << 22)|(1 << 27)|(1 << 24);
         while((AD0DR & (0x80000000))==0);
         data1= (AD0DR >> 6) & 0x3ff;          //读取ADC结果,并清除DONE标志位
         data1=data1*ad01x;
     
      fm3=(fm3+1)%7;
      value[fm3-1][2]= data1;         
            //fm3+=1;
         }
         else{
            ddd1=(ddd1+1)%1024;
            goto loop1;
          }
  }
     else
         {
        ddd1=(ddd1-1)%1024;
        goto loop1;
         }
      
/*AD0.3*k输出VIH=2V为条件  测量AD1.6 VOL="0".5V*/     
    DelayNS(100);
    IO1PIN=(IO1PIN |(0x3f<<18))&(~(1<<21));        //LED4 测量VOL  
    ddd2=826;
loop2: DACR=(ddd2<<6);                                     
   
    AD0CR = (1 << 3)|((Fpclk / 1000000 - 1) << 8)|(0 << 16)|(0 << 17)|(1 << 21)|(0 << 22)|(1 << 27)|(1 << 24);
    while((AD0DR & (0x80000000))==0);
    data2= (AD0DR >> 6) & 0x3ff;              //读取ADC结果,并清除DONE标志位
    data2=data2*ad03x;
    
     if(data2<=2005)
      {
         if (data2>=1995)             //判断是否为2.0V
        {
        AD1CR = (1 << 6)|((Fpclk / 1000000 - 1) << 8)|(0 << 16)|(0 << 17)|(1 << 21)|(0 << 22)|(1 << 27)|(1 << 24);
        while((AD1DR & (0x80000000))==0);
        data3= (AD1DR >> 6) & 0x3ff;          //读取ADC结果,并清除DONE标志位
        data3=data3*ad16x;
    
     fm4=(fm4+1)%7;
     value[fm4-1][3]= data3;         
           //fm4+=1;
         }
     else {                      //如果>2.0V
        ddd2--;
        goto loop2;
         } 
       }    
     else                                        //<2.0V
       {
        ddd2++;
        goto loop2;
       }
 }
/*
*********************************************************************************************************
** 函数名称 :csh2()
** 函数功能 :测量IIL IOL
** 调试说明 :
*********************************************************************************************************
*/
void csh2 (void)                                    

    uint32 data,data1,data2;
    uint16 ddd3;                                 //DA输出值


/*AD1.5*k输出VIL=0.4V为条件  测量AD0.5 IIL="-0".4mA*/   
   
    DelayNS(100);
    IO1PIN=(IO1PIN |(0x3f<<18))&(~(1<<22));        //LED5 测量IIL
    ddd3=83;  
loop3: DACR=(ddd3<<6);                                           
   
    AD1CR = (1 << 5)|((Fpclk / 1000000 - 1) << 8)|(0 << 16)|(0 << 17)|(1 << 21)|(0 << 22)|(1 << 27)|(1 << 24);
    while((AD1DR & (0x80000000))==0);
    data=(AD1DR >> 6) & 0x3ff;
    data="data"*ad15x;
    
    if(data<=402)
       {
         if (data>=398)                 //AD1.5=0.4V为条件  测AD0.5 IIL
            {
           AD0CR =(1 << 5)|((Fpclk / 1000000 - 1) << 8)|(0 << 16)|(0 << 17)|(1 << 21)|(0 << 22)|(1 << 27)|(1 << 24);
           while((AD0DR & (0x80000000))==0);
           data1= (AD0DR >> 6) & 0x3ff;          //读取ADC结果,并清除DONE标志位
           data1=data1*ad05x;
    
        fm5=(fm5+1)%7;
        value[fm5-1][4]= (data1-data)/300;    //300欧姆 根据实际修改        
              //fm5+=1;
             }
         else 
             {
            ddd3--;
            goto loop3;
             }
       }
     else 
       {
        ddd3++;
        goto loop3;
       }


/*测量AD1.7  IOL     (硬件)调节电位器使得恒压输出为0.5V*/  
        IO1PIN=(IO1PIN |(0x3f<<18))&(~(1<<23));    //LED6 测量IOL            
  DelayNS(2);    
  AD1CR =(1 << 7)|((Fpclk / 1000000 - 1) << 8)|(0 << 16)|(0 << 17)|(1 << 21)|(0 << 22)|(1 << 27)|(1 << 24);
  while((AD1DR & (0x80000000))==0);       
  data2= (AD1DR >> 6) & 0x3ff;          //读取ADC结果,并清除DONE标志位
  data2=data2*ad17x;     
  
  fm6=(fm6+1)%7;
     value[fm6-1][5]= (data2-500)/390;        //390欧姆   根据实际修改
     //fm6+=1;
}
/*
*******************************************************************************************************
** 函数名称 :bijiao()
** 函数功能 :把存到数组的测量值与标准值相比较,如有错误则发送到value[6]显示
** 调试说明 :
*******************************************************************************************************
*/
void bijiao (void)
{
  uint8 i;
  uint32 j;
  for(i=0;i<6;i++)
     {
           if(value[0]<biaozhunzhi[0])          //比较第一列,以下逐列比较
                  {
                    value[6]=1;
                  };
           if(value[1]>biaozhunzhi[1])
                  {
                    value[6]=(value[6])|2;
                  };
           if(value[2]<biaozhunzhi[2])
                  {
                    value[6]=(value[6])|4;
                  };
           if(value[3]>biaozhunzhi[3])
                  {
                    value[6]=(value[6])|8;
                  };
                  j="value"[4];
                    j="fabs"(j); 
           if(j>biaozhunzhi[4])
                  {
                    value[6]=(value[6])|0x10;
                  };
           if(value[5]<biaozhunzhi[5])
                  {
                    value[6]=(value[6])|0x20;
                  };
           for(i=0;i<6;i++)                  
                  {       /*存入比较值*/
                    value[6]=(1&value[6])*100000+(2&value[6])*20000+(4&value[6])*3000+(8&value[6])*400+(0x10&value[6])*50+(0x20&value[6])*6;
                  }    
     }
}
/*
*******************************************************************************************************
** 函数名称 :xianshi()
** 函数功能 :把转换值发送到串口以坐标形式显示。
** 调试说明 :在config.h中包含stdio.h
*******************************************************************************************************
*/
void xianshi (void)
{
  char str[10];
  uint8 i,j;
  sprintf (str, " %1d  VIL",ay[0]);
     ISendStr(1,1, 0x30,str);
     DelayNS(10);
          
           sprintf (str, " %1d  VIH ",ay[1]);
     ISendStr(10,1,0x30,str);
     DelayNS(10);
    
     sprintf (str, " %1d  VOH ",ay[2]);
     ISendStr(20,1,0x30,str);
     DelayNS(10);
    
     sprintf (str, " %1d  VOL ",ay[3]);
     ISendStr(30,1,0x30,str);
     DelayNS(10);
    
     sprintf (str, " %1d  IIL ",ay[4]);
     ISendStr(40,1,0x30,str);
     DelayNS(10);
    
     sprintf (str, " %1d  IOL ",ay[5]);
     ISendStr(50,1,0x30,str);
     DelayNS(10);
    
     sprintf (str, " %1d  ERR ",ay[6]); //出错标志
     ISendStr(60,1,0x30,str);
     DelayNS(10);
          
           for(i=1;i<7;i++)
             {
               for(j=0;j<6;j++)                            
                  {
                   DelayNS(10);
                   sprintf (str, "%8d",value[i-1][j]*2480/1024);
             ISendStr(j*10,i+1,0x30,str);
                  }
             }
          for(i=1;i<7;i++)
             {
                   DelayNS(10);
                   sprintf (str, "%8d",value[i-1][j]);
             ISendStr(60,i+1,0x30,str);
             }
}
/*
*********************************************************************************************************
** 函数名称 :IRQ_Timer0()
** 函数功能 :定时器0中断服务程序,产生锯齿波
** 入口参数 :无
** 出口参数 :无
*********************************************************************************************************
*/
void __irq IRQ_Timer0 (void)
{              
   DA_OUT=(DA_OUT+1)%1024;
   DACR="DA"_OUT<<6;
   T0IR = 0x01;                      // 清除中断标志  
   VICVectAddr = 0x00;                 // 通知VIC中断处理结束       
}
/*
*******************************************************************************************************
** 函数名称 :主程序 main()  
** 函数功能 :把转换值发送到串口以坐标形式显示。
** 调试说明 :在config.h中包含stdio.h
*******************************************************************************************************
*/
int main (void)
{  
    char str[10];
    uint8 i,j;
    uint8 snd[20];
    PINSEL0 =0xc0005505;                   //总的管脚初始化
 PINSEL1 =0x11181800;                
 PINSEL2 =PINSEL2&(~0x08);       //0x03ff
 IO0DIR =(1<<8)|(1<<9)|(1<<10)|(1<<12)|(1<<13)|(1<<16)|(1<<17)|(1<<18)|(1<<19)|(1<<20)|(1<<23)|(1<<27);
         //J1     J2     J3      J4      J5      J6      J7      J8       J9     J10     J11     J12
 
 IO1DIR =(1<<16)|(1<<17)|(1<<18)|(1<<19)|(1<<20)|(1<<21)|(1<<22)|(1<<23)|(1<<24)|(0<<25); 
            //A0      A1      LED1    LED2    LED3    LED4    LED5    LED6    A2     KEY1
    
    UART0_Init();
         
    chz:  for(j=0;j<6;j++)
      {
         MSPI_Init();
         MSPI_SendData(DISP_TAB[j+1]);  //数码管显示1,2 ,3,4,5,6               
         IODIR="IODIR0";
         DelayNS(1000);
        
         IO0PIN= a[j][0];               
         //VICIntEnable =(1 << 4)|(1 << 18);
         csh0();
        
         IO0PIN=a[j][1];               
         csh1();                        //测量VOH VOL
       
         IO0PIN=a[j][2];                     
         csh2();                        //测量IIL IOL 
      }
         bijiao ();                     //查询是否存在错误,如有则发送显示
               xianshi ();


while(1)
     {       
     /*示波器显示三角波  判断有键则推退出并测量新的芯片*/
   T0TC=0;
   T0PR  = 0;                // 分频系数
   T0MCR = 0x003;               // 设置T1MR0匹配后将T1TC复位,并产生中断标志
   T0MR0 = Fpclk/1024/5000;           // 定时
   T0TCR = 0x03;               // 启动并复位T0TC
   T0TCR = 0x01;              // 启动T0TC
   IRQEnable();         // IRQ中断使能
   DA();
   /* 设置定时器0中断IRQ */
   VICIntSelect = 0x00;          // 所有中断通道设置为IRQ中断   
   VICVectCntl0 = 0x20 | 0x04;         // 设置定时器0中断通道分配最高优先级 
   VICVectAddr0 = (uint32)IRQ_Timer0;    // 设置中断服务程序地址 
   T0IR = 0x01;                  // 清除中断标志    
   VICIntEnable = 1 << 0x04;      // 使能定时器0中断
             
 if((IO1PIN&key1)==0)                  //等待重做命令
   {
     goto  chz;
   }
 if((U0LSR & 0x01) == 1)
    {
    UART0_GetStr(snd,18);
    for(i=0;i<18;i++)
    {
       sprintf (str, "%4d",rcv_buf);
    ISendStr(70,i,0x30,str);
    }
    }                
     }
    return 0;
}
/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/

PARTNER CONTENT

文章评论2条评论)

登录后参与讨论

用户1224933 2008-2-15 22:23

你好!请问有没有这个程序所对应的电路?它是哪个开发板或者是哪个产品的程序?我现在也是做这个作为毕业设计,请帮帮忙,谢谢!.我的邮箱是:2292ljq@163.com  

用户48732 2008-1-24 14:57

 “ARM软件全仿真的DOS字符窗口”怎样调出?
相关推荐阅读
用户55264 2007-01-25 14:53
数字集成电路参数测试仪源程序
/****************************************Copyright (c)**********************************************...
我要评论
2
2
关闭 站长推荐上一条 /1 下一条