打印
[PIC®/AVR®/dsPIC®产品]

pic单片机 实现10ms定时的简单程序

[复制链接]
393|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
febgxu|  楼主 | 2023-3-26 20:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
直接用软件延时,如用以下的DELAY()延时子程序,如要延时5ms,直接调用DELAY(5)就好了,但这种是纯软件的延时。
//======延时(n)ms,在4MHz晶振下!!!
void DELAY(uint n)
{ uint j;
uchar k;
for (j=0;jn;j++)
for (k=246;k0;k--) NOP();
}
2、用定时器延时,要通过计算延时的时间来确定延时的常数(分频比和定时器初值)。

使用特权

评论回复
沙发
systemchip| | 2023-3-27 17:08 | 只看该作者
XC编译器里面已经有Buildin 函数  __delay_ms(),直接用就好了

使用特权

评论回复
板凳
1988020566| | 2023-4-9 13:48 | 只看该作者
#
include# define uchar unsigned char# define uint unsigned int uchar time0;
uchar time1;
uchar time2;
uchar time3;
uchar time4;
uchar time5;
uchar time6;
uchar time7;
void tim0_init() {
    TMOD = 0x01;
    TH0 = (65536 - 46080) / 256;
    TL0 = (65536 - 46080) % 256;
    ET0 = 1;
    EA = 1;
}
void tim0() interrupt 1 {
    TH0 = (65536 - 46080) / 256;
    TL0 = (65536 - 46080) % 256;
    time0++;
    if (time0 == 10) {
        time0 = 0;
        time1++;
        if (time1 == 10) {
            time1 = 0;
            time2++;
            if (time2 == 10) {
                time2 = 0;
                time3++;
                if (time3 == 10) {
                    time3 = 0;
                    time4++;
                    if (time4 == 10) {
                        time4 = 0;
                        time5++;
                        if (time5 == 10) {
                            time5 = 0;
                            time6++;
                            if (time6 == 10) {
                                time6 = 0;
                                time7++;
                                if (time7 == 10) {
                                    time7 = 0;
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
int main() {
        tim0_init();
        TR0 = 1;
        while (1) {
            if (time7 == 10) { //执行10ms定时任务 } } return 0; }

使用特权

评论回复
地板
pmp| | 2023-4-9 15:59 | 只看该作者
可以使用PIC单片机的定时器模块来完成。  

使用特权

评论回复
5
kmzuaz| | 2023-4-9 16:14 | 只看该作者
使用MPLAB X IDE或其他PIC单片机开发工具,配置定时器模块以产生10ms的定时。

使用特权

评论回复
6
biechedan| | 2023-4-9 20:34 | 只看该作者
// 定义全局变量
volatile unsigned char flag_10ms = 0;

// 定时器中断服务子程序
void __attribute__((interrupt, auto_psv)) _T1Interrupt(void)
{
    // 将标志位设置为1
    flag_10ms = 1;
   
    // 清除中断标志位
    _T1IF = 0;
}

// 主程序
int main()
{
    // 配置定时器1
    T1CON = 0x8030;  // TMR1ON = 1, TCKPS = 11 (1:256分频)
    PR1 = 3125;      // 10ms的重载值(8MHz/256/3125 = 10ms)
    _T1IF = 0;       // 清除中断标志位
    _T1IE = 1;       // 使能定时器1中断
   
    while(1)
    {
        if(flag_10ms)  // 如果标志位为1
        {
            // 执行相应的任务
            
            // 将标志位清零
            flag_10ms = 0;
        }
    }
    return 0;
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

38

主题

4755

帖子

2

粉丝