|
|
我用計(jì)數(shù)器0對(duì)直流減速電機(jī)編碼器計(jì)數(shù),編碼器每651個(gè)脈沖代表電機(jī)轉(zhuǎn)動(dòng)一圈,主函數(shù)通過(guò)計(jì)數(shù)器0的溢出標(biāo)志位TR0變?yōu)?的次數(shù),對(duì)電機(jī)的圈數(shù)進(jìn)行累加、顯示,但不知為什么,顯示一直都是零,是計(jì)數(shù)器0一直就沒(méi)有觸發(fā)中斷?還是程序設(shè)計(jì)有問(wèn)題?求高手指點(diǎn)指點(diǎn),謝謝!
單片機(jī)源程序如下:
#include "reg52.h"
typedef unsigned int u16; //對(duì)系統(tǒng)默認(rèn)數(shù)據(jù)類型進(jìn)行重定義
typedef unsigned char u8;
//定義LED1管腳
sbit LED1=P2^0;
#define SMG_A_DP_PORT P0 //使用宏定義數(shù)碼管段碼口
//定義數(shù)碼管位選信號(hào)控制腳
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
/*******************************************************************************
* 函 數(shù) 名 : delay_10us
* 函數(shù)功能 : 延時(shí)函數(shù),ten_us=1時(shí),大約延時(shí)10us
* 輸 入 : ten_us
* 輸 出 : 無(wú)
*******************************************************************************/
void delay_10us(u16 ten_us)
{
while(ten_us--);
}
//共陰極數(shù)碼管顯示0~F的段碼數(shù)據(jù)
u8 gsmg_code[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
/*******************************************************************************
* 函 數(shù) 名 : smg_display
* 函數(shù)功能 : 動(dòng)態(tài)數(shù)碼管顯示
* 輸 入 : 無(wú)
* 輸 出 : 無(wú)
*******************************************************************************/
void smg_display(u8 dat[])
{
u8 i=0;
for(i=0;i<8;i++)
{
switch(i)//位選
{
case 0: LSC=1;LSB=1;LSA=1;SMG_A_DP_PORT=gsmg_code[dat[0]];break;
case 1: LSC=1;LSB=1;LSA=0;SMG_A_DP_PORT=gsmg_code[dat[1]];break;
case 2: LSC=1;LSB=0;LSA=1;SMG_A_DP_PORT=gsmg_code[dat[2]];break;
case 3: LSC=1;LSB=0;LSA=0;SMG_A_DP_PORT=gsmg_code[dat[3]];break;
case 4: LSC=0;LSB=1;LSA=1;SMG_A_DP_PORT=gsmg_code[dat[4]];break;
case 5: LSC=0;LSB=1;LSA=0;SMG_A_DP_PORT=gsmg_code[dat[5]];break;
case 6: LSC=0;LSB=0;LSA=1;SMG_A_DP_PORT=gsmg_code[dat[6]];break;
case 7: LSC=0;LSB=0;LSA=0;SMG_A_DP_PORT=gsmg_code[dat[7]];break;
}
delay_10us(20);//延時(shí)一段時(shí)間,等待顯示穩(wěn)定
SMG_A_DP_PORT=0x00;//消音
}
}
/*******************************************************************************
* 函 數(shù) 名 : time0_init
* 函數(shù)功能 : 定時(shí)器0中斷配置函數(shù),通過(guò)設(shè)置TH和TL即可確定定時(shí)時(shí)間
* 輸 入 : 無(wú)
* 輸 出 : 無(wú)
*******************************************************************************/
void counter0_init(void)
{
TMOD|=0X05;//選擇為計(jì)數(shù)器0模式,工作方式1
TH0=0XFD; //給計(jì)數(shù)器賦初值
TL0=0X71;
ET0=1;//打開(kāi)計(jì)數(shù)器0中斷允許
EA=1;//打開(kāi)總中斷
TR0=1;//打開(kāi)計(jì)數(shù)器
IT0=0;//下降沿觸發(fā)
}
/*******************************************************************************
* 函 數(shù) 名 : main
* 函數(shù)功能 : 主函數(shù)
* 輸 入 : 無(wú)
* 輸 出 : 無(wú)
*******************************************************************************/
void main()
{
u16 roll;
u8 rollb8[8];
counter0_init();//計(jì)數(shù)器0中斷配置
while(1)
{
if(TF0==1)
{
roll++;
TF0=0;
}
rollb8[3]=roll/10000; //讀取萬(wàn)位數(shù)
rollb8[4]=roll%10000/1000; //讀取千位數(shù)
rollb8[5]=roll%1000/100; //讀取百位數(shù)
rollb8[6]=roll%100/10; //讀取十位數(shù)
rollb8[7]=roll%10; //讀取個(gè)位數(shù)
smg_display(rollb8); //調(diào)用數(shù)碼管顯示
}
}
void conter0() interrupt 1 //定時(shí)器0中斷函數(shù)
{
TH0=0XFD; //給計(jì)數(shù)器賦初值
TL0=0X71;
}
|
|