1、工具准备
仿真工具:Proteus 7.0
编程工具:KEIL 4
MCU :89C52
2、仿真电路图的搭建
2.1 最小系统搭建
最小系统的线路图在网上有很多,基本上都是街上晶振和复位按钮就行。本仿真的最小系统搭建如下:
2.2 LCD1602的连接
LCD1602主要由三个控制口和8个数据口组成,一般情况下,在仿真图中,相同标号的线表示在电气连接上是连接在一起的,所以本仿真中,用P0口作为数据口:
2.3 红外传感器和ADC芯片的连接:
3、程序的编写
3.1 LCD1602驱动代码及其API
LCD1602.h文件如下
//LCD1602驱动
#ifndef __LCD1602_H__
#define __LCD1602_H__
#include"reg52.h"
#define uint unsigned int
#define uchar unsigned char
sbit cs = P3^2;
sbit wela = P2^7;
sbit dula = P2^6;
sbit lcden=P3^4;
sbit lcdrs=P3^5;
void delayms(uint z);
void write_com(uchar com);
void write_data(uchar date);
void init();
void print_data(uchar *dat);
#endif
LCD1602.c文件如下:
#include "lcd1602.h"
void delayms(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y-- );
}
void write_com(uchar com)
{
lcdrs=0;
P0=com;
delayms(5);
lcden=1;
delayms(5);
lcden=0;
}
void write_data(uchar date)
{
lcdrs=1;
P0=date;
delayms(5);
lcden=1;
delayms(5);
lcden=0;
}
void init() //初始化液晶
{
dula=0;
wela=0;
lcden=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
}
void print_data(uchar *dat)
{
uchar i = 0;
while(dat[i]!='\0')
{
write_data(dat[i]);
i++;
}
}
3.2 主函数及ADC和红外模块
#include"reg52.h"
#include<intrins.h>
#include "lcd1602.h"
long int read=0;
uchar bai,shi,ge;
uchar table[] ="0123456789";
uchar table1[] ="Infrared Measure";
uchar table2[] ="Distance:";
void delay(uint a) // a 个1us延时
{
for(;a > 0;a --)
_nop_();_nop_();
}
void T0_time() interrupt 1
{
cs = 0;
RD = 0;
read = P1;
INT0 = 1;
}
uint adc0804()
{
TMOD=0X01;
TH0=(65536-45872)/256;
TL0=(65536-45872)/256;
EA=1;
ET0=1;
TR0=1;
INT0 = 1;
cs = 0;
WR = 0;
delay(255);
cs = 1;
WR = 1;
delay(200);
read = read * 196 /100;
return read;
}
void math(uint x)
{
bai = x / 100;
shi = x /10 % 10;
ge = x % 10;
}
void main()
{
cs=0;
init();
while(1)
{
write_com(0x80);
print_data(table1);
write_com(0x80+0x40);
print_data(table2);
math(adc0804());
write_com(0x80+0x40+12);
write_data(table[bai]);
write_data(table[shi]);
write_data(table[ge]);
write_data('M');
delayms(500);
}
}
3.3 最终效果图
4、总结
这是一个简单的51仿真实验。对于初学者而言很好理解,也很容易做出来。其中涉及到Proteus的学习,LCD1602、ADC、红外模块的驱动。于程序中,还有定时器。欢迎交流~~~ >_<