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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機中斷與數碼管動態掃描(含按鍵控制方法)仿真和源碼

[復制鏈接]
跳轉到指定樓層
樓主
   利用中斷與定時器來實現99秒的秒表   
   按鍵可以暫停
當然也可以清零 可以參照我上一個帖子自己再給按鍵加一些功能

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機源程序如下:
  1. #include <reg52.h>
  2. sbit p1=P1^0;
  3. sbit p2=P1^1;
  4. sbit k1=P1^7;
  5. unsigned char code LedChar[] = { //數碼管顯示字符轉換表
  6.     0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
  7.     0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
  8. };
  9. unsigned char LedBuff[6]= { //數碼管顯示緩沖區,初值 0xFF 確保啟動時都不亮
  10.     0xc0,0xc0
  11. };
  12. char scan[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};

  13. unsigned char i = 0;  //動態掃描的索引
  14. unsigned int cnt = 0;
  15. bit flag=0;//記錄 T0 中斷次數
  16. unsigned long sec = 0;  //記錄經過的秒數
  17. void debouncer();
  18. void main(){
  19.    
  20.     EA = 1;  //使能總中斷
  21.     TMOD = 0x01;  //設置 T0 為模式 1
  22.     TH0 = 0xFC;  //為 T0 賦初值 0xFC67,定時 1ms
  23.     TL0 = 0x18;
  24.     ET0 = 1;  //使能 T0 中斷
  25.     TR0 = 0;
  26.     ET1=1;
  27.     TR1=0;
  28.     TH1=0xfc;
  29.     TL1=0x18;       
  30. k1=1;        //啟動 T0
  31. while (1){
  32.           

  33.         if(k1==0&&flag==0){   //按鍵按下不放 開始計時    松開立即停止計時,示數定在當前計數數值
  34.           debouncer();
  35.           TR0=1;  //打開定時器中斷0
  36.                 TR1=1;  //打開定時器中斷1
  37.                 flag=1;
  38.                 while(k1==0);  /*這兩句防止在 按鍵按下的短時間內程序跑飛到下一個if語句*/
  39.                 debouncer();
  40.                
  41.         }
  42.        
  43.         if(k1==0&&flag==1){   //此時 k1==0,可以實現第二次功能   若k1==1即為按鍵松開產生動作
  44.           debouncer();
  45.                 TR1=0;    //關閉定時器中斷1 使得程序停止在當前時刻
  46.           flag=0;
  47.           while(k1==0);
  48.                  debouncer();
  49.         }

  50.                
  51.        
  52.   
  53.     }
  54. }
  55. /* 定時器 0 中斷服務函數  控制位 并顯示對應數值 */
  56. void InterruptTimer0() interrupt 1{
  57.     TH0 = 0xFC;  //重新加載初值
  58.     TL0 = 0x18;
  59.     cnt++;  //中斷次數計數值加 1
  60.    
  61.     //以下代碼完成數碼管動態掃描刷新
  62.     P2 = 0xFF;
  63.     //顯示消隱
  64.     switch (i){
  65.         case 0: p2=1;p1=0; i++; P2=LedBuff[0]; break;  //打開個位,關閉其他位,并給P2端口賦個位相應數值斷碼
  66.         case 1: p1=1;p2=0; i=0; P2=LedBuff[1]; break;  //打開十位,關閉其他位,并給P2端口賦十位相應數值斷碼
  67.         default: break;
  68.     }
  69. }

  70. void InterruptTimer1() interrupt 3{            /* 定時器 1 中斷服務函數  控制段并 將要顯示的數值斷碼 賦值到數組中等待調用 */
  71. TH1=0xc0;
  72.         TL1=0x18;
  73.       if (cnt >=800){  //判斷 T0 溢出是否達到 1000 次   此處理論上寫1000,但是實際寫800是因為為了消除計時誤差 800這個數
  74.             cnt = 0;  //達到 1000 次后計數值清零
  75.             sec++;  //秒計數自加 1
  76.            if(sec>99)sec=0;
  77.             //以下代碼將 sec 按十進制位從低到高依次提取并轉為數碼管顯示字符
  78.             LedBuff[0] = LedChar[sec%10];
  79.             LedBuff[1] = LedChar[sec/10];
  80.            
  81.         }
  82. }


  83.    void debouncer(){  //延時20ms按鍵消抖
  84.     int i;
  85.           for(i=0;i<2400;i++);

  86. }
復制代碼

所有資料51hei提供下載:
中斷與數碼管動態掃描.rar (15.26 KB, 下載次數: 24)



評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:332416 發表于 2018-5-18 15:12 | 只看該作者
這個是獨立按鍵控制的
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit dula=P2^6;
sbit wela=P2^7;
sbit K1=P3^4;
sbit K2=P3^5;
sbit K3=P3^6;
sbit K4=P3^7;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
uint aa;
uchar num1,num2,shi1,ge1,shi2,ge2;

void delay(uint z)
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);
}

void display(uchar num1,uchar num2)
{
        shi1=num1/10;
        ge1=num1%10;
        shi2=num2/10;
        ge2=num2%10;
       
        dula=1;
        P0=table[shi1];
        dula=0;
        P0=0xff;
        wela=1;
        P0=0xfe;
        wela=0;
        delay(1);

        dula=1;
        P0=table[ge1];
        dula=0;
        P0=0xff;
        wela=1;
        P0=0xfd;
        wela=0;
        delay(1);

        dula=1;
        P0=table[shi2];
        dula=0;
        P0=0xff;
        wela=1;
        P0=0xfb;
        wela=0;
        delay(1);

        dula=1;
        P0=table[ge2];
        dula=0;
        P0=0xff;
        wela=1;
        P0=0xf7;
        wela=0;
        delay(1);
}

void key()
{
        if(K1==0)
        {
                delay(5);
                if(K1==0)
                {
                        TR0=0;
                        while(!K1);
                }
        }

        if(K2==0)
        {
                delay(5);
                if(K2==0)
                {
                        if(num1==0)
                        {
                                num1=60;
                        }
                        num1--;
                        while(!K2);
                }
        }

        if(K3==0)
        {
                delay(5);
                if(K3==0)
                {
                        num1++;
                        if(num1>=60)
                        {
                                num1=num1-60;
                        }
                        while(!K3);
                }
        }

        if(K4==0)
        {
                delay(5);
                if(K4==0)
                {
                        TR0=1;
                        while(!K4);
                }
        }
}

void inint()
{
        TMOD=0x01;
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        EA=1;
        ET0=1;
        TR0=1;
}

void main()
{
        inint();
        while(1)
        {
                key();
                display(num1,num2);
        }
}

void zhongduan()interrupt 1
{
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        aa++;
        if(aa==20)
        {
                aa=0;
                num2++;
                if(num2==60)
                {
                        num2=0;
                        num1++;
                        if(num1==60)
                                num1=0;
                }
        }
}
回復

使用道具 舉報

板凳
ID:492742 發表于 2019-3-17 19:58 | 只看該作者
謝謝,收益
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产日韩一区二区 | 久久久久九九九女人毛片 | 在线观看中文视频 | 国产成人在线一区 | 日韩精品久久一区二区三区 | 亚洲精品国产成人 | 午夜在线免费观看视频 | 成人免费视频网站在线看 | 天堂三级 | 亚洲精品视频免费 | 欧美一级免费看 | 国产精品久久久久999 | 色综合一区二区 | 欧美成人免费在线 | 99亚洲| h片在线看| 亚洲狠狠爱| 亚洲精品久久 | 一区二区播放 | 一级黄色淫片 | 91视频一区二区三区 | 欧美簧片| 欧美精品成人 | 91观看| 欧美国产精品一区二区三区 | 日本黄色激情视频 | 99久久免费精品 | 国产黄色网址在线观看 | 黑人巨大精品欧美一区二区一视频 | 久草在线 | 日本精品一区二区三区在线观看视频 | 欧美综合一区二区 | 亚洲一区导航 | 欧美一区二区三区 | 久久久精品网 | 国产欧美精品 | 亚洲精品乱码久久久久久按摩观 | 99久久婷婷国产综合精品首页 | 亚洲精品久久久久久一区二区 | 在线观看免费av片 | 91在线综合|