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

📄 main.c

📁 主要有基于51的I2c读写24c64的测试程序
💻 C
📖 第 1 页 / 共 2 页
字号:
/*
**************************************************************************************
** 工程名   : AT89S52大夹
** 创建日期 :2008.11.4
** 说明     :本程序只供参考,因时间问题没有对本程序进行认真测试, 只是觉得很久没有用过51而写的程序,请不要转载
			  主函数部分未加整理  
** 联系     : 广西民族大学   06自动化   覃启溪   dongxixiaonanbi@163.com
**************************************************************************************
*/
#include <at89x52.h>
#include <intrins.h>
#include "lcd_51.h"
#include "delay_51.h"
#include "24c64.h"
#include "key.h"
//#include "adc0832.h" 


#define    uchar    unsigned char
#define    uint     unsigned int

//adc0832部分
uchar ReadAdc0832( uchar channel ) reentrant;
//ADC0832端口定义
#define     ADC0832_SCK_H      P1_1 = 1
#define     ADC0832_SCK_L      P1_1 = 0

#define     ADC0832_DIDO_H     P1_2 = 1
#define     ADC0832_DIDO_L     P1_2 = 0
#define     ADC0832_DIDO       P1_2

#define     ADC0832_CS_H       P1_0 = 1
#define     ADC0832_CS_L       P1_0 = 0

//按键部分
uchar sure = 0;
uchar model = 0;
uchar add_b = 0;
uint  add_p = 0x0000;

//串口部分

//uchar flag44 = 0;
//uchar flagadc0832 = 0;
//uchar flag24c64 = 0;
//uchar flagshumaguang = 0;
uchar flagwhole = 5;
//uchar flagno = 1;
uchar flagfillallow = 0;

uchar flagsendmessage44 = 0;
uchar flagsendmessageadc0832 = 0;
uchar flagsendmessageshumaguang = 0;
uchar flagsendmessage24c64 = 0;	
uchar flagdoing24c64 = 0;

//波特率宏定义
#define RELOAD_COUNT 0xfd;	//SMOD=1, crystal=11.0592, baud= 19200
//#define RELOAD_COUNT 0xFa	//SMOD=1, crystal=11.0592, baud= 9600
//#define RELOAD_COUNT 0xf4	//SMOD=1, crystal=11.0592, baud= 4800
//#define RELOAD_COUNT 0xe8	//SMOD=1, crystal=11.0592, baud= 2400


//缓冲区 
#define  Rec_Max       9   //定义最大值
#define  COMRECSIZE    16  //定义缓冲区大小

uchar    Rec_buf[COMRECSIZE];  
uchar    *Point2Rec_buf;    //定义指向数组Rec_buf的指针

uchar    Rec_n = 0;        //接收字节个数初始化为0
uchar    RecFullFlag = 0;  //接收满标志初始化为0


//-----------------------------------------------------串口部分接口函数--------------------------------------------------
/*
********************************************************************
** 函数名:串口初始化函数
** 例子  : UART_Init();
** 
********************************************************************
*/
void UART_Init( void )	
{
	SCON |= 0x50;	    //串口工作方式1, 波特率可变, 波特率由T1决定, 允许接收位REN = 1.	无奇偶校验位
	PCON |= 0x80;	    //波特率加倍
	TMOD |= 0x20;	    //T1, 8位自动, 方式2, 之所以选择工作方式2是因为它有自动加载功能,可以避免程序反复装入初值引起的误差
	
	TH1 = RELOAD_COUNT;	//赋初值高8位TH     RELOAD_COUNT由前宏定义
	TL1 = RELOAD_COUNT;	//赋初值低8位TH
	ES = 1;	            //开串口中断	
	ET1 = 0;            //禁止T1中断允许, 以免产生不必要的中断带来的频率误差
	TR1 = 1;	        //打开T1

	//EA = 1;           //注意, 还没有打开全局中断
}

//串口接收中断服务程序
void serial_INT4( void ) interrupt 4
{
   	if( RI )
   	{ 
   		RI = 0;                  //硬件置位,软件清零
		if( flagdoing24c64 == 0 )
		{
		switch( SBUF )
		{
			case '1': 
				{
					//4*4
					flagwhole = 1;
					flagsendmessage44 = 1;
					LCD_write_string( 1, 0, " made by hebei   " );
			    	LCD_write_string( 2, 0, " TEST 4*4 --> 0   " );
				}  break;

			case '2': 
				{
					//ADC
					flagwhole = 2;
					flagsendmessageadc0832 = 1;
					LCD_write_string( 1, 0, " made by hebei   " );
			    	LCD_write_string( 2, 1, "TEST ADC-->        " );
				}  break;

			
			case '3': 
				{
					//shumaguang
					flagwhole = 3;	
					flagsendmessageshumaguang = 1;
					LCD_write_string( 1, 0, " made by hebei   " );
			    	LCD_write_string( 2, 0, "TEST shumaguang  " );
				}  break;

			case '4': 
				{
					//24C64
					flagwhole = 4;
					flagsendmessage24c64 = 1;
					LCD_write_string( 1, 1, "0000 >0 is      " );  //
					LCD_write_string( 2, 0, "                 ");
					
				}  break;

		   case '5': 
				{
					//结束
					flagwhole = 5;
					LCD_write_string( 1, 0, " made by hebei   " );
   			 		LCD_write_string( 2, 0, "    NO TEST       " );
				}  break;

			
		}
		}

		if( flagdoing24c64 == 1 )
		{
		if( flagfillallow == 1 )
		{
		    Rec_buf[Rec_n++] = SBUF;
		
		    if( Rec_n == Rec_Max )
			    RecFullFlag = 1;
		}
	   }
	}
	
	return;
}


