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

📄 s51_borad_test.c

📁 基于单片机的温度控制系统设计
💻 C
字号:
//2005-6-4 21:25
//2005-6-9 9:10		修改
/*资源:
		P00~P03 	四个按键
		P04			蜂鸣器
		P05			LCD		E
		P06 		LCD		R/W
		P07			LCD		RS
		P2 			LCD数据端口
		P22			24C02 	SCL
		P23			24C02	SDA
		P30、P31	两个LED
		HD7279	interface
		MOTOR DRIVE	interface
*/
//s51board	test
/*功能:上电后24C02计数从0~99
		液晶第一行显示24C02信息
		按键1(靠近串口)红灯亮
		按键2 绿灯亮
		按键3 蜂鸣器响
		按键4 灯灭、蜂鸣器停
		操作按键时,液晶第二行有信息提示*/
#include " reg51.h "
#include " intrins.h "
/********************************************************************/
#define 	LCDIO			P2
#define 	LINE1			0
#define 	LINE2			1
#define 	HIGH			1
#define 	LOW 			0
#define 	CLEARSCREEN		LCD_en_command(0x01)
#define 	LCD_DELAY_TIME	40

#define 	WRITE24C02		0xA0
#define     READ24C02		0xA1
#define 	ACK				0
#define     NO_ACK  		1
#define 	MSB				0x80
#define		KEY				(P0&0x0F)
#define 	KEY1			0X0E
#define 	KEY2			0X0D
#define 	KEY3			0X0B
#define 	KEY4			0X07
#define 	BUZZER_ON 		BUZZER=0
#define 	BUZZER_OFF 		BUZZER=1
#define 	LED1_ON 		LED1=0
#define 	LED2_ON 		LED2=0
#define 	LED1_OFF 		LED1=1
#define 	LED2_OFF 		LED2=1
/********************************************************************/
sbit RS=P0^7;			//数据、命令选择	1:数据 0:指令		4脚 
sbit RW=P0^6;			//读、写操作选择	1:读   0:写		5脚
sbit E=P0^5;			//使能信号								6脚

sbit SDA=P2^3;    		//AT24C02串行数据				5脚 
sbit SCLK=P2^2;   		//AT24C02串行时钟				6脚						

