📄 jisuanqi.c
字号:
/******************************************************************
** 文件名: main.c
** 创建人: 飘扬
** 日 期: 2006.10.04
** 修改人:
** 日 期:
** 描 述: 本程序使用伟纳300A型实验板,来检测光电旋转编码器的实际每周
** 输出脉冲数。程序中,定时器0用于8位数码管动态扫描定时,时间
** 为1ms(12MHZ晶振)。定时器1工作于模式1,计数器方式,直接测量
** 接在T1脚的脉冲个数。外部中断0,工作于边沿触发方式,接在旋转
** 编码器的Z信号输出上,用于检测编码器完整旋转一周。8位数码管,
** 接成动态扫描,接在P0和P2口。左4位,用来显示上一周的实际脉冲
** 数,右4位,用来显示当前周的脉冲数。
**
** 实际使用,感觉效果还可以。程序准确的测量出某牌光电旋转编码
** 器(400脉冲),实际工作时,双路信号输出脉冲数量不等,及脉冲
** 数与标称值的误差情况。
**
** 本程序的显示部分,直接修改于伟纳提供的数码管显示1-8例程。
**----------------------------------------------------------------*/
#include <reg51.h>
#include <intrins.h>
unsigned char g=0;
sbit SL=P2^0;//定义装载控制口//
sbit CLK=P2^2; //产生时钟信号//
sbit SO=P2^1;//定义串行数据接收口//
unsigned char count;
unsigned char key;
unsigned char flag;
unsigned char i;
unsigned char j;
unsigned char m;
unsigned char n;
unsigned char o;
unsigned char data dis_digit;
unsigned char code dis_code[]={0xff,0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8};// 1, 2, 3 4, 5, 6, 7,8
unsigned char dis_buf[3]={0xff,0xff,0xff};
unsigned char dis_index;
unsigned int counter1=0,counter2=0; //左右计数器数值
/*void timer0() interrupt 1
// 定时器0中断服务程序, 用于数码管的动态扫描
// dis_index --- 显示索引, 用于标识当前显示的数码管和缓冲区的偏移量
// dis_digit --- 位选通值, 传送到P2口用于选通当前数码管的数值, 如等于0xfe时,
// 选通P2.0口数码管
// dis_buf --- 显于缓冲区基地址
{
TH0 = 0xFC;
TL0 = 0x17;
P0= 0xff; // 先关闭所有数码管
P0 =dis_buf[dis_index]; // 显示代码传送到P0口
P1= dis_digit ; //
dis_digit--; // 位选通值左移, 下次中断时选通下一位数码管
if(dis_digit==0x04)dis_digit=0x07;
dis_index++; //
if(dis_index==0x03)dis_index=0x00; // 8个数码管全部扫描完一遍之后,再回到第一个开始下一次扫描
}*/
void DELAY(void)
{for(i=1;i<=5;i++)
for(j=1;j<=50;j++)
{}
}
void DELAY1(unsigned int n)
{
unsigned int i=0,j=0;
for (i=n;i>0;i--)
for (j=0;j<1140;j++);
}
void DIS_PLAY(void )
{for(m=0;m<3;m++)
{P0=0xff;
P1=dis_digit;
P0= dis_buf[m];
dis_digit--;
if(dis_digit==0x04)dis_digit=0x07;
DELAY();
}
}
void chuli (unsigned char SHUJU )
{ int count2=SHUJU,count1;
count1=(count1*0x0A)+count2;
if(counter1/100==0)
{
dis_buf[2] =dis_code[counter1/100];
if((counter1%100)/10==0)
{
dis_buf[1] = dis_code[(counter1%100)/10];
dis_buf[0] = dis_code[counter1%10+1];
}
else
{dis_buf[1] = dis_code[(counter1%100)/10+1];
dis_buf[0] = dis_code[counter1%10+1];
}
}
else
{
dis_buf[2] =dis_code[counter1/100+1];
dis_buf[1] = dis_code[(counter1%100)/10+1];
dis_buf[0] = dis_code[counter1%10+1];
}
}
void DATA1(void)
{ SL=1;
_nop_();
_nop_();
SL=0;
_nop_();
_nop_();
SL=1; //把数据装载进74HC165//
for (i =0; i<8; i++) //循环8次,把数据一位一位读进//
{ CLK=0; //产生上升沿脉冲,读入数据//
g<<=1;
if(SO)g|=0x01;
CLK=1;
}
}
void main()
{
P0 = 0xff;
/*TMOD = 0x01; //定时器0工作在模式1定时器方式
TH0 = 0xFC;
TL0 = 0x17;
IE = 0x82; //开定时器0中断
//显示初始化*/
dis_digit = 0x07;
dis_index = 0x00;
/*TR0 = 1;*/
count=1;
while(1)
{ DATA1();
if(g==0xff)
{
if(count==1)
{
P0= 0xff;
P1=dis_digit;
P0= 0xc0;
DELAY();
dis_digit--;
P0= 0xff;
P1=dis_digit;
P0= 0xff;
DELAY();
dis_digit--;
P0= 0xff;
P1=dis_digit;
P0= 0xff;
DELAY();
dis_digit = 0x07;
}
else
{ DIS_PLAY();
}
}
else
{
n=g;
DELAY1(50);
DATA1();
if(g!=n)continue;
count=2;
flag=g;
switch(flag)
{case 0xfe:key=0;chuli(key);break;
case 0xfd:key=1;chuli(key);break;
case 0xfb:key=2;chuli(key);break;}
/* case 0xF7:key=3;break;
case 0xef:key=4;break;
case 0xdf:key=5;break;
case 0xbf:key=6;break;
case 0x7f:key=7;break;
default:key=8; break;}*/
counter2=key;
counter1=(counter1*0x0A)+counter2;
DIS_PLAY();
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -