找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

求助51單片機(jī)定時(shí)器中斷計(jì)數(shù)問題

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:883025 發(fā)表于 2021-2-5 14:46 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
void Interrupt_0() interrupt 1
{
           TH0 = 0xFC;
           TL0 = 0x66;
                 cnt++;
                 if(cnt>=1000)
                 {
                   cnt=0;
上面使部分程序。計(jì)數(shù)1ms時(shí)間到,cnt值加一,但是計(jì)數(shù)值在液晶上顯示的不是連續(xù)值,比如說當(dāng)加到21時(shí),下一個(gè)數(shù)應(yīng)該是22,但是顯示的是23或者更大。求大佬幫忙解決下這種計(jì)時(shí)不精確的問題。
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:882828 發(fā)表于 2021-2-5 15:31 | 只看該作者
你是火眼金睛嗎?連1ms的計(jì)數(shù)值變化都能看清楚???正常人連100ms的都看不清。
回復(fù)

使用道具 舉報(bào)

板凳
ID:315264 發(fā)表于 2021-2-5 15:33 | 只看該作者
因?yàn)轱@示的時(shí)候取cnt的值時(shí)已經(jīng)變成了取的時(shí)候的值了,程序運(yùn)行總是要時(shí)間的吧,所以要么計(jì)時(shí)延長,不要1ms
回復(fù)

使用道具 舉報(bào)

地板
ID:883031 發(fā)表于 2021-2-5 15:59 | 只看該作者
人眼根本無法看到1ms的變化。
回復(fù)

使用道具 舉報(bào)

5#
ID:451718 發(fā)表于 2021-2-5 16:43 | 只看該作者
你的問題,嚴(yán)謹(jǐn)性不夠,導(dǎo)致大家都給你回答偏了。  你這個(gè)肯定是程序的問題,但是,你又只貼了部分程序,你讓大家靠猜么?
回復(fù)

使用道具 舉報(bào)

6#
ID:743654 發(fā)表于 2021-2-5 17:13 | 只看該作者
人分辨事物的最高頻率為24HZ,即反應(yīng)一次要0.042s=42ms
也就是說電影播放時(shí),每秒鐘播放的圖片數(shù)要超過24張,人眼才看不出圖片之間的切換,看到的才是動(dòng)態(tài)的影片效果.
你可以試著把定時(shí)器計(jì)數(shù)一次的時(shí)間設(shè)置>=42ms,看看效果。
回復(fù)

使用道具 舉報(bào)

7#
ID:390416 發(fā)表于 2021-2-6 11:42 | 只看該作者
你的液晶刷新速度不夠了。建議你沒事多看看我的貼子和視頻教程
回復(fù)

使用道具 舉報(bào)

8#
ID:759419 發(fā)表于 2021-2-6 12:50 | 只看該作者
演示的問題
回復(fù)

使用道具 舉報(bào)

9#
ID:213173 發(fā)表于 2021-2-6 14:24 | 只看該作者
cheney03 發(fā)表于 2021-2-5 17:13
人分辨事物的最高頻率為24HZ,即反應(yīng)一次要0.042s=42ms
也就是說電影播放時(shí),每秒鐘播放的圖片數(shù)要超過24張, ...

普通135mm膠片電影每秒鐘播放24幀不假,但不可以此推算出人眼分辨頻率約為24Hz(42ms)。其實(shí)人眼分辨頻率約20ms。那么電影為了節(jié)省膠片又顧及人眼分辨速率,實(shí)際放映機(jī)是一幀膠片兩次打開快門。其閃爍頻率就提高一倍達(dá)48Hz,與絕大多數(shù)人的肉眼暫留時(shí)間相近。
回復(fù)

使用道具 舉報(bào)

10#
ID:883301 發(fā)表于 2021-2-6 22:06 | 只看該作者
把遞減間隔加大點(diǎn)唄
回復(fù)

使用道具 舉報(bào)

11#
ID:883025 發(fā)表于 2021-2-7 09:19 | 只看該作者
抱歉,是我沒說清楚。程序里我設(shè)置了一個(gè)對照量。比如說超過設(shè)定值25ms時(shí)停止計(jì)數(shù),但是停止計(jì)數(shù)的時(shí)候,計(jì)數(shù)值往往大于設(shè)定值。所以,不是觀察的問題
回復(fù)

使用道具 舉報(bào)

12#
ID:883025 發(fā)表于 2021-2-7 09:22 | 只看該作者
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit K1 = P1^0;
sbit K2 = P1^1;
sbit K3 = P1^2;
sbit K4 = P1^3;
sbit K5 = P1^4;
sbit K6 = P2^4;
sbit LED1 = P2^1;
sbit LED2 = P2^2;
sbit LED3 = P2^3;
sbit RL = P2^0;
sbit LCD_RS=P1^6;
sbit LCD_RW=P1^5;
sbit LCD_E=P1^7;
#define LCD_DataPort P0
uint tab1[4]=0;
uint tab2[4]=0;
uint a=0;
uint cnt=0;
uint sec1=0;
uint sec2=0;
uchar k=0;
uchar min=0;
i = 0;

void delay(uint ms)
{
    uint i,j;
        for(i=0;i<ms;i++)
        for(j=0;j<100;j++);
}

void LED_init()
{
   RL=1;
         LED1=1;
         LED2=1;
         LED3=1;
}

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

void LCD_WriteCommand(uchar Command)
{
  LCD_RS=0;
        LCD_RW=0;
        LCD_DataPort=Command;
        LCD_E=1;
        delay(1);
        LCD_E=0;
        delay(1);
}

void LCD_WriteData(uchar Data)
{
        LCD_RS=1;
        LCD_RW=0;
        LCD_DataPort=Data;
        LCD_E=1;
        delay(1);
        LCD_E=0;
        delay(1);
}

void LCD_Init()
{
   delay(15);
         LCD_WriteCommand(0x38);
         delay(15);
         LCD_WriteCommand(0x0C);
         delay(15);
         LCD_WriteCommand(0x06);
         delay(15);
         LCD_WriteCommand(0x01);
}

void DisplayCount(uint temp3,uint temp4)
{
   tab1[0]=temp3/10;
         tab1[1]=temp3%10;
         tab1[2]=temp4/10;;
         tab1[3]=temp4%10;
   LCD_WriteCommand(0xC6);
         LCD_WriteData(tab1[0]+0x30);
         LCD_WriteCommand(0xC7);
         LCD_WriteData(tab1[1]+0x30);
         LCD_WriteCommand(0xC8);
         LCD_WriteData('.');
         LCD_WriteCommand(0xC9);
         LCD_WriteData(tab1[2]+0x30);
         LCD_WriteCommand(0xCA);
         LCD_WriteData(tab1[3]+0x30);
}

void DisplaySet(uint temp1,uint temp2)
{
   tab2[0]=temp1/10;
         tab2[1]=temp1%10;
         tab2[2]=temp2/10;;
         tab2[3]=temp2%10;
         LCD_WriteCommand(0x86);
         LCD_WriteData(tab2[0]+0x30);
         LCD_WriteCommand(0x87);
         LCD_WriteData(tab2[1]+0x30);
         LCD_WriteCommand(0x88);
         LCD_WriteData('.');
         LCD_WriteCommand(0x89);
         LCD_WriteData(tab2[2]+0x30);
         LCD_WriteCommand(0x8A);
         LCD_WriteData(tab2[3]+0x30);
}

void KEY_set()
{
   static uchar m=0;
         if(K4==0)
         {
            delay(1);
                        do{}while(K4==0);
                        {
                           TR0=0;
                                 m++;
                                 if(m>4)
                                 m=0;
                        }
         }
         if(m==1)
         {
                        if(K5==0)
                        {
                           delay(1);
                           do{}while(K5==0);
                           sec1++;
                        }
                        if(K6==0)
                        {
                           delay(1);
                           {}while(K6==0);
                           sec1--;
                        }
         }
         if(m==2&&K5==0)
         {
            delay(1);
                        do{}while(K5==0);
                        sec1=sec1+10;
         }
         if(m==2&&K6==0)
         {
            delay(1);
                        do{}while(K6==0);
                        sec1=sec1-10;
         }
         if(m==3&&K5==0)
         {
            delay(1);
                        do{}while(K5==0);
                        sec2++;
         }
         if(m==3&&K6==0)
         {
            delay(1);
                        do{}while(K6==0);
                        sec2--;
         }
         if(m==4&&K5==0)
         {
            delay(1);
                        do{}while(K5==0);
                        sec2=sec2+10;
         }
         if(m==4&&K6==0)
         {
            delay(1);
                        do{}while(K6==0);
                        sec2=sec2-10;
         }
         if(K3==0)
         {
             delay(1);
                        do{}while(K3==0);
                        k++;
                        TR0=0;
                        if(k>2)
                        k=0;
         }
}

void KEY_scan()
{
         if(K1==0)
         {
            delay(1);
                        do{}while(K1==0);
                        i++;
                        if(i>1)
                        i=0;
         }
         if(i==0)
         {
            LED1=0;
                        LED2=1;
                        if(K2==0)
                        {
                           delay(1);
                                 do{}while(K2==0);
                                 RL=!RL;
                        }
         }
         if(i==1)
         {
            LED2=0;
                        LED1=1;
            KEY_set();
                        if(K2==0)
                        {
                           delay(1);
                                 do{}while(K2==0);
                           RL=0;
                                 TR0=1;
                        }
         }
}

void main()
{
   LED_init();
         LCD_Init();
         Timer_Init();
         while(1)
         {
            KEY_scan();
                       
                        if(i==1&&k==0)
                {               
                   if(cnt>=100)
                          cnt=0;
                         DisplayCount(cnt,0);
                                DisplaySet(sec1,0);
                                LCD_WriteCommand(0x8B);
              LCD_WriteData('m');
               LCD_WriteCommand(0x8C);
               LCD_WriteData('s');
                                 if(cnt>=sec1)
                                 {
                                   TR0 = 0;
                                         cnt=0;
                                         RL=1;
                                 }
                 }
                 if(i==1&&k==1)
                 {
                     DisplayCount(a,cnt/10);
                                 DisplaySet(sec1,sec2);
                                  LCD_WriteCommand(0x8B);
              LCD_WriteData(' ');
                                        LCD_WriteCommand(0x8C);
               LCD_WriteData('s');
                                 if(a>=sec1&&cnt>=sec2*10)
                                 {
                                    TR0 = 0;
                                                cnt=0;
                                                a=0;
                                                RL=1;
                                 }
                 }
                 if(i==1&&k==2)
                 {
                    DisplayCount(min,a);
                                 DisplaySet(sec1,sec2);
                                  LCD_WriteCommand(0x8B);
              LCD_WriteData(' ');
                                        LCD_WriteCommand(0x8C);
               LCD_WriteData('m');
                                 if(min>=sec1&&a>=sec2)
                                 {
                                    TR0 = 0;
                                                cnt=0;
                                                RL=1;
                                                a=0;
                                                min=0;
                                 }
                 }
         }
}

void Interrupt_0() interrupt 1
{
           TH0 = (65536-1000)/256;
           TL0 = (65536-1000)%256;
                 cnt++;
                 if(cnt>=1000)
                 {
                   cnt=0;
                         a++;
                         if(a==60)
                         {
                            a=0;
                            min++;
                         }
                 }
}
新手,程序?qū)懙挠悬c(diǎn)亂。我這個(gè)計(jì)數(shù)想要精確到ms 級,請問有什么辦法
回復(fù)

