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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 5370|回復(fù): 16
打印 上一主題 下一主題
收起左側(cè)

0~99以一秒遞進(jìn)的動(dòng)態(tài)掃描顯示程序

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


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

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

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) //數(shù)碼管顯示函數(shù)
{
     P0 = 0xff;    //個(gè)位顯示
     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];  //個(gè)位顯示的值
      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);    //定時(shí)過程中數(shù)碼管顯示
   
     if (num==20)
         num = 0;   
}
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

指出幾個(gè)問題:顯示與0~99遞進(jìn)無關(guān);0~99只有2位,不需用動(dòng)態(tài)掃描顯示;若I/O端口沒有他用,P0、P2口可直接控制2位顯示。
回復(fù)

使用道具 舉報(bào)

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

我用的是單片機(jī)開發(fā)板上的數(shù)碼管。
回復(fù)

使用道具 舉報(bào)

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

我沒有聽太懂朋友可否寫幾行代碼來指導(dǎo)一下小弟。
回復(fù)

使用道具 舉報(bào)

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

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

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) //數(shù)碼管顯示函數(shù)
{
     P0 = 0xff;    //個(gè)位顯示
     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];  //個(gè)位顯示的值
      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);    //定時(shí)過程中數(shù)碼管顯示
   
     if (num==20)
   {
  
         num = 0;
        sec++;
        if(sec >=100)
        sec =0;      
    }  
}
回復(fù)

使用道具 舉報(bào)

8#
ID:140358 發(fā)表于 2016-10-3 08:00 來自手機(jī) | 只看該作者
沒了解過這個(gè)
回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

11#
ID:141149 發(fā)表于 2016-10-4 12:31 | 只看該作者
/*                                                                             *
*                 數(shù)碼管顯示秒表, 分辨率0.01s                                     *
*                 K1=P1.4---控制按鈕                                           *
*                       第一次按下時(shí), 啟動(dòng)開始計(jì)時(shí)                             *
*                       第二次按下時(shí), 停止                                     *
*                       第三次按下時(shí), 歸零                                     *
*                                                                              *
*    秒單位,寄存器與數(shù)碼管對(duì)應(yīng)關(guān)系:                                            *
*                                                                              *
* --- 秒單位 ---------- 數(shù)碼管端口 ---- 緩沖區(qū) --------- 計(jì)時(shí)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]           *
*     個(gè)位(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];                // 顯示緩沖區(qū)
unsigned char sec_bcd[8];                 // 秒計(jì)數(shù)值, BCD碼
unsigned char dis_index;                //
unsigned char key_times;                // K1 按下次數(shù)                                //

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;                // 定時(shí)器0, 1工作模式1, 16位定時(shí)方式
        TH1 = 0xdc;
        TL1 = 0;

        TH0 = 0xFC;
        TL0 = 0x17;
       
        clr_time();                        //
                                           
        dis_digit = 0x7f;                // 初始顯示P20口數(shù)碼管
        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
// 定時(shí)器0中斷服務(wù)程序, 用于數(shù)碼管的動(dòng)態(tài)掃描
// dis_index --- 顯示索引, 用于標(biāo)識(shí)當(dāng)前顯示的數(shù)碼管和緩沖區(qū)的偏移量
// dis_digit --- 位選通值, 傳送到P2口用于選通當(dāng)前數(shù)碼管的數(shù)值, 如等于0xfe時(shí),
//                                選通P2.0口數(shù)碼管
// dis_buf   --- 顯于緩沖區(qū)基地址       
{
        TH0 = 0xFC;
        TL0 = 0x17;
       
        P2 = 0xff;                                                        // 先關(guān)閉所有數(shù)碼管
        P0 = dis_buf[dis_index];                        // 顯示代碼傳送到P0口
        P2 = dis_digit;                                                //

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

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則向高位進(jìn)1
                        break;                        // 低位未滿10
                sec_bcd[i] = 0;                        // 低位滿10清0
        }
        update_disbuf();                        // 更新顯示緩沖區(qū)
}

void update_disbuf()
// 更新顯示緩沖區(qū)
{
        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;        // 加上小數(shù)點(diǎn)
        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)       
// 延時(shí)子程序
{                                               
        unsigned char i;
        while(ms--)
        {
                for(i = 0; i < 120; i++);
        }
}

給你個(gè)程序,你自己研究一下把
回復(fù)

使用道具 舉報(bào)

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

感謝解答
回復(fù)

使用道具 舉報(bào)

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

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

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

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

uchar wei[2] = { 0xef, 0xdf };  //個(gè)位與十位選通代碼
      
uchar duan[2];     //用于存儲(chǔ)個(gè)位與十位值的數(shù)組

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) //數(shù)碼管顯示函數(shù)
{
      P0 = 0xff;    //個(gè)位顯示
      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];  //個(gè)位顯示的值
        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;      
     }  
}
回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

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


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

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

uchar wei[2] = { 0xef, 0xdf };  //個(gè)位與十位選通代碼
      
uchar duan[2];     //用于存儲(chǔ)個(gè)位與十位值的數(shù)組

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) //數(shù)碼管顯示函數(shù)
{
      P0 = 0xff;    //個(gè)位顯示
      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];  //個(gè)位顯示的值
        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;      
      }  
}

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 久久久久久成人 | 午夜专区| 黄色av网站在线观看 | 红桃视频一区二区三区免费 | 99在线免费观看视频 | 人人种亚洲 | 人妖无码 | 亚洲黄色片免费观看 | 成人欧美一区二区三区 | 欧美一区成人 | 成人精品鲁一区一区二区 | 亚洲精品国产偷自在线观看 | 国内自拍偷拍一区 | 国产精品毛片无码 | 欧美一区二区小视频 | 97超碰成人 | 久久国产精品久久国产精品 | 99视频在线免费观看 | 国产精品18久久久久久久 | 欧美久操网 | 午夜影院在线观看 | 精品久久精品 | 国产一级毛片精品完整视频版 | 国产欧美精品区一区二区三区 | 日韩国产中文字幕 | 91正在播放 | 久久综合九色综合欧美狠狠 | 成人精品一区二区三区 | 97影院2 | 99热99| 性xxxxx | 日韩免费一区二区 | 日韩欧美在线观看 | 秋霞在线一区 | 亚洲精品在线看 | 精品国产免费一区二区三区演员表 | 华丽的挑战在线观看 | av官网在线| 精品福利在线 | 亚洲视频免费在线观看 | 欧美天堂 |