我用计数器0对直流减速电机编码器计数,编码器每651个脉冲代表电机转动一圈,主函数通过计数器0的溢出标志位TR0变为1的次数,对电机的圈数进行累加、显示,但不知为什么,显示一直都是零,是计数器0一直就没有触发中断?还是程序设计有问题?求高手指点指点,谢谢!
单片机源程序如下:
#include "reg52.h"
typedef unsigned int u16; //对系统默认数据类型进行重定义
typedef unsigned char u8;
//定义LED1管脚
sbit LED1=P2^0;
#define SMG_A_DP_PORT P0 //使用宏定义数码管段码口
//定义数码管位选信号控制脚
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
/*******************************************************************************
* 函 数 名 : delay_10us
* 函数功能 : 延时函数,ten_us=1时,大约延时10us
* 输 入 : ten_us
* 输 出 : 无
*******************************************************************************/
void delay_10us(u16 ten_us)
{
while(ten_us--);
}
//共阴极数码管显示0~F的段码数据
u8 gsmg_code[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
/*******************************************************************************
* 函 数 名 : smg_display
* 函数功能 : 动态数码管显示
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
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);//延时一段时间,等待显示稳定
SMG_A_DP_PORT=0x00;//消音
}
}
/*******************************************************************************
* 函 数 名 : time0_init
* 函数功能 : 定时器0中断配置函数,通过设置TH和TL即可确定定时时间
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void counter0_init(void)
{
TMOD|=0X05;//选择为计数器0模式,工作方式1
TH0=0XFD; //给计数器赋初值
TL0=0X71;
ET0=1;//打开计数器0中断允许
EA=1;//打开总中断
TR0=1;//打开计数器
IT0=0;//下降沿触发
}
/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void main()
{
u16 roll;
u8 rollb8[8];
counter0_init();//计数器0中断配置
while(1)
{
if(TF0==1)
{
roll++;
TF0=0;
}
rollb8[3]=roll/10000; //读取万位数
rollb8[4]=roll%10000/1000; //读取千位数
rollb8[5]=roll%1000/100; //读取百位数
rollb8[6]=roll%100/10; //读取十位数
rollb8[7]=roll%10; //读取个位数
smg_display(rollb8); //调用数码管显示
}
}
void conter0() interrupt 1 //定时器0中断函数
{
TH0=0XFD; //给计数器赋初值
TL0=0X71;
}
|