使用道具 舉報(bào)

13#
ID:883025 發(fā)表于 2021-2-7 09:23 | 只看該作者
peoplefly 發(fā)表于 2021-2-5 15:33
因?yàn)轱@示的時(shí)候取cnt的值時(shí)已經(jīng)變成了取的時(shí)候的值了,程序運(yùn)行總是要時(shí)間的吧,所以要么計(jì)時(shí)延長,不要1ms

請問想要計(jì)時(shí)1ms 有什么精確的方法嗎
回復(fù)

使用道具 舉報(bào)

14#
ID:883025 發(fā)表于 2021-2-7 09:25 | 只看該作者
robinsonlin 發(fā)表于 2021-2-5 16:43
你的問題,嚴(yán)謹(jǐn)性不夠,導(dǎo)致大家都給你回答偏了。  你這個(gè)肯定是程序的問題,但是,你又只貼了部分程序,你 ...

完整的程序下面給出了,我是新手,寫的有點(diǎn)亂,麻煩幫看下
回復(fù)

使用道具 舉報(bào)

15#
ID:883025 發(fā)表于 2021-2-7 09:38 | 只看該作者
人人學(xué)會單片機(jī) 發(fā)表于 2021-2-6 11:42
你的液晶刷新速度不夠了。建議你沒事多看看我的貼子和視頻教程

