找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 814|回复: 1
打印 上一主题 下一主题
收起左侧

如何解决单片机t0和t1不能同时用的问题?

[复制链接]
跳转到指定楼层
楼主
ID:841401 发表于 2023-5-23 23:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
单片机定时器0做pwm输出,定时器1做超声波测距计时。但是不能同时使用,哪位可以帮忙解决下这个问题

  1. #include "reg52.h"
  2. #include "intrins.h"

  3. sbit tr=P1^4;
  4. sbit echo=P1^3;
  5. sbit led=P1^5;
  6. sbit servo=P2^7;

  7. int num[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//段选
  8. int num2[]={0x01,0x02,0x04,0x08};
  9. int compare, count = 0;

  10. void Delay10us()                //@11.0592MHz
  11. {
  12.         unsigned char i;

  13.         _nop_();
  14.         i = 25;
  15.         while (--i);
  16. }

  17. void display(int a)
  18. {
  19.         unsigned char i;
  20.         for(i=0;i<4;i++)
  21.         {
  22.                 P2=num2[i];
  23.                 switch(i)
  24.                 {
  25.                         case 0:
  26.                                 P0=num[a/1000];
  27.                         break;
  28.                         case 1:
  29.                                 P0=num[a/100%10];
  30.                         break;
  31.                         case 2:
  32.                                 P0=num[a/10%10];
  33.                         break;
  34.                         case 3:
  35.                                 P0=num[a%10];
  36.                         break;
  37.                 }
  38.     Delay10us();
  39.                 P0=0xff;
  40.                 Delay10us();
  41.         }
  42. }

  43. void timer0_init(void)
  44. {
  45.         TMOD=0X11;//定时器模式选择
  46.         EA=1;//总中断
  47.         ET1=1;//定时器1中断
  48.         TH1=0;
  49.         TL1=0;
  50.         TL0 = 0x9c;                //设置定时初值
  51.         TH0 = 0xff;                //设置定时初值
  52.         TR0=1;//定时器开关
  53.         TR1=0;
  54. }

  55.         void setangle(int anglenum)
  56. {
  57.         compare = anglenum + 7;
  58. }


  59. void main(void)
  60. {
  61.         int ss,a=0;
  62.         int i;
  63.         timer0_init();
  64.         loop:tr=1;
  65.         Delay10us();
  66.         Delay10us();
  67.         tr=0;
  68.         while(!echo)
  69.         {
  70.                 i++;
  71.                 if(i>20)
  72.                 {
  73.                         goto loop;
  74.                 }
  75.         }
  76.         TR1=1;
  77.         while(echo);
  78.         TR1=0;
  79.         ss=(TH1*256+TL1-20)*0.174;
  80.         TH1=0;
  81.         TL1=0;
  82.         display(ss);
  83.         for(i=0;i<6;i++)
  84.         {
  85.                 Delay10us();
  86.         }
  87.         if(ss <= 500)
  88.         {
  89.                 led = 1;
  90.         }else{
  91.                 led = 0;
  92.         }
  93.         setangle(0);
  94. }

  95. void timer0() interrupt 1
  96. {
  97.         count ++;
  98.         if(count <= compare)
  99.         {
  100.                 servo = 1;
  101.         }else{
  102.                 servo = 0;
  103.         }
  104.         if(count == 200)
  105.         {
  106.                 count = 0;
  107.         }        
  108.         TL0 = 0x9c;                //设置定时初值
  109.         TH0 = 0xff;                //设置定时初值
  110. }
复制代码

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:59202 发表于 2023-5-24 09:22 | 只看该作者
这程序写的!!!main函数里主要程序要在一个死循环里,要不能执行下去也一下就停止了啊,还有
goto loop中的loop在哪啊
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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