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

📄 jisuanqi.c

📁 采用两片165芯片与16个键盘连接
💻 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 + -