单片机计数脉冲

本文介绍了如何使用单片机进行脉冲计数,用于电机的正反转控制。通过配置TMR1和TMR2定时器,实现精确的脉冲计数和时间检测,确保电机按照设定的脉冲数量和时间运行。同时,文章涵盖了中断服务程序(ISR)和信号检测机制,以确保电机运动的准确性和稳定性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <pic.h>

__CONFIG(0x3004);//(0X30C4);
#define T0_40MS 100    // 定义 TMR0 延时10MS 的时间常数
#define T1_100MS 40536

#define        DN                        RA5        //Motor rise                 2        DN
#define        UP                        RA0        //Motor decline                13  UP
#define        MOTA                RC5        //Motor Forward                5
#define        MOTB                RC4        //Motor Reversal        6

bit rise;        //正反转标志位
bit tmrl;        //正反转标志位
bit tmrh;        //正反转标志位

unsigned int num;  //脉冲总个数
unsigned int cnnt; //脉冲计数
unsigned int timerl; //TMR1脉冲上升沿时间
unsigned int timerh; //TMR1脉冲下降沿时间
unsigned int cnnt_timer;//TMR1脉冲总时间
unsigned int cnnt_tmr2;        //TMR2脉冲总时间

unsigned int signal_key();
unsigned int getkey() ;
void Delay_MS(unsigned int t);
void initial()
{
        TRISA=0x3D;//3D;RA2=1,
        TRISC=0X0E;
        OPTION=0x87;//RA2内部中断时源
       
        INTCON=0xF0;//外围中断允许
        CMCON0 = 0X07;
        ANSEL = 0;

//        TMR0=T0_40MS;//启动TMR0自带振荡器,分频比为1:256

        T1CON=0X22;//2启动TMR1自带振荡器,分频比为1:4关闭TRM1ON=0;
        TMR1H=T1_100MS>>8;//0X80;         //设初值
        TMR1L==T1_100MS;//0X00;
        TMR1IE=1;         //TMR1中断允许

        T2CON=0x63;  //TMR2 预分频系数为1:16 ,后分频系数为1:13,开始工作  关闭TRM2ON=0;
        PR2=239;   //TMR2的溢出值,当 TMR2 为此值+1时溢出
        TMR2IE=1;         //TMR1中断允许  50MS

        cnnt=0;
        cnnt_timer=0;
        num=10;
}
void Delay_MS(unsigned int t)
{
        unsigned int a,b;
        for(a=t;a>0;a--)
        for(b=110;b>0;b--);
}
void Forward()
{
        rise=1;
    MOTB=1;       
        MOTA=0;
        signal_key();
}
void Reversal()
{
        rise=0;
        MOTB=0;
        MOTA=1;
        signal_key();
}
void Stop()
{
        MOTA=0;
        MOTB=0;
}
unsigned int getkey()
{

        if(!UP)
        {
                while(!UP)
                {
                        if(cnnt==num){Stop();break;}
                        Forward();
                }
        }       
       
        if(!DN)
&

在C语言中编写单片机计数脉冲显示的程序,通常需要使用定时器功能以及数码管或LED等外部设备来表示计数值。这里以8051单片机为例,使用定时器T0配合中断机制来实现简单计数: ```c #include <reg52.h> // 使用8051汇编指令头文件 // 定义定时器T0初始化函数 void init_TIMER(void) { TMOD = 0x01; // 设置T0工作模式为模式1 (定时) TH0 = 0xFD; // 高4位设定初值,让计数从0开始 TL0 = 0xFD; } // 定义中断服务函数(ISR) void timer_ISR(void) interrupt 1 { if ((TF0 == 1) && (TR0 == 1)) { // TF0标志位表示溢出,计数达到最大 TF0 = 0; // 清除溢出标志 count++; // 加一计数 if (count > 9) { // 如果超过9,重新置为0,并点亮下一个LED count = 0; display_next_digit(); // 调用显示下一位数字的函数 } else { // 否则直接更新当前显示的数字 display_digit(count); } } } // 显示特定数字的函数 void display_digit(int digit) { // 根据实际硬件连接,通过P1口或者其他相应端口控制数码管或LED的显示 // P1口示例: P1 = digit | 0b00001000; // 略去具体数码管映射逻辑 } // 显示下一位数字的函数 void display_next_digit() { // 同上,处理显示变化的逻辑,如数码管的移位操作 // P1口示例: P1 = (~digit << 4); // 取反并左移四位,以便显示下一位 } int main(void) { init_TIMER(); TR0 = 1; // 开启定时器T0 EA = 1; // 开中断 ET0 = 1; // 启动T0中断 while(1); // 无限循环,等待中断 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值