sbit BUZZER=P0^4;
sbit LED1=P3^0;
sbit LED2=P3^1;
/********************************************************************/
void LCD_delay(void);
void LCD_en_command(unsigned char command);
void LCD_en_dat(unsigned char temp);
void LCD_set_xy( unsigned char x, unsigned char y );
void LCD_write_char( unsigned x,unsigned char y,unsigned char dat);
void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s);
void LCD_init(void);
/********************************************************************/
void I2C_delay(void);
void I2C_start(void);
void I2C_stop(void);
void I2C_send_ack(bit k);
void I2C_write_byte(unsigned char dat);
unsigned char I2C_read_byte(void);
void I2C_write(unsigned char address,unsigned char dat);
unsigned char I2C_read(unsigned char address);
/********************************************************************/
void AT24C02_write(unsigned char address,unsigned char dat);
unsigned char AT24C02_read(unsigned char address);
/********************************************************************/
void Mcu_init(void);				//系统初始化
void delay_nms(unsigned int n);       //N ms延时函数
void Key_delay(void);
unsigned char count[2];
/********************************************************************/
void main(void)
{    
    unsigned char temp;  
	Mcu_init();
	while(1)				
	{
		AT24C02_write(0x00,count[1]);
		temp=AT24C02_read(0x00);
		LCD_write_string(0x00,LINE1,"AT24C02 TEST   ");
	    LCD_write_char(0x0e,LINE1,(temp/10)|0x30);
	    LCD_write_char(0x0f,LINE1,(temp%10)|0x30);
	    AT24C02_write(0x00,count[1]); 
		
		if(KEY!=0x0F) 
	 	{
			Key_delay();
			if(KEY!=0x0F)
			switch (KEY)
			{
				case KEY1:
					LED1_ON;
					LCD_write_string(0,LINE2,"KEY1 LED1 LIGHT ");
					break;
				case KEY2:  
					LED2_ON;
					LCD_write_string(0,LINE2,"KEY2 LED2 LIGHT ");
					break;
				case KEY3:
					BUZZER_ON;
					LCD_write_string(0,LINE2,"KEY3 BUZZER RING");
					break;
				case KEY4: 
					BUZZER_OFF;
					LED1_OFF; 
					LED2_OFF;
					LCD_write_string(0,LINE2,"KEY4 STOP ALL   ");
					break;
				default:	
					break;
		 	}
	 	}
	}
}
s/***********************************************************************/
void timer0(void) interrupt 1 using 1 
{
	TH0=-(12000/256);
    TL0=-(12000%256);
	count[0]=count[0]+1;
	if(count[0]==100)
    { 	
		count[0]=0;
		count[1]=count[1]+1;
		if(count[1]==99) 
			count[1]=0;
	}	
}
/***********************************************************************/
void Mcu_init(void) 
{
	TMOD=0x11;
	TH0=-(12000/256);
	TL0=-(12000%256);
	EA=1;
	ET0=1;
	TR0=1;
	LED1_ON;
    LED2_ON;
    BUZZER_ON; 
    delay_nms(100);
    LED1_OFF;
    LED2_OFF;
    BUZZER_OFF;
    LCD_init();	
}
/***********************************************************************/
/******************************** I2C PART **************************/
void I2C_delay(void)
{
	 _nop_();_nop_();_nop_();_nop_();
}
/***********************************************************************/
void I2C_start(void)
{
	 SDA=HIGH;
	 _nop_();
	 SCLK=HIGH;
	 _nop_();
	 SDA=LOW;
	 _nop_();
	 SCLK=LOW;
	 _nop_();
}
/***********************************************************************/
void I2C_stop(void)
{
	 SDA=LOW;
	 _nop_();
	 SCLK=HIGH;
 	 _nop_();
	 SDA=HIGH;
	 _nop_();
	 SCLK=LOW;
	 _nop_();
}
/***********************************************************************/
void I2C_send_ack(bit k)
{
	 SDA=k;
	 _nop_();
	 SCLK=HIGH;
	 I2C_delay();
	 SCLK=LOW;
}
/***********************************************************************/
void I2C_write_byte(unsigned char dat)
{
 	unsigned char i;
  	for (i=8;i>0;i--)
   	{
	    SCLK=LOW;
	    _nop_(); 
	    SDA=(bit)(dat&MSB);
	    dat<<=1;
	    I2C_delay();
	    I2C_delay();
	    SCLK=HIGH;
	    I2C_delay();
  	 }
   	SCLK=LOW;   
}
/***********************************************************************/
unsigned char I2C_read_byte(void)
{
 	unsigned char i,dat;
  	for (i=0;i<8;i++)
   	{
	    SCLK=LOW;
	    _nop_();
	    SDA=HIGH;
	    I2C_delay();
	    SCLK=HIGH;
	    dat<<=1;
   	    I2C_delay();
    	if(SDA)
    	   dat++;
   	} 
   	SCLK=LOW;  
  	 	
  	return (dat); 
}
/***********************************************************************/
void I2C_write(unsigned char address,unsigned char dat)
{
	unsigned char temp;
	temp=dat/10; 
	temp<<=4;
	temp=dat%10+temp;
	 
	I2C_start(); 
	I2C_write_byte(WRITE24C02);  			
	I2C_send_ack(ACK);
	I2C_write_byte(address);  	
	I2C_send_ack(ACK);    
	I2C_write_byte(temp);     
	I2C_send_ack(NO_ACK); 
	I2C_stop();
}
/***********************************************************************/
unsigned char I2C_read(unsigned char address)
{
	unsigned char temp,dat;
	I2C_start();
	I2C_write_byte(WRITE24C02);
	I2C_send_ack(ACK);
	I2C_write_byte(address); 
	I2C_send_ack(NO_ACK);
	I2C_stop();
	 
	I2C_start();
	I2C_write_byte(READ24C02);
	I2C_send_ack(ACK);
	dat=I2C_read_byte();
	I2C_send_ack(NO_ACK);
	I2C_stop();        
 
	temp=dat/16;
	dat=dat%16;
	dat=dat+temp*10;
 
 	return (dat);
}
/***********************************************************************/
/************************ 24C02 PART **********************************/
void AT24C02_write(unsigned char address,unsigned char dat)
{	
	_nop_();_nop_();_nop_();_nop_();
	I2C_write(address,dat);
	_nop_();_nop_();_nop_();_nop_();
}
/***********************************************************************/
unsigned char AT24C02_read(unsigned char address)
{
	unsigned char temp;
	_nop_();_nop_();_nop_();_nop_();
	temp=I2C_read(address); 
	_nop_();_nop_();_nop_();_nop_();
	
	return (temp);
}
/***********************************************************************/
/******************** LCD PART *************************************/
void LCD_delay(void)//延时子函数   
{
	unsigned char i;
	for(i=LCD_DELAY_TIME;i>0;i--);		//保证lcd复位的最小延时
}
/********************************************************************/  
void LCD_en_command(unsigned char command)//写命令函数
{
	LCDIO=command;
	RS=LOW;   
	RW=LOW;
	E=LOW;
	LCD_delay();
	E=HIGH;
}
/********************************************************************/
void LCD_en_dat(unsigned char dat)//写数据函数
{
	LCDIO=dat;
	RS=HIGH;
	RW=LOW;
	E=LOW;
	LCD_delay();
	E=HIGH;
}
/********************************************************************/
void LCD_set_xy( unsigned char x, unsigned char y )  //设置地址函数
{
	unsigned char address;
	if (y == 0) 
		address = 0x80 + x;
	else 
    	address = 0xc0 + x;
	LCD_en_command(address); 
}
/********************************************************************/
void LCD_write_char( unsigned x,unsigned char y,unsigned char dat)//写字符函数
{
	LCD_set_xy( x, y ); 
	LCD_en_dat(dat);
}
/********************************************************************/
void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s)//写字符串函数
{
    LCD_set_xy( X, Y ); //写地址 
    while (*s)  // 写显示字符
    {
    	LCDIO=*s;
        LCD_en_dat(*s);   
	s ++;
    }
}
/********************************************************************/
void LCD_init(void)//初始化子函数
{	
	CLEARSCREEN;//清屏
	LCD_en_command(0x38);//设置8位串数据格式
	LCD_en_command(0x0c);//开显示器
	LCD_en_command(0x80);//显示起始地址
	CLEARSCREEN;//清屏
}
/********************************************************************/
/******************* OTHER PART ***********************************/
void delay_nms(unsigned int n)       
{
   	unsigned int i=0,j=0;
   	for (i=n;i>0;i--)
   		for (j=0;j<1140;j++)
   			; 	
}
/********************************************************************/
void Key_delay(void)
{
	unsigned char temp;
	unsigned int i;
	for(temp=25;temp>0;temp--)
		for(i=50;i>0;i--);
}

⌨️ 快捷键说明

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