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

📄 main.c

📁 ADUC845单片机AD/UART/SPI程序调试通过
💻 C
字号:
/********************************************************************

* Author        :cuit xiao deng    www.cuit.edu.cn   QQ:75968687

* Date          : 2009-4-12

* File          : aduc845.c

* Hardware      : ADuC845

* Description   : 主函数程序
                               
*********************************************************************/
#include<ADuC845.H>

/********************************************************************
*作者:许海波

*功能:全局变量声明

**********************************************************************/
char ADC_buffer[3][3]=0; 	//定义全局变量接收三个通道的AD转换结果
unsigned int AD_flag=0; 	//定义转换标志位
unsigned int TIMER_60s=0;	//定义时间变量
unsigned long int FM25H20_ADDRESS=0x00000000; //首地址
unsigned long int FM25H20_START=0x00000000

#define FM25H20_WREN  0x06 	//Set Write Enable Latch
#define FM25H20_WRDI  0x04	//Write Dsiable
#define FM25H20_RDSR  0x05 	//Read Status Register
#define FM25H20_WRSR  0x01 	//Write Status Register
#define FM25H20_READ  0x03 	//Read Memory Data
#define FM25H20_WRITE 0x02 	//Write Memory Data
#define FM25H20_SLEEP 0xb9 	//Enter Sleep Mode
#define FM25H20_CAPACITY 0x0003ffff	//容量

sbit CLK  =P2^0;
sbit MOSI =P2^1;
sbit MISO =P2^2;
sbit SS   =P2^3;
sbit HOLD =P2^5;      /*一般置低*/
sbit W    =P2^6;      /*一般置高*/


/*********************************************************************
*作者:许海波

*功能:定义主函数中包含个人定义的头文件

**********************************************************************/
#include"adc.h"
#include"uart.h"


/**********************************************************************
*作者:许海波

*功能:声明主函数中的一些函数

***********************************************************************/
void delay(unsigned int i);
void SPI_TX(unsigned char dat);
unsigned char SPI_RX(void);
void SPI_FM25H20_WRSR(void);
unsigned char SPI_FM25H20_READ(unsigned long int address);
void SPI_FM25H20_WRITE(unsigned long int address,unsigned char dat);
void TIMER0_Init();
void ARM_SEND();



/************************************************************************
*函数:void delay(unsigned int i)

*作者:许海波

*功能:延时函数,延时大小有i的值决定

*************************************************************************/
void delay(unsigned int i)
{ 	  
	while(i--);
}



/************************************************************************
*函数:void SPI_TX(unsigned char dat)

*作者:许海波

*功能:向SPI总线发送数据

*************************************************************************/
void SPI_TX(unsigned char dat)
{
	ISPI=0;               //对ISPI位清零
	SPIDAT=dat;           
	while(!ISPI);         //等待数据发送完成
}



/*************************************************************************
*函数:unsigned char SPI_RX(void)

*作者:许海波

*功能:向SPI总线发送数据

**************************************************************************/
unsigned char SPI_RX(void)
{
	unsigned char dat=0;	
	//ISPI=0;
	dat|=SPIDAT;
	//while(!ISPI);
	return(dat);
}


/*************************************************************************
*函数:void SPI_FM25H20_WRSR(void)

*作者:许海波

*功能:配置FM25H20中的状态寄存器

**************************************************************************/
void SPI_FM25H20_WRSR(void)
{
    SS  = 0;
	SPI_TX(FM25H20_WREN);
	delay(10);
	SS  = 1;
	delay(10);
	SS  = 0;
	SPI_TX(FM25H20_WRSR);
	SPI_TX(0x40);          /******对FM25H20内部状态寄存器进行配置,WPEN=1 ;BP0BP1=00;*******/
	delay(10);
	SS  = 1;
}


/*************************************************************************
*函数:unsigned char SPI_FM25H20_READ(unsigned long int address)

*作者:许海波	   

*功能:从FM25H20读取数据

**************************************************************************/
unsigned char SPI_FM25H20_READ(unsigned long int address)
{
	unsigned char ADDR_H,ADDR_M,ADDR_L;
	unsigned char dat=0;
	unsigned long int ADD;

	ADD = address;
    ADDR_H=(unsigned char)((ADD >> 16) & 0x000000FF);   
    ADD = address;
    ADDR_M=(unsigned char)((ADD >> 8) & 0x000000FF); 
    ADD = address;
    ADDR_L=(unsigned char)(ADD & 0x000000FF); 

	SS  = 0;
	SPI_TX(FM25H20_WRDI);
	SS  = 1;
	delay(10);
	SS  = 0;
	SPI_TX(FM25H20_READ);
	SPI_TX(ADDR_H);	          /**发送地址数据高8位**/
	SPI_TX(ADDR_M);	          /**发送地址数据中间8位**/
	SPI_TX(ADDR_L);           /**发送地址数据低8位**/
	dat=SPI_RX();
	return(dat);
	SS  = 1;
}



/*****************************************************************************
*函数:void SPI_FM25H20_WRITE(unsigned long int address,unsigned char dat)

*作者:许海波

*功能:向FM25H20写数据

******************************************************************************/
void SPI_FM25H20_WRITE(unsigned long int address,unsigned char dat)
{
	unsigned char ADDR_H,ADDR_M,ADDR_L;
	unsigned long int ADD;

	ADD = address;
    ADDR_H=(unsigned char)((ADD >> 16) & 0x000000FF);   
    ADD = address;
    ADDR_M=(unsigned char)((ADD >> 8) & 0x000000FF); 
    ADD = address;
    ADDR_L=(unsigned char)(ADD & 0x000000FF); 

    SS  = 0;
	SPI_TX(FM25H20_WREN);
	delay(10);
	SS  = 1;
	delay(10);

	SS  = 0;
	SPI_TX(FM25H20_WRITE);
	SPI_TX(ADDR_H);	          /**发送地址数据高8位**/
	SPI_TX(ADDR_M);	          /**发送地址数据中间8位**/
	SPI_TX(ADDR_L);           /**发送地址数据低8位**/
	SPI_TX( dat);             /****发送数据****/
	//delay(10);
	SS  = 1;
	//delay(10);

}


/****************************************************************************
*函数:void TIMER0_int () interrupt 1

*作者:许海波

*功能:定时1S向FM250存数据

*****************************************************************************/
void TIMER0_int () interrupt 1
{
	 int i,j;
	 EA=0;
	 TIMER_60s++;
	 if(TIMER_60s==200)	      //如果时间到了1S向FM250存数据
	 {  
		for(i=0;i<=2;i++)
		for(j=0;j<=2;j++)
		{	if	(FM25H20_ADDRESS==0xFFFFFFFF)	 //如果数据存满了返回开头从新存 覆盖旧的数据
				 FM25H20_ADDRESS=0x00000000;
			else SPI_FM25H20_WRITE(FM25H20_ADDRESS++,ADC_buffer[i][j]);
		 }
	   	 TIMER_60s=0;
	  }
	  
	  EA=1;
}


/****************************************************************************
*函数:void TIMER0_Init()

*作者:许海波

*功能:定时1S向FM250存数据

*****************************************************************************/
void TIMER0_Init()
{
   TMOD=0X01;		// 定时器0,工作模式1
   TH0=0X00;		// 给初值
   TL0=0X00;
   ET0=1;			// 开启定时器0的中断
}


/****************************************************************************
*函数:ARM_SEND()

*作者:许海波

*功能:向主系统发送数据

*****************************************************************************/
void ARM_SEND()
{
	unsigned long int  i;
	EA=0;	
	for( i=FM25H20_START;i<=FM25H20_CAPACITY;i++)
	{
		
		UART_SEND_DATA((char) SPI_FM25H20_READ(i));		
	}
	
	EA=1;
}



/******************************************************************************
*函数:void main()

*作者:许海波

*功能:主函数

*******************************************************************************/
void main(void)
{
	unsigned int Tongxun=0;
	ADC_Init();
	UART_INIT();
	TIMER0_Init();
	SPICON = 0x30;
	UART_INIT();
	HOLD =  0;             /*一般置低*/
	W    =  1;             /*一般置高*/
    SPI_FM25H20_WRSR();

 while(1)
 	{

	  
	  Tongxun=UART_RECEIVE_DATA( );
	  if(Tongxun==123)
	  {
	  	ARM_SEND();
		SBUF=0X00;
		Tongxun=0;
	   }

	 }
}


⌨️ 快捷键说明

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