?? 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 + -