/*
********************************************************************
** 函数名:串口发送一个字符
** 例子  : UART_Sendstr( 'a' );
**
** 说明  : UART_SendCh(10);  //
**  	   UART_SendCh(13);  //回车换行 
********************************************************************
*/
void UART_SendCh( uchar Tmp_char )  
{
	TI = 0;
	SBUF = Tmp_char;
	while( !TI )
		{;}
}

/*
********************************************************************
** 函数名:串口发送字符串函数 
** 例子  : UART_Sendstr( "how are you?" );
** 
********************************************************************
*/
void UART_SendStr( uchar *str )	   
{ 	
	ES=0;      //disable uart0 interrupt;
	while( *str ) 
	{  
	 	TI = 0; 
		SBUF = ( *str );  
		++str;   
		while( !TI )
		{;}   //waitting for sending finished.
	} 
	TI=0;    
	ES=1;
}

//-----------------------------------------------------串口部分接口函数结束--------------------------------------------------



//-----------------------------------------------------外部中断0部分接口函数(24c64按键)--------------------------------------------------
//外中断初始化
void Int0init( void )
{
	EX0 = 1;  //允许外中断0
	IT0 = 1;  //边沿触发
}

//
void modelchang( void )
{
    model++;
	model %= 3;    //model在0-2之间
	switch( model )
	{
		case 0: LCD_write_char( 1, 0, ' ' ); LCD_write_char( 1, 6, ' ' ); break;
		case 1: LCD_write_char( 1, 0, '>' ); LCD_write_char( 1, 6, ' ' ); break;
		case 2: LCD_write_char( 1, 0, ' ' ); LCD_write_char( 1, 6, '>' );  break;
		default: break;
	}
}

//
void add( void )
{	
	uint k = add_p;
    switch( model )
    {
        case 1: 
	    		add_p++;
				add_p %= 0x000A;
				LCD_write_char( 1, 4, ( add_p & 0x000f ) + 0x30 ); break;
		case 2: 
				add_b %= Rec_Max;
				LCD_write_char( 1, 7, ( add_b & 0x000f ) + 0x30 ); 
				LCD_write_char( 1, 12, I2cReadDataFromAddr( 0xa0, k + add_b ) ); //从24C64里面读数据
				add_b++;
				break;

		default : break;
    }
}

//确定
void ok( void )
{
	sure = 1;
}

//外中断0服务程序
void int0_int( void ) interrupt 0
{
	EA = 0;   //禁止再次外中断
	
	if( ( P3 & 0x3c ) != 0x3c )
	{
	 	delay_nms( 20 );             //去除抖动
		if( ( ( P3 & 0x3c ) != 0x3c ) )
		{    
			switch( P3 & 0x3c )
    		{
        	 	//模式
        	 	case 0x30 : modelchang(); break;
        	 	//加
        	 	case 0x28 : add(); break;
        	 	//确定
        	 	case 0x18 : ok(); break;

        	 	default : break;
	    	}
		}
	}
	
	EA = 1;   //打开外中断
}

//-----------------------------------------------------外部中断0部分接口函数结束--------------------------------------------------


//-----------------------------------------------------芯片74HC595以及74HC139部分接口函数(数码管)--------------------------------------------------

//595端口定义
#define     HC595_SHCP_H       P0_0 = 1
#define     HC595_SHCP_L       P0_0 = 0
#define     HC595_DS_H         P0_1 = 1
#define     HC595_DS_L         P0_1 = 0
#define     HC595_STCP_H       P0_2 = 1
#define     HC595_STCP_L       P0_2 = 0

//139端口定义
#define     HC139A_H            P0_3 = 1
#define     HC139A_L            P0_3 = 0
#define     HC139B_H            P0_4 = 1
#define     HC139B_L            P0_4 = 0

//共阳a-7 b-6 c-5 d-4 e-3 f-2 g-1 h-0
uchar code Atab[] =				 //注意,此处要定义为code													
{
        0x03,/*0*/
        0x9F,/*1*/
        0x25,/*2*/
        0x0D,/*3*/
        0x99,/*4*/
        0x49,/*5*/
        0x41,/*6*/
        0x1F,/*7*/
        0x01,/*8*/
        0x09,/*9*/
};

//139译码
void HC139_Sendbyte( uchar senddata )
{
    switch( senddata )
    {
        case 0: HC139A_L; HC139B_L; break;
        case 1: HC139A_H; HC139B_L; break;
        case 2: HC139A_L; HC139B_H; break;
        case 3: HC139A_H; HC139B_H; break;
        default: break;
    }
}

/**********************************
** 函数作用:向595发送一个字节数据的低n位
** 入口参数:要写的字节 senddata
** 返回值  : 无
***********************************/
void HC595_Send( uchar Btemp )
{
    uchar i;
    for( i = 0; i < 8; i++ )
    {

⌨️ 快捷键说明

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