欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標(biāo)題: 求助51單片機(jī)定時(shí)器中斷計(jì)數(shù)問題 [打印本頁]

作者: 電子電路!51    時(shí)間: 2021-2-5 14:46
標(biāo)題: 求助51單片機(jī)定時(shí)器中斷計(jì)數(shù)問題
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í)不精確的問題。
作者: r2d2    時(shí)間: 2021-2-5 15:31
你是火眼金睛嗎?連1ms的計(jì)數(shù)值變化都能看清楚???正常人連100ms的都看不清。
作者: peoplefly    時(shí)間: 2021-2-5 15:33
因?yàn)轱@示的時(shí)候取cnt的值時(shí)已經(jīng)變成了取的時(shí)候的值了,程序運(yùn)行總是要時(shí)間的吧,所以要么計(jì)時(shí)延長,不要1ms
作者: cn_zhx    時(shí)間: 2021-2-5 15:59
人眼根本無法看到1ms的變化。
作者: robinsonlin    時(shí)間: 2021-2-5 16:43
你的問題,嚴(yán)謹(jǐn)性不夠,導(dǎo)致大家都給你回答偏了。  你這個(gè)肯定是程序的問題,但是,你又只貼了部分程序,你讓大家靠猜么?
作者: cheney03    時(shí)間: 2021-2-5 17:13
人分辨事物的最高頻率為24HZ,即反應(yīng)一次要0.042s=42ms
也就是說電影播放時(shí),每秒鐘播放的圖片數(shù)要超過24張,人眼才看不出圖片之間的切換,看到的才是動(dòng)態(tài)的影片效果.
你可以試著把定時(shí)器計(jì)數(shù)一次的時(shí)間設(shè)置>=42ms,看看效果。
作者: 人人學(xué)會(huì)單片機(jī)    時(shí)間: 2021-2-6 11:42
你的液晶刷新速度不夠了。建議你沒事多看看我的貼子和視頻教程
作者: Lzc@@    時(shí)間: 2021-2-6 12:50
演示的問題

作者: wulin    時(shí)間: 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í)間相近。
作者: msgd6688    時(shí)間: 2021-2-6 22:06
把遞減間隔加大點(diǎn)唄
作者: 電子電路!51    時(shí)間: 2021-2-7 09:19
抱歉,是我沒說清楚。程序里我設(shè)置了一個(gè)對(duì)照量。比如說超過設(shè)定值25ms時(shí)停止計(jì)數(shù),但是停止計(jì)數(shù)的時(shí)候,計(jì)數(shù)值往往大于設(shè)定值。所以,不是觀察的問題
作者: 電子電路!51    時(shí)間: 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 級(jí),請(qǐng)問有什么辦法

作者: 電子電路!51    時(shí)間: 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

請(qǐng)問想要計(jì)時(shí)1ms 有什么精確的方法嗎
作者: 電子電路!51    時(shí)間: 2021-2-7 09:25
robinsonlin 發(fā)表于 2021-2-5 16:43
你的問題,嚴(yán)謹(jǐn)性不夠,導(dǎo)致大家都給你回答偏了。  你這個(gè)肯定是程序的問題,但是,你又只貼了部分程序,你 ...

完整的程序下面給出了,我是新手,寫的有點(diǎn)亂,麻煩幫看下
作者: 電子電路!51    時(shí)間: 2021-2-7 09:38
人人學(xué)會(huì)單片機(jī) 發(fā)表于 2021-2-6 11:42
你的液晶刷新速度不夠了。建議你沒事多看看我的貼子和視頻教程

我在程序里加了一個(gè)設(shè)定值,如果cnt值大于等于設(shè)定值,就停止計(jì)數(shù),但是在液晶上顯示的cnt值往往超過了設(shè)定值。請(qǐng)問這是因?yàn)橐壕У膯栴}嗎
作者: wulin    時(shí)間: 2021-2-7 14:32
電子電路!51 發(fā)表于 2021-2-7 09:19
抱歉,是我沒說清楚。程序里我設(shè)置了一個(gè)對(duì)照量。比如說超過設(shè)定值25ms時(shí)停止計(jì)數(shù),但是停止計(jì)數(shù)的時(shí)候,計(jì) ...

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

那請(qǐng)問怎么解決呢

作者: wulin    時(shí)間: 2021-2-8 09:59
電子電路!51 發(fā)表于 2021-2-7 17:05
那請(qǐng)問怎么解決呢

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


作者: 電子電路!51    時(shí)間: 2021-2-8 16:57
wulin 發(fā)表于 2021-2-8 09:59
給你改寫個(gè)示例,分毫不差。

太感謝了




歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1