#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
typedef unsigned char uint8; //数据类型宏定义
typedef unsigned int uint16;
sbit lcden=P2^5; //LCD1602使能端
sbit lcdrs=P1^0; //LCD1602数据命令选择端
sbit lcdrw=P1^1; //LCD1602读写选择端
sbit lcdbusy=P0^7; //繁忙检测位
sbit pulse=P3^4; //脉冲输入端
uint i,kop,z,zhuan,num;
uint num=0;
uchar display[]={"speed =r/sec"}; // 定义显示参数
void delayms(uchar); //声明延时子函数
/*延时函数*/
void delayms(uchar xms)
{
uchar l,n;
for(l=xms;l>0;l--)
for(n=110;n>0;n--);
}
/*繁忙检测函数*/
void wait(void)
{
P0=0xFF;
do
{
lcdrs=0;
lcdrw=1;
lcden=0;
lcden=1;
}
while (lcdbusy==1);
lcden=0;
}
/*向LCD1602写命令*/
void write_cmd(uint8 cmd)
{
wait();
lcden=0;
P0=cmd;
lcdrs=0;
lcdrw=0;
lcden=1;
lcden=0;
}
/*向LCD1602写数据*/
void write_dat(uint8 dat)
{
wait();
lcden=0;
P0=dat;
lcdrs=1;
lcdrw=0;
lcden=1;
lcden=0;
}
/*发送字符串到LCD1602*/
void write_string(uint8 addr_start, uint8 *p)
{
write_cmd(addr_start);
while (*p != '\0')
{
write_dat(*p++);
}
}
/*LCD显示函数*/
void displaytolcd()
{
write_cmd(0x80); //向LCD1602写命令80H
for (i=0;i<sizeof(display)-1;i++) //循环要传输的字符个数次,每一次传输一个字符
{
write_dat(display);
delayms(5);
}
}
/*数据处理函数*/
void disp_count()
{
display[6]=(zhuan/1000+'0'); //转换转速的千位
display[7]=(zhuan/100%10+'0'); //转换转速的百位
display[8]=(zhuan/10%10+'0'); //转换转速的十位
display[9]=(zhuan%10+'0'); //转换转速的个位
}
/*定时时间到,获取计数器值*/
void Timer_0(void) interrupt 3
{
TH1=(65536-50000)/256; //T1定时器装入初值,定时50ms
TL1=(65536-50000)%256;
num++;
if(num==20) //50*20=1S
{
num=0;
kop=TH0; //计数器计入脉冲,每来一个矩形脉冲计数值加1
kop=kop<<8;
kop=kop+TL0;
kop=kop/5;
zhuan=kop;
disp_count();
displaytolcd();
TH0=0;
TL0=0; //计数器清零
}
}
/*初始函数*/
void LCD1602()
{
lcdrw=0; //只写
write_cmd(0x38); //设置16x2显示,5x7点阵,8位数据接口
delayms(5);
write_cmd(0x0c); //设置开显示,不显示光标
delayms(5);
write_cmd(0x06); //写一个字符后地址指针加1
delayms(5);
write_cmd(0x01); //显示清0,数据指针清0
delayms(5);
}
/*定时器初始函数*/
void init()
{
TMOD=0x15; //T0为计数器,T1为定时器,都工作方式为1
TH1=(65536-50000)/256; //50ms定时 定时器1
TL1=(65536-50000)%256;
TH0=0x00;
TL0=0x00; //T0计数器初值
EA=1; //开总中断
ET0=1; //开计数器0中断
ET1=1; //开定时器1中断
TR0=1; //启动计数器0
TR1=1; //启动定时器0
}
void main()
{
LCD1602();
init();
while(1)
{
disp_count();
displaytolcd();
}
} |