📄 text1.c
字号:
/*
若晶振频率为12MHZ,如何用T0来测量20ms-1s之间的方波周期?
又如何测量频率为0.5MHZ左右的脉冲频率?
*/
/*
实现方法:
用外部中断,选择下降沿触发,程序响应中断后马上开启定时器,
在下个下降沿来临的时候关掉定时器。
*/
#include<regX51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uint time0_tick=0;
uchar tick=0;
uchar count[4]={0,0,0,0};
bit flag = 1;
code seven_seg[10]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90};
code scan[4]={0X08,0X04,0X02,0X01};//直接用P3驱动共阳七段显示器;
static void time0_isr(void)interrupt TF0_VECTOR using 2
{
TH0 = (65536-10000)/256;
TL0 = (65536-10000)%256;
P0_7 = ~ P0_7; //波动形象化。
if(flag)
{
count[0]++;
if(count[0]==10)
{
count[0]=0;
count[1]++;
if(count[1]==10)
{
count[1]=0;
count[2]++;
if(count[2]==10)
{
count[2]=0;
count[3]++;
if(count[3]==10)count[3]=0;
}
}
}
}
}
static void xint0_isr(void)interrupt IE0_VECTOR using 1//外部中断
{
tick++;
if(tick == 1)
{
count[0]=0;
count[1]=0;
count[2]=0;
count[3]=0;
flag = 1;
TR0 = 1;
}
if(tick == 2)
{
tick = 0;//置零重新开始读取波段
flag = 0;
TR0 = 0;
// EX0 = 0; //不允许int0中断;
}
}
void delay(uchar ms)
{
uchar i,j;
for(i=0;i<ms;i++)
for(j=0;j<250;j++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
static void timer0_initialize(void)
{
EA=0; // 所有中断关
TR0=0;
TMOD = 0x01; // T0 模式1 16位计数器
TH0 = (65536-10000)/256; //直接二进制取位赋值
TL0 = (65536-10000)%256;
PT0=1;
ET0=1;
//TR0=1;
EA=1;
}
static void xint0_initialize(void)
{
EA=0;
IT0=1;
EX0=1;
EA=1;
}
void main()
{
uchar i;
xint0_initialize();
timer0_initialize();
while(1)
{
for(i=0;i<4;i++)
{
P2=seven_seg[count[i]];
P1=scan[i];
delay(5);
P1 = 0x00;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -