📄 pulse.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 + -