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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4672|回復: 7
收起左側

關于單片機定時器結合1602LCD顯示時鐘問題

[復制鏈接]
ID:356940 發表于 2018-7-27 07:51 | 顯示全部樓層 |閱讀模式
5黑幣
我想在1602LCD液晶上第一行顯示日期,第二行顯示時間,我定時器設置為50ms中斷一次,但是當我在中斷中寫入if(i==20)i清零,秒自增時不是一秒加一次,而是差不多兩秒加一次,這是怎么回事?代碼如下:

  1. #include<reg52.h>
  2. uchar hours=1,mins=3,ss=0,hourg=9,ming=6,sg=0;   //最后一個字母帶s表示十位,g表示個位


  3. void delay1ms(void)   // 1ms
  4. {
  5.     unsigned char a,b,c;
  6.     for(c=1;c>0;c--)
  7.         for(b=142;b>0;b--)
  8.             for(a=2;a>0;a--);
  9. }
  10. void delay5ms(void)   // 5ms
  11. {
  12.     unsigned char a,b;
  13.     for(b=19;b>0;b--)
  14.         for(a=130;a>0;a--);
  15. }
  16. void write_cmd(uchar cmd)
  17. {
  18.   E=0;
  19.   RS=0;                                                                 //RS=0為寫命令
  20.   RW=0;                                                                 //當要對1602寫時RW=0,表示允許寫入
  21.   P0=cmd;
  22.   delay1ms();
  23.   E=1;
  24.   delay5ms();
  25.   E=0;

  26. }

  27. void write_dat(uchar dat)
  28. {
  29.   E=0;
  30.   RS=1;                                                                //RS=1為寫數據
  31.   RW=0;                                                                //當要對1602寫時RW=0,表示允許寫入
  32.   P0=dat;
  33.   delay1ms();
  34.   E=1;
  35.   delay5ms();
  36.   E=0;

  37. }

  38. void init()
  39. {                                                   //(STA7~STA0)(D7~D0)STA7為讀寫操作使能 1為禁止 2為允許
  40.   E=0;                                           //使能先關閉        為后面使能高脈沖做鋪墊                                                   
  41.   write_cmd(0x38);                   //送入 0011 1000   設置16X2顯示
  42.   write_cmd(0x0c);                   //光標顯示設置 0000 1DCB
  43.                                                    //D=1開顯示 C=1顯示光標 B=1光標閃爍
  44.   write_cmd(0x06);                   //光標設置     0000 01NS
  45.                                                    //N=1 讀R或寫W一個字符后地址指針加1,光標自加一;反之N=0 減一
  46.   write_cmd(0x01);                   //01表示顯示清屏:數據指針清零 02表示顯示回車




  47. }



  48. uchar hours=1,mins=3,ss=0,hourg=9,ming=6,sg=0;

  49. void Time0_init()
  50. {
  51.   TMOD=0x01;
  52.   TH0=(65536-50000)/256;
  53.   TL0=(65536-50000)%256;
  54.   TR0=1;
  55.   EA=1;
  56.   ET0=1;
  57. }

  58. void timer()
  59. {
  60.   if(sg==10)
  61.   {
  62.     sg=0;
  63.         ss++;
  64.         if(ss==6)
  65.         {
  66.           ss=0;
  67.           ming++;
  68.           if(ming==10)
  69.           {
  70.             ming=0;
  71.                 mins++;
  72.                 if(mins==6)
  73.                 {
  74.                  mins=0;
  75.                  hourg++;
  76.                    if(hours==2&&hourg==4)
  77.                    {
  78.                    hours=0;
  79.                    hourg=0;
  80.                    }
  81.                  if(hourg==10)
  82.                  {
  83.                    hourg=0;
  84.                    hours++;
  85.                   

  86.                  }
  87.                 }
  88.           }
  89.         }

  90.   }
  91. }
  92. void main()
  93. {
  94.             
  95.     Time0_init();
  96.         init();
  97.         
  98.         while(1);
  99. }

  100. void Time0() interrupt 1
  101. {         

  102.      uchar i;
  103.          uchar a[]={'2','0','1','8','/','0','7','/','2','6'};
  104.            TH0=(65536-50000)/256;
  105.      TL0=(65536-50000)%256;
  106.          i++;
  107.          if(i==5)
  108.          {
  109.           i=0;
  110.           sg++;
  111.          }
  112.          
  113.             write_cmd(0x80+3);
  114.                 write_dat(a[0]);
  115.                 write_cmd(0x80+4);
  116.                 write_dat(a[1]);
  117.                 write_cmd(0x80+5);
  118.                 write_dat(a[2]);
  119.                 write_cmd(0x80+6);
  120.                 write_dat(a[3]);
  121.                 write_cmd(0x80+7);
  122.                 write_dat(a[4]);
  123.                 write_cmd(0x80+8);
  124.                 write_dat(a[5]);
  125.                 write_cmd(0x80+9);
  126.                 write_dat(a[6]);
  127.                 write_cmd(0x80+10);
  128.                 write_dat(a[7]);
  129.                 write_cmd(0x80+11);
  130.                 write_dat(a[8]);
  131.                 write_cmd(0x80+12);
  132.                 write_dat(a[9]);
  133.                   
  134.                
  135.          
  136.         
  137.          
  138.            
  139.         
  140.         write_cmd(0x80+0x40+4);
  141.         write_dat(0x30+hours);
  142.         write_cmd(0x80+0x40+5);
  143.         write_dat(0x30+hourg);
  144.         write_cmd(0x80+0x40+6);
  145.         write_dat(':');
  146.         write_cmd(0x80+0x40+7);
  147.         write_dat(0x30+mins);
  148.         write_cmd(0x80+0x40+8);
  149.         write_dat(0x30+ming);
  150.         write_cmd(0x80+0x40+9);
  151.         write_dat(':');
  152.         write_cmd(0x80+0x40+10);
  153.         write_dat(0x30+ss);
  154.         write_cmd(0x80+0x40+11);
  155.         write_dat(0x30+sg);
  156.         timer();

  157. }
復制代碼


回復

使用道具 舉報

ID:7485 發表于 2018-7-27 10:03 | 顯示全部樓層
”uchar i;”位置不對吧?
回復

使用道具 舉報

ID:319344 發表于 2018-7-27 10:09 | 顯示全部樓層
你這,你看看你發的程序,當i==5時你就給清0了,和你描述的不相符,這讓人怎么回答
回復

使用道具 舉報

ID:356940 發表于 2018-7-27 11:39 | 顯示全部樓層
wenzedong 發表于 2018-7-27 10:09
你這,你看看你發的程序,當i==5時你就給清0了,和你描述的不相符,這讓人怎么回答

i=20確實是差不多2-3s秒才+1,我改成i=5看上去就像1s秒+1
回復

使用道具 舉報

ID:356940 發表于 2018-7-27 11:42 | 顯示全部樓層
ahshmj 發表于 2018-7-27 10:03
”uchar i;”位置不對吧?

不好意思,我的程序分成三塊的,第一塊主程序,第二塊初始化程序,第三塊頭文件,復制粘貼的時候有點差錯,你就當uchar i;放在頭文件的下面靠前的位置吧,我編譯是沒錯的,是我復制代碼的時候沒注意,請諒解
回復

使用道具 舉報

ID:356940 發表于 2018-7-27 11:51 | 顯示全部樓層
我重新發一遍吧
//第一個(.c)文件 主函數
#include<reg52.h>
#include<lcd1602.h>

uchar hours=1,mins=3,ss=0,hourg=9,ming=6,sg=0;

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

void timer()
{
  if(sg==10)
  {
    sg=0;
        ss++;
        if(ss==6)
        {
          ss=0;
          ming++;
          if(ming==10)
          {
            ming=0;
                mins++;
                if(mins==6)
                {
                 mins=0;
                 hourg++;
                   if(hours==2&&hourg==4)
                   {
                   hours=0;
                   hourg=0;
                   }
                 if(hourg==10)
                 {
                   hourg=0;
                   hours++;
                  

                 }
                }
          }
        }

  }
}
void main()
{
           
    Time0_init();
        init();
       
        while(1);
}

void Time0() interrupt 1
{         

     uchar i;
         uchar a[]={'2','0','1','8','/','0','7','/','2','6'};
           TH0=(65536-50000)/256;
     TL0=(65536-50000)%256;
         i++;
         if(i==5)
         {
          i=0;
          sg++;
         }
         
            write_cmd(0x80+3);
                write_dat(a[0]);
                write_cmd(0x80+4);
                write_dat(a[1]);
                write_cmd(0x80+5);
                write_dat(a[2]);
                write_cmd(0x80+6);
                write_dat(a[3]);
                write_cmd(0x80+7);
                write_dat(a[4]);
                write_cmd(0x80+8);
                write_dat(a[5]);
                write_cmd(0x80+9);
                write_dat(a[6]);
                write_cmd(0x80+10);
                write_dat(a[7]);
                write_cmd(0x80+11);
                write_dat(a[8]);
                write_cmd(0x80+12);
                write_dat(a[9]);
                  
               
         
       
          
          
       
        write_cmd(0x80+0x40+4);
        write_dat(0x30+hours);
        write_cmd(0x80+0x40+5);
        write_dat(0x30+hourg);
        write_cmd(0x80+0x40+6);
        write_dat(':');
        write_cmd(0x80+0x40+7);
        write_dat(0x30+mins);
        write_cmd(0x80+0x40+8);
        write_dat(0x30+ming);
        write_cmd(0x80+0x40+9);
        write_dat(':');
        write_cmd(0x80+0x40+10);
        write_dat(0x30+ss);
        write_cmd(0x80+0x40+11);
        write_dat(0x30+sg);
        timer();

}
//第二個(.c)文件 用來初始化1602
#include<lcd1602.h>

void delay1ms(void)   // 1ms
{
    unsigned char a,b,c;
    for(c=1;c>0;c--)
        for(b=142;b>0;b--)
            for(a=2;a>0;a--);
}
void delay5ms(void)   // 5ms
{
    unsigned char a,b;
    for(b=19;b>0;b--)
        for(a=130;a>0;a--);
}
void write_cmd(uchar cmd)
{
  E=0;
  RS=0;                                                                 //RS=0為寫命令
  RW=0;                                                                 //當要對1602寫時RW=0,表示允許寫入
  P0=cmd;
  delay1ms();
  E=1;
  delay5ms();
  E=0;

}

void write_dat(uchar dat)
{
  E=0;
  RS=1;                                                                //RS=1為寫數據
  RW=0;                                                                //當要對1602寫時RW=0,表示允許寫入
  P0=dat;
  delay1ms();
  E=1;
  delay5ms();
  E=0;

}

void init()
{                                                   //(STA7~STA0)(D7~D0)STA7為讀寫操作使能 1為禁止 2為允許
  E=0;                                           //使能先關閉        為后面使能高脈沖做鋪墊                                                  
  write_cmd(0x38);                   //送入 0011 1000   設置16X2顯示
  write_cmd(0x0c);                   //光標顯示設置 0000 1DCB
                                                   //D=1開顯示 C=1顯示光標 B=1光標閃爍
  write_cmd(0x06);                   //光標設置     0000 01NS
                                                   //N=1 讀R或寫W一個字符后地址指針加1,光標自加一;反之N=0 減一
  write_cmd(0x01);                   //01表示顯示清屏:數據指針清零 02表示顯示回車

  

  
}
//第三個為(.h)頭文件用來調用
#ifndef _lcd1602_H_
#define _lcd1602_H_


#ifndef uchar
#define uchar unsigned char
#endif



#ifndef uint
#define uint unsigned int
#endif
#include<reg52.h>
sbit RW=P2^5;
sbit RS=P2^6;
sbit E=P2^7;
void delay1ms(void);
void delay5ms(void);
void init();
void write_cmd(uchar cmd);
void write_dat(uchar dat);





#endif


//總共是三個文件,第一個是主函數,第二個初始化函數,第三個用來調用第二個的初始化函數的頭文件,麻煩幫我看看問題出在哪了?謝謝!
回復

使用道具 舉報

ID:7485 發表于 2018-7-27 14:15 | 顯示全部樓層
我說的是“i”應該是全局變量。否則假設第一次中斷時,i==2,由于不是全局變量,退出本函數,就釋放了,第二次進入中斷函數時,不一定是2,可能是其他值。
回復

