图7 LCD1602显示器部分
分析:LCD1602详细介绍见图8和图9
图8 LCD1602引脚功能
图9 LCD1602引脚功能
图10 按键部分
分析:检测单片机引脚是否为低电平来判断是否按键按下。
图11 警报部分 分析:通过检测IN2口电压来警报,当电压大于上限制或者低于下限值会LED亮和蜂鸣器报警。 三、程序设计 1、程序框图: 开始 按键扫描 k0 显示设定的通道电压 K1 快速依次显示八通道各电压 K2 间隔一定时间显示各通道电压 K3 选择要显示的通道 K4 对IN2口进行报警控制 #define uchar unsigned char voidinit(); voidwrite_com(uchar); voidwrite_data(uchar); 2、程序代码: #include
voidwrite_sfm(uchar,uchar); void read(uint i); void display(uint i); void key(); ucharnum,shuju;
uint i=0,ii=0,b1,b2,t=3,tt,fre,flag; float b;
uchar code table[]=%uchar code table1[]=%uchar code
tab[8]={0x00,0x20,0x40,0x60,0x80,0xa0,0xc0,0xe0}; sbit RW=P1^7; sbit RS=P1^6; sbit EN=P1^5; sbit START=P3^6; sbit AD_INT=P3^2; sbit AD_ENA=P3^7; sbit k0=P1^0; sbit k1=P1^1; sbit k2=P1^2; sbit k3=P1^3; sbit k4=P1^4; sbit LED1=P3^5; sbit SPEAK=P3^4; /*****************主程序*****************/ void main() { init(); while(1) { key();
}
}
/*****************初始化LCD1602和中断服务*****************/ voidinit() { RW=0; //进入写操作
write_com(0x38); //显示十六位液晶
write_com(0x0c); //打开十六位液晶,不显示光标
write_com(0x06); //写下一个数右移以为 write_com(0x01); //清屏 write_com(0x80); //第一行写 for(num=0;num<15;num++) {
write_data(table[num]); //第一行写数据 delay(5);
}
write_com(0x80+0x40);
for(num=0;num<12;num++) //第二行写数据 {
write_data(table1[num]); delay(5); }
fre=50000; SPEAK=1; TMOD=0x11;
TH0=(65536-fre)/256; TL0=(65536-fre)%6; TH1=(65536-50000)/256; TL1=(65536-50000)%6; EA=1; ET0=1; ET1=1; TR1=0; TR0=0;
}
/*****************中断服务子程序*****************/ void timer0() interrupt 1 { TR0=0;
TH0=(65536-fre)/256; TL0=(65536-fre)%6; tt++; if(flag<40)
{
if(tt==0) { tt=0;
tt=50000;
SPEAK=~SPEAK; }
}
if(flag>=40&&flag<80) { tt=0; fre=50000; SPEAK=~SPEAK; }
if(flag>=80&&flag<120) { tt=0; fre=10000; SPEAK=~SPEAK; }
if(flag>=120&&flag<160) { tt=0; fre=5000; SPEAK=~SPEAK; }
if(flag>=160&&flag<200) { tt=0; fre=2500; SPEAK=~SPEAK; }
if(flag>=200&&flag<240) { tt=0; fre=1250; SPEAK=~SPEAK; }
if(flag>=240&&flag<280) { tt=0; fre=625; SPEAK=~SPEAK; }
if(flag>=280&&flag<320) { tt=0; fre=312; SPEAK=~SPEAK;
}
if(flag>=320&&flag<360) { tt=0; fre=156; SPEAK=~SPEAK; } TR0=1;
}
void timer1() interrupt 3 { TH1=(65536-50000)/256; TL1=(65536-50000)%6; flag++; if(flag==360) { flag=0; fre=50000;
} }
/*****************LCD1602设置*****************/ voidwrite_com(uchar com) { RS=0;
//写指令
EN=0; //使能端拉低 delay(5);
P0=com; //输入地址,就是命令 EN=1; //使能端拉高,工作
delay(5);
EN=0;
//使能端拉低停止工作 delay(5);
}
voidwrite_data(uchar date) { RS=1; EN=0;
//使能端拉低
delay(5);