//电机转速表设计
#include<reg52.h> //包含单片机寄存器的头文件
#include<intrins.h> //包含_nop_()函数定义的头文件
#define uchar unsigned char
#define uint unsigned int
sbit CS=P3^5;
sbit SID=P3^6;
sbit SCLK=P3^4;
sbit PSB=P3^7;
uchar code digit[ ]={"0123456789"}; //定义字符数组显示数字
uint v; //储存电机转速
uchar count,count1; //储存定时器T0中断次数
bit flag; //计满1秒钟标志位
//**********液晶延时***************
void delay_1ms(uint x)
{
uint i,j;
for(j=0;j<x;j++)
for(i=0;i<110;i++);
}
/*********************写命令***************************/
void send_command(uchar command_data)
{
uchar i;
uchar i_data;
i_data=0xf8; /*********0xf8命令控制字*************/
CS=1;
SCLK=0;
for(i=0;i<8;i++)
{
SID=(bit)(i_data&0x80); /***************命令的送入8个字节*****************/
SCLK=0;
SCLK=1;
i_data=i_data<<1;
}
i_data=command_data;
i_data&=0xf0; /****************命令的高四位的四个字节******************/
for(i=0;i<8;i++)
{
SID=(bit)(i_data&0x80);
SCLK=0;
SCLK=1;
i_data=i_data<<1;
}
i_data=command_data;
i_data<<=4;
for(i=0;i<8;i++)
{
SID=(bit)(i_data&0x80); /****************命令的低四位的四个字节**************/
SCLK=0;
SCLK=1;
i_data=i_data<<1;
}
CS=0;
delay_1ms(10);
}
/**********************写数据********************************/
void send_data(uchar command_data)
{
uchar i;
uchar i_data;
i_data=0xfa; /******************0xfa数据控制字********************/
CS=1;
for(i=0;i<8;i++)
{
SID=(bit)(i_data&0x80);
SCLK=0;
SCLK=1;
i_data=i_data<<1;
}
i_data=command_data;
i_data&=0xf0; /********************数据的高四位*****************/
for(i=0;i<8;i++)
{
SID=(bit)(i_data&0x80);
SCLK=0;
SCLK=1;
i_data=i_data<<1;
}
i_data=command_data;
i_data<<=4; /********************数据的低四位*****************/
for(i=0;i<8;i++)
{
SID=(bit)(i_data&0x80);
SCLK=0;
SCLK=1;
i_data=i_data<<1;
}
CS=0;
delay_1ms(10);
}
void lcd_init()
{
delay_1ms(100);
send_command(0x30);
send_command(0x02);
send_command(0x06);
send_command(0x0c);
send_command(0x01);
send_command(0x80);
}
/******************************************************************************
函数功能:显示速度数值
******************************************************************************/
void display_val(unsigned int x)
{
unsigned char i,j,k,l; //j,k,l分别储存温度的百位、十位和个位
i=x/1000; //取千位
j=(x%1000)/100; //取百位
k=(x%100)/10; //取十位
l=x%10; //取个位
send_command(0x91);
send_data(digit[i]);
send_data(digit[j]);
send_data(digit[k]);
send_data(digit[l]);
send_data(' ');
send_data('r');
send_data('/');
send_data('f');
send_data('e');
send_data('n');
}
void counter(void) interrupt 0
{
EX1=0; //关外部中断0
count1++;
if(count1==4) //4次循环为电机转一圈
{
count1=1; //初始化计数
v++; //转圈计数加1
} //计数+1
EX1=1; //开外部中断0
return;
}
/*******************************************************
函数功能:主函数
********************************************************/
void main(void)
{ PSB=0;EX1=1;
lcd_init(); //调用LCD初始化函数
TMOD=0x51; //定时器T1工作于计数模式1,定时器T0工作于计时模式1;
TH0=(65536-46083)/256; //定时器T0的高8位设置初值,每50ms产生一次中断
TL0=(65536-46083)%256; //定时器T0的低8位设置初值,每50ms产生一次中断
EA=1; //开总中断
ET0=1; //定时器T0中断允许
TR0=1; //启动定时器T0
count=0; //将T0中断次数初始化为0
display_val(0000); //显示器工作正常标志
while(1) //无限循环
{
TR1=1; //定时器T1启动
TH1=0; //定时器T1高8位赋初值0
TL1=0; //定时器T1低8位赋初值0
flag=0; //时间还未满1分钟
while(flag==0) ; //时间未满等待
// v=(TH1*256+TL1)*60; // /16 //计算速度,每周产生16个脉冲
display_val(v); //显示速度
}
}
/*******************************************************
函数功能:定时器T0的中断服务函数
********************************************************/
void Time0(void ) interrupt 1 using 1 //定时器T0的中断编号为1,使用第1组工作寄存器
{
count++; //T0每中断1次,count加1
if(count==20) //若累计满20次,即计满1秒钟
{
flag=1; //计满1秒钟标志位置1
count=0; //清0,重新统计中断次数
}
TH0=(65536-46083)/256; //定时器T0高8位重新赋初值
TL0=(65536-46083)%256; //定时器T0低8位重新赋初值
}
基于AT89C51与霍尔元件的测速及LCD1602显示
于 2019-04-09 22:09:15 首次发布