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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4785|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产成人精品免费视频 | 精品美女视频在线观看免费软件 | 日韩在线精品视频 | 日韩人体视频 | 99精品一区| 在线观看三级av | 国产日韩精品一区 | 在线高清免费观看视频 | 99精品免费久久久久久久久日本 | 久久大陆| 欧美精品久久久 | 夜久久 | 欧美日韩久久精品 | www国产亚洲精品久久网站 | 成在线人视频免费视频 | 亚洲精品视频在线播放 | 在线不卡av| 亚洲精品在线91 | 一级a性色生活片久久毛片 一级特黄a大片 | 国产成人精品一区二区三区视频 | 视频一区在线观看 | 成年人在线视频 | 国产成人在线一区 | 欧美日韩国产在线 | 国产一区二区三区久久久久久久久 | 亚洲天天 | japan25hdxxxx日本| 亚洲精品一级 | 国产精品久久久久久久久久久免费看 | 欧美成人h版在线观看 | 精品久久久久久亚洲综合网站 | 国产精品毛片一区二区三区 | 一区二区三区四区av | 亚洲国产精品一区二区三区 | 国产麻豆乱码精品一区二区三区 | 99re在线视频 | 精品久久精品 | 国产精品久久久久久久久久久新郎 | 精品久久一区 | 荷兰欧美一级毛片 | 国产一级久久久久 |