找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机程序,同样的赋值为什么结果数码管显示的不一样了?

[复制链接]
跳转到指定楼层
楼主
     大神们求指教下,下面这段单片机代码先是我自己慢慢编出来,之后结合郭老师的视频讲解改了改,就是学习《单片机十天征服我》的那个学习视频。中让LED按1秒闪烁,数码管用中断2秒来变化。

我最初使用的是TL0 = 0xD7; ,那数码管显示的老快了。看着就是8,灯到没问题,这张图片就是显示的很快,这又是为什么了。这TL0和TH0都是通过STC-isp算出来的呀。没道理错瑟
                      TH0 = 0xFD;      
当我使用TL0=(65536-50000)%256;就完全能实现。
            TH0=(65536-50000)/256;

单片机源程序如下:
#include<reg52.h>
#include<intrins.h>
#define ut unsigned int
#define ur unsigned char
sbit dula=P2^6;
sbit wela=P2^7;
ut num=0,t=0;
ur a=0,temp=0;        
ur code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void delay(ut z) //延迟保持不变,大约Z=1000为1s
{
   ut x,y;
   for(x=z;x>0;x--)
    for(y=110;y>0;y--);
}
void main()
{  TMOD=0x01;
   /*TL0=(65536-50000)%256;
   TH0=(65536-50000)/256;*/
   TL0 = 0xD7; TH0 = 0xFD;//50ms的初值
   EA=1; //总中断开
   ET0=1; //定时0中断开
   TR0=1; //启动定时器0开,开始断点
   wela=1;P0=0xe0;wela=0; //位选,所有的数码管
   dula=1;P0=0x3f;dula=1; //段选让数码管的初值为0
   a=0xfe;                                        //让发光二极管间隔1s循环闪烁,没问题
while(1){P1=a;
          temp=a;
          temp=_crol_(temp,1);
                  a=temp;
                  delay(1000);
         }
}
void zd0() interrupt 1         //中断有问题
{ /*TL0=(65536-50000)%256;
   TH0=(65536-50000)/256;*/TL0 = 0xD7; TH0 = 0xFD;
   t++;
   if(t==40)
       {t=0;num++;
        dula=1;P0=table[num%16];dula=0;
           }
         
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:161164 发表于 2022-7-15 11:24 | 只看该作者
TL0 = 0xD7; TH0 = 0xFD;
0xFDD7 = 64983
计时时间 = 65536 - 64983 = 533
12Mhz晶振为533us
11.0592Mhz晶振为 600us
你是不是在STC-ISP上按错了?



回复

使用道具 举报

板凳
ID:1036115 发表于 2022-7-15 11:34 | 只看该作者
lkc8210 发表于 2022-7-15 11:24
TL0 = 0xD7; TH0 = 0xFD;
0xFDD7 = 64983
计时时间 = 65536 - 64983 = 533

大佬又是你,感谢感谢。忘说了。因为直接来定义1秒都达不到跟何况2秒了,所以我采用了50ms,之后再运行40次。那个if就是判断是否中断了40次,也就是2秒。是的话再,t重新计数,同时显示数码管。就这样循环下去。
真的很怪.TL0=(65536-50000)%256; TH0=(65536-50000)/256;用这两个都没问题,  TH0 = 0xFD;TL0 = 0xD7;这两个就有问题,按照道理,都是代表50ms,没想到用这个TH0 = 0xFD;TL0 = 0xD7;数码管闪的老快了。正常的话应该LED闪烁两次,数码管显示一次
回复

使用道具 举报

地板
ID:1036115 发表于 2022-7-15 11:40 | 只看该作者
lkc8210 发表于 2022-7-15 11:24
TL0 = 0xD7; TH0 = 0xFD;
0xFDD7 = 64983
计时时间 = 65536 - 64983 = 533

郭天祥老师在视频中用的TL0=(65536-50000)%256;TH0=(65536-50000)/256;这两个。中断那章郭老师的视频看的云里雾里,之后看了其他up主的视频,说八位定时器可以用软件来算,我就一直用的软件。哪知道这次不行。就咋想都想不明白
回复

使用道具 举报

5#
ID:624769 发表于 2022-7-15 11:42 来自手机 | 只看该作者
枫清y 发表于 2022-7-15 11:34
大佬又是你,感谢感谢。忘说了。因为直接来定义1秒都达不到跟何况2秒了,所以我采用了50ms,之后再运行40 ...

你确定?  (65536-50000)/256 = 0xfd ????
你计算器按一下看看?
回复

使用道具 举报

6#
ID:1036115 发表于 2022-7-15 11:51 | 只看该作者
本帖最后由 枫清y 于 2022-7-15 11:55 编辑
188610329 发表于 2022-7-15 11:42
你确定?  (65536-50000)/256 = 0xfd ????
你计算器按一下看看?

void Timer0Init(void)                //50微秒@11.0592MHz
{
        AUXR |= 0x80;                //定时器时钟1T模式
        TMOD &= 0xF0;                //设置定时器模式
        TL0 = 0xD7;                //设置定时初值
        TH0 = 0xFD;                //设置定时初值
        TF0 = 0;                //清除TF0标志
        TR0 = 1;                //定时器0开始计时
}定时长度为50
找到错那里了,该用笔来算算。大意了,纳闷上面定时为50单位为微秒,我要的是50毫秒。哎呀,真憨啊我。谢谢,果然单片机10天征服我啊,&#128557;
回复

使用道具 举报

7#
ID:140489 发表于 2022-7-15 12:51 | 只看该作者
void Timer0Init(void)                //50毫秒@11.0592MHz
{
        AUXR &= 0x7F;                //定时器时钟12T模式
        TMOD &= 0xF0;                //设置定时器模式
        TMOD |= 0x01;                //设置定时器模式  16位
        TL0 = 0x00;                //设置定时初始值
        TH0 = 0x4C;                //设置定时初始值
        TF0 = 0;                //清除TF0标志
        TR0 = 1;                //定时器0开始计时
}
STC89C52    定时器0中断50ms
回复

使用道具 举报

8#
ID:213173 发表于 2022-7-15 13:35 | 只看该作者
枫清y 发表于 2022-7-15 11:40
郭天祥老师在视频中用的TL0=(65536-50000)%256;TH0=(65536-50000)/256;这两个。中断那章郭老师的视频看的 ...
  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #define ut unsigned int
  4. #define ur unsigned char
  5. sbit dula=P2^6;
  6. sbit wela=P2^7;
  7. ut num=0,t=0;
  8. ur a=0,temp=0;        
  9. ur code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
  10. 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
  11. void delay(ut z) //延迟保持不变,大约Z=1000为1s
  12. {
  13.    ut x,y;
  14.    for(x=z;x>0;x--)
  15.     for(y=110;y>0;y--);
  16. }
  17. void main()
  18. {
  19.         TMOD=0x01;
  20.         /*TL0=(65536-50000)%256;
  21.         TH0=(65536-50000)/256;*/
  22. //        TL0 = 0xD7; TH0 = 0xFD;//50ms的初值
  23.         TH0 = 0x4C;                //50ms的初值
  24.         TL0 = 0x00;                //50ms的初值

  25.         EA=1; //总中断开
  26.         ET0=1; //定时0中断开
  27.         TR0=1; //启动定时器0开,开始断点
  28.         wela=1;P0=0xc0;wela=0; //位选,所有的数码管
  29.         dula=1;P0=0x3f;dula=1; //段选让数码管的初值为0
  30.         a=0xfe;//让发光二极管间隔1s循环闪烁,没问题
  31.         while(1)
  32.         {
  33.                 P1=a;
  34.                 temp=a;
  35.                 temp=_crol_(temp,1);
  36.                 a=temp;
  37.                 delay(1000);
  38.         }
  39. }
  40. void zd0() interrupt 1         //中断有问题
  41. {
  42. /*TL0=(65536-50000)%256;
  43.    TH0=(65536-50000)/256;*/
  44. // TL0 = 0xD7; TH0 = 0xFD;
  45.         TH0 = 0x4C;                //50ms的初值
  46.         TL0 = 0x00;                //50ms的初值
  47.         t++;
  48.         if(t==40)
  49.         {
  50.                 t=0;
  51.                 num++;
  52.                 dula=1;P0=table[num%16];dula=0;
  53.         }         
  54. }
复制代码
回复

使用道具 举报

9#
ID:161164 发表于 2022-7-15 16:30 | 只看该作者
枫清y 发表于 2022-7-15 11:51
void Timer0Init(void)                //50微秒@11.0592MHz
{
        AUXR |= 0x80;                 ...

你选错了1T,普通8051是12T的



回复

使用道具 举报

10#
ID:1036115 发表于 2022-7-15 21:56 | 只看该作者
lkc8210 发表于 2022-7-15 16:30
你选错了1T,普通8051是12T的

谢谢,开始不知道还要选这个。现在明白了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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