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

QQ登錄

只需一步,快速開始

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

想做一個(gè)時(shí)間累加,到60后,清零的單片機(jī)程序,兩位數(shù)時(shí)候出錯(cuò)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:384605 發(fā)表于 2019-3-18 21:09 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
#include <reg52.h>
typedef unsigned int uint;
typedef unsigned char uchar;
sbit LED1=P1^0;
sbit wela=P2^6;
sbit dula=P2^7;
//void delayms(uint);
uchar num,shi,num,ge,num1;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,
     0x6d,0x7d,0x07,0x7f,0x6f,
     0x77,0x7c,0x39,0x5e,0x79,0x71};  //顯示0~F的十六進(jìn)制的數(shù);0 1 2 3 4 5 6 7 8 9

void delayms(uint xms)   //延時(shí)函數(shù)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void display(uchar shi, uchar ge)
{
dula=1;
P1=0xfe;
dula=0;
wela=1;
P0=table[shi];  //位選
wela=0;
delayms(5);

dula=1;
P1=0xfd;
dula=0;
wela=1;
P0=table[ge];
wela=0;
}

void main()
{
TMOD=0x01;
TH0=(65535-45872)/256;  //付初值
TL0=(65535-45872)%256;
EA=1;      //打開總中斷
ET0=1;      //開定時(shí)器0中斷
TR0=1;      //啟動(dòng)定時(shí)器0中斷
while(1)     //等待中斷開啟
{
display(shi,ge);
}     
}
void T0_time() interrupt 1     //方式1
{
TH0=(65535-45872)/256;  //付初值
TL0=(65535-45872)%256;
num++;
if(num==20)
{
num=0;
num1++;
if(num1==9)
{
num1=0;
}
shi=num1/10;
ge=shi;
}

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

使用道具 舉報(bào)

沙發(fā)
ID:384605 發(fā)表于 2019-3-18 21:12 | 只看該作者
代碼可以實(shí)現(xiàn)一位累加,但是兩位數(shù)時(shí)候,累加總出現(xiàn)顯示錯(cuò)誤,不知道什么原因,求解答
回復(fù)

使用道具 舉報(bào)

板凳
ID:46220 發(fā)表于 2019-3-19 09:57 | 只看該作者
這是我學(xué)中斷時(shí)候?qū)懙,你參考一下,這個(gè)程序在51HEL開發(fā)板驗(yàn)證過的,數(shù)碼管從0到59累加后歸零,歸零的時(shí)候蜂鳴器響一聲,希望可以幫到您
#include<reg52.h>        //52系列單片機(jī)頭文件
#include<math.h>       
#define uint unsigned int//宏定義
#define uchar unsigned char//宏定義
sbit DUAN=P2^6;     //74HC573的LE端  U1  數(shù)碼管LED的段選端
sbit WEI=P2^7;      //74HC573的LE端  U1  數(shù)碼管LED的位選端
sbit LED8=P2^4;
sbit FG=P2^2;                //蜂鳴器和繼電器的控制端
uchar num,num2,shi,ge;
uint num1;
void delayms(uint);        //聲明延時(shí)子函數(shù)
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};  //共陰顯示字庫
void display(uchar,uchar);

void main()                //主函數(shù)
{
        TMOD=0x11;                                //設(shè)置定時(shí)器0和1為工作方式1(0001 0001)
        TH0=(65536-45872)/256;        //裝初值
        TL0=(65536-45872)%256;
        TH1=(65536-45872)/256;        //裝初值
        TL1=(65536-45872)%256;
                EA=1;                                //開總中斷
                ET0=1;                                //開定時(shí)器0中斷
                ET1=1;                                //開定時(shí)器1中斷
                TR0=1;                                //啟動(dòng)定時(shí)器0
                TR1=1;                                //啟動(dòng)定時(shí)器1
        while(1)                        //程序在這里不停的對(duì)數(shù)碼管動(dòng)態(tài)掃描同時(shí)等待中斷發(fā)生
        {
                display(shi,ge);
        }
}
void display(uchar shi,uchar ge)        //顯示子函數(shù)
{

        DUAN=1;        //打開段選
        P0=table[shi];        //送段選數(shù)據(jù)
        DUAN=0;                //段選鎖定
        P0=0xff;        //送位選數(shù)據(jù)前關(guān)閉所有顯示,防止打開位選鎖存時(shí)原來段選數(shù)據(jù)通過位選鎖存器造成混亂
        WEI=1;                //打開位選
        P0=0xfe;        //送位選數(shù)據(jù)
        WEI=0;                //位選鎖定
        delayms(5);        //延時(shí)

       
        DUAN=1;        //打開段選
        P0=table[ge];        //送段選數(shù)據(jù)
        DUAN=0;                //段選鎖定
        P0=0xff;        //送位選數(shù)據(jù)前關(guān)閉所有顯示,防止打開位選鎖存時(shí)原來段選數(shù)據(jù)通過位選鎖存器造成混亂
        WEI=1;                //打開位選
        P0=0xfd;        //送位選數(shù)據(jù)
        WEI=0;                //位選鎖定
        delayms(5);        //延時(shí)

}



