找回密码
 立即注册

QQ登录

只需一步,快速开始

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

如何把这个单片机计数器和led程序结合一下,计数器计时和led灯亮同步

[复制链接]
跳转到指定楼层
楼主
ID:507750 发表于 2019-6-29 04:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
计时器程序:
#include<reg51.h>#define uchar unsigned char
  uchar second;
  uchar i;
  sbit K_start=P1^6;           //定义按键
  sbit K_stop=P1^7;
  uchar code
  tab[10]={0x3f,0x06,0X5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void InitTimer0(void)
  {
    TMOD=0x01;
        TH0=0x3c;
        TL0=0xb0;
        EA=1;
        ET0=1;
        }
void Timer0Interrupt()interrupt 1
  {
     TH0=0x3c;  //重新赋初值
         TL0=0xb0;
     i++;
     if(i==20)
         {
     i=0;
     second++;
     second%=100; //记满1s,更新second变量
         }
  }
void main(void)           //主函数
   {
          second=0;
          P0=tab[0];
          P2=tab[0];
          InitTimer0();
          while(1)
          {
               if(!K_start)
                   {
                   while(!K_start);
                   second=0;
                   TR0=1;
                   }
                   if(!K_stop)
                   {
                   while(!K_stop);
                   TR0=0;
                   }
                   P0=tab [second/10];
                   P2=tab [second%10];
                   }
                   }


led灯程序:#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define led_8 P1
uchar m;
lius[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};                                                                                                                  
void ys(uint x)
{ uchar i;
  while(x--)
  for(i=0;i<120;i++);
  }
void main()
{
  uchar k;
while(1)
{
  {
  led_8=0xff;
  for(k=0;k<8;k++)
  {
  led_8=lius[k];
  ys(500);
  }
  }
  }
  }


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

使用道具 举报

沙发
ID:332444 发表于 2019-6-29 21:11 | 只看该作者
有2步要做,1把2个程序不同的部分合到一起为一个新的程序,2修改为   for(i=0;i<120;i++){P0=tab [second/10]; P2=tab [second%10];}
回复

使用道具 举报

板凳
ID:332444 发表于 2019-6-29 21:14 | 只看该作者
之上2点是同时运行,而不是同步,若要同步就要把LED的延时改为中断计时,那就要修改程序,把 led_8=lius[k++];放在中断中
回复

使用道具 举报

地板
ID:207421 发表于 2019-6-29 23:12 | 只看该作者
  1. /**************************************************************************************
  2. * 计时器程序
  3. * xxxxxxxx
  4. * xxxxxxxx
  5. **************************************************************************************/
  6. #include<reg51.h>
  7. #define uchar unsigned char
  8. uchar second,i,led_co;
  9. sbit K_start = P1^6; //定义按键
  10. sbit K_stop  = P1^7;
  11. uchar code tab[10]={0x3f,0x06,0X5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
  12. uchar lius[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
  13. //延时
  14. void ys(unsigned int x)
  15. {
  16.         uchar j;
  17.         while(x--)
  18.         for(j=0;j<120;j++);
  19. }
  20. //定时器0初始化
  21. void InitTimer0(void)
  22. {
  23.         TMOD = 0x01;
  24.         TH0  = 0x3c;
  25.         TL0  = 0xb0;
  26.         EA   = 1;
  27.         ET0  = 1;
  28. }
  29. //定时器0中断
  30. void Timer0Interrupt()interrupt 1
  31. {
  32.         uchar k;
  33.         TH0 = 0x3c;  //重新赋初值
  34.         TL0 = 0xb0;
  35.         i++;
  36.         if(i==20)
  37.         {
  38.                 i=0;
  39.                 second++;
  40.                 second%=100;         //记满1s,更新second变量
  41.                 led_co = 1;
  42.                 P1 = 0xff;
  43.                 for(k=0;k<8;k++)
  44.                 {
  45.                         P1 = lius[k];
  46.                         ys(100);         //注意延时尽量短,需要调整
  47.                 }
  48.         }
  49. }
  50. //主函数
  51. void main(void)           
  52. {
  53.         //uchar k;
  54.         second = 0;
  55.         led_co = 0;
  56.         P1     = 0xff;
  57.         P0     = tab[0];
  58.         P2     = tab[0];
  59.         InitTimer0();
  60.         //
  61.         while(1)
  62.         {
  63.                 /* BAK
  64.                 if(led_co==1)
  65.                 {
  66.                         led_co = 0;
  67.                         P1 = 0xff;
  68.                         for(k=0;k<8;k++)
  69.                         {
  70.                                 P1 = lius[k];
  71.                                 ys(100);
  72.                         }
  73.                 }
  74.                 */
  75.                 if(!K_start)
  76.                 {
  77.                         while(!K_start);
  78.                         second=0;
  79.                         TR0 = 1;
  80.                 }
  81.                 if(!K_stop)
  82.                 {
  83.                         while(!K_stop);
  84.                         TR0 = 0;
  85.                 }
  86.                 P0 = tab[second/10];
  87.                 P2 = tab[second%10];
  88.         }
  89. }
复制代码


回复

使用道具 举报

5#
ID:507750 发表于 2019-6-30 02:11 | 只看该作者
xianfajushi 发表于 2019-6-29 21:14
之上2点是同时运行,而不是同步,若要同步就要把LED的延时改为中断计时,那就要修改程序,把 led_8=lius[k+ ...

谢谢您
回复

使用道具 举报

6#
ID:507750 发表于 2019-6-30 02:12 | 只看该作者
回复

使用道具 举报

7#
ID:155507 发表于 2019-6-30 08:36 | 只看该作者

通常在中断子程序中是不调用延时子程序的,这样会增加中断处理时间,则下次中断有可能不会被触发,就会延误响应中断了,导致定时器时间出错。
回复

使用道具 举报

8#
ID:207421 发表于 2019-6-30 15:18 | 只看该作者
angmall 发表于 2019-6-30 08:36
通常在中断子程序中是不调用延时子程序的,这样会增加中断处理时间,则下次中断有可能不会被触发,就会延 ...

不一定,看怎么调整时间
不是还有第二方案被注释了么
如果有更好的注意,提供下代码,让大家学习学习嘛
回复

使用道具 举报

9#
ID:507750 发表于 2019-6-30 15:27 | 只看该作者
angmall 发表于 2019-6-30 08:36
通常在中断子程序中是不调用延时子程序的,这样会增加中断处理时间,则下次中断有可能不会被触发,就会延 ...

哦哦,受教了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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