标题:
利用单片机定时器中断频率计实现代码
[打印本页]
作者:
2635580848
时间:
2019-4-25 21:16
标题:
利用单片机定时器中断频率计实现代码
电路原理图如下:
捕获.PNG
(128.73 KB, 下载次数: 40)
下载附件
2019-4-25 21:16 上传
单片机源程序如下:
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char //数据类型宏定义
#define uint unsigned int
#define out P0 //IO端口定义
sbit RS=P2^0;
sbit RW=P2^1;
sbit EN=P2^2;
uint i = 0; //全局变量
uint j;
uint cnt=0;
uchar display[]={'0','1','2','3','4','5','6','7','8','9'};
void Delay4us()
{
_nop_();_nop_();_nop_();_nop_();
}
//延时
void delay (int ms)
{
uchar i;
while(--ms)
for(i=0;i<250;i++)
Delay4us();
}
//LCD忙检测,返回1则忙
bit LCD_Busy_Check()
{
bit result;
RS=0;
RW=1;
EN=1;
Delay4us();
result=(bit)(P0&0x80);
EN=0;
return result;
}
//写指令给P0
void LCD_Write_Command(uchar cmd)
{
while (LCD_Busy_Check());
RS=0;
RW=0;
EN=0;
_nop_();
_nop_();
P0=cmd;
Delay4us();
EN=1;
Delay4us();
EN=0;
}
//写数据给P0
void LCD_Write_Data(uchar dat)
{
while(LCD_Busy_Check());
RS=1;
RW=0;
EN=0;
P0=dat;
Delay4us();
EN=1;
Delay4us();
EN=0;
}
//LCD初始化
void LCD_Initialise()
{
LCD_Write_Command(0x38);//显示初始化
delay(5);
LCD_Write_Command(0x0c); //开显示
delay(5);
LCD_Write_Command(0x06);//读写后指针加一
delay(5);
LCD_Write_Command(0x01); //清屏
delay(5);
}
/***********主函数*******************************************************/
void main(void)
{
uchar ge=0;
uchar shi=0;
uchar bai=0;
uchar qian=0;
TMOD=0x15; // 定时器0工作于计数方式,工作方式1,16位计数
// 定时器1工作于定时方式,工作方式1,16位定时
TH0=0; // 清零计数器
TL0=0;
TH1=0x4C; // 12M晶振工作下,定时50ms
TL1=0x00;
TR0=1; // 启动定时器0
TR1=1; // 启动定时器1
IE=0x88; // 打开定时中断1和总中断
LCD_Initialise();
while(1)
{
qian=cnt/1000;
bai=cnt%1000/100;
shi=cnt%100/10;
ge=cnt%10;
LCD_Write_Command(0x80);
LCD_Write_Data(display[qian]);
LCD_Write_Command(0x81);
LCD_Write_Data(display[bai]);
LCD_Write_Command(0x82);
LCD_Write_Data(display[shi]);
LCD_Write_Command(0x83);
LCD_Write_Data(display[ge]);
LCD_Write_Data('h');
LCD_Write_Data('z');
}
}
/***********计数器T0中断处理函数******************************************/
void Timer1_ISR() interrupt 3
{
static char j = 0;
i++;
TH1=0x4C; // 重设定时器值,50ms @ 12MHz XTAL
TL1=0x00;
if(++j == 20) // 50ms * 20 = 1S
{
j = 0;
i = (TH0 << 8) | TL0; // 1S内的计数值
cnt=i;
i=0;
TH0 = 0; // 清零计数
TL0 = 0;
}
}
复制代码
作者:
物业tuan
时间:
2019-12-19 14:18
怎么使用呢
作者:
@@;
时间:
2020-1-3 17:22
范围多少
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1