找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2399|回复: 18
收起左侧

求助51单片机定时器中断计数问题

[复制链接]
ID:883025 发表于 2021-2-5 14:46 | 显示全部楼层 |阅读模式
void Interrupt_0() interrupt 1
{
           TH0 = 0xFC;
           TL0 = 0x66;
                 cnt++;
                 if(cnt>=1000)
                 {
                   cnt=0;
上面使部分程序。计数1ms时间到,cnt值加一,但是计数值在液晶上显示的不是连续值,比如说当加到21时,下一个数应该是22,但是显示的是23或者更大。求大佬帮忙解决下这种计时不精确的问题。
回复

使用道具 举报

ID:882828 发表于 2021-2-5 15:31 | 显示全部楼层
你是火眼金睛吗?连1ms的计数值变化都能看清楚???正常人连100ms的都看不清。
回复

使用道具 举报

ID:315264 发表于 2021-2-5 15:33 | 显示全部楼层
因为显示的时候取cnt的值时已经变成了取的时候的值了,程序运行总是要时间的吧,所以要么计时延长,不要1ms
回复

使用道具 举报

ID:883031 发表于 2021-2-5 15:59 | 显示全部楼层
人眼根本无法看到1ms的变化。
回复

使用道具 举报

ID:451718 发表于 2021-2-5 16:43 | 显示全部楼层
你的问题,严谨性不够,导致大家都给你回答偏了。  你这个肯定是程序的问题,但是,你又只贴了部分程序,你让大家靠猜么?
回复

使用道具 举报

ID:743654 发表于 2021-2-5 17:13 | 显示全部楼层
人分辨事物的最高频率为24HZ,即反应一次要0.042s=42ms
也就是说电影播放时,每秒钟播放的图片数要超过24张,人眼才看不出图片之间的切换,看到的才是动态的影片效果.
你可以试着把定时器计数一次的时间设置>=42ms,看看效果。
回复

使用道具 举报

ID:390416 发表于 2021-2-6 11:42 | 显示全部楼层
你的液晶刷新速度不够了。建议你没事多看看我的贴子和视频教程
回复

使用道具 举报

ID:759419 发表于 2021-2-6 12:50 | 显示全部楼层
演示的问题
回复

使用道具 举报

ID:213173 发表于 2021-2-6 14:24 | 显示全部楼层
cheney03 发表于 2021-2-5 17:13
人分辨事物的最高频率为24HZ,即反应一次要0.042s=42ms
也就是说电影播放时,每秒钟播放的图片数要超过24张, ...

普通135mm胶片电影每秒钟播放24帧不假,但不可以此推算出人眼分辨频率约为24Hz(42ms)。其实人眼分辨频率约20ms。那么电影为了节省胶片又顾及人眼分辨速率,实际放映机是一帧胶片两次打开快门。其闪烁频率就提高一倍达48Hz,与绝大多数人的肉眼暂留时间相近。
回复

使用道具 举报

ID:883301 发表于 2021-2-6 22:06 | 显示全部楼层
把递减间隔加大点呗
回复

使用道具 举报

ID:883025 发表于 2021-2-7 09:19 | 显示全部楼层
抱歉,是我没说清楚。程序里我设置了一个对照量。比如说超过设定值25ms时停止计数,但是停止计数的时候,计数值往往大于设定值。所以,不是观察的问题
回复

使用道具 举报

ID:883025 发表于 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 发表于 2021-2-7 09:23 | 显示全部楼层
peoplefly 发表于 2021-2-5 15:33
因为显示的时候取cnt的值时已经变成了取的时候的值了,程序运行总是要时间的吧,所以要么计时延长,不要1ms

请问想要计时1ms 有什么精确的方法吗
回复

使用道具 举报

ID:883025 发表于 2021-2-7 09:25 | 显示全部楼层
robinsonlin 发表于 2021-2-5 16:43
你的问题,严谨性不够,导致大家都给你回答偏了。  你这个肯定是程序的问题,但是,你又只贴了部分程序,你 ...

完整的程序下面给出了,我是新手,写的有点乱,麻烦帮看下
回复

使用道具 举报

ID:883025 发表于 2021-2-7 09:38 | 显示全部楼层
人人学会单片机 发表于 2021-2-6 11:42
你的液晶刷新速度不够了。建议你没事多看看我的贴子和视频教程

我在程序里加了一个设定值,如果cnt值大于等于设定值,就停止计数,但是在液晶上显示的cnt值往往超过了设定值。请问这是因为液晶的问题吗
回复

使用道具 举报

ID:213173 发表于 2021-2-7 14:32 | 显示全部楼层
电子电路!51 发表于 2021-2-7 09:19
抱歉,是我没说清楚。程序里我设置了一个对照量。比如说超过设定值25ms时停止计数,但是停止计数的时候,计 ...

既然楼主说超过设定值25ms时停止计数,只要计数周期小于25ms,那么计数值肯定会大于设定值。
回复

使用道具 举报

ID:883025 发表于 2021-2-7 17:05 | 显示全部楼层
wulin 发表于 2021-2-7 14:32
既然楼主说超过设定值25ms时停止计数,只要计数周期小于25ms,那么计数值肯定会大于设定值。

那请问怎么解决呢
回复

使用道具 举报

ID:213173 发表于 2021-2-8 09:59 | 显示全部楼层

给你改写个示例,分毫不差。 测试.zip (166.21 KB, 下载次数: 6)
回复

使用道具 举报

ID:883025 发表于 2021-2-8 16:57 | 显示全部楼层
wulin 发表于 2021-2-8 09:59
给你改写个示例,分毫不差。

太感谢了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表