单片机/MCUwilliam hill官网
直播中

DF_wei

7年用户 25经验值
擅长:嵌入式技术 模拟技术 处理器/DSP 接口/总线/驱动 控制/MCU
私信 关注
[问答]

请大神帮我看下我的程序错在哪里,串口通信给个指令测试RAM

本帖最后由 昨日的惆怅 于 2017-9-21 09:54 编辑
  1. #include
  2. #include                 //头文件 调用_Nop_()函数
  3. #include           //访问绝对地址的头文件
  4. #define uchar unsigned char        // unsigned char 宏定义为 uchar  unsigned char 就是0~255
  5. #define uint  unsigned int        // 定义uint为无符号整型。无符号整型就是说内存中表示这个数的二进制串没有符号位,也就是没有负数。
  6. #define _Nop_() _nop_()     //定义空指令
  7. #define ushort unsigned short



  8. bit  RAMERR;
  9. uchar RAMDATA,dat2,dat3;
  10. uint RAMADDR,RAMdat2;
  11. uchar flag, OK,ZZZ,NO,i,Dat;

  12. void InitUART(void)
  13. {
  14.     TMOD = 0x20;                                         //将timer1设置为Mode2以产生波特率
  15.     SCON = 0xd0;                                    //串口工作方式3,串口工作方式2有固定的波特率
  16.     TH1 = 0xfd;                                                //波特率9600
  17.     TL1 = TH1;
  18.     PCON = 0x00;                                        //将SMOD设置为0
  19.     TR1 = 1;                                                //开启定时器1
  20.         EA=1;                                                    //开启总中断
  21.         ES=1;                                                   //开启串口中断
  22. }
  23. void SendData(uchar Dat)                         //发送数据
  24. {
  25.     ACC = Dat;
  26.         CY=P;
  27.         TB8=~CY        ;
  28.         SBUF=ACC;
  29.     while(!TI);
  30.     TI = 0;                                 //软件复位         
  31. }

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


  39. void sendstring(uchar *p)   //送字符串
  40. {
  41.    
  42.   while(*p)
  43.   {
  44.   SendData(*p);
  45.   p++;
  46.   }
  47. }


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

  59.                 _nop_();
  60.                 _nop_();
  61.                 _nop_();
  62.         }
  63. }
  64. void RAMread(uchar dat)
  65. {                                                                          


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

  69.                 _nop_();
  70.                 _nop_();
  71.                 _nop_();
  72.         if(RAMDATA==dat)        //比较数据
  73.                 {

  74.                   sendstring("RAMdat is OK.");

  75.                 }
  76.                 else
  77.                 {
  78.                         SendData(RAMADDR);
  79.                 }
  80.                 _nop_();
  81.                 _nop_();
  82.                
  83.         
  84.         }  
  85. }
  86. void RAMaddr_bus_check(void)
  87. {
  88.         uchar k;
  89.         uchar datt1;
  90.         uchar datt2;
  91. //        uchar ZZZ;
  92.     uint RAMaddr=1;
  93.    

  94.         XBYTE[0x0000]=0xff;                                                  //写数据 CCC==0XFF
  95.         delay1ms(1);
  96.         for(k=0;k<15;k++)
  97.         {               
  98.                 XBYTE[RAMaddr<
  99.                 delay1ms(1);
  100.                 datt1=XBYTE[RAMaddr<
  101.                 datt2=XBYTE[0x0000];                        //datt2==0xff
  102.                 if(datt1==k&&datt1!=datt2)                //datt1==k是测试ram地址总线是否读写数据一致,是否粘连 (一致,没有粘连,datt1等于K)
  103. //        for(k=1;k<16;k++)                                        //datt1!=datt2是测试ram地址总线是否断路  (datt1等于datt2,断路)   
  104. //         {
  105. //            XBYTE[RAMaddr<
  106. //                delay1ms(1);
  107. //            datt1=XBYTE[RAMaddr<
  108. //                datt2=XBYTE[RAMaddr<<(k-1)];
  109. //                if(datt1!=datt2)
  110.                 {                          
  111.                     RAMERR=0;                 
  112.                                  
  113.            }
  114.            else
  115.             {
  116.                   RAMERR=1;

  117.                 }
  118.            if(RAMERR==0)
  119.             {
  120.                     sendstring("RAMaddr bus is OK.");
  121.             _nop_();
  122.                  }         
  123.                if(RAMERR==1)
  124.                   {
  125.                    sendstring("RAMaddr bus is no.");
  126. //                   SendData(RAMaddr);
  127.                     }
  128.    }
  129. }
  130. void RAMdata_bus_check(void)
  131. {
  132.         uchar datt1,datt2,A;
  133.         for(A=0;A<8;A++)
  134.         {
  135.                 XBYTE[0x0000] = 0x00  ;                                   //写数据         ZZZ==0X00
  136.                 delay1ms(1 ) ;
  137.                 datt1 = XBYTE[0x0000]  ;
  138.                 delay1ms(1 ) ;
  139.                 if((datt1 & (0x01<
  140.                 {        
  141.                         XBYTE[0x0000] = (0x01<
  142.                         delay1ms(1 ) ;
  143.                         datt2 = XBYTE[0x0000]  ;
  144.                         delay1ms(1 ) ;
  145.                         if(datt2 & (0x01<
  146.                         {
  147.                            RAMERR=0;

  148.                         }
  149.                         else
  150.                          {
  151.                             RAMERR=1;
  152.                           }
  153.                 }                           
  154.         }
  155.                 if(RAMERR==0)
  156.            {

  157.                   sendstring("RAMdata bus is OK.");

  158.          delay1ms(200);                 //LED2,LED3,LED4,LED5,LED6, 全亮 ,延迟5s
  159.         }
  160.                  if(RAMERR==1)
  161.                  {
  162.                    SendData(A);
  163.                    delay1ms(200);                         //LED2,LED3,LED4,LED5,LED6, 全灭 ,延迟5s
  164.                   }
  165.           }        
  166.         



  167. void main(void)                                                   //主程序
  168. {
  169.     InitUART();                                           //端口初始化
  170.         AUXR = 0x02;
  171.         while(1)
  172.    {

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

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

  179.                  delay1ms(500);
  180.                  
  181.                 if(ZZZ==0xaa)
  182.                 {

  183.           RAMwrite(0xaa);        
  184.               delay1ms(500);
  185.           RAMread(0xaa);

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

  192.                    }
  193.                    if(ZZZ==0x00)
  194.                    {

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

  197.                         }

  198. //                  if(RAMDATA==CCC)        //比较数据
  199. //                {
  200. //
  201. //                  sendstring("RAMaddress is OK.");
  202. //
  203. //                }
  204. //                else
  205. //                {
  206. //                        SendData(RAMADDR);
  207. //                }
  208. //                _nop_();
  209. //                _nop_();
  210. //
  211. //              delay1ms(1000);
  212.             }        
  213.        ES=1;                               //重新开启串口中断  
  214.                  
  215.          }                                                               

  216.         }

  217.    
  218.    






  • RAM的测试.jpg
已退回2积分

回帖(1)

DF_wei

2017-9-21 09:22:05
我短接了RAM地址线的其中两根,程序中给个指令ff,测试RAM的地址总线,单片机应该回个RAMaddr bus is no.给调试助手的,然而单片机给的却是RAMaddr bus is OK.,请路过的大神帮忙分析下
举报

更多回帖

发帖
×
20
完善资料,
赚取积分