85 基于单片机水质检测仪系统仿真设计【毕设课设】

 

/* 写命令 */
void write_com( uchar com )
{
	LCDRS = 0;
	LCD_WriteData( com );
/*  DAT=com; */
	LCDdelay( 5 );
	LCDEN = 1;
	LCDdelay( 5 );
	LCDEN = 0;
}


/* 写数据 */
void write_data( uchar date )
{
	LCDRS = 1;
	LCD_WriteData( date );
/*  DAT=date; */
	LCDdelay( 5 );
	LCDEN = 1;
	LCDdelay( 5 );
	LCDEN = 0;
}


/*------------------------------------------------
*             选择写入位置
*  ------------------------------------------------*/
void SelectPosition( unsigned char x, unsigned char y )
{
	if ( x == 0 )
	{
		write_com( 0x80 + y );  /* 表示第一行 */
	}else  {
		write_com( 0xC0 + y );  /* 表示第二行 */
	}
}


/*------------------------------------------------
*             写入字符串函数
*  ------------------------------------------------*/
void LCD_Write_String( unsigned char x, unsigned char y, unsigned char *s )
{
	SelectPosition( x, y );
	while ( *s )
	{
		write_data( *s );
		s++;
	}
}


/*
 * ========================================================================
 * 函数: void LCD_Write_Char(u8 x,u8 y,u16 s,u8 l)
 * 应用: LCD_Write_Char(0,1,366,4) ;
 * 描述: 在第0行第一个字节位置显示366的后4位,显示结果为 0366
 * 参数: x:行,y:列,s:要显示的字,l:显示的位数
 * 返回: none.
 * 版本: VER1.0
 */

/* ======================================================================== */
void LCD_Write_Char( u8 x, u8 y, u16 s, u8 l )
{
	SelectPosition( x, y );


	if ( l >= 1 )
		write_data( 0x30 + s % 10 );  /* 个位 */
}


/*1602指令简介
 * write_com(0x38);//屏幕初始化
 * write_com(0x0c);//打开显示 无光标 无光标闪烁
 * write_com(0x0d);//打开显示 阴影闪烁
 * write_com(0x0d);//打开显示 阴影闪烁
 */
/* 1602初始化 */
void Init1602()
{
	uchar i = 0;
	write_com( 0x38 );      /* 屏幕初始化 */
	write_com( 0x0c );      /* 打开显示 无光标 无光标闪烁 */
	write_com( 0x06 );      /* 当读或写一个字符是指针后一一位 */
	write_com( 0x01 );      /* 清屏 */
}


void Display_1602( setValue, temp )
{
	/* 显示预设采集值 */
	LCD_Write_Char( 1, 13, setValue, 2 );
	/* 时时采集值 */
	LCD_Write_Char( 1, 7, temp, 1 );
}


/*
 * ========================================================================
 * 函数: unsigned int Adc0832(unsigned char channel)
 * 应用:          temp=Adc0832(0);
 * 描述: 读取0通道的AD值
 * 参数: channel:通道0和通道1选择
 * 返回: 选取通道的AD值
 * 版本: VER1.0
 * ========================================================================
 */
unsigned int Adc0832( unsigned char channel )
{
	uchar	i = 0;
	uchar	j;
	uint	dat	= 0;
	uchar	ndat	= 0;
	uchar	Vot	= 0;

	if ( channel == 0 )
		channel = 2;
	if ( channel == 1 )
		channel = 3;
	ADDI = 1;
	_nop_();
	_nop_();
	ADCS = 0;                       /* 拉低CS端 */
	_nop_();
	_nop_();
	ADCLK = 1;                      /* 拉高CLK端 */
	_nop_();
	_nop_();
	ADCLK = 0;                      /* 拉低CLK端,形成下降沿1 */
	_nop_();
	_nop_();
	ADCLK	= 1;                    /* 拉高CLK端 */
	ADDI	= channel & 0x1;
	_nop_();
	_nop_();
	ADCLK = 0;                      /* 拉低CLK端,形成下降沿2 */
	_nop_();
	_nop_();
	ADCLK	= 1;                    /* 拉高CLK端 */
	ADDI	= (channel >> 1) & 0x1;
	_nop_();
	_nop_();
	ADCLK	= 0;                    /* 拉低CLK端,形成下降沿3 */
	ADDI	= 1;                    /* 控制命令结束 */
	_nop_();
	_nop_();
	dat = 0;
	for ( i = 0; i < 8; i++ )
	{
		dat	|= ADDO;        /* 收数据 */
		ADCLK	= 1;
		_nop_();
		_nop_();
		ADCLK = 0;              /* 形成一次时钟脉冲 */
		_nop_();
		_nop_();
		dat <<= 1;
		if ( i == 7 )
			dat |= ADDO;
	}
	for ( i = 0; i < 8; i++ )
	{
		j	= 0;
		j	= j | ADDO;     /* 收数据 */
		ADCLK	= 1;
		_nop_();
		_nop_();
		ADCLK = 0;              /* 形成一次时钟脉冲 */
		_nop_();
		_nop_();
		j	= j << 7;
		ndat	= ndat | j;
		if ( i < 7 )
			ndat >>= 1;
	}
	ADCS	= 1;    /* 拉低CS端 */
	ADCLK	= 0;    /* 拉低CLK端 */
	ADDO	= 1;    /* 拉高数据端,回到初始状态 */
	dat	<<= 8;
	dat	|= ndat;

	return(dat);    /* return ad data */
}


/*
 * ========================================================================
 * 函数: u8 Key_Scan()
 * 应用: temp=u8 Key_Scan();
 * 描述: 按键扫描并返回按下的键值
 * 参数: NONE
 * 返回: 按下的键值
 * 版本: VER1.0
 * 备注: 该函数带松手检测,按下键返回一次键值后返回0,直至第二次按键按下
 * ========================================================================
 */
u8 Key_Scan()
{
	static u8 key_up = 1;   /*按键按松开标志 */
	if ( key_up && (Key1 == 0 || Key2 == 0 || Key3 == 0) )
	{
		delay_ms( 10 ); /* 去抖动 */
		key_up = 0;
		if ( Key1 == 0 )
			return(1);
		else if ( Key2 == 0 )
			return(2);
		else if ( Key3 == 0 )
			return(3);
	}else if ( Key1 == 1 && Key2 == 1 && Key3 == 1 )
		key_up = 1;
	return(0); /* 无按键按下 */
}


void main( void )
{
	u8 key;
	Buzzer	= 0;
	Led	= 0;
	Init1602();                                     /* 调用初始化显示函数 */
	LCD_Write_String( 0, 0, ">Water Quality<" );    /* 开机界面 */
	LCD_Write_String( 1, 0, "NOW EQ:0  UP:0" );
	delay_ms( 1000 );

	while ( 1 )                                     /* 主循环 */
	{
		key	= Key_Scan();                   /*按键扫描 */
		value	= Adc0832( 0 );                 /* 读取采集值值 */
		if ( value < 36 )
		{
			value = 0;
		}else if ( (value > 36 || value == 36) && value < 72 )
		{
			value = 1;
		}else if ( (value > 72 || value == 72) && value < 108 )
		{
			value = 2;
		}else if ( (value > 108 || value == 108) && value < 140 )
		{
			value = 3;
		}else if ( (value > 140 || value == 140) && value < 172 )
		{
			value = 4;
		}else if ( (value > 172 || value == 172) && value < 208 )
		{
			value = 5;
		}else if ( value > 208 || value == 208 )
		{
			value = 6;
		}
		if ( key == KEY_SET )
		{
			Mode++;
		}

		switch ( Mode )                                 /* 判断模式的值 */
		{
		case 0:                                         /* 监控模式 */
		{
			Display_1602( setValue, value );        /* 显示预设采集值,预设采集值,采集值值,采集值值 */
			if ( value >= setValue )                /* 采集值值大于等于预设值时 */
			{
				Led	= 1;                    /* 采集值指示灯亮 */
				Fan	= 0;
				Buzzer	= 1;                    /* 蜂鸣器报警 */
			}else  {                                /* 采集值值小于预设值时 */
				Buzzer	= 0;
				Led	= 0;                    /* 关掉报警灯 */
				Fan	= 1;
			}

			break;
		}

		case 1:                                         /* 预设采集值模式 */
		{
			SelectPosition( 1, 13 );                /* 指定位置 */
			write_com( 0x0f );                      /* 打开显示 无光标 光标闪烁 */
			if ( key == KEY_ADD )                   /* 加键按下 */
			{
				setValue++;                     /* 预设采集值值(阀值)加1,最大为255 */
				if ( setValue >= 6 )            /* 当阀值加到大于等于255时 */
					setValue = 6;           /* 阀值固定为254 */

				LCD_Write_Char( 1, 13, setValue, 2 );
			}
			if ( key == KEY_MINUS )                 /* 减键按下 */
			{
				if ( setValue <= 1 )            /* 当采集值上限值减小到1时 */
					setValue = 1;           /* 固定为1 */
				setValue--;                     /* 预设采集值值减一,最小为0 */
				LCD_Write_Char( 1, 13, setValue, 2 );
			}
			break;
		}
		default:
		{
			write_com( 0x38 );                      /* 屏幕初始化 */
			write_com( 0x0c );                      /* 打开显示 无光标 无光标闪烁 */
			Mode = 0;                               /* 恢复正常模式 */
			break;
		}
		}
	}
}

资料下载地址

https://pan.baidu.com/s/1zETFUkJt8LRexunrdCeM4w?pwd=8888

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值