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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

0~99以一秒遞進的動態掃描顯示程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:140769 發表于 2016-10-1 13:31 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
書本上的0~99顯示程序都是用74LS593鎖存器控制顯示電路。我們的單片機可以直接驅動數碼管,可以不用鎖存器。
我想只用89C52單片機與四位共陽數碼管寫一個以一秒為遞進的0~99數字顯示程序。P0口控制數碼管的位選,P2口控制數碼管的段選。
以下是我的程序思路,運行起來一直動態顯示01兩個數字。我不知道問題出在哪里,懇求各位壇友給個修改思路,不勝感激!!!


# include <reg52.h>
# define uint unsigned int
# define uchar unsigned char

uchar a[10] = { 0xC0, 0xF9, 0xA4, 0xB0, 0x99,     //四位共陽數碼管0~9顯示代碼
                       0x92, 0x82, 0xF8, 0x80, 0x90 };
uchar wei[2] = { 0xef, 0xdf };  //個位與十位選通代碼
     
uchar duan[2];     //用于存儲個位與十位值的數組

void delay(uchar m)
{
    uchar i, j;
    for (i=0; i<m; ++i)
    for (j=110; j>0; --j);
}

void display(uchar n, uchar k) //數碼管顯示函數
{
     P0 = 0xff;    //個位顯示
     P2 = wei[n];
     P0 = duan[n];
     delay(5);
     P2 = 0xff;

     P0 = 0xff;     //十位顯示
     P2 = wei[k];
     P0 = duan[k];
     delay(5);
     P2 = 0xff;
}

void main(void)
{
     uchar i=0, n=0, k=1, d=0;
     while (1)
   {
      ++d;
      if (d==100)
          d = 0;

      duan[0] = a[d%10];  //個位顯示的值
      duan[1] = a[d/10];  //十位顯示的值

      display(n, k);

      TMOD = 0X01;
      TH0 = (65536-50000)/256;
      TL0 = (65536-50000)%256;
      EA = 1;
      ET0 = 1;
      TR0 = 1;
      while(1);
     }
}

void T0_time() interrupt 1
{
     uchar num=0, n=0, k=1;

     TH0 = (65536-50000)/256;
     TL0 = (65536-50000)%256;
     num++;

     display(n, k);    //定時過程中數碼管顯示
   
     if (num==20)
         num = 0;   
}
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:57657 發表于 2016-10-1 20:18 | 只看該作者
中斷進入了變量num都清零了,怎么可能加到20啊。
把相關變量定義在函數外試試。
回復

使用道具 舉報

板凳
ID:111634 發表于 2016-10-1 22:19 | 只看該作者
593是計數器,595才是鎖存器。
回復

使用道具 舉報

地板
ID:111634 發表于 2016-10-1 22:23 | 只看該作者
本帖最后由 zl2168 于 2016-10-1 22:25 編輯

指出幾個問題:顯示與0~99遞進無關;0~99只有2位,不需用動態掃描顯示;若I/O端口沒有他用,P0、P2口可直接控制2位顯示。
回復

使用道具 舉報

5#
ID:140769 發表于 2016-10-1 23:27 | 只看該作者
zl2168 發表于 2016-10-1 22:23
指出幾個問題:顯示與0~99遞進無關;0~99只有2位,不需用動態掃描顯示;若I/O端口沒有他用,P0、P2口可直接 ...

我用的是單片機開發板上的數碼管。
回復

使用道具 舉報

6#
ID:140769 發表于 2016-10-1 23:31 | 只看該作者
npn 發表于 2016-10-1 20:18
中斷進入了變量num都清零了,怎么可能加到20啊。
把相關變量定義在函數外試試。

我沒有聽太懂朋友可否寫幾行代碼來指導一下小弟。
回復

使用道具 舉報

7#
ID:140371 發表于 2016-10-2 07:40 | 只看該作者
原程式有多處問題..... 修改後
# include <reg52.h>
# define uint unsigned int
# define uchar unsigned char

uchar a[10] = { 0xC0, 0xF9, 0xA4, 0xB0, 0x99,     //四位共陽數碼管0~9顯示代碼
                       0x92, 0x82, 0xF8, 0x80, 0x90 };
uchar wei[2] = { 0xef, 0xdf };  //個位與十位選通代碼
     
uchar duan[2];     //用于存儲個位與十位值的數組

uchar num=0,sec;


void delay(uchar m)
{
    uchar i, j;
    for (i=0; i<m; ++i)
    for (j=110; j>0; --j);
}

void display(uchar n) //數碼管顯示函數
{
     P0 = 0xff;    //個位顯示
     P2 = wei[n]];
     P0 = a[duan[n]];   
}

void main(void)
{
     uchar i=0, n=0, k=1, d=0;

      TMOD = 0X01;
      TH0 = (65536-50000)/256;
      TL0 = (65536-50000)%256;
      EA = 1;
      ET0 = 1;
      TR0 = 1;

      while(1)
      {
      duan[0] = sec[d%10];  //個位顯示的值
      duan[1] = sec[d/10];  //十位顯示的值
       display(n);
        n++;
        n = n %2;
       delay(1);
      }
     
}

void T0_time() interrupt 1
{
     //uchar num=0, n=0, k=1;

     TH0 = (65536-50000)/256;
     TL0 = (65536-50000)%256;
     num++;

     //display(n, k);    //定時過程中數碼管顯示
   
     if (num==20)
   {
  
         num = 0;
        sec++;
        if(sec >=100)
        sec =0;      
    }  
}
回復

使用道具 舉報

8#
ID:140358 發表于 2016-10-3 08:00 來自手機 | 只看該作者
沒了解過這個
回復

使用道具 舉報

9#
ID:140461 發表于 2016-10-3 08:36 | 只看該作者
7樓的程序不錯
回復

使用道具 舉報

10#
ID:141207 發表于 2016-10-3 14:20 | 只看該作者
可以參考下
回復

使用道具 舉報

11#
ID:141149 發表于 2016-10-4 12:31 | 只看該作者
/*                                                                             *
*                 數碼管顯示秒表, 分辨率0.01s                                     *
*                 K1=P1.4---控制按鈕                                           *
*                       第一次按下時, 啟動開始計時                             *
*                       第二次按下時, 停止                                     *
*                       第三次按下時, 歸零                                     *
*                                                                              *
*    秒單位,寄存器與數碼管對應關系:                                            *
*                                                                              *
* --- 秒單位 ---------- 數碼管端口 ---- 緩沖區 --------- 計時BCD碼值寄存器     *
*     十萬位               P20        dis_buf[7]          sec_bcd[7]           *
*     萬位                 P21        dis_buf[6]          sec_bcd[6]           *
*     千位                 P22        dis_buf[5]          sec_bcd[5]           *
*     百位                 P23        dis_buf[4]          sec_bcd[4]           *
*     十位                 P24        dis_buf[3]          sec_bcd[3]           *
*     個位(1.s)            P25        dis_buf[2]          sec_bcd[2]           *
*     十分位(0.1s)         P26        dis_buf[1]          sec_bcd[1]           *
*     百分位(0.01s)        P27        dis_buf[0]          sec_bcd[0]           *
*                                                                              *
********************************************************************************
*/

#include <reg51.h>
#include <intrins.h>

unsigned char data dis_digit;
unsigned char key_s, key_v;

unsigned char code dis_code[11]={0xc0,0xf9,0xa4,0xb0,        // 0, 1, 2, 3
                                0x99,0x92,0x82,0xf8,0x80,0x90, 0xff};// 4, 5, 6, 7, 8, 9, off
unsigned char dis_buf[8];                // 顯示緩沖區
unsigned char sec_bcd[8];                 // 秒計數值, BCD碼
unsigned char dis_index;                //
unsigned char key_times;                // K1 按下次數                                //

void clr_time();       
void update_disbuf();
bit        scan_key();
void proc_key();
void delayms(unsigned char ms);

sbit        K1 = P1^4;


void main(void)
{
        P0 = 0xff;
        P2 = 0xff;
        TMOD = 0x11;                // 定時器0, 1工作模式1, 16位定時方式
        TH1 = 0xdc;
        TL1 = 0;

        TH0 = 0xFC;
        TL0 = 0x17;
       
        clr_time();                        //
                                           
        dis_digit = 0x7f;                // 初始顯示P20口數碼管
        dis_index = 0;                        //
       
        key_times = 0;
        key_v = 0x01;
       
        IE = 0x8a;                                // 使能timer0, timer1中斷
       
        TR0 = 1;
        TR1 = 0;
        while(1)
        {
                if(scan_key())
                {
                        delayms(10);
                        if(scan_key())
                        {
                                key_v = key_s;
                                proc_key();
                        }
                }
               
        }
}

void clr_time()
{
        sec_bcd[0] = 0x0;
        sec_bcd[1] = 0x0;
        sec_bcd[2] = 0x0;
        sec_bcd[3] = 0x0;
        sec_bcd[4] = 0x0;
        sec_bcd[5] = 0x0;
        sec_bcd[6] = 0x0;
        sec_bcd[7] = 0x0;   
       
        update_disbuf();
       
}

bit scan_key()
{
        key_s = 0x00;
        key_s |= K1;
        return(key_s ^ key_v);       
}

void proc_key()
{
        if((key_v & 0x01) == 0)
        {
                key_times++;
                if(key_times == 1)
                {
                        TR1 = 1;
                }
                else if(key_times == 2)
                {       
                        TR1 = 0;
                }
                else
                {
                        clr_time();
                        key_times = 0;
                }
               
        }
}

void timer0() interrupt 1
// 定時器0中斷服務程序, 用于數碼管的動態掃描
// dis_index --- 顯示索引, 用于標識當前顯示的數碼管和緩沖區的偏移量
// dis_digit --- 位選通值, 傳送到P2口用于選通當前數碼管的數值, 如等于0xfe時,
//                                選通P2.0口數碼管
// dis_buf   --- 顯于緩沖區基地址       
{
        TH0 = 0xFC;
        TL0 = 0x17;
       
        P2 = 0xff;                                                        // 先關閉所有數碼管
        P0 = dis_buf[dis_index];                        // 顯示代碼傳送到P0口
        P2 = dis_digit;                                                //

        dis_digit = _cror_(dis_digit,1);        // 位選通值右移(P20<-P27), 下次中斷時選通下一位數碼管
        dis_index++;                                                //
                                       
        dis_index &= 0x07;                        // 8個數碼管全部掃描完一遍之后,再回到第一個開始下一次掃描
}

void timer1() interrupt 3
//
{       
        unsigned char i;
        TH1 |= 0xdc;
        for(i = 0; i < 8; i++)
        {
                sec_bcd[i]++;                        // 低位加1
                if(sec_bcd[i] < 10)                // 如果低位滿10則向高位進1
                        break;                        // 低位未滿10
                sec_bcd[i] = 0;                        // 低位滿10清0
        }
        update_disbuf();                        // 更新顯示緩沖區
}

void update_disbuf()
// 更新顯示緩沖區
{
        dis_buf[0] = dis_code[sec_bcd[0]];
        dis_buf[1] = dis_code[sec_bcd[1]];
        dis_buf[2] = dis_code[sec_bcd[2]] & 0x7f;        // 加上小數點
        dis_buf[3] = dis_code[sec_bcd[3]];
        dis_buf[4] = dis_code[sec_bcd[4]];
        dis_buf[5] = dis_code[sec_bcd[5]];
        dis_buf[6] = dis_code[sec_bcd[6]];
        dis_buf[7] = dis_code[sec_bcd[7]];
}

void delayms(unsigned char ms)       
// 延時子程序
{                                               
        unsigned char i;
        while(ms--)
        {
                for(i = 0; i < 120; i++);
        }
}

給你個程序,你自己研究一下把
回復

使用道具 舉報

12#
ID:140769 發表于 2016-10-6 19:53 | 只看該作者
zfbhjzxc 發表于 2016-10-4 12:31
/*                                                                             *
*                  ...

感謝解答
回復

使用道具 舉報

13#
ID:140769 發表于 2016-10-6 20:55 | 只看該作者
a0931727149 發表于 2016-10-2 07:40
原程式有多處問題..... 修改後
# include
# define uint unsigned int

非常感謝您提供了代碼,看后收獲良多!您的程序運行時有一些問題,我做了如下修改。
運行中數值正常顯示(0~99),但是遞進的速度非常快(不是以一秒為單位),是不是定時器沒起作用啊?

# include <reg52.h>
# define uint unsigned int
# define uchar unsigned char

uchar a[10] = { 0xC0, 0xF9, 0xA4, 0xB0, 0x99,     //四位共陽數碼管0~9顯示代碼
                 0x92, 0x82, 0xF8, 0x80, 0x90 };

uchar wei[2] = { 0xef, 0xdf };  //個位與十位選通代碼
      
uchar duan[2];     //用于存儲個位與十位值的數組

uint num=0,sec;


void delay(uint m)
{
     uint i, j;

     for (i=0; i<m; ++i)
         for (j=110; j>0; --j);
}

void display(uint n) //數碼管顯示函數
{
      P0 = 0xff;    //個位顯示
      P2 = wei[n];
      P0 = duan[n];   
}

void main(void)
{
      uint i=0, n=0, k=1, d=0;

       TMOD = 0X01;
       TH0 = (65536-50000)/256;
       TL0 = (65536-50000)%256;
       EA = 1;
       ET0 = 1;
       TR0 = 1;

       while(1)
       {
        duan[0] = a[d%10];  //個位顯示的值
        duan[1] = a[d/10];  //十位顯示的值

        display(n);

            d++;

           if (d == 100)
                      d = 0;
                          
        n++;
        n = n % 2;
        delay(1);
       }
      
}

void T0_time() interrupt 1
{
      TH0 = (65536-50000)/256;
      TL0 = (65536-50000)%256;

      ++num;
     
    if (num == 20)
    {
        num = 0;
        sec++;

        if(sec == 100)
                sec =0;      
     }  
}
回復

使用道具 舉報

14#
ID:141520 發表于 2016-10-7 07:47 | 只看該作者
中斷進入了變量num都清零了,怎么可能加到20啊。
回復

使用道具 舉報

15#
ID:141520 發表于 2016-10-7 07:48 | 只看該作者
變量num都清零了,怎么可能加到20啊。
回復

使用道具 舉報

16#
ID:140769 發表于 2016-10-7 14:16 | 只看該作者
zfbhjzxc 發表于 2016-10-4 12:31
/*                                                                             *
*                  ...

非常感謝您修改的程序,在您的基礎上我再次修改后運行了如下的代碼得到了我想要的結果。此次收獲良多!
下列的程序是完整的代碼,運行后無誤。


# include <reg52.h>
# define uint unsigned int
# define uchar unsigned char

uchar a[10] = { 0xC0, 0xF9, 0xA4, 0xB0, 0x99,     //四位共陽數碼管0~9顯示代碼
                       0x92, 0x82, 0xF8, 0x80, 0x90 };

uchar wei[2] = { 0xef, 0xdf };  //個位與十位選通代碼
      
uchar duan[2];     //用于存儲個位與十位值的數組

uint num=0,sec;


void delay(uint m)
{
     uint i, j;

     for (i=0; i<m; ++i)
         for (j=110; j>0; --j);
}

void display(uint n) //數碼管顯示函數
{
      P0 = 0xff;    //個位顯示
      P2 = wei[n];
      P0 = duan[n];   
}

void main(void)
{
      uint i=0, n=0, k=1;

       TMOD = 0X01;
       TH0 = (65536-50000)/256;
       TL0 = (65536-50000)%256;
       EA = 1;
       ET0 = 1;
       TR0 = 1;

       while(1)
       {
        duan[0] = a[sec%10];  //個位顯示的值
        duan[1] = a[sec/10];  //十位顯示的值

        display(n);
      
        n++;
        n = n % 2;        //此語句巧妙
        delay(1);
       }  
}

void T0_time() interrupt 1
{
      TH0 = (65536-50000)/256;
      TL0 = (65536-50000)%256;

      ++num;
     
      if (num == 20)
      {
         num = 0;
         sec++;

         if(sec == 100)
         sec =0;      
      }  
}

回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 99re在线视频免费观看 | 欧美在线一区二区三区四区 | www久久国产 | 欧美国产精品一区二区三区 | 一本一道久久a久久精品综合 | 亚洲欧美激情视频 | 狠狠综合久久av一区二区老牛 | 国产9999精品 | 国产免费一区二区 | 91成人在线 | 精品一区二区三区在线观看 | 在线男人天堂 | 九九爱这里只有精品 | 色综合天天天天做夜夜夜夜做 | 成人高清视频在线观看 | 国产区精品| 欧美精品三区 | 99在线精品视频 | 一级日批片| 亚洲+变态+欧美+另类+精品 | 亚洲 欧美 激情 另类 校园 | 中文字幕欧美日韩 | 波多野结衣一区二区三区 | 亚洲 欧美 日韩 在线 | 国产三级一区二区 | 国产一级片免费在线观看 | 亚洲国产精品久久 | 久久99精品久久 | 久久伊人在 | 日韩欧美国产一区二区三区 | 日韩欧美一区二区三区四区 | 国产精品人人做人人爽 | 日韩视频中文字幕 | 成人三区 | 午夜精品视频在线观看 | 日韩国产一区二区三区 | 国产黄色在线 | 在线观看国产91 | 超碰成人av| 欧美综合视频在线 | 麻豆hd|