我在程序里加了一個(gè)設(shè)定值,如果cnt值大于等于設(shè)定值,就停止計(jì)數(shù),但是在液晶上顯示的cnt值往往超過了設(shè)定值。請問這是因?yàn)橐壕У膯栴}嗎
回復(fù)

使用道具 舉報(bào)

16#
ID:213173 發(fā)表于 2021-2-7 14:32 | 只看該作者
電子電路!51 發(fā)表于 2021-2-7 09:19
抱歉,是我沒說清楚。程序里我設(shè)置了一個(gè)對照量。比如說超過設(shè)定值25ms時(shí)停止計(jì)數(shù),但是停止計(jì)數(shù)的時(shí)候,計(jì) ...

既然樓主說超過設(shè)定值25ms時(shí)停止計(jì)數(shù),只要計(jì)數(shù)周期小于25ms,那么計(jì)數(shù)值肯定會大于設(shè)定值。
回復(fù)

使用道具 舉報(bào)

17#
ID:883025 發(fā)表于 2021-2-7 17:05 | 只看該作者
wulin 發(fā)表于 2021-2-7 14:32
既然樓主說超過設(shè)定值25ms時(shí)停止計(jì)數(shù),只要計(jì)數(shù)周期小于25ms,那么計(jì)數(shù)值肯定會大于設(shè)定值。

那請問怎么解決呢
回復(fù)

使用道具 舉報(bào)

18#
ID:213173 發(fā)表于 2021-2-8 09:59 | 只看該作者

給你改寫個(gè)示例,分毫不差。 測試.zip (166.21 KB, 下載次數(shù): 6)

回復(fù)

使用道具 舉報(bào)

19#
ID:883025 發(fā)表于 2021-2-8 16:57 | 只看該作者
wulin 發(fā)表于 2021-2-8 09:59
給你改寫個(gè)示例,分毫不差。

太感謝了
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

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