⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pulse.c

📁 光电编码器采集脉冲的程序
💻 C
字号:
/*************************************************************************************/
/*光电编码器采集脉冲的程序,采用计数查询等待中断方式, 液晶显示正反转 ,显示脉冲数(60个/转),显示转圈数*/
/************************************************************************************/

#include<reg51.h>    
#include<stdio.h>
#include<absacc.h>
#include<string.h>

#define fosc 11.0592
#define uint unsigned int
#define send XBYTE[0xdfff]    /*液晶片选地址*/

sbit P1_5=P1^5;
sbit P1_4=P1^4;

sbit ACC_0=ACC^0;    /*定义液晶标准位*/
sbit ACC_1=ACC^1;
sbit ACC_3=ACC^3;
sbit ACC_5=ACC^5;

uint com,dat1,dat2,M,N,up;
int d_code1[4],d_code2[3];

/**********************************************************************************/
//void timer0(void)interrupt 1 using 1   /*中断服务程序入口,计数函数*/
//{
// TL0=0x00;   /*低8位初值*/
// M++;
//}

void count()   /*计数函数*/
{
 if(P1_5)M++;  /*正转加1*/
 else M--;     /*反转减1*/
 M%=10000;     /*如果大于10000则取余显示4位*/
 TF0=0;        /*软件复位*/
}

void code_c()    /*脉冲数转换*/
{
 //count();
 N=M/60;
 d_code1[0]=M/1000;               /*千位*/
 d_code1[1]=(M%1000)/100;         /*百位*/
 d_code1[2]=((M%1000)%100)/10;    /*十位*/
 d_code1[3]=((M%1000)%100)%10;    /*个位*/
 d_code2[0]=N/100;        /*百位*/
 d_code2[1]=(N%100)/10;   /*十位*/
 d_code2[2]=(N%100)%10;   /*个位*/
}

/************************************************************/
void delay()
{
 uint i,j;
 i=0;
 j=0;
 for(i=0;i<1000;i++)     /*7s状态改变一次*/
 {
  for(j=0;j<500;j++);
 }
}

void delay1()
{
 uint i,j;
 i=0;
 j=0;
 for(i=0;i<100;i++)     /*0.28s状态改变一次*/
 {
  for(j=0;j<200;j++);
 }
}

void sta01()   /*状态位写指令和写数据的准备判断*/
{
 P1_4=1;
 do
 {
  ACC=send;
 }
 while(ACC_0==0||ACC_1==0||ACC_5==0);
}

void sta3()     /*自动写数据的状态位判断*/
{
 P1_4=1;
 do
 {
  ACC=send;
 }

while(ACC_3==0||ACC_5==0);
}

void write1()   /*无参数指令写入*/
{
 sta01();
 send=com;
 P1_4=1;
}

void write2()   /*单字节参数指令写入*/
{
 sta01();
 P1_4=0;
 send=dat2;
 write1();
}

void write3()   /*双字节参数指令写入*/
{
 sta01();
 P1_4=0;
 send=dat1;
 write2();
}

void chushihua()  /*初始化*/
{
 dat1=0x00;   /*设文本显示区域首地址*/
 dat2=0x00;
 com=0x40;
 write3();
 dat1=0x28;   /*设文本显示区域宽度*/
 dat2=0x00;
 com=0x41;
 write3();
 dat1=0x00;   /*设图形显示区域宽度*/
 dat2=0x08;
 com=0x42;
 write3();
 dat1=0x28;   /*设图形显示区域宽度*/
 dat2=0x00;
 com=0x43;
 write3();
 com=0x80;    /*显示方式设置*/
 write1();
 com=0x9c;    /*显示开关设置*/
 write1();
}

void clear()   /*清显示屏*/
{
 uint i;
 dat1=0x00;
 dat2=0x00;
 com=0x24;    /*设置显示地址*/
 write3();
 com=0xb0;    /*设置自动写方式*/
 write1();
 for(i=0;i<8200;i++)  /*清屏8200个点阵字符*/
 {
  sta3();
  P1_4=0;
  send=0x00;
 }
 com=0xb2;    /*结束自动写方式*/
 write1();
}

/************************************************************/
void code_display11()   /*显示脉冲数*/
{
 uint i;
 code_c();
 dat1=0x80;
 dat2=0x00;
 com=0x24;    /*设置显示地址*/
 write3();
 com=0xb0;    /*设置自动写方式*/
 write1();
 for(i=0;i<4;i++)
 {
  switch(d_code1[i])
  {
   case 1:up=0x11;break;
   case 2:up=0x12;break;
   case 3:up=0x13;break;
   case 4:up=0x14;break;
   case 5:up=0x15;break;
   case 6:up=0x16;break;
   case 7:up=0x17;break;
   case 8:up=0x18;break;
   case 9:up=0x19;break;
   case 0:up=0x10;break;
  }
  sta3();
  P1_4=0;
  send=up;    /*选液晶字符集的相应数字*/
 }
 com=0xb2;    /*结束自动写方式*/
 write1();
}

void code_display22()   /*显示转圈数*/
{
 uint i;
 code_c();
 dat1=0x8c;
 dat2=0x00;
 com=0x24;    /*设置显示地址*/
 write3();
 com=0xb0;    /*设置自动写方式*/
 write1();
 for(i=0;i<3;i++)
 {
  switch(d_code2[i])
  {
   case 1:up=0x11;break;
   case 2:up=0x12;break;
   case 3:up=0x13;break;
   case 4:up=0x14;break;
   case 5:up=0x15;break;
   case 6:up=0x16;break;
   case 7:up=0x17;break;
   case 8:up=0x18;break;
   case 9:up=0x19;break;
   case 0:up=0x10;break;
  }
  sta3();
  P1_4=0;
  send=up;    /*选液晶字符集的相应数字*/
 }
 com=0xb2;    /*结束自动写方式*/
 write1();
}

void code_display33()   /*显示函数3,正转反转*/
{
 if(!P1_5)   /*P1_5为1时数字前加-*/
 {
  dat1=0x7e;
  dat2=0x00;
  com=0x24;   /*设置显示位置*/
  write3();
  dat2=0x0d;
  com=0xc0;   /*写数据*/
  write2();
 }
 else        /*否则不显*/
 {
  dat1=0x7e;
  dat2=0x00;
  com=0x24;   /*设置显示位置*/
  write3();
  dat2=0x00;
  com=0xc0;   /*写数据*/
  write2();
 }
}

/*********************************************************/
void code_display1()    /*脉冲数*/
{
 chushihua();
 clear();
 code_display11();
}

void code_display2()    /*转圈数*/
{
 chushihua();
 clear();
 code_display22();
}

void code_display3()    /*正转反转*/
{
 chushihua();
 clear();
 code_display33();
}

/*****************************主函数**************************/
void main()
{
 //IE=0x82;   /*开T0中断*/
 M=0;
 chushihua();
 clear();
 code_display11();  /*初始化显示0000  000*/
 code_display22();
 code_display33();  
 TMOD=0x06; /*T0为自动重装初值的2个8位计数器*/
 TH0=0xff;  /*计数脉冲1个M加1*/
 TL0=0xff;  /*给T0装初值*/
 TR0=1;     /*开始计数*/
 while(1)
 {
  while(!TF0);  /*查询等待中断*/
  count();      /*TF0软件复位*/
  //clear();
  code_display11();   /*显示接受脉冲数*/
  code_display22();   /*转圈数*/
  code_display33();   /*正反转*/
  //delay();
 }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -