找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

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

查看数: 2177 | 评论数: 9 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2022-7-15 10:01

正文摘要:

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

回复

ID:1036115 发表于 2022-7-15 21:56
lkc8210 发表于 2022-7-15 16:30
你选错了1T,普通8051是12T的

谢谢,开始不知道还要选这个。现在明白了
ID:161164 发表于 2022-7-15 16:30
枫清y 发表于 2022-7-15 11:51
void Timer0Init(void)                //50微秒@11.0592MHz
{
        AUXR |= 0x80;                 ...

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



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. }
复制代码
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
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;
ID:624769 发表于 2022-7-15 11:42
枫清y 发表于 2022-7-15 11:34
大佬又是你,感谢感谢。忘说了。因为直接来定义1秒都达不到跟何况2秒了,所以我采用了50ms,之后再运行40 ...

你确定?  (65536-50000)/256 = 0xfd ????
你计算器按一下看看?
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主的视频,说八位定时器可以用软件来算,我就一直用的软件。哪知道这次不行。就咋想都想不明白
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:161164 发表于 2022-7-15 11:24
TL0 = 0xD7; TH0 = 0xFD;
0xFDD7 = 64983
计时时间 = 65536 - 64983 = 533
12Mhz晶振为533us
11.0592Mhz晶振为 600us
你是不是在STC-ISP上按错了?



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

Powered by 单片机教程网

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