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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 4640|回復(fù): 7
收起左側(cè)

關(guān)于單片機(jī)定時(shí)器結(jié)合1602LCD顯示時(shí)鐘問(wèn)題

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

  1. #include<reg52.h>
  2. uchar hours=1,mins=3,ss=0,hourg=9,ming=6,sg=0;   //最后一個(gè)字母帶s表示十位,g表示個(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;                                                                 //當(dāng)要對(duì)1602寫時(shí)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為寫數(shù)據(jù)
  31.   RW=0;                                                                //當(dāng)要對(duì)1602寫時(shí)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;                                           //使能先關(guān)閉        為后面使能高脈沖做鋪墊                                                   
  41.   write_cmd(0x38);                   //送入 0011 1000   設(shè)置16X2顯示
  42.   write_cmd(0x0c);                   //光標(biāo)顯示設(shè)置 0000 1DCB
  43.                                                    //D=1開(kāi)顯示 C=1顯示光標(biāo) B=1光標(biāo)閃爍
  44.   write_cmd(0x06);                   //光標(biāo)設(shè)置     0000 01NS
  45.                                                    //N=1 讀R或?qū)慦一個(gè)字符后地址指針加1,光標(biāo)自加一;反之N=0 減一
  46.   write_cmd(0x01);                   //01表示顯示清屏:數(shù)據(jù)指針清零 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. }
復(fù)制代碼


回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

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

使用道具 舉報(bào)

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

不好意思,我的程序分成三塊的,第一塊主程序,第二塊初始化程序,第三塊頭文件,復(fù)制粘貼的時(shí)候有點(diǎn)差錯(cuò),你就當(dāng)uchar i;放在頭文件的下面靠前的位置吧,我編譯是沒(méi)錯(cuò)的,是我復(fù)制代碼的時(shí)候沒(méi)注意,請(qǐng)諒解
回復(fù)

使用道具 舉報(bào)

ID:356940 發(fā)表于 2018-7-27 11:51 | 顯示全部樓層
我重新發(fā)一遍吧
//第一個(gè)(.c)文件 主函數(shù)
#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();

}
//第二個(gè)(.c)文件 用來(lái)初始化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;                                                                 //當(dāng)要對(duì)1602寫時(shí)RW=0,表示允許寫入
  P0=cmd;
  delay1ms();
  E=1;
  delay5ms();
  E=0;

}

void write_dat(uchar dat)
{
  E=0;
  RS=1;                                                                //RS=1為寫數(shù)據(jù)
  RW=0;                                                                //當(dāng)要對(duì)1602寫時(shí)RW=0,表示允許寫入
  P0=dat;
  delay1ms();
  E=1;
  delay5ms();
  E=0;

}

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

  

  
}
//第三個(gè)為(.h)頭文件用來(lái)調(diào)用
#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


//總共是三個(gè)文件,第一個(gè)是主函數(shù),第二個(gè)初始化函數(shù),第三個(gè)用來(lái)調(diào)用第二個(gè)的初始化函數(shù)的頭文件,麻煩幫我看看問(wèn)題出在哪了?謝謝!
回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

ID:356940 發(fā)表于 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();
            
       

}

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

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 91偷拍精品一区二区三区 | 手机三级电影 | 日韩三区在线观看 | 日本淫视频 | 华丽的挑战在线观看 | 天堂视频中文在线 | 日韩在线中文 | 日韩欧美亚洲 | 99精品一区二区 | 日韩在线欧美 | 久久久亚洲精品视频 | 日韩一区二区久久 | 国产精品中文字幕在线 | 欧美精品久久久久久久久久 | 久久国产精品免费一区二区三区 | 超碰成人在线观看 | 粉色午夜视频 | www亚洲免费国内精品 | 狠狠亚洲 | 久久久国产一区二区三区 | 国产精品网址 | 日韩一区二区精品 | 国产免费黄网 | 亚洲欧美日韩在线不卡 | av永久 | 91精品国产综合久久久久久蜜臀 | 国产精品99免费视频 | 精品精品视频 | 美女日批免费视频 | 久久精品国产一区二区电影 | 91日韩在线 | 成人网在线观看 | 免费的一级视频 | 欧美影院久久 | a国产一区二区免费入口 | 三区在线观看 | 色橹橹欧美在线观看视频高清 | 夜夜爽99久久国产综合精品女不卡 | 欧美日韩一区二区三区四区 | 亚洲欧美在线一区 | 欧美日韩国产精品 |