4.2 复位电路设计
图4-2 复位电路电路图
单片机复位的两种基本形式:上电复位和RST按键复位。
本设计采用RST按键复位。在复位电路的设计中,要选择合适的元器件参数,电阻的阻值不宜过大或者过小,过大使得RST不可能获得高电平,过小也不能起到限流作用。另外电容容值也应该合适,要保证放电时,RST引脚上的高电平也能保持两个机器周期以上的高电平。
4.3 晶振电路设计
图4-3 晶振电路电路图
本系统中为了尽量降低功耗的原则,采用了内部时钟方式。晶振全称为晶体振荡器(英文Crystal Oscillators),其作用在于产生原始的时钟频率。内部时钟方式的电路实现方法是在XTAL1和XTAL2引脚外接石英晶体,与单片机片内震荡电路形成震荡回路,图中电容C3和C4的容值为22pF,它们的作用是加快起振和稳定频率。
11
5显示模块软硬件设计 5.1 LCD1602简介
LCD1602每行可以输出16个字符,可以显示两行,故称1602,它不带中文字库,故只能显示数字、字母和普通字符。1602字符型LCD通常有14条引脚线或16条引脚线的LCD,多出来的2条线是背光电源线。在本设计中不检测液晶的忙与闲,用前面对待ADC0804的方法,用软件延时来等待液晶的忙操作时间。
液晶显示输出D0到D7口接P0.0到 P0.7,单独使用一个口,另外还要接上10K上拉电阻来提高P0口带负载能力。
当处于读状态时,RS处于低脉冲,R/W为高脉冲,E为高脉冲,D0~D7=状态字
当处于读数据时,RS为高脉冲,R/W为高脉冲,E为高脉冲,D0~D7=数据。 当处于写指令时,RS为低脉冲,R/W为低脉冲,D0~D7=指令码,E=高脉冲。
当处于写数据时,RS为高脉冲,R/W为低脉冲,E为高脉冲,D0~D7=数据。
12
5.2本设计中LCD1602的硬件连接
图5-1 LCD1602硬件连接图
5.3液晶写命令子函数和写数据子函数程序分析
在初始化函数void init(){…}中,已将R/W拉低(对应lcden=0;语句),即只对液晶进行写操作,不读液晶状态。
之前有位定义sbit lcdrs=P2^5; sbit lcdrw=P2^6; sbit lcden=P2^7; 写命令函数各语句分析: void write_com(uchar com)
{ lcdrs=0; //将RS拉低,对指令操作, 上电时是默认高电平 P0=com; //对P0赋值,该值是对应命令码 ,com为形参 delay(5); //延时约五毫秒
lcden=1; //E拉高,让液晶读P0口,写入对应命令码
delay(5); //延时约五毫秒,让液晶忙完再对其操作,防止数据丢失
lcden=0; //将E拉低 } 写数据函数各语句分析: void write_com(uchar da)
13
{ lcdrs=1; //将RS拉低高(读写数据),说明对数据操作 P0=da; //对P0赋值,该值是要写入的数据 ,da为形参 delay(5); //延时约五毫秒
lcden=1; //E拉高,让液晶读P0口,写入数据
delay(5); //延时约五毫秒,让液晶忙完再对其操作,防止数据丢失
lcden=0; //将E拉低 }
值得注意的是,在写数据的操作中,写入的都是字符ASCII码,例如想写1,让液晶在某处显1,可写write_data(’1’);或者write_data(0x30+1)。
5.4 本设计中用的液晶指令介绍
一些指令码的介绍:
0x38:液晶初始化指令,让液晶按每行显示16个字符,显示两行,并且每个字符显示处的点阵为5X7;
0x0C:不显示光标,光标不闪烁;
0x06:在写入一个数据后地址自动加一,显示不移动;
1即0x01:清屏指令,即将液晶内部存储数据清楚,地址指针指向零; 0x80+……:设置写入数据的地址,所加的就是对应地址。
5.5字符串显示和数据实时更新的实现
1)写字符串子程序: void write_str(uchar *p) {while(*p) write_data(*p++);}
这里灵巧的应用了数组指针,比传统的for嵌套循环写入方便很多。用while(*p)……自动检测是否写完,当写完后指针变为零,跳出循环。如想写
14
入\只需先定义数组uchar code str[]=\,再写语句write_str(str);写完后指针变为零,自动结束。
2)数据实时更新的实现方法,检测时不断调用显示子函数,display(); 显示函数如下: void display() {
uint value; //定义局部变量value uchar a,b,c; //定义局部变量a、b、c
value=3.92*temp; //获得value值,它是以ppm为单位 a=value/100; //a为value的百位 b=value0/10; //b为value的十位 c=value; //c为value的个位
write_com(0x80+0x40+4); //将数据写在第二行,第五个字符处 write_data(0x30+a); //在第二行,第五个字符处写入value百位
write_com(0x80+0x40+5); //将数据写在第二行,第六个字符处 write_data(0x30+b); //在第二行,第六个字符处写入value十位
write_com(0x80+0x40+6); //将数据写在第二行,第七个字符处 write_data(0x30+c); //在第二行,第七个字符处写入value个位
}
在循环语句中不断调用AD转换程序, ad();,又不断调用显示函数,数据就能实时检测更新。
在待机时,循环程序中不断执行语句:
write_com(0x80+6); //将数据写在第一行,第七个字符处
15
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库智能酒精浓度探测仪(3)在线全文阅读。
相关推荐: