⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 z_25045.c

📁 MCS-51单片机实验 39个实用实验和源码
💻 C
字号:
/*-------------------------------------------------------------
**
**  版权:上海航虹高科技有限公司,2002年
**
**  文件名: e25045b.C
**
**  描述:  本文件是与5196ET实验机配套完成的实验程序。
**  更改:  FOR  EAT598实验机
**--------------------------------------------------------------
*/

/*-------------------------------------------------------------
**       文件包括
**-------------------------------------------------------------
*/
/*-------------------------------------------------------------
**
**
*/
#include <reg51.h>          //定义51单片机特殊功能寄存器的值的标准头文件
#define XBYTE ((unsigned char volatile *) 0x020000L)
//#define CBYTE ((unsigned char volatile *) 0x050000L)
//#define DBYTE ((unsigned char volatile *) 0x040000L)
#define z8279 XBYTE[0xf239]   //8279命令/状态口//
#define d8279 XBYTE[0xf238]  //8279数据口//

unsigned char data dataBuf[16];//数据缓冲区

/*used in 25045读写*/
unsigned char bdata x1;	//used in 25045读写
sbit x1b0=x1^0;
sbit x1b1=x1^1;
sbit x1b2=x1^2;
sbit x1b3=x1^3;
sbit x1b4=x1^4;
sbit x1b5=x1^5;
sbit x1b6=x1^6;
sbit x1b7=x1^7;

sbit cs=P1^0;  //cs接5196ET的P1.0
sbit sck=P1^1; //sck接5196ET的P1.1
sbit si=P1^2;  //SI接5196ET的P1.2
//sbit so=P1^2;  //so接5196ET的P1.2
sbit so=P1^5;  //so接5196ET的P1.5
sbit wp=P1^3;  //wp接5196ET的P1.3

bit addr8;  //地址第八位
unsigned char data addr;
unsigned char data *dataP;
unsigned char data rn;

sbit light1=P1^4;  //数据传送指示灯5196ET的P1.4

/*数码管显示码表*/
unsigned char code led[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
							0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

unsigned char n;//数码管显示的位置

/*-------------------------------------------------------------
**       函数定义
**-------------------------------------------------------------
*/

/*-------------------------------------------------------------
**  函数名:wr8Bit
**  格式: void wr8Bit()
**  返回值: 无
**  描述:x1写入25045 8位 
**  算法:从高位一位一位传送,在SCK上升沿输入
**-------------------------------------------------------------
*/							
void wr8Bit()	//x1写入25045 8位
{
	si=x1b7;    
	sck=1;
	sck=0;	
	si=x1b6;
	sck=1;
	sck=0;	
	si=x1b5;
	sck=1;
	sck=0;	
	si=x1b4;
	sck=1;
	sck=0;	
	si=x1b3;
	sck=1;
	sck=0;	
	si=x1b2;
	sck=1;
	sck=0;	
	si=x1b1;
	sck=1;
	sck=0;	
	si=x1b0;
	sck=1;
	sck=0;	

}

/*-------------------------------------------------------------
**  函数名:rd8Bit
**  格式: void rd8Bit()
**  返回值: 无
**  描述:读25045 8位到x1
**  算法:从高位一位一位传送,在SCK下降沿输出
**-------------------------------------------------------------
*/
void rd8Bit()	//读25045 8位到x1
{
	so=1;
	sck=1;
	x1b7=so;
	sck=0;
	sck=1;
	x1b6=so;
	sck=0;
	sck=1;
	x1b5=so;
	sck=0;
	sck=1;
	x1b4=so;
	sck=0;
	sck=1;
	x1b3=so;
	sck=0;
	sck=1;
	x1b2=so;
	sck=0;
	sck=1;
	x1b1=so;
	sck=0;
	sck=1;
	x1b0=so;
	sck=0;
}

/*-------------------------------------------------------------
**  函数名:rd2545S
**  格式: void rd2545S()
**  返回值: 无
**  描述:读25045状态到x1
**  算法:
**-------------------------------------------------------------
*/
void rd2545S()	//读25045状态到x1
{
	do
	{
		x1=0x05;//写状态的指令格式0000 0101
		sck=0;
		cs=0;
		wr8Bit();
		rd8Bit();
		cs=1;
	}while(x1b0==1);
}

/*-------------------------------------------------------------
**  函数名:wr2545en
**  格式: void wr2545en()
**  返回值: 无
**  描述:置写允许
**  算法:将写允许的指令格式00000110写入到X25045
**-------------------------------------------------------------
*/	
void wr2545en()	//置写允许
{
	x1=0x06;    //读状态的指令格式0000 0110
	sck=0;
	cs=0;
	wr8Bit();
	cs=1;
}

/*-------------------------------------------------------------
**  函数名:wr2545S
**  格式: void wr2545S()
**  返回值: 无
**  描述:写25045状态
**  算法:先置写允许,然后把写状态的指令地址写入25045,再将状态写入
**-------------------------------------------------------------
*/
void wr2545S()	//写x1到25045状态
{
	unsigned char data y1;
	y1=x1;
	wp=1;
	wr2545en();
	x1=0x01;  //写状态的指令格式0000 0001
	sck=0;
	cs=0;
	wr8Bit();
	x1=y1&0x3c;	//00111100看门狗溢出和写保护四位有效
	wr8Bit();
	cs=1;
	wp=0;
}
	
/*-------------------------------------------------------------
**  函数名:rd2545D
**  格式: void rd2545D()
**  返回值: 无
**  描述:读25045内E2PROM的数据
**  算法:将从25045读到的数据送入dataP指向的数组。地址=addr8,addr,rn个
**-------------------------------------------------------------
*/
void rd2545D()	
{				
	x1=0x03;    //读数据的指令格式0000 A8011
	x1b3=addr8; //位3(A8)=addr8用于选择芯片的上半区还是下半区
	sck=0;
	cs=0;
	wr8Bit();
	x1=addr;    //数据所要存放的地址addr
	wr8Bit();
	while(rn!=0)//判断所要读的数据个数rn,不为零就将读到的送入dataP指向的数组
	{
		rd8Bit();
		*dataP=x1;
		dataP++;
		rn--;
	}
	cs=1;			
}

/*-------------------------------------------------------------
**  函数名:wr2545D
**  格式: void wr2545D()
**  返回值: 无
**  描述:写dataP指向的数组数据到25045的E2PROM
**  算法:参见程序注释
**-------------------------------------------------------------
*/
void wr2545D()	
{				
	wp=1;
	wr2545en();				
	x1=0x02;    //写数据的指令格式0000 A8010
	x1b3=addr8; //位3(A8)=addr8用于选择芯片的上半区还是下半区
	sck=0;
	cs=0;
	wr8Bit();
	x1=addr&0xfc; //addr&0xfc地址是从00——11
	wr8Bit();
	while(rn!=0)  //判断要写入的数据个数rn(最多为4个)
	{             //rn不为零,写dataP指向的数组数据到 25045
		x1=*dataP;
		wr8Bit();
		dataP++;
		rn--;
	}	
	cs=1;
	wp=0;
	rd2545S();
}

/*-------------------------------------------------------------
**  函数名:wr2545D1
**  格式: void wr2545D1()
**  返回值: 无
**  描述:写1个数据到25045的E2PROM
**  算法:参见程序注释
**-------------------------------------------------------------
*/
void wr2545D1()	//写x1数据到 25045,地址=addr8,addr,1个,
{
	unsigned char data y1;
	y1=x1;
	wp=1;
	wr2545en();				
	x1=0x02;
	x1b3=addr8;
	sck=0;
	cs=0;
	wr8Bit();
	x1=addr;
	wr8Bit();
	x1=y1;
	wr8Bit();
	cs=1;
	wp=0;
	rd2545S();
}

/*-------------------------------------------------------------
**  函数名:mSecond
**  格式: void mSecond(unsigned char x)
**  返回值: 无
**  描述:延迟x ms
**  算法:
**-------------------------------------------------------------
*/
void mSecond(unsigned int x)   //延迟x ms
{   
    unsigned int i;
    while((x--)!=0)
    {
    	for (i=0;i<125;i++){;}
    }
}

/*-------------------------------------------------------------
**  函数名:sta8279
**  格式: void sta8279()
**  返回值: 无
**  描述:初始化8279
**  算法:
**-------------------------------------------------------------
*/
void sta8279()		//初始化8279
{   
    z8279=0x00;    //00表示左键输入,八位字符显示
    z8279=0x2f;    //2f表示扫描速率
    z8279=0xc1;    //C1清除显示RAM
}

/*-------------------------------------------------------------
**  函数名:dispLed1
**  格式: void dispLed1()
**  返回值: 无
**  描述:一个数码管显示
**  算法:设定显示位置并显示数据,
**-------------------------------------------------------------
*/
void dispLed1()	
{   
	z8279=0x80+n;   //显示的RAM地址加上位置偏移量n
	d8279=led[x1];  //数据x1送8279数据口地址
}

/*-------------------------------------------------------------
**  函数名:dispLed2
**  格式: void dispLed2()
**  返回值: 无
**  描述:两个数码管显示
**  算法:
**-------------------------------------------------------------
*/
void dispLed2()		//两个数码管显示,x1=data,n=position
{   
	unsigned char y1;
	y1=x1;
	x1=x1&0x0f;   //取低位
	dispLed1();
	n++;          //位置偏移量加1准备显示下一位
   	x1=y1&0xf0;	  //取高位
	x1=x1>>4;     //右移四位
	dispLed1();
}

/*------------------------------------------------
**  函数名: main
**  格式: void main()
**  返回值: 无
**  描述:主程序
**  算法:参见程序注释
**------------------------------------------------
*/
void main()			//主函数
{
	unsigned char data y1;
	unsigned int  data  i;
    sta8279();
    
	x1=0x00;//00 无看门狗溢出
	wr2545S();
   
    while(1)
	{
		y1=0xff;     //从FF——00显示
		addr8=0;
		for(i=0;i<0xff;i++)
		{
			addr=i;
			x1=y1;
			wr2545D1();
			dataP=&dataBuf[0];
			rn=1;
			rd2545D();
	    	x1=dataBuf[0];
			n=0;
			dispLed2();
			light1=~light1;
			mSecond(200);
			y1--;
		}
	 
		y1=0;    //从00——FF显示
		addr8=1;
	//	for(i=0;i<0xfc;i+=4)
	    for(i=0;i<0xff;i+=4)
		{
			dataBuf[0]=y1++;
			dataBuf[1]=y1++;
			dataBuf[2]=y1++;
			dataBuf[3]=y1++;
			
			addr=i;
			dataP=&dataBuf;
			rn=4;
			wr2545D();
			
			dataP=&dataBuf[0];
			rn=4;
			rd2545D();
			
	    	x1=dataBuf[0];
			n=6;
			dispLed2();
			light1=~light1;
			mSecond(200);
			
			x1=dataBuf[1];
			n=6;
			dispLed2();
			light1=~light1;
			mSecond(200);
			
			x1=dataBuf[2];
			n=6;
			dispLed2();
			light1=~light1;
			mSecond(200);
			
			x1=dataBuf[3];
			n=6;
			dispLed2();
			light1=~light1;
			mSecond(200);
		}

	}

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -