?? 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 + -