找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2363|回复: 14
收起左侧

求思路 用stc15w408as单片机输出每隔50ms输出10个脉宽2.5us

[复制链接]
ID:648591 发表于 2021-1-5 21:05 | 显示全部楼层 |阅读模式
200黑币
求大神给个思路

回复

使用道具 举报

ID:390416 发表于 2021-1-6 00:46 | 显示全部楼层
很简单啊
第一步 设置一个定时器 定时时间2.5us
第二步 用一个变量,如果变量小于20000则不输出。大于等于20001小于20020则IO口翻转。
20000*2.5us=50ms

《人人学会单片机》视频教程在原子哥网站全部投放。马上去看看吧。
回复

使用道具 举报

ID:390416 发表于 2021-1-6 00:49 | 显示全部楼层
第一步 设定一个2.5us的定时器
第二步 设定一个16位变量。定时器里面让变量增加。如果小于20000 则不输出脉冲。
如果变量大于20000并且小于20020。那么让IO口翻转。然后把变量清0,开始下一个周期。
20000*2.5us=50ms
回复

使用道具 举报

ID:213173 发表于 2021-1-6 08:02 | 显示全部楼层
给你一个示例
  1. //如果对精确度要求高要提高时钟频率
  2. #include <STC15F2K60S2.H>
  3. #include <intrins.h>

  4. #define uint unsigned int
  5. #define uchar unsigned char

  6. sbit Trigger=P1^0;//定义输出端口


  7. /***********定时器初始化程序****************/
  8. void Timer0Init()                //50毫秒@12.000MHz
  9. {
  10.         AUXR &= 0x7F;                //定时器时钟12T模式
  11.         TMOD &= 0xF0;                //设置定时器自动重装模式
  12.         TL0 = 0xB0;                        //设置定时初值
  13.         TH0 = 0x3C;                        //设置定时初值
  14.         TF0 = 0;                                //清除TF0标志
  15.         TR0 = 1;                                //定时器0开始计时
  16.         EA=1;                                        //开总中断
  17.         ET0=1;                                //开定时器0中断
  18. }
  19. /***********2.5us延时程序****************/
  20. void Delay2500ns()        //@12MHz
  21. {
  22.         _nop_();
  23.         _nop_();
  24.         _nop_();
  25.         _nop_();
  26.         _nop_();
  27.         _nop_();
  28.         _nop_();
  29.         _nop_();
  30.         _nop_();
  31.         _nop_();
  32. //        _nop_();//用示波器或逻辑分析仪观察增减调整精确度
  33. //        _nop_();
  34. }
  35. /***************主程序****************/
  36. void main()
  37. {
  38.         Trigger=0;                        //输出端口初始化
  39.         Timer0Init();                //定时器初始化
  40.         while(1);
  41. }
  42. /**************中断服务程序*****************/
  43. void Timer0() interrupt        1
  44. {
  45.         uchar i=0;
  46.         for(i=20;i>0;i--)
  47.         {
  48.                 Trigger=~Trigger;//10个脉冲,占空比50%
  49.                 Delay2500ns();
  50.         }
  51. }
复制代码
回复

使用道具 举报

ID:574482 发表于 2021-1-6 08:55 | 显示全部楼层
用stc15w408as单片机输出每隔50ms输出10个脉宽2.5us

你的问题不完整
每隔50ms,10个脉冲,脉宽2.5US,表达清淅。
问题是10个脉冲是不是平均分布在50ms 内?因为你没表达脉冲的周期以及是否连续的。
回复

使用道具 举报

ID:451718 发表于 2021-1-6 09:30 | 显示全部楼层
对于STC的单片机,如果你设2.5uS的定时器,你的单片机就几乎全部在执行中断了。
一般没有其他用途,就设10mS的定时器,在定时器中加累加标志,在第五次定时器中断时,清零累加标记,并用软件延迟来控制翻转端口输出。12Mh主频来算,4个_nop_();  差不多占用1uS时长。
回复

使用道具 举报

ID:451718 发表于 2021-1-6 11:44 | 显示全部楼层

定时器用12T模式,进入定时器中断后, 一个 罗普 实际是多久啊? 有没有人实际测量过。 这里是继承用12T模式,还是用默认的1T模式?
回复

使用道具 举报

ID:478073 发表于 2021-1-6 12:01 | 显示全部楼层
自己整整!很好做出来!方法总比困难多!
回复

使用道具 举报

ID:213173 发表于 2021-1-6 13:59 | 显示全部楼层
robinsonlin 发表于 2021-1-6 11:44
定时器用12T模式,进入定时器中断后, 一个 罗普 实际是多久啊? 有没有人实际测量过。 这里是继承用12T ...

STC  1T单片机执行1个 _nop_()  用时3个时钟。与定时器采用12T模式没有任何关联。
回复

使用道具 举报

ID:648591 发表于 2021-1-6 19:29 | 显示全部楼层
200k输出图·.jpg
回复

使用道具 举报

ID:648591 发表于 2021-1-6 19:31 | 显示全部楼层
asmmcu 发表于 2021-1-6 08:55
用stc15w408as单片机输出每隔50ms输出10个脉宽2.5us

你的问题不完整

200k输出图·.jpg
回复

使用道具 举报

ID:648591 发表于 2021-1-6 19:38 | 显示全部楼层
各位大侠有图
回复

使用道具 举报

ID:648591 发表于 2021-1-6 19:49 | 显示全部楼层
asmmcu 发表于 2021-1-6 08:55
用stc15w408as单片机输出每隔50ms输出10个脉宽2.5us

你的问题不完整

有图说明的,就是每隔50ms发出10个连续占空比50%脉宽为2.5us脉冲
回复

使用道具 举报

ID:752974 发表于 2021-1-7 10:53 | 显示全部楼层
一个定时器定时2.5微妙,连续工作,另一个定时器设定50MS,50ms到,关定时器,输出并计数2.5微妙脉冲,输出十个,停止输出,启动50MS定时器。。。。。。。。。
回复

使用道具 举报

ID:451718 发表于 2021-1-7 15:13 | 显示全部楼层

3楼的大佬已经完美的给了你解决方案了。  那段代码简直就是教程级别的解决方案。  无论是从资源占用,还是内存占用来讲,都是最简洁高效的。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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