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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2987|回復: 18
收起左側

求助51單片機定時器中斷計數問題

[復制鏈接]
ID:883025 發(fā)表于 2021-2-5 14:46 | 顯示全部樓層 |閱讀模式
void Interrupt_0() interrupt 1
{
           TH0 = 0xFC;
           TL0 = 0x66;
                 cnt++;
                 if(cnt>=1000)
                 {
                   cnt=0;
上面使部分程序。計數1ms時間到,cnt值加一,但是計數值在液晶上顯示的不是連續(xù)值,比如說當加到21時,下一個數應該是22,但是顯示的是23或者更大。求大佬幫忙解決下這種計時不精確的問題。
回復

使用道具 舉報

ID:882828 發(fā)表于 2021-2-5 15:31 | 顯示全部樓層
你是火眼金睛嗎?連1ms的計數值變化都能看清楚???正常人連100ms的都看不清。
回復

使用道具 舉報

ID:315264 發(fā)表于 2021-2-5 15:33 | 顯示全部樓層
因為顯示的時候取cnt的值時已經變成了取的時候的值了,程序運行總是要時間的吧,所以要么計時延長,不要1ms
回復

使用道具 舉報

ID:883031 發(fā)表于 2021-2-5 15:59 | 顯示全部樓層
人眼根本無法看到1ms的變化。
回復

使用道具 舉報

ID:451718 發(fā)表于 2021-2-5 16:43 | 顯示全部樓層
你的問題,嚴謹性不夠,導致大家都給你回答偏了。  你這個肯定是程序的問題,但是,你又只貼了部分程序,你讓大家靠猜么?
回復

使用道具 舉報

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

使用道具 舉報

ID:390416 發(fā)表于 2021-2-6 11:42 | 顯示全部樓層
你的液晶刷新速度不夠了。建議你沒事多看看我的貼子和視頻教程
回復

使用道具 舉報

ID:759419 發(fā)表于 2021-2-6 12:50 | 顯示全部樓層
演示的問題
回復

使用道具 舉報

ID:213173 發(fā)表于 2021-2-6 14:24 | 顯示全部樓層
cheney03 發(fā)表于 2021-2-5 17:13
人分辨事物的最高頻率為24HZ,即反應一次要0.042s=42ms
也就是說電影播放時,每秒鐘播放的圖片數要超過24張, ...

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

使用道具 舉報

ID:883301 發(fā)表于 2021-2-6 22:06 | 顯示全部樓層
把遞減間隔加大點唄
回復

使用道具 舉報

ID:883025 發(fā)表于 2021-2-7 09:19 | 顯示全部樓層
抱歉,是我沒說清楚。程序里我設置了一個對照量。比如說超過設定值25ms時停止計數,但是停止計數的時候,計數值往往大于設定值。所以,不是觀察的問題
回復

使用道具 舉報

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++;
                         }
                 }
}
新手,程序寫的有點亂。我這個計數想要精確到ms 級,請問有什么辦法
回復

使用道具 舉報

ID:883025 發(fā)表于 2021-2-7 09:23 | 顯示全部樓層
peoplefly 發(fā)表于 2021-2-5 15:33
因為顯示的時候取cnt的值時已經變成了取的時候的值了,程序運行總是要時間的吧,所以要么計時延長,不要1ms

請問想要計時1ms 有什么精確的方法嗎
回復

使用道具 舉報

ID:883025 發(fā)表于 2021-2-7 09:25 | 顯示全部樓層
robinsonlin 發(fā)表于 2021-2-5 16:43
你的問題,嚴謹性不夠,導致大家都給你回答偏了。  你這個肯定是程序的問題,但是,你又只貼了部分程序,你 ...

完整的程序下面給出了,我是新手,寫的有點亂,麻煩幫看下
回復

使用道具 舉報

ID:883025 發(fā)表于 2021-2-7 09:38 | 顯示全部樓層
人人學會單片機 發(fā)表于 2021-2-6 11:42
你的液晶刷新速度不夠了。建議你沒事多看看我的貼子和視頻教程

我在程序里加了一個設定值,如果cnt值大于等于設定值,就停止計數,但是在液晶上顯示的cnt值往往超過了設定值。請問這是因為液晶的問題嗎
回復

使用道具 舉報

ID:213173 發(fā)表于 2021-2-7 14:32 | 顯示全部樓層
電子電路!51 發(fā)表于 2021-2-7 09:19
抱歉,是我沒說清楚。程序里我設置了一個對照量。比如說超過設定值25ms時停止計數,但是停止計數的時候,計 ...

既然樓主說超過設定值25ms時停止計數,只要計數周期小于25ms,那么計數值肯定會大于設定值。
回復

使用道具 舉報

ID:883025 發(fā)表于 2021-2-7 17:05 | 顯示全部樓層
wulin 發(fā)表于 2021-2-7 14:32
既然樓主說超過設定值25ms時停止計數,只要計數周期小于25ms,那么計數值肯定會大于設定值。

那請問怎么解決呢
回復

使用道具 舉報

ID:213173 發(fā)表于 2021-2-8 09:59 | 顯示全部樓層

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

回復

使用道具 舉報

ID:883025 發(fā)表于 2021-2-8 16:57 | 顯示全部樓層
wulin 發(fā)表于 2021-2-8 09:59
給你改寫個示例,分毫不差。

太感謝了
回復

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲协和影视 | 久久久激情视频 | 亚洲成人国产精品 | 久久国产福利 | 免费性视频| 在线视频日韩 | 一a一片一级一片啪啪 | 在线中文字幕亚洲 | 国产乱人伦精品一区二区 | 一级黄色裸片 | 一区二区在线不卡 | 欧美在线视频网站 | 天天操狠狠操 | 亚洲一区二区久久 | 国产综合视频 | 91精品国产色综合久久不卡98口 | 亚洲精品日日夜夜 | 久久av一区二区三区 | 欧美一区二区三区在线免费观看 | 91久久精品国产 | 狠狠插天天干 | 人人做人人澡人人爽欧美 | 国产伦一区二区三区久久 | 精品综合久久 | aa级毛片毛片免费观看久 | 毛片在线看片 | 一级毛片高清 | 欧美人成在线视频 | 在线一级片 | 国产成人精品一区二区 | 日韩av电影在线观看 | 免费观看一级毛片 | 精品久久伊人 | 日韩欧美综合在线视频 | 日韩一二区 | 天天躁日日躁狠狠躁2018小说 | 91资源在线 | 国产视频一二三区 | 性做久久久久久免费观看欧美 | 久久精品亚洲精品国产欧美 | 99精品国产一区二区三区 |