本帖最后由 昨日的惆怅 于 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; //重新开启串口中断
}
}
此帖出自
小平头技术问答
一周热门 更多>