谁进来帮忙看下"定时器的初值"是不是有问题啊?

2020-01-30 14:16发布

本帖最后由 一匹狼 于 2013-2-13 11:03 编辑
  1. /********************************************************************/                                                         
  2. /*用动态扫描方法和定时器1在数码管的前三位显示出秒表,                                */
  3. /*精确到1%秒,即最后两位显示1%秒,一直循环下去                                                */
  4. /*设时钟频率为12M                                                                                                        */
  5. /********************************************************************/
  6. #include<reg52.h>  //52单片机头文件
  7. #include <intrins.h> //包含有左右循环移位子函数的库
  8. #define uint unsigned int    //宏定义
  9. #define uchar unsigned char  //宏定义
  10. sbit dula=P2^2;       //数码管段选锁存端
  11. sbit wela=P2^3;       ////数码管位选锁存端
  12. uchar ge,shi,bai;
  13. uint tt;
  14. uchar code table[]={
  15. 0x3f,0x06,0x5b,0x4f,
  16. 0x66,0x6d,0x7d,0x07,
  17. 0x7f,0x6f,0x77,0x7c,
  18. 0x39,0x5e,0x79,0x71};
  19. void display(uchar,uchar,uchar); //函数声明
  20. void delay(uint);
  21. void main()
  22. {
  23.         TMOD=0x10;//设置定时器1为工作方式1
  24.         TH1=(65536-10000)/256;
  25.         TL1=(65536-10000)%256;
  26.         EA=1;//开总中断
  27.         ET1=1;//开定时器1中断
  28.         TR1=1;//启动定时器1
  29.         while(1)
  30.         {
  31.                 display(bai,shi,ge);
  32.         }
  33. }


  34. void exter0() interrupt 3   // 定时器1中断
  35. {
  36.         TH1=(65536-10000)/256;
  37.         TL1=(65536-10000)%256;
  38.         tt++;
  39.         if(tt==1000)
  40.                 tt=0;
  41.         bai=tt/100;
  42.         shi=tt%100/10;
  43.         ge=tt%10;
  44. }

  45. void display(uchar one,uchar two,uchar three)
  46. {
  47.         dula=1;
  48.                 P0=table[one];   //送段数据
  49.                 dula=0;
  50.                 P0=0xff;                //送位数据前关闭所有显示,防止打开位选锁存后段选数据通过位选锁存器
  51.                 wela=1;
  52.                 P0=0xfe;
  53.                 wela=0;
  54.                 delay(1);

  55.                 dula=1;
  56.                 P0=table[two];
  57.                 dula=0;
  58.                 P0=0xff;
  59.                 wela=1;
  60.                 P0=0xfd;
  61.                 wela=0;
  62.                 delay(1);

  63.                 dula=1;
  64.                 P0=table[three];
  65.                 dula=0;
  66.                 P0=0xff;
  67.                 wela=1;
  68.                 P0=0xfb;
  69.                 wela=0;
  70.                 delay(1);
  71. }

  72. void delay(uint z)       //延时子函数
  73. {
  74.         uint x,y;
  75.         for(x=z;x>0;x--)
  76.                 for(y=110;y>0;y--);
  77. }
复制代码设定初值时是不是有错?
        TH1=(65536-10000)/256;
        TL1=(65536-10000)%256;
后面是tt=1000;所以
        TH1=(65536-1000)/256;
        TL1=(65536-1000)%256;
郭天祥十天学会单片机的课后习题,感觉不对劲啊
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
aammoo
1楼-- · 2020-01-30 14:20
友情提示:标题不合格、重复发帖,将会被封锁ID。详情请参考:论坛通告:封锁ID、获得注册邀请码、恢复被封ID、投诉必读
tony90
2楼-- · 2020-01-30 16:47
是12M晶振吗,是滴话1ms定时应该是65536-1000才对,10000就10ms了
一匹狼
3楼-- · 2020-01-30 19:22
tony90 发表于 2013-2-14 16:00
是12M晶振吗,是滴话1ms定时应该是65536-1000才对,10000就10ms了

已经想明白了,因为秒表最后两位表示分秒 想成ms了

一周热门 更多>