请大神看一下以下程序,这是是串口调试助手发指令给单片机进行RAM的粘连和短路测试

2019-03-24 17:10发布

本帖最后由 昨日的惆怅 于 2017-9-20 15:17 编辑

[C] 纯文本查看 复制代码
#include <STC89C5xRC.H>
#include<intrins.h>                 //头文件 调用_Nop_()函数
#include <absacc.h>          //访问绝对地址的头文件
#define uchar unsigned char        // unsigned char 宏定义为 uchar  unsigned char 就是0~255
#define uint  unsigned int        // 定义uint为无符号整型。无符号整型就是说内存中表示这个数的二进制串没有符号位,也就是没有负数。
#define _Nop_() _nop_()     //定义空指令
#define ushort unsigned short



bit  RAMERR;
uchar RAMDATA,dat2,dat3;
uint RAMADDR,RAMdat2;
uchar flag, OK,ZZZ,NO,i,Dat;

void InitUART(void)
{
    TMOD = 0x20;                                         //将Timer1设置为Mode2以产生波特率
    SCON = 0xd0;                                    //串口工作方式3,串口工作方式2有固定的波特率
    TH1 = 0xfd;                                                //波特率9600
    TL1 = TH1;
    PCON = 0x00;                                        //将SMOD设置为0
    TR1 = 1;                                                //开启定时器1
        EA=1;                                                    //开启总中断
        ES=1;                                                   //开启串口中断
}
void SendData(uchar Dat)                         //发送数据
{
    ACC = Dat;
        CY=P;
        TB8=~CY        ;
        SBUF=ACC;
    while(!TI);
    TI = 0;                                 //软件复位         
}

void my_int1(void) interrupt 4                                 //串口中断服务程序
{
  RI=0;
  ZZZ=SBUF;
                                    //将SBUF中的数据读走给c, 这是此中断服务程序最重要的目的
  flag = 1;                                                   //将标志位flag置1, 以方便在主程序中查询判断是否已经收到数据
}


void sendstring(uchar *p)   //送字符串
{
   
  while(*p)
  {
  SendData(*p);
  p++;
  }
}


void delay1ms(int x) //1ms延时
{        int i,j;                                        //声明整型变量i;j
        for(i=0;i<x;i++)                        //计数x次,延迟xX1ms
         for(j=0;j<120;j++);                //计数120次,延迟1ms
}                                                                //延时函数结束
void RAMwrite(uchar dat)
{
        for(RAMADDR=0x0000;RAMADDR<0x8000;RAMADDR++)          //15根地址线(0000 0000 0000 0000~1000 0000 0000 0000)
        {
                XBYTE[RAMADDR]=dat;          //此地址对应一个字节,把数据(dat)写入地址(RAMADDR)即把数据写入62256如
                                           //        XBYTE [0x4000] = 57;这赋值语句,就可以把57写到外部RAM的0x4000处了,此地址对应一个字节。

                _nop_();
                _nop_();
                _nop_();
        }
}
void RAMread(uchar dat)
{                                                                          


        for(RAMADDR=0x0000;RAMADDR<0x8000;RAMADDR++)  //62256末地址        0X8000
        {
                RAMDATA = XBYTE[RAMADDR];          //从62256读出数据

                _nop_();
                _nop_();
                _nop_();
        if(RAMDATA==dat)        //比较数据
                {

                  sendstring("RAMdat is OK.");

                }
                else
                {
                        SendData(RAMADDR);                                                                                                                                          
                }
                _nop_();
                _nop_();
               
        
        }  
}
void RAMaddr_bus_check(void)
{
        uchar k;
        uchar datt1;
        uchar datt2;
//        uchar ZZZ;
    uint RAMaddr=1;
   

        XBYTE[0x0000]=0xff;                                                  //写数据 CCC==0XFF
        delay1ms(1);
        for(k=0;k<15;k++)
        {               
                XBYTE[RAMaddr<<k]=k;
                delay1ms(1);
                datt1=XBYTE[RAMaddr<<k];                //datt1==k
                datt2=XBYTE[0x0000];                        //datt2==0xff
                if(datt1==k&&datt1!=datt2)                //datt1==k是测试ram地址总线是否读写数据一致,是否粘连 (一致,没有粘连,datt1等于K)
//        for(k=1;k<16;k++)                                        //datt1!=datt2是测试ram地址总线是否断路  (datt1等于datt2,断路)   
//         {
//            XBYTE[RAMaddr<<k]=k;                                   //0x0001左移K
//                delay1ms(1);
//            datt1=XBYTE[RAMaddr<<k];
//                datt2=XBYTE[RAMaddr<<(k-1)];
//                if(datt1!=datt2)
                {                          
                    RAMERR=0;                 
                                 
           }
           else
            {
                  RAMERR=1;

                }
           if(RAMERR==0)
            {
                    sendstring("RAMaddr bus is OK.");
            _nop_();
                 }         
               if(RAMERR==1)
                  {
                   sendstring("RAMaddr bus is no.");
//                   SendData(RAMaddr);
                    }
   }
}
void RAMdata_bus_check(void)
{
        uchar datt1,datt2,A;
        for(A=0;A<8;A++)
        {
                XBYTE[0x0000] = 0x00  ;                                   //写数据         ZZZ==0X00
                delay1ms(1 ) ;
                datt1 = XBYTE[0x0000]  ;
                delay1ms(1 ) ;
                if((datt1 & (0x01<<A)) == 0x00)
                {        
                        XBYTE[0x0000] = (0x01<<A) ;
                        delay1ms(1 ) ;
                        datt2 = XBYTE[0x0000]  ;
                        delay1ms(1 ) ;
                        if(datt2 & (0x01<<A))               
                        {
                           RAMERR=0;

                        }
                        else
                         {
                            RAMERR=1;
                          }
                }                           
        }
                if(RAMERR==0)
           {

                  sendstring("RAMdata bus is OK.");

         delay1ms(200);                 //LED2,LED3,LED4,LED5,LED6, 全亮 ,延迟5s
        }
                 if(RAMERR==1)
                 {
                   SendData(A);
                   delay1ms(200);                         //LED2,LED3,LED4,LED5,LED6, 全灭 ,延迟5s
                  }
          }        
        



void main(void)                                                   //主程序
{
    InitUART();                                           //端口初始化
        AUXR = 0x02;
        while(1)
   {

     if(flag==1)                                   //若检测到flag为1, 说明程序已经执行过串口中断服务程序, 即收到了数据.
        {

                 flag=0;                                           //如果写入成功,标志位flag就变为0
         ES=0;
  
//                 SendData(ZZZ);

                 delay1ms(500);
                 
                if(ZZZ==0xaa)
                {

          RAMwrite(0xaa);        
              delay1ms(500);
          RAMread(0xaa);

                  }
                  if(ZZZ==0xff)
                  {
                  
                    RAMaddr_bus_check();                //RAM地址总线检测是否有断线、粘线。
                        delay1ms(500);

                   }
                   if(ZZZ==0x00)
                   {

                     RAMdata_bus_check();        //RAM数据总线检测是否有断路、粘线。
                         delay1ms(500);

                        }

//                  if(RAMDATA==CCC)        //比较数据
//                {
//
//                  sendstring("RAMaddress is OK.");
//
//                }
//                else
//                {
//                        SendData(RAMADDR);
//                }
//                _nop_();
//                _nop_();
//
//              delay1ms(1000);
            }        
       ES=1;                               //重新开启串口中断  
                 
         }                                                               

        }



此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。