搜索
bottom↓
回复: 6

求大神帮忙解决个有关单片机定时器的程序

[复制链接]

出0入0汤圆

发表于 2012-9-27 21:23:48 | 显示全部楼层 |阅读模式
我自己写了个程序,实在是找不出错误,麻烦哪位高手帮忙解答下!
要实现的功能是:用定时器0的方式1实现第一个发光管以200ms间隔闪烁,用定时器1的方式1实现数码管前两位59s循环计时。用的芯片是STC89C58RD+,晶振是11.0592MHz,程序代码如下:
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit wei=P2^7;
sbit duan=P2^6;
sbit led1=P0^0;
uchar n1=0,n2=0,n=0;
uchar shi=0,ge=0;
uchar code atm[]={
                           0x3f,0x06,0x5b,0x4f,
                   0x66,0x6d,0x7d,0x07,
                   0x7f,0x6f
                          };
void delay(uint xms)
{
  uint i,j;
  for(i=xms;i>0;i--)
    for(j=110;j>0;j--)
         ;
}
void smg(uchar shi,uchar ge)
{
  duan=1;
  P0=atm[shi];
  duan=0;
  P0=0xff;
  wei=1;
  P0=0x7f;
  wei=0;
  delay(5);   // 延时?
  P0=0xff;
  duan=1;
  P0=atm[ge];
  duan=0;
  P0=0xbf;
  wei=1;
  P0=0xbf;
  wei=0;
  delay(5);
}

void main()
{
  
  TMOD=0x11;
  TH0=(65536-45872)/256;
  TL0=(65536-45872)%256;
  TH1=(65536-45872)/256;
  TL1=(65536-45872)%256;  
  EA=1;
  ET0=1;
  ET1=1;  
  TR0=1;
  TR1=1;
  while(1)
  {
    smg(shi,ge);
  }
}
void T0_time() interrupt 1
{
  TH0=(65536-45872)/256;
  TL0=(65536-45872)%256;
  n1++;
  if(n1==4)
   {
         n1=0;
         led1=~led1;
        }
}
void T1_time() interrupt 3
{
  TH1=(65536-45872)/256;
  TL1=(65536-45872)%256;
  n2++;
  if(n2==20)
  {
    n=0;
         n++;
         if(n==60)
          {
           n=0;
                shi=n/10;
                ge=n%10;
          }
  }
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2012-9-27 22:48:59 | 显示全部楼层
T1中断里第一个n=0什么意思,紧接着n++永远等于1

出0入0汤圆

发表于 2012-9-28 09:05:19 | 显示全部楼层
定时中断里 n == 20 后。里面并没有将n清零  故n2会一直停在0这个数里

出0入0汤圆

发表于 2012-9-28 10:22:16 | 显示全部楼层
n2 误清零 还有用1个中断就可以了 不要浪费中断

void T0_time() interrupt 1
{
  TH0=(65536-45872)/256;
  TL0=(65536-45872)%256;

  n1++;
  n2++;

  if(n1>=4)
   {
         n1=0;
         led1=~led1;
   }

  if(n2>=20)
  {
         n2=0; //此处为n2 你写成n了
         n++;
         if(n>=60)
          {
                n=0;
                shi=n/10;
                ge=n%10;
          }
  }

}

出0入0汤圆

发表于 2012-9-28 10:24:36 | 显示全部楼层
LS正解。。

出0入0汤圆

 楼主| 发表于 2012-9-28 17:24:01 | 显示全部楼层
我去试试看!谢谢各位高手,最近刚开始玩单片机,还不太懂,刚在这注册,不知有什么规则否?

出0入0汤圆

 楼主| 发表于 2012-9-28 17:42:32 | 显示全部楼层
另外补充一下,n1用来控制发光管每200ms亮一次的变量,n是用来使shi,ge改变,使数码管每秒增加1(“shi”为“十位数”,“ge“为“个位数”),n2则用来控制一秒的时间,定时器初始赋值后50ms后溢出
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 22:13

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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