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

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

QQ登錄

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

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

求助,89C52計(jì)數(shù)器T0對(duì)外部方波沒(méi)反應(yīng)

[復(fù)制鏈接]
ID:269045 發(fā)表于 2018-1-11 17:49 | 顯示全部樓層 |閱讀模式
最近用STC89C52做一個(gè)頻率計(jì)數(shù)器,用LCD1602顯示,外接1kHz的方波到T0進(jìn)行測(cè)試的時(shí)候,發(fā)現(xiàn)T0沒(méi)有對(duì)方波進(jìn)行計(jì)數(shù),下面是代碼,請(qǐng)高手幫忙看看是哪里出了問(wèn)題
  1.    
  2.     #include <AT89x52.h>
  3.     #include <stdio.h>
  4.     #include <math.h>
  5.     #include <intrins.h>

  6.     float p;
  7.     char idata buff[20];
  8.     unsigned char time;
  9.     unsigned char T1inter;
  10.     unsigned char GATE = 1; //測(cè)量中斷,0表示開(kāi)始測(cè)量
  11.     unsigned char FLAG = 0; //是否分頻選擇,0不分頻,1分頻
  12.     unsigned char LCD_Wait(void);
  13.     void LCD_Write(bit style, unsigned char input);
  14.     void LCD_SetDisplay(unsigned char DisplayMode);
  15.     void LCD_SetInput(unsigned char InputMode);
  16.     void LCD_Initial();
  17.     void GotoXY(unsigned char x, unsigned char y);
  18.     void Print(unsigned char *str);

  19.     /****************************************
  20.     * 模塊名稱:LCD1602顯示程序 *
  21.     *****************************************/
  22.     /***********************Port Definitions*********************/
  23.     sbit LcdRs = P1^0; //定義端口
  24.     sbit LcdRw = P1^1;
  25.     sbit LcdEn = P2^5;
  26.     sfr DBPort= 0x80; //P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.數(shù)據(jù)端口

  27.     /************************內(nèi)部等待函數(shù)************************/
  28.     unsigned char LCD_Wait(void)
  29.     {
  30.     LcdRs=0; //寄存器選擇輸入端 1:數(shù)據(jù) 0:指令
  31.     LcdRw=1; _nop_(); //RW:為0:寫(xiě)狀態(tài);為1:讀狀態(tài);
  32.     LcdEn=1; _nop_(); //使能輸入端,讀狀態(tài),高電平有效;寫(xiě)狀態(tài),下降沿有效
  33.     LcdEn=0;
  34.     return DBPort;
  35.     }
  36.     /***********************向LCD寫(xiě)入命令或數(shù)據(jù)*******************/
  37.     #define LCD_COMMAND 0 // Command
  38.     #define LCD_DATA 1 // Data
  39.     #define LCD_CLEAR_SCREEN 0x01 // 清屏
  40.     #define LCD_HOMING 0x02 // 光標(biāo)返回原點(diǎn)
  41.     void LCD_Write(bit style, unsigned char input)
  42.     {
  43.     LcdEn=0;
  44.     LcdRs=style;
  45.     LcdRw=0; _nop_();
  46.     DBPort=input; _nop_();//注意順序
  47.     LcdEn=1; _nop_();//注意順序
  48.     LcdEn=0; _nop_();
  49.     LCD_Wait();
  50.     }
  51.     /********************設(shè)置顯示模式****************************/
  52.     #define LCD_SHOW 0x04 //顯示開(kāi)
  53.     #define LCD_HIDE 0x00 //顯示關(guān)

  54.     #define LCD_CURSOR 0x02 //顯示光標(biāo)
  55.     #define LCD_NO_CURSOR 0x00 //無(wú)光標(biāo)

  56.     #define LCD_FLASH 0x01 //光標(biāo)閃動(dòng)
  57.     #define LCD_NO_FLASH 0x00 //光標(biāo)不閃動(dòng)

  58.     void LCD_SetDisplay(unsigned char DisplayMode)
  59.     {
  60.     LCD_Write(LCD_COMMAND, 0x08|DisplayMode);
  61.     }
  62.     /*********************設(shè)置輸入模式****************************/
  63.     #define LCD_AC_UP 0x02
  64.     #define LCD_AC_DOWN 0x00 // default

  65.     #define LCD_MOVE 0x01 // 畫(huà)面可平移
  66.     #define LCD_NO_MOVE 0x00 //default

  67.     void LCD_SetInput(unsigned char InputMode)
  68.     {
  69.     LCD_Write(LCD_COMMAND, 0x04|InputMode);
  70.     }
  71.     /******************初始化LCD*********************************/
  72.     void LCD_Initial()
  73.     {
  74.     LcdEn=0;
  75.     LCD_Write(LCD_COMMAND,0x38); //8位數(shù)據(jù)端口,2行顯示,5*7點(diǎn)陣
  76.     LCD_Write(LCD_COMMAND,0x38);
  77.     LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); //開(kāi)啟顯示, 無(wú)光標(biāo)
  78.     LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏
  79.     LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE); //AC遞增, 畫(huà)面不動(dòng)
  80.     }

  81.     /*************************************************************/
  82.     void GotoXY(unsigned char x, unsigned char y)
  83.     {
  84.     if(y==0)
  85.     LCD_Write(LCD_COMMAND,0x80|x);
  86.     if(y==1)
  87.     LCD_Write(LCD_COMMAND,0x80|(x-0x40));
  88.     }
  89.     void Print(unsigned char *str)
  90.     {
  91.     while(*str!='\0')
  92.     {
  93.     LCD_Write(LCD_DATA,*str);
  94.     str++;
  95.     }
  96.     }
  97.     /**************************ms延時(shí)子程序********************/
  98.     void Delay(unsigned int t) //t隨著數(shù)值越大,誤差趨于平衡.
  99.     {
  100.     unsigned char i;
  101.     while(t--)
  102.     {
  103.     for(i=0;i<123;i++){;}
  104.     }
  105.     }
  106.     //配置計(jì)數(shù)器0,定時(shí)器1、2
  107.     void Init_timer(void)
  108.     {
  109.     TMOD=0x9D; //工作方式1 內(nèi)部寄存器控制的計(jì)數(shù)功能
  110.     TH0=0x00; //T0高八位的初值
  111.     TL0=0x00; //T0低八位初值
  112.     TH1=0x00; //T1高八位的初值
  113.     TL1=0x00; //T1低八位初值
  114.     EA=1; //開(kāi)啟整體中斷允許
  115.     ET0=1; //開(kāi)啟定時(shí)器0中斷允許
  116.     ET1=1; //開(kāi)啟T1中斷允許
  117.     TR0=1;
  118.     TR1=1;
  119.     EX0=1;
  120.     IT0=1;
  121.     RCAP2H=(65536-62500)/256; //在程序初始化的時(shí)候給RCAP2L和RCAP2H賦值,
  122.     RCAP2L=(65536-62500)%256; //TH2和TL2將會(huì)在中斷產(chǎn)生時(shí)自動(dòng)使TH2=RCAP2H,TL2=RCAP2L。
  123.     TH2=RCAP2H; //12M晶振下每次中斷62.5ms(1s=1000ms=62.5ms×16)
  124.     TL2=RCAP2L;
  125.     ET2=1; //打開(kāi)定時(shí)器2中斷
  126.     TR2=1; //定時(shí)器2開(kāi)始計(jì)時(shí)
  127.     }



  128.     /***************主程序**************/
  129.     void main()
  130.     {
  131.     P1_2=0;
  132.     Init_timer();
  133.     LCD_Initial(); //LCD初始化
  134.     while(1)
  135.     {;}

  136.     }
  137. //P1.2接INT0,觸發(fā)中斷
  138.     void Out_interrupt(void)interrupt 0
  139.     {
  140.     float t0cont,t1cont;
  141. //關(guān)閉T0、T1
  142.     TR0=0;
  143.     TR1=0;
  144.     t0cont=TH0*256+TL0;
  145.     t1cont=65535*T1inter+TH1*256+TL1;
  146.     //p=(t0cont/t1cont)*1000000;
  147.     p=t0cont;
  148.     GotoXY(0,1);
  149.     sprintf(buff,"%4.4fKHz",p);
  150.     Print(buff);
  151.     //打開(kāi)T0、T1,重置初值,為下一次測(cè)量做準(zhǔn)備
  152.     TR0=1;
  153.     TR1=1;
  154.     TH0=0x00; //T0高八位的初值
  155.     TL0=0x00; //T0低八位初值
  156.     TH1=0x00; //T1高八位的初值
  157.     TL1=0x00;
  158.     //中斷后開(kāi)始讀數(shù)顯示

  159.     }
  160.     void Timer0_isr(void)interrupt 1
  161.     {
  162.     TH0=0x00;
  163.     TL0=0x00;

  164.     }
  165.     void Timer1_isr(void)interrupt 3
  166.     { T1inter++;
  167.     TH1=0; //計(jì)數(shù)=(65535-初值) 初值0x159F=5535
  168.     TL1=0;
  169.     if(T1inter==4)
  170.     {
  171.     T1inter=0;
  172.     }
  173.     }
  174.     void timer2(void) interrupt 5 //定時(shí)器2中斷(62.5ms)
  175.     {
  176.     time++;
  177.     TF2=0; //定時(shí)器2的中斷標(biāo)志位TF2不能夠由硬件清零,所以要在中斷服務(wù)程序中將其清零
  178.     if (time==4) //定時(shí)0.25s時(shí)間到
  179.     {
  180.     time=0; //計(jì)時(shí)清0
  181.     P1_2=~P1_2;//P1.2反轉(zhuǎn)
  182.     }
  183.     }


復(fù)制代碼

回復(fù)

使用道具 舉報(bào)

ID:164602 發(fā)表于 2018-1-12 15:05 | 顯示全部樓層
我沒(méi)有看你的程序全部,只看了定時(shí)器設(shè)置那部分,你說(shuō)沒(méi)反應(yīng),可能就是設(shè)置的問(wèn)題。
第一:如圖所示:
1.jpg

這是STC89C52的手冊(cè)說(shuō)明(我沒(méi)有找到你用的AT89C52的手冊(cè))
你程序中設(shè)置TMOD=0x9d,即二進(jìn)制1001  1101
定時(shí)器0、1都是工作方式1——16位定時(shí)\計(jì)數(shù)器
定時(shí)器1為定時(shí)器,定時(shí)器0為計(jì)數(shù)器
“門(mén)控制”位都是1——由上圖可知,當(dāng)此位為1時(shí),要開(kāi)啟定時(shí)\計(jì)數(shù)器,還需要外部中斷。
這是不是你想要的結(jié)果?

第二:我的建議:
“門(mén)控制”位置0,即只需要TRx就可以控制定時(shí)器的開(kāi)啟和關(guān)閉。
你的外部脈沖,直接到定時(shí)器0。只要TR0=1,則計(jì)數(shù)器0就開(kāi)始計(jì)數(shù)了,注意,你的脈沖信號(hào)要接在P34腳;只要TR1=1,定時(shí)器1就開(kāi)始計(jì)時(shí)了。
同時(shí)開(kāi)啟兩定時(shí)器,你的工作不就完成了?
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产精品日韩欧美 | 国产欧美精品 | 精品久久国产 | 国产视频一区二区在线观看 | 一区二区国产精品 | 国产一区二区三区www | 国产精品久久久久久久久久久久久久 | 中文字幕一区在线观看视频 | 一级片av | 伊人精品国产 | 999免费网站 | 二区在线视频 | 欧美激情一区二区三级高清视频 | 久久精品视频91 | 一级毛片播放 | 在线视频亚洲 | 日韩福利 | 国产在线资源 | 中文字幕欧美日韩一区 | 久久艹免费视频 | 久久一区二| 国产精品欧美精品日韩精品 | 久久久久国产 | 久久精品69 | 激情福利视频 | 婷婷色网 | 日韩视频观看 | 日韩欧美在线观看 | 国产精品久久av | 久草电影网 | 成人黄色网址大全 | 亚洲国产精品第一区二区 | 色片在线观看 | 亚洲成年影院 | 欧美日韩国产一区二区三区 | 日本一区二区电影 | 久久久国产一区二区三区 | 中文字幕亚洲一区二区三区 | 拍真实国产伦偷精品 | 国产在线中文字幕 | 日韩欧美网 |