void delayms(uint xms)                                //延時(shí)子函數(shù)
        {
                uint i,j;
                        for(i=xms;i>0;i--)
                                for(j=110;j>0;j--);                //i=xms即延時(shí)約xms毫秒
        }

void T0_time()interrupt 1
{
        TH0=(65536-45872)/256;               
        TL0=(65536-45872)%256;                //重裝初值
        num1++;               
                if(num1==1200)                //如果到了1200次,說明60秒時(shí)間到
                        {
                                num1=0;                //然后把num1清0重新再計(jì)1200次
                                FG=~FG;                //讓蜂鳴器狀態(tài)取反
                                delayms(100);
                                FG=~FG;
                        }
}

void T1_time() interrupt 3
{
        TH1=(65536-45872)/256;               
        TL1=(65536-45872)%256;                //重裝初值
        num2++;
                if(num2==20)                //如果到了20次,說明1秒時(shí)間到
                        {
                                num2=0;                //然后把num2清0重新再計(jì)20次
                                num++;
                                if(num==60)        //這個(gè)數(shù)用來送數(shù)碼管顯示,到60后歸0
                                        num=0;
                                shi=num/10;                //把一個(gè)二位數(shù)分離后分別送數(shù)碼管顯示
                                ge=num%10;                //十位和個(gè)位
                        }                       
}
回復(fù)

使用道具 舉報(bào)

地板
ID:234075 發(fā)表于 2019-3-19 11:11 | 只看該作者
你的程序應(yīng)該是50ms中斷累加,1S計(jì)數(shù)每秒+1,你的程序
if(num1==9)
{
num1=0;
}
shi=num1/10;
ge=shi;
}
這里不對(duì)的,你要顯示的是num1的值,按照你的設(shè)想就應(yīng)該num1到60再進(jìn)行清零,你這里到9就清零了。應(yīng)該是if(num1==60),這樣才能顯示0~59
回復(fù)

使用道具 舉報(bào)

5#
ID:213173 發(fā)表于 2019-3-19 12:54 | 只看該作者
你的中斷程序和顯示程序都有問題,給你改好了,你試試。
  1. #include <reg52.h>
  2. typedef unsigned int uint;
  3. typedef unsigned char uchar;
  4. sbit LED1=P1^0;
  5. sbit dula=P2^6;
  6. sbit wela=P2^7;
  7. uchar num,num1,shi,ge;
  8. uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,
  9.      0x6d,0x7d,0x07,0x7f,0x6f,
  10.      0x77,0x7c,0x39,0x5e,0x79,0x71};  //顯示0~F的十六進(jìn)制的數(shù);0 1 2 3 4 5 6 7 8 9

  11. void delayms(uint xms)   //延時(shí)函數(shù)
  12. {
  13.         uint i,j;
  14.         for(i=xms;i>0;i--)
  15.                 for(j=110;j>0;j--);
  16. }
  17. void display(uchar i)
  18. {
  19.         P0=0xfe;//送十位位碼
  20.         wela=1;
  21.         wela=0;
  22.         P0=table[i/10];//送十位段碼
  23.         dula=1;
  24.         dula=0;
  25.         delayms(2);
  26.        
  27.         P0=0xfd;//送十位段碼
  28.         wela=1;
  29.         wela=0;
  30.         P0=table[i%10];//送個(gè)位段碼
  31.         dula=1;
  32.         dula=0;
  33.         delayms(2);
  34. }

  35. void main()
  36. {
  37.         TMOD=0x01;
  38.         TH0=(65536-45872)/256;  //賦初值
  39.         TL0=(65536-45872)%256;
  40.         EA=1;      //打開總中斷
  41.         ET0=1;      //開定時(shí)器0中斷
  42.         TR0=1;      //啟動(dòng)定時(shí)器0中斷
  43.         while(1)     //等待中斷開啟
  44.         {
  45.                 display(num1);
  46.         }     
  47. }
  48. void T0_time() interrupt 1     //方式1
  49. {
  50.         TH0=(65536-45872)/256;  //賦初值
  51.         TL0=(65536-45872)%256;
  52.         num++;
  53.         if(num==20)
  54.         {
  55.                 num=0;
  56.                 LED1=~LED1;//LED閃爍
  57.                 num1++;
  58.                 if(num1==60)
  59.                 {
  60.                         num1=0;
  61.                 }
  62.         }
  63. }
復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表