久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標(biāo)題:
求助,89C52計數(shù)器T0對外部方波沒反應(yīng)
[打印本頁]
作者:
rank
時間:
2018-1-11 17:49
標(biāo)題:
求助,89C52計數(shù)器T0對外部方波沒反應(yīng)
最近用STC89C52做一個頻率計數(shù)器,用LCD1602顯示,外接1kHz的方波到T0進行測試的時候,發(fā)現(xiàn)T0沒有對方波進行計數(shù),下面是代碼,請高手幫忙看看是哪里出了問題
#include <AT89x52.h>
#include <stdio.h>
#include <math.h>
#include <intrins.h>
float p;
char idata buff[20];
unsigned char time;
unsigned char T1inter;
unsigned char GATE = 1; //測量中斷,0表示開始測量
unsigned char FLAG = 0; //是否分頻選擇,0不分頻,1分頻
unsigned char LCD_Wait(void);
void LCD_Write(bit style, unsigned char input);
void LCD_SetDisplay(unsigned char DisplayMode);
void LCD_SetInput(unsigned char InputMode);
void LCD_Initial();
void GotoXY(unsigned char x, unsigned char y);
void Print(unsigned char *str);
/****************************************
* 模塊名稱:LCD1602顯示程序 *
*****************************************/
/***********************Port Definitions*********************/
sbit LcdRs = P1^0; //定義端口
sbit LcdRw = P1^1;
sbit LcdEn = P2^5;
sfr DBPort= 0x80; //P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.數(shù)據(jù)端口
/************************內(nèi)部等待函數(shù)************************/
unsigned char LCD_Wait(void)
{
LcdRs=0; //寄存器選擇輸入端 1:數(shù)據(jù) 0:指令
LcdRw=1; _nop_(); //RW:為0:寫狀態(tài);為1:讀狀態(tài);
LcdEn=1; _nop_(); //使能輸入端,讀狀態(tài),高電平有效;寫狀態(tài),下降沿有效
LcdEn=0;
return DBPort;
}
/***********************向LCD寫入命令或數(shù)據(jù)*******************/
#define LCD_COMMAND 0 // Command
#define LCD_DATA 1 // Data
#define LCD_CLEAR_SCREEN 0x01 // 清屏
#define LCD_HOMING 0x02 // 光標(biāo)返回原點
void LCD_Write(bit style, unsigned char input)
{
LcdEn=0;
LcdRs=style;
LcdRw=0; _nop_();
DBPort=input; _nop_();//注意順序
LcdEn=1; _nop_();//注意順序
LcdEn=0; _nop_();
LCD_Wait();
}
/********************設(shè)置顯示模式****************************/
#define LCD_SHOW 0x04 //顯示開
#define LCD_HIDE 0x00 //顯示關(guān)
#define LCD_CURSOR 0x02 //顯示光標(biāo)
#define LCD_NO_CURSOR 0x00 //無光標(biāo)
#define LCD_FLASH 0x01 //光標(biāo)閃動
#define LCD_NO_FLASH 0x00 //光標(biāo)不閃動
void LCD_SetDisplay(unsigned char DisplayMode)
{
LCD_Write(LCD_COMMAND, 0x08|DisplayMode);
}
/*********************設(shè)置輸入模式****************************/
#define LCD_AC_UP 0x02
#define LCD_AC_DOWN 0x00 // default
#define LCD_MOVE 0x01 // 畫面可平移
#define LCD_NO_MOVE 0x00 //default
void LCD_SetInput(unsigned char InputMode)
{
LCD_Write(LCD_COMMAND, 0x04|InputMode);
}
/******************初始化LCD*********************************/
void LCD_Initial()
{
LcdEn=0;
LCD_Write(LCD_COMMAND,0x38); //8位數(shù)據(jù)端口,2行顯示,5*7點陣
LCD_Write(LCD_COMMAND,0x38);
LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); //開啟顯示, 無光標(biāo)
LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏
LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE); //AC遞增, 畫面不動
}
/*************************************************************/
void GotoXY(unsigned char x, unsigned char y)
{
if(y==0)
LCD_Write(LCD_COMMAND,0x80|x);
if(y==1)
LCD_Write(LCD_COMMAND,0x80|(x-0x40));
}
void Print(unsigned char *str)
{
while(*str!='\0')
{
LCD_Write(LCD_DATA,*str);
str++;
}
}
/**************************ms延時子程序********************/
void Delay(unsigned int t) //t隨著數(shù)值越大,誤差趨于平衡.
{
unsigned char i;
while(t--)
{
for(i=0;i<123;i++){;}
}
}
//配置計數(shù)器0,定時器1、2
void Init_timer(void)
{
TMOD=0x9D; //工作方式1 內(nèi)部寄存器控制的計數(shù)功能
TH0=0x00; //T0高八位的初值
TL0=0x00; //T0低八位初值
TH1=0x00; //T1高八位的初值
TL1=0x00; //T1低八位初值
EA=1; //開啟整體中斷允許
ET0=1; //開啟定時器0中斷允許
ET1=1; //開啟T1中斷允許
TR0=1;
TR1=1;
EX0=1;
IT0=1;
RCAP2H=(65536-62500)/256; //在程序初始化的時候給RCAP2L和RCAP2H賦值,
RCAP2L=(65536-62500)%256; //TH2和TL2將會在中斷產(chǎn)生時自動使TH2=RCAP2H,TL2=RCAP2L。
TH2=RCAP2H; //12M晶振下每次中斷62.5ms(1s=1000ms=62.5ms×16)
TL2=RCAP2L;
ET2=1; //打開定時器2中斷
TR2=1; //定時器2開始計時
}
/***************主程序**************/
void main()
{
P1_2=0;
Init_timer();
LCD_Initial(); //LCD初始化
while(1)
{;}
}
//P1.2接INT0,觸發(fā)中斷
void Out_interrupt(void)interrupt 0
{
float t0cont,t1cont;
//關(guān)閉T0、T1
TR0=0;
TR1=0;
t0cont=TH0*256+TL0;
t1cont=65535*T1inter+TH1*256+TL1;
//p=(t0cont/t1cont)*1000000;
p=t0cont;
GotoXY(0,1);
sprintf(buff,"%4.4fKHz",p);
Print(buff);
//打開T0、T1,重置初值,為下一次測量做準(zhǔn)備
TR0=1;
TR1=1;
TH0=0x00; //T0高八位的初值
TL0=0x00; //T0低八位初值
TH1=0x00; //T1高八位的初值
TL1=0x00;
//中斷后開始讀數(shù)顯示
}
void Timer0_isr(void)interrupt 1
{
TH0=0x00;
TL0=0x00;
}
void Timer1_isr(void)interrupt 3
{ T1inter++;
TH1=0; //計數(shù)=(65535-初值) 初值0x159F=5535
TL1=0;
if(T1inter==4)
{
T1inter=0;
}
}
void timer2(void) interrupt 5 //定時器2中斷(62.5ms)
{
time++;
TF2=0; //定時器2的中斷標(biāo)志位TF2不能夠由硬件清零,所以要在中斷服務(wù)程序中將其清零
if (time==4) //定時0.25s時間到
{
time=0; //計時清0
P1_2=~P1_2;//P1.2反轉(zhuǎn)
}
}
復(fù)制代碼
作者:
HC6800-ES-V2.0
時間:
2018-1-12 15:05
我沒有看你的程序全部,只看了定時器設(shè)置那部分,你說沒反應(yīng),可能就是設(shè)置的問題。
第一:如圖所示:
1.jpg
(47.84 KB, 下載次數(shù): 33)
下載附件
2018-1-12 14:52 上傳
這是STC89C52的手冊說明(我沒有找到你用的AT89C52的手冊)
你程序中設(shè)置TMOD=0x9d,即二進制1001 1101
定時器0、1都是工作方式1——16位定時\計數(shù)器
定時器1為定時器,定時器0為計數(shù)器
“門控制”位都是1——由上圖可知,當(dāng)此位為1時,要開啟定時\計數(shù)器,還需要外部中斷。
這是不是你想要的結(jié)果?
第二:我的建議:
“門控制”位置0,即只需要TRx就可以控制定時器的開啟和關(guān)閉。
你的外部脈沖,直接到定時器0。只要TR0=1,則計數(shù)器0就開始計數(shù)了,注意,你的脈沖信號要接在P34腳;只要TR1=1,定時器1就開始計時了。
同時開啟兩定時器,你的工作不就完成了?
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
国产精品久久久久久久久久
|
在线一区二区观看
|
一级免费毛片
|
亚洲不卡在线观看
|
亚洲国产成人久久久
|
91精品在线播放
|
在线中文视频
|
欧美成人精品一区二区男人看
|
四季久久免费一区二区三区四区
|
亚洲精品久久久久久久久久久久久
|
日本精品裸体写真集在线观看
|
狠狠亚洲
|
久久亚洲天堂
|
91视在线国内在线播放酒店
|
91美女在线
|
九九热免费在线观看
|
午夜免费视频
|
色视频一区二区
|
久久男人天堂
|
91精品国产综合久久精品
|
亚州精品天堂中文字幕
|
亚洲精品免费在线观看
|
人人人艹
|
日韩欧美三级在线
|
区一区二区三在线观看
|
日韩一区二区福利视频
|
日韩 欧美 二区
|
精品免费国产视频
|
男人天堂国产
|
伊人婷婷
|
97精品超碰一区二区三区
|
日韩一区二区免费视频
|
91精品国产色综合久久不卡98口
|
欧美日韩在线一区二区三区
|
男女污网站
|
国产精品日韩欧美一区二区三区
|
午夜资源
|
亭亭五月激情
|
日本精品久久久久久久
|
波多野结衣一区二区三区在线观看
|
亚洲精品久久久久久一区二区
|