单片机电机转速表设计

单片机电机转速表设计

#include<reg51.h> //包孕单片机寄存器的头文件

#include<intrins.h> //包孕_nop_()函数定义的头文件

sbit RS=P2^0; //寄存器选择位,将RS位定义为P2.0引脚

sbit RW=P2^1; //读写选择位,将RW位定义为P2.1引脚

sbit E=P2^2; //使能旌旗灯号位,将E位定义为P2.2引脚

sbit BF=P0^7; //繁忙标志位,,将BF位定义为P0.7引脚

unsigned char code digit[ ]={“0123456789”}; //定义字符数组显示数字

unsigned int v; //储存电机转速

unsigned char count; //储存准时器T0中断次数

bit flag; //计满1秒钟标志位

/奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫**

函数功能:延时1ms

(3j+2)*i=(3×33+2)×10=1010(微秒),可以觉得是1毫秒

奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫/

void delay1ms()

{

unsigned char i,j;

for(i=0;i<10;i++)

for(j=0;j<33;j++)

;

}

/奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫**

函数功能:延时多少毫秒

进口参数:n

奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫/

void delay(unsigned char n)

{

unsigned char i;

for(i=0;i<n;i++)

delay1ms();

}

/奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫**

函数功能:判断液晶模块的繁忙状态

返回值:result。result=1,繁忙;result=0,不忙

奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫/

unsigned char BusyTest(void)

{

bit result;

RS=0; //根据规定,RS为低电平,RW为高电日常平凡,可以读状态

RW=1;

E=1; //E=1,才容许读写

_nop_(); //空操作

_nop_();

_nop_();

_nop_(); //空操作四个机械周期,给硬件反映光阴

result=BF; //将繁忙标志电平赋给result

E=0; //将E规复低电平

return result;

}

/奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫**

函数功能:将模式设置指令或显示地址写入液晶模块

进口参数:dictate

奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫/

void WriteInstruction (unsigned char dictate)

{

while(BusyTest()==1); //假如忙就等待

RS=0; //根据规定,RS和R/W同时为低电日常平凡,可以写入指令

RW=0;

E=0; //E置低电平(根据表8-6,写指令时,E为高脉冲,

// 便是让E从0到1发生正跳变,以是应先置”0″

_nop_();

_nop_(); //空操作两个机械周期,给硬件反映光阴

P0=dictate; //将数据送入P0口,即写入指令或地址

_nop_();

_nop_();

_nop_();

_nop_(); //空操作四个机械周期,给硬件反映光阴

E=1; //E置高电平

_nop_();

_nop_();

_nop_();

_nop_(); //空操作四个机械周期,给硬件反映光阴

E=0; //当E由高电平跳变成低电日常平凡,液晶模块开始履行敕令

}

/奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫**

函数功能:指定字符显示的实际地址

进口参数:x

奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫/

void WriteAddress(unsigned char x)

{

WriteInstruction(x|0x80); //显示位置切实着实定措施规定为”80H+地址码x”

}

/奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫**

函数功能:将数据(字符的标准ASCII码)写入液晶模块

进口参数:y(为字符常量)

奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫/

void WriteData(unsigned char y)

{

while(BusyTest()==1);

RS=1; //RS为高电平,RW为低电日常平凡,可以写入数据

RW=0;

E=0; //E置低电平(根据表8-6,写指令时,E为高脉冲,

// 便是让E从0到1发生正跳变,以是应先置”0″

P0=y; //将数据送入P0口,即将数据写入液晶模块

_nop_();

_nop_();

_nop_();

_nop_(); //空操作四个机械周期,给硬件反映光阴

E=1; //E置高电平

_nop_();

_nop_();

_nop_();

_nop_(); //空操作四个机械周期,给硬件反映光阴

E=0; //当E由高电平跳变成低电日常平凡,液晶模块开始履行敕令

}

/奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫**

函数功能:对LCD的显示模式进行初始化设置

奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫/

void LcdInitiate(void)

{

delay(15); //延时15ms,首次写指令时应给LCD一段较长的反映光阴

WriteInstruction(0x38); //显示模式设置:16×2显示,5×7点阵,8位数据接口

delay(5); //延时5ms ,给硬件一点反映光阴

WriteInstruction(0x38);

delay(5);

WriteInstruction(0x38); //继续三次,确保初始化成功

delay(5);

WriteInstruction(0x0c); //显示模式设置:显示开,无光标,光标不闪烁

delay(5);

WriteInstruction(0x06); //显示模式设置:光标右移,字符不移

delay(5);

WriteInstruction(0x01); //清屏幕指令,将曩昔的显示内容清除

delay(5);

}

/奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫

函数功能:显示速率提示符

奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫/

void display_sym(void)

{

WriteAddress(0x00); //写显示地址,将在第1行第1列开始显示

WriteData(‘v’); //将字符常量v写入LCD

WriteData(‘=’); //将字符常量=写入LCD

}

/奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫

函数功能:显示速率数值

奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫/

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; //取个位

WriteAddress(0x02); //写显示地址,将在第1行第3列开始显示

WriteData(digit[i]); //将千位数字的字符常量写入LCD

WriteData(digit[j]); //将百位数字的字符常量写入LCD

WriteData(digit[k]); //将十位数字的字符常量写入LCD

WriteData(digit[l]); //将个位数字的字符常量写入LCD

}

/奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫*

函数功能:显示速率单位“r/min”

奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫**/

void display_unit(void)

{

WriteAddress(0x06); //写显示地址,将在第2行第7列开始显示

WriteData(‘r’); //将字符常量r写入LCD

WriteData(‘/’); //将字符常量/写入LCD

WriteData(‘m’); //将字符常量m写入LCD

WriteData(‘i’); //将字符常量i写入LCD

WriteData(‘n’); //将字符常量n写入LCD

}

/奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫*

函数功能:主函数

奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫**/

void main(void)

{

LcdInitiate(); //调用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_sym(); //显示速率提示符

display_val(0000); //显示器事情正常标志

display_unit(); //显示速率单位

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位从新赋初值

}

单片机电机转速表设计

Tags: , ,

Leave a Reply

Your email address will not be published. Required fields are marked *

*
*