找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 474|回复: 16
收起左侧

请教大家,51单片机10us中断一次,能来得及执行其它程序吗

  [复制链接]
ID:282726 发表于 2024-3-27 10:01 | 显示全部楼层 |阅读模式
C51单片机,晶振用12M

void init()     //初始化函数
{
        TMOD=0X01;  //工作模式选择
        TH0=(65535-10)/256;   //高位装载初始值
        TL0=(65535-10)%256;   //低位装载初始值
        EA=1;                 //开总中断
        ET0=1;                //开定时器0中断
        TR0=1;                                 //启动定时器0


回复

使用道具 举报

ID:282726 发表于 2024-3-27 10:28 | 显示全部楼层
我做了个PWM控制LED的亮度,想让灯慢慢亮下来
回复

使用道具 举报

ID:1109793 发表于 2024-3-27 10:29 | 显示全部楼层
12M,12T,10US?应该干不了啥了吧,主频提到22M,改为1T,兴许还能干点
回复

使用道具 举报

ID:1109793 发表于 2024-3-27 10:45 | 显示全部楼层
rebios 发表于 2024-3-27 10:28
我做了个PWM控制LED的亮度,想让灯慢慢亮下来

硬件PWM还是软件的?频率不需要那么高啊
回复

使用道具 举报

ID:213173 发表于 2024-3-27 11:09 | 显示全部楼层
PWM占空比0-100,100-200us中断就行,10us中断基本玩不转。
回复

使用道具 举报

ID:1110945 发表于 2024-3-27 12:33 | 显示全部楼层
那就要看你的程序怎么写了,你想玩PWM放着高级定时器不用非要用T0完成
PWM的任务。T0只能软件模拟,这样要花费很多的CPU的时间,而且最窄
脉冲做不到1个时钟。
如果用高级定时器来做那就不同了,10uS就是120个时钟,CPU只需要在“更新”
中断里写一下下个周期的脉宽值就好了,120个时钟里面还有大部分的时间CPU
还可以做其它的任务。
回复

使用道具 举报

ID:401564 发表于 2024-3-27 12:43 | 显示全部楼层
10uS一次中断,如果中断执行时间再有个10uS的话,效率就慢一半了,影响很大的,它不是说做不了什么事,而是慢,而且是慢到“一卡一卡”的那种情况
比如你按键按一下就开灯,10uS中断可能就是按下按键之后,好几秒才能开灯的那种
如果是要用到PWM,可以用片上的PWM
实在没有或者是非得用定时器不可的话,可以把灯的频率调到200HZ,感觉上有一点点闪频,但也能接受
定时器PWM只做10级的占空比调节,那就可以了
回复

使用道具 举报

ID:402383 发表于 2024-3-27 13:46 | 显示全部楼层
Y_G_G 发表于 2024-3-27 12:43
10uS一次中断,如果中断执行时间再有个10uS的话,效率就慢一半了,影响很大的,它不是说做不了什么事,而是 ...

我最近一次项目也遇到过这个情况:电机驱动芯片建议10K以上的PWM频率,10KHZ对应是100us的PWM周期,然后在调试电机功能时发现调速有卡顿。后面排查问题就定位到是主程序跟中断服务程序有冲突导致的异常。

当初做MCU选型的时候没考虑到这一点,所以没选带有PWM功能的型号,嗐。
吃一堑长一智,下一批次就准备用STC8H系列来调试。
回复

使用道具 举报

ID:1034262 发表于 2024-3-27 21:59 | 显示全部楼层
可以执行几个us的程序。
回复

使用道具 举报

ID:235438 发表于 2024-3-27 23:08 | 显示全部楼层
10u的话,完全没有问题,不过你要是玩pwm,10u周期,100可调,这1ms了,相当于1k的频率.这种pwm使用有限吧,最好用硬件pwm,现在基本都有,寄存器一设置,自动发指定频率,指定占空比,方便的一批
回复

使用道具 举报

ID:1088185 发表于 2024-3-28 00:04 | 显示全部楼层
10us 中断间隔是否可行,取决于你的中断程序,你不贴中断程式只贴初始化的代码是啥意思?
回复

使用道具 举报

ID:420836 发表于 2024-3-28 06:26 | 显示全部楼层
这取决于其他任务是否严重依赖于时间。
回复

使用道具 举报

ID:282726 发表于 2024-3-29 09:58 | 显示全部楼层
谢谢楼上各位的回复
采用的是STC15W104,没有硬件PWM,用软件来模拟,我试了,灯可以慢慢亮下来或暗下来

void  Time0() interrupt 1 //中断函数
{
        TH0=(65536-10)/256;   //装载初值
        TL0=(65536-10)%256;   //装载初值
        num++;                //10us中断一次 num 加1
        if(num==100)          //判断num 值  是否等于100 如果等于100 说明1ms时间到 也就相当于定时为1KHZ频率
        {
                num=0;            //将num值清零
        }
        pwm_print();           //调用PWM函数
        pwm_print1();           //调用PWM函数
}
回复

使用道具 举报

ID:282726 发表于 2024-3-29 10:10 | 显示全部楼层
祥子陈 发表于 2024-3-27 23:08
10u的话,完全没有问题,不过你要是玩pwm,10u周期,100可调,这1ms了,相当于1k的频率.这种pwm使用有限吧,最好用 ...

谢谢
程序就是这样设计的,10us周期,100可调,工作频率1K,依靠延时程序,灯能一级一级亮下来。
但是有个问题,LED的亮度是非线性,一开始亮度变化特别大,后来就基本感觉不出来了。
回复

使用道具 举报

ID:282726 发表于 2024-3-29 10:16 | 显示全部楼层
感谢各位,程序就是拷贝自本坛的。
程序可以正常运行,后来我嫌100级调光,档位还是太少,改成1000级调光,芯片用STC15W104,控制BP2838 LED电源。晶体还是12M默认。仍能正常工作,程序改成下面这样。
我现在鱼缸就正在用这个灯照明,每天从不亮到最亮,将近要一个小时,模拟自然光。

void  Time0() interrupt 1 //中断函数
{
        TH0=(65536-1)/256;   //装载初值
        TL0=(65536-1)%256;   //装载初值
        num++;                //1us中断一次 num 加1
        if(num==1000)          //1KHZ频率
        {
                num=0;            //将num值清零
        }
        pwm_print();           //调用PWM函数
        pwm_print1();           //调用PWM函数
}
回复

使用道具 举报

ID:525244 发表于 2024-3-29 10:36 来自手机 | 显示全部楼层
灯慢慢亮下来?眼睛看?需要那么快的频率?1毫秒调一次,眼睛能分辨出来?你知道变得很快和看出来变不一样。能看出来就行,那么快有啥用?
回复

使用道具 举报

ID:1088185 发表于 2024-3-29 20:41 | 显示全部楼层
以你贴出来的中断程序,估计CPU是12T, 加上这种写法10us肯定是不够的,不用想了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表