久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標題: 單片機程序,同樣的賦值為什么結果數碼管顯示的不一樣了? [打印本頁]

作者: 楓清y    時間: 2022-7-15 10:01
標題: 單片機程序,同樣的賦值為什么結果數碼管顯示的不一樣了?
     大神們求指教下,下面這段單片機代碼先是我自己慢慢編出來,之后結合郭老師的視頻講解改了改,就是學習《單片機十天征服我》的那個學習視頻。中讓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;
           }
         
}

作者: lkc8210    時間: 2022-7-15 11:24
TL0 = 0xD7; TH0 = 0xFD;
0xFDD7 = 64983
計時時間 = 65536 - 64983 = 533
12Mhz晶振為533us
11.0592Mhz晶振為 600us
你是不是在STC-ISP上按錯了?




作者: 楓清y    時間: 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閃爍兩次,數碼管顯示一次
作者: 楓清y    時間: 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主的視頻,說八位定時器可以用軟件來算,我就一直用的軟件。哪知道這次不行。就咋想都想不明白
作者: 188610329    時間: 2022-7-15 11:42
楓清y 發表于 2022-7-15 11:34
大佬又是你,感謝感謝。忘說了。因為直接來定義1秒都達不到跟何況2秒了,所以我采用了50ms,之后再運行40 ...

你確定?  (65536-50000)/256 = 0xfd ????
你計算器按一下看看?
作者: 楓清y    時間: 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;
作者: lids    時間: 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
作者: wulin    時間: 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. }
復制代碼

作者: lkc8210    時間: 2022-7-15 16:30
楓清y 發表于 2022-7-15 11:51
void Timer0Init(void)                //50微秒@11.0592MHz
{
        AUXR |= 0x80;                 ...

你選錯了1T,普通8051是12T的




作者: 楓清y    時間: 2022-7-15 21:56
lkc8210 發表于 2022-7-15 16:30
你選錯了1T,普通8051是12T的

謝謝,開始不知道還要選這個。現在明白了




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 在线婷婷 | 色婷婷国产精品 | 99伊人网| 91久久电影| 日韩欧美三级电影 | 久久精品一区二区 | 性做久久久久久免费观看欧美 | 国产精品久久久久久久久久久久久久 | 日韩在线中文字幕 | 免费在线观看av片 | 久久蜜桃av一区二区天堂 | 国产 日韩 欧美 在线 | 国产区一区二区三区 | 1204国产成人精品视频 | 视频一区在线观看 | 99re在线 | 欧美a区| 国产精品久久久久久久久免费樱桃 | 成人在线观看免费观看 | 罗宾被扒开腿做同人网站 | 国产精品久久久久久婷婷天堂 | 久草日韩 | 国产成人免费在线 | 黄色一级片aaa | 久久国产日韩欧美 | 久久天天 | 久久久久亚洲精品 | 免费国产黄网站在线观看视频 | 夜夜夜夜夜夜曰天天天 | 国产激情一区二区三区 | 天天操人人干 | 国产精品美女久久久久久免费 | 久久精品毛片 | 亚洲成av人影片在线观看 | 综合国产 | av毛片| 精品国产一区二区在线 | 欧美视频在线播放 | 欧美中文一区 | 天天曰天天干 | 国产在线区 |