请大神帮我看下我的程序错在哪里,串口通信给个指令测试RAM
2019-07-15 09:37发布
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
本帖最后由 昨日的惆怅 于 2017-9-21 09:54 编辑
- #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; //重新开启串口中断
-
- }
- }
-
-
-
复制代码
一周热门 更多>