两个30PF的起振电容,J1是上拉电阻.单片机的P1口8位引脚与行列式键盘输出脚相连,控制和检测行列式键盘的输入.行线通过上拉电阻接到+5V上,无按键按下时,行线处于高电平状态,有键按下时,行线的电平状态将由与此行线相连接的列线的电平决定.键盘输入的信息主要进程是:
1 CPU判断是否有键按下. 2 确定是按下的是哪个键.
3 把此键所代表的信息翻译成计算机可以识别的代码或者其他的特征符号.
图 3.4 键盘硬件电路图
3.3显示电路的设计
液晶显示器是一种将液晶显示器件,连接器件,集成电路,PCB线路板,背光源,结构器件装配在一起的组件。
根据显示内容和方式的不同可以分为,数显LCD,点阵字符LCD,点阵图形LCD在此设计中我们采用点阵字符LCD,这里采用常用的2行16个字的1602液晶模块。
1602采用标准的14脚接口,其中:
第1脚:VSS为地电源第2脚:VDD接5V正电源
第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位
器
调
整
对
比
度
第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄
存
器
。
第5脚:RW为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和RW共同为低电平时可以写入指令或者显示地址,当RS为低电平RW
为高电平时可以读忙信号,当RS为高电平RW为低电平时可以写入数据。 第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。
第7~14脚:D0~D7为8位双向数据线。 第15~16脚:空脚。
与单片机的连接如图3.7所示。
图 3.5 液晶显示电路图
: 3、电路原理图
仿真结果:
附录
#include\
#define uchar unsigned char #define uint unsigned int #define ulong unsigned long
/*****************引脚定义*********************************/ sbit output=P2^5;
/********************************/ sbit CLOCK=P3^1; sbit D_IN=P2^7; sbit D_OUT=P2^6; sbit _CS=P3^0;
/********************************/ sbit lcdrs=P2^0; sbit lcdrw=P2^1; sbit lcden=P2^2;
/********************************/ sbit in1=P2^3; sbit in2=P2^4;
/********************************/ sbit led=P3^2; sbit speaker=P3^3;
/*****************引脚定义*********************************/ /*****************变量定义(申明)*********************************/ int freq=500,pwm=0;
uchar setflag=0,pageflag=0,ok=0; float pwm_temp=0;
float KP=100,KI=10,KD=0; uint pul_count=0; float ek=0,ek1=0,ek2=0;
uchar code str[16]=\ welcome! %uchar code str1[16]=%uchar code str2[16]=\ pra-T %uchar code str3[16]=\ I: D:%uchar code str4[16]=\ %uchar code str5[16]=\ %uchar code str6[16]=\ \void Init(void);
uint adcread(uchar port); void delay(uint n);
void writecom(uchar com); void writedata(uchar date); void initlcd();
float keyscan(void); uchar keyscans(void);
void lcdnumdisplay(uchar pos,double f); void lcdnumdisplays(uchar pos,double f); uint read_pul();
void mypid(float Kp,float Ki,float Kd,uint count,uint point);
/*****************变量定义(申明)*********************************/
void main() {
uchar i;float scantemp; float adnum0=0; float adnum1=0; bit init0,init1,init2,init3,init4; Init(); initlcd();
writecom(0x80); for(i=0;i<16;i++)writedata(str[i]); //huanyin writecom(0x80+0x40); for(i=0;i<16;i++)writedata(str1[i]); //shuming delay(200); while(1) {
pwm_temp=500*(float)(adnum0)/4095; //pwm=pwm_temp;
mypid(KP,KI,KD,adnum1,pwm_temp); scantemp=keyscan();
if(adnum1>=pwm_temp-1.5&&adnum1<=pwm_temp+1.5) {
led=0; speaker=1; } else{ led=1; speaker=0; } if(setflag==0) { adnum0=adcread(0); adnum1=adcread(1)/10; if(init0==0) { initlcd(); writecom(0x80); for(i=0;i<16;i++)writedata(str2[i]); //shuming
init0=1;init1=0;init2=0;init3=0;init4=0; }
lcdnumdisplays(0x80+0x40,(float)pwm_temp); //pwm_temp
lcdnumdisplays(0x80+0x4a,(float)adnum1); } if(setflag!=0&&pageflag==0) { if(init1==0) { initlcd(); writecom(0x80); for(i=0;i<16;i++)writedata(str3[i]); //PID init0=0;init1=1;init2=0;init3=0;init4=0; } lcdnumdisplays(0x80+0x40,KP); lcdnumdisplays(0x80+0x46,KI);
lcdnumdisplays(0x80+0x4D,KD); } if(setflag!=0&&pageflag==1) { if(init2==0) { initlcd(); writecom(0x80);
for(i=0;i<16;i++)writedata(str4[i]);
//P
init0=0;init1=0;init2=1;init3=0;init4=0; }
lcdnumdisplays(0x80+0x40,scantemp); if(ok==1)KP=scantemp; } if(setflag!=0&&pageflag==2) { if(init3==0) { initlcd(); writecom(0x80);
for(i=0;i<16;i++)writedata(str5[i]); //i
init0=0;init1=0;init2=0;init3=1;init4=0; }
lcdnumdisplays(0x80+0x40,scantemp); if(ok==1)KI=scantemp; } if(setflag!=0&&pageflag==3) { if(init4==0) { initlcd(); writecom(0x80);
for(i=0;i<16;i++)writedata(str6[i]); //d