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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4927|回復: 5
打印 上一主題 下一主題
收起左側

51單片機如何用定時中斷代替延時

[復制鏈接]
跳轉到指定樓層
樓主
//用計數器統計的數量,用定時器在數碼管上顯示數量,用外部中斷清空
//師傅的意思是想讓我們把顯示函數丟到中斷里邊好從delay中解脫出來,可樓主太菜了,悟不到555
#include<reg51.h>
#include<stdio.h>
unsigned char dis;
//sbit relay = P1^0;
unsigned char code nondis[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//0-9
//延時
void delay(unsigned int n)
{
        unsigned int i=0,j=0;
for(i=0;i<n;i++)
        {
        for(j=0;j<120;j++);
        }
}
//顯示函數
        void display()
        {
        unsigned char gewei,shiwei,baiwei;
//        num1=256-TL0;
//        num=9-num1;
        baiwei=TL0/100;
        gewei=TL0%10;
        shiwei=(TL0/10)%10;
        P2=nondis[gewei];//個位
        P0=0x80;
        delay(10);
        P2=0xff;
        P2=nondis[shiwei];//十位
        P0=0x40;
        delay(10);
        P2=0xff;
        P2=nondis[baiwei];//百位
        P0=0x20;
        delay(10);
        P2=0xff;
        }
                       
                        void main(void)
                        {
                                        P0=0x80;
                                        EA = 1;
                                        ET0 = 1;
                                        EX0 = 1;
                                        IT0 = 1;
                                        ET0 = 0;
                                        TMOD = 0x06;
                                        TH0 = 0;//9
                                        TL0 = 0;//9
                                        TR0 = 1;
                                while(1)
                                {
                        display();//顯示函數
                                }
                        }

void int0() interrupt 0        // 清空
                        {
                        TL0 = 0 ;
                        }

//void counter1() interrupt 1
//{
//        relay = ~relay;
//}

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:765181 發表于 2020-5-30 17:33 | 只看該作者
這是仿真的圖哥哥們

777.jpg (239.98 KB, 下載次數: 91)

圖是這樣一個開關按一下加一,一個清空

圖是這樣一個開關按一下加一,一個清空
回復

使用道具 舉報

板凳
ID:765181 發表于 2020-5-30 18:41 | 只看該作者
//按普中的視頻改了改不知道行不行
#include<reg51.h>
#include<stdio.h>
unsigned char dis;
//sbit relay = P1^0;
unsigned char code nondis[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//0-9

                //定時器1初始化
                void timerinit()
                {
                TMOD|=0X10;
                TH1=0xFC;
                TL1=0x18;
                ET1=1;
                EA=1;
                TR1=1;
                }
                       
                        void main(void)
                        {
                                        P0=0x80;
                                        EA = 1;
                                        ET0 = 1;
                                        EX0 = 1;
                                        IT0 = 1;
                                        ET0 = 0;
                                        TMOD = 0x06;
                                        TH0 = 0;//9
                                        TL0 = 0;//9
                                        TR0 = 1;
                        timerinit();
                                while(1);
                       
                        }

void int0() interrupt 0        // 清空
                        {
                        TL0 = 0 ;
                        }

//void counter1() interrupt 1
//{
//        relay = ~relay;
//}
void Time1() interrupt 3        // 清空
                        {
                        static unsigned short i;
                        unsigned char gewei,shiwei,baiwei;
                          
                                baiwei=TL0/100;
                                gewei=TL0%10;
                                shiwei=(TL0/10)%10;
                       
                        TH1=0xFC;
                        TL1=0x18;
                        i++;
                        if(i==10)
                        {
                          
                                  P2=0xff;       
                          P2=nondis[gewei];//個位
                          P0=0x80;

                        }
                                                if(i==20)
                        {
                          
                                  P2=0xff;
                          P2=nondis[shiwei];//十位
                                P0=0x40;

                        }
                                                if(i==30)
                        {         i=0;
                                P2=0xff;
                                  P2=nondis[baiwei];//百位
                                P0=0x20;

                        }
                        }

回復

使用道具 舉報

地板
ID:162664 發表于 2020-5-30 22:07 | 只看該作者
很久項目不用io口掃數碼管了。有點不知道怎么說。
簡單說:
1:io口掃描數碼管要注意是掃描的時間間隔。
滿足掃描間隔的前提下,如果主循環里有ALU占用時間過長的函數,那么數碼管掃描的程序放到中斷里掃描來滿足掃描時間的間隔。(假設在突發情況下,一個模擬iic的流程可能會占用5ms時間,那么,有可能就會因為這個導致數碼管亮度異常或者閃爍)
2:看了一眼程序,改進的程序中放在中斷中的程序已經把每一位的掃描分時出來了。如果時序沒問題是可以的。修改意見:定時器的時間注釋出來;if 改成 siwtch 語句(我覺得相對直觀);電路有問題,一般不這么設計,至于為什么自己去看看三極管一般怎么用。
回復

使用道具 舉報

5#
ID:213173 發表于 2020-5-30 22:43 | 只看該作者
BilibiliGiao 發表于 2020-5-30 17:33
這是仿真的圖哥哥們

沒有必要把顯示程序放在中斷,稍微改一下即可不用delay。

  1. #include<reg51.h>
  2. #include<stdio.h>
  3. unsigned char i;
  4. //sbit relay = P1^0;
  5. unsigned char code nondis[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//0-9
  6. //延時
  7. /*
  8. void delay(unsigned int n)
  9. {
  10.         unsigned int i=0,j=0;
  11.         for(i=0;i<n;i++)
  12.                 for(j=0;j<120;j++);
  13. }*/
  14. //顯示函數
  15. void display()
  16. {
  17.         P2=0xff;//消隱
  18.         if(i==0)
  19.         {
  20.                 P0=0x20;
  21.                 P2=nondis[TL0/100%10];//百位
  22.         }
  23.         if(i==1)
  24.         {
  25.                 P0=0x40;
  26.                 P2=nondis[TL0/10%10];//十位
  27.         }
  28.         if(i==2)
  29.         {
  30.                 P2=nondis[TL0%10];//個位
  31.                 P0=0x80;
  32.         }
  33.         i++;
  34.         i%=3;
  35. }

  36. void main(void)
  37. {
  38. //        P0=0x80;
  39.         TMOD = 0x06;
  40.         TH0 = 0;//9
  41.         TL0 = 0;//9
  42.         TR0 = 1;
  43.         EA = 1;
  44. //        ET0 = 1;
  45.         EX0 = 1;
  46.         IT0 = 1;
  47.         ET0 = 0;
  48.         while(1)
  49.         {
  50.                 display();//顯示函數
  51.         }
  52. }

  53. void int0() interrupt 0 // 清空
  54. {
  55.         TL0=0;
  56. }

  57. //void counter1() interrupt 1
  58. //{
  59. //        relay = ~relay;
  60. //}

復制代碼



回復

使用道具 舉報

6#
ID:765181 發表于 2020-5-31 19:06 | 只看該作者
gxslxxm 發表于 2020-5-30 22:07
很久項目不用io口掃數碼管了。有點不知道怎么說。
簡單說:
1:io口掃描數碼管要注意是掃描的時間間隔。
...

謝謝您的回復,我另一個pwm可調占空比的程序數碼管確實有閃爍。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 喷水毛片| 国产精品欧美一区喷水 | 久久黄视频 | 欧美乱人伦视频 | 欧美黄色绿像 | 国产精品一区二区久久精品爱微奶 | 日本一区二区三区视频在线 | 羞羞视频免费观看 | 中文字幕免费视频 | 亚洲精品一区国语对白 | 国产美女精品视频 | 国产精品一区二区无线 | 影音先锋中文字幕在线观看 | 在线成人精品视频 | 麻豆一区二区三区精品视频 | 成人免费在线视频 | 性一交一乱一透一a级 | 我我色综合 | 一区视频 | 欧美三级电影在线播放 | 亚洲97 | 久久成人国产 | 成人高潮片免费视频欧美 | 在线免费毛片 | 国内久久 | 91亚洲精选| 成人在线视频一区 | 精品久久久久久久久久久久 | 久久精品屋 | 99免费精品 | 99精品观看 | 日韩精品一区二区三区在线 | 欧美日韩在线一区二区 | 欧美精品在线播放 | 国产一区二区三区四区三区四 | 成人在线免费观看视频 | 成人做爰9片免费看网站 | 99爱国产 | 婷婷综合网 | 午夜天堂精品久久久久 | 精品久久久久久 |