霍尔测速及显示程序

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include<reg52.h>
#include<absacc.h>
#define uchar unsigned char
#define uint unsigned int
#define LCD_CW XBYTE[0xF800]
#define LCD_DW XBYTE[0xF840]
#define LCD_CR XBYTE[0xF8B0]
#define WHILE_BUSY while(LCD_CR & 0x80) //读LCD状态字,若为
0x80,则等待/LCD_CR & 0x80
#define led XBYTE[0xfa00]
sbit warning=P3^1;
uint i,z,count,zhuan,msec;
void nint_LCD(){//LCD初始化
LCD_CW=0x0c; //00001100,开显示,不显示光标,光标不闪烁/
WHILE_BUSY; //忙等待/
LCD_CW=0x38; //设置16×2显示,5×7点阵,8位数据接口
}
void print(uchar *str,uchar addr){//LCD字符串输出
WHILE_BUSY; //忙等待,不能少!!!/
LCD_CW = 0x80 | addr; //向LCD写入地址,数据指针初始地址为0x80/
while(*str!='\0'){ //写到字符串结束/
WHILE_BUSY; //忙等待/
LCD_DW=*str; //向LCD写入数据/
str++; //写下一个字符/
}
}
void dis_LCD(uchar date,uchar addr){//LCD字符输出
WHILE_BUSY; //忙等待,不能少!!!/
LCD_CW = 0x80 | addr; //向LCD写入地址,数据指针初始地址为0x80/
WHILE_BUSY; //忙等待/
LCD_DW = date; //向LCD写入数据/
}
/*-------------------外部中断0计数程序-------------------*/
void counter(void) interrupt 5{
TF2=0;//定时器2的标志位
ET2=0;TR2=0;//定时器2重新工作
count++;
TR0=1;
if(count==20){//到达一秒的时间
count=0;
TR0=0;//关计数器0
zhuan=TL0|(TH0<<8);//读数
TL0=0;TH0=0;//计数器置零//4次循环为电机转一圈
TR0=1;//开启计数器
}
//开外部中断0
ET2=1;TR2=1;//开定时器中断
}
/*----------------------端口初始化-----------------------*/
void int_all(){
warning=0; //关蜂鸣器
z=0; //初始化z的值
count=0; //初始化count的值
zhuan=0; //初始化转的值
TH0=0;TL0=0;//计数器置零
TMOD=0x05;//计数器的工作方式//内部中断定时器选择
RCAP2H=(65536-50000)/256; //
//50ms定时
RCAP2L=(65536-50000)%256;
EA=1; //开中断总开关
ET2=1; //开内部中断5
TR2=1; //计时器开始工作
//IT0=1; //外部中断0为下降沿触发
// EX0=1; //开外部中断0
}
/*-------------------转速过高警告程序--------------------*/
void warning_speed(){
if(zhuan>5000) //高于5000转打开警告
{ warning=1; }
if(zhuan<=5000) //低于5000转关闭警告
{ warning=0; }
}
/*-------------------------------------------------------*/
/*------------------------主函数-------------------------*/
void main(){
nint_LCD();
int_all(); //全局初始化
print("speed=",0);
dis_LCD('0',6);
dis_LCD('0',7);
dis_LCD('0',8);
dis_LCD('0',9);
print("rad/s",10);
while(1){
// disp_count(); //数据处理
dis_LCD(zhuan/1000+0x30,6);
dis_LCD(zhuan/100%10+0x30,7);
dis_LCD(zhuan/10%10+0x30,8);
dis_LCD(zhuan%10+0x30,9);
warning_speed(); //转速警告
//displaytolcd(); //LCD显示}
}。

相关文档
最新文档