|
各位高手,鄙人新手,用89c52做了個(gè)轉(zhuǎn)速計(jì),思路是通過測(cè)量兩個(gè)信號(hào)之間的周期的方法來測(cè)算轉(zhuǎn)速。具體做法是用外部中斷0和定時(shí)器0,外部中斷作為信號(hào)輸入端,當(dāng)外部中斷產(chǎn)生第一次跳變?yōu)?時(shí),啟動(dòng)定時(shí)器0.定時(shí)器開始計(jì)時(shí)1MS,1毫秒滿溢出時(shí),TF0清零,在賦初值 同時(shí)temp加1,當(dāng)外部中斷再次產(chǎn)生跳變?yōu)?時(shí),關(guān)閉定時(shí)器,得到兩個(gè)轉(zhuǎn)速信號(hào)的時(shí)間temp.然后用60000(60秒*1000ms)除以temp得到RPM值,計(jì)算后將RPM值送數(shù)碼管顯示。實(shí)際試驗(yàn)的時(shí)候數(shù)碼管有時(shí)候顯示的 RPM是正確的 有時(shí)候會(huì)顯示65535.而在外部中斷中程式設(shè)計(jì)為:第一次收到外部中斷信號(hào)的時(shí)候 LED點(diǎn)亮 外部中斷再次收到中斷信號(hào)的時(shí)候要關(guān)閉LED,單實(shí)際測(cè)試的時(shí)候RPM數(shù)值顯示正確的時(shí)候LED卻是一直點(diǎn)亮的,而顯示值為65535的時(shí)候 LED燈卻是在閃爍,程序或思路中定有不妥之處 懇請(qǐng)高人指點(diǎn)迷津 不勝感激
代代碼如下:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit gewei=P1^7;
sbit shiwei=P1^6;
sbit baiwei=P1^5;
sbit qianwei=P1^4;
sbit wanwei=P1^3;
sbit led1=P2^0;
uchar code table[]={
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e,0xff,};
uchar bai,shi,ge,i,qian,wan;
uint temp,rpm;
uchar l=0;
void init();
void main()
{
init();
while(1)
{
if(TF0==1) //定時(shí)器1計(jì)時(shí)滿1MS 溢出
{
TF0=0; //TF0清零
TH0=(65536-960)/256; //定時(shí)器重新賦初值 定時(shí)1MS
TL0=(65536-960)%256;
temp++; //毫秒值累計(jì)
if(temp>=6000) //超過6秒無信號(hào),數(shù)碼管顯示清零
{ //(10RPM以下值為無效值)
temp=0;
rpm=0;
TR0=0;
led1=1;
}
}
wan=rpm/10000%10; //計(jì)算萬位值
qian=rpm/1000%10; //計(jì)算千位值
bai=rpm/100%10; //計(jì)算百位值
shi=rpm/10%10; //計(jì)算十位值
ge=rpm%10; //計(jì)算個(gè)位值
P1=0xff; //進(jìn)入數(shù)碼管掃描顯示RPM值前關(guān)閉位顯示
switch(l) //依此掃描顯示RPM值
{
case 0:l++;P0=table[wan];wanwei=0;break;
case 1:l++;P0=table[qian];qianwei=0;break;
case 2:l++;P0=table[bai];baiwei=0;break;
case 3:l++;P0=table[shi];shiwei=0;break;
case 4:l=0;P0=table[ge];gewei=0;break;
}
}
}
void init() //初始化
{
temp=0;
rpm=0;
i=0;
EA=1;
TMOD=0x01;
EX0=1;
IT0=1;
}
void extimer0() interrupt 0
{
EA=0; //關(guān)閉總中斷,停止定時(shí)器1
if(i==0) //外部中斷第一次電平跳變
{
TH0=(65536-960)/256; //定時(shí)器重新賦初值 定時(shí)1MS
TL0=(65536-960)%256;
temp=0;
TR0=1; //開啟定時(shí)器1
i=1; //i賦1
led1=0;
}
else //外部中斷第二次電平跳變
{
TR0=0; //關(guān)閉啟定時(shí)器1
rpm=(60000/temp); //計(jì)算RPM數(shù)值
i=0; //i清零
led1=1; //關(guān)閉LED燈
}
EA=1; //開啟總中斷
}
謝謝 !!
|
|