使用道具 舉報

ID:356940 發表于 2018-7-27 16:15 | 顯示全部樓層
#include<reg52.h>
#include<lcd1602.h>

uchar hours=1,mins=3,ss=0,hourg=9,ming=6,sg=0;
uchar time;
void Time0_init()
{
  TMOD=0x01;
  TH0=(65536-50000)/256;
  TL0=(65536-50000)%256;
  TR0=1;
  EA=1;
  ET0=1;
}

void timer()
{
  if(sg==10)
  {
    sg=0;
        ss++;
        if(ss==6)
        {
          ss=0;
          ming++;
          if(ming==10)
          {
            ming=0;
                mins++;
                if(mins==6)
                {
                 mins=0;
                 hourg++;
                   if(hours==2&&hourg==4)
                   {
                   hours=0;
                   hourg=0;
                   }
                 if(hourg==10)
                 {
                   hourg=0;
                   hours++;
                  

                 }
                }
          }
        }

  }
}
void main()
{
    uchar a[]={'2','0','1','8','/','0','7','/','2','6'};       
    Time0_init();
        init();
        while(1)
        {
        write_cmd(0x80+3);
                write_dat(a[0]);
                write_cmd(0x80+4);
                write_dat(a[1]);
                write_cmd(0x80+5);
                write_dat(a[2]);
                write_cmd(0x80+6);
                write_dat(a[3]);
                write_cmd(0x80+7);
                write_dat(a[4]);
                write_cmd(0x80+8);
                write_dat(a[5]);
                write_cmd(0x80+9);
                write_dat(a[6]);
                write_cmd(0x80+10);
                write_dat(a[7]);
                write_cmd(0x80+11);
                write_dat(a[8]);
                write_cmd(0x80+12);
                write_dat(a[9]);
                  
               
         
       
          
          
       
        write_cmd(0x80+0x40+4);
        write_dat(0x30+hours);
        write_cmd(0x80+0x40+5);
        write_dat(0x30+hourg);
        write_cmd(0x80+0x40+6);
        write_dat(':');
        write_cmd(0x80+0x40+7);
        write_dat(0x30+mins);
        write_cmd(0x80+0x40+8);
        write_dat(0x30+ming);
        write_cmd(0x80+0x40+9);
        write_dat(':');
        write_cmd(0x80+0x40+10);
        write_dat(0x30+ss);
        write_cmd(0x80+0x40+11);
        write_dat(0x30+sg);
        }
}

void Time0() interrupt 1
{         

     
         
           TH0=(65536-50000)/256;
     TL0=(65536-50000)%256;
         time++;
         if(time==20)
         {
          time=0;
          sg++;
         }
         timer();
            
       

}

我自己已經解決了,我把中斷中的寫地址和寫數據函數都提到主函數里,然后一個while(1)加個大括號居然神奇的1s秒+1,謝謝~
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 免费在线视频精品 | 久色网| 国产精品一区二区久久 | 国产成人精品一区二区三 | 国产精品成人在线播放 | 99pao成人国产永久免费视频 | 手机在线不卡av | 亚洲视频三 | 成人影院在线 | 最新国产视频 | 亚洲精品福利视频 | 国产99视频精品免视看9 | 国产精品资源在线 | 91色网站| 亚洲精品一二三 | 亚洲成人午夜电影 | 亚洲a视频 | 成在线人视频免费视频 | 中文字幕一区在线观看视频 | 国产精品无码久久久久 | 欧美成人在线影院 | 黄色片大全在线观看 | 热re99久久精品国产99热 | 中文字幕不卡视频在线观看 | 91色站 | 6996成人影院网在线播放 | 精品二三区 | 一级aaaaaa毛片免费同男同女 | 日本一区二区三区在线观看 | jlzzxxxx18hd护士| 精品国产青草久久久久96 | 午夜免费成人 | 久久麻豆精品 | 色综合天天综合网国产成人网 | 久久久亚洲精品视频 | 国产日韩欧美在线观看 | 偷拍自拍网址 | 精品国产18久久久久久二百 | 精品久久国产 | 欧美日本高清 | 欧美日韩专区 |