利用MEGA8完成单光子脉冲计数
Posted 卓晴
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了利用MEGA8完成单光子脉冲计数相关的知识,希望对你有一定的参考价值。
01 MEGA8计数
一、背景介绍
AD\\Atmel\\Mega8\\2023\\TestMEGA81.PcbDoc
在昨天制作了MEGA8的测试实验板, 这是用来对于前天制作的单光子雪崩信号进行计数统计。 下面通过MEGA8编程测试脉冲计数的性能。
▲ 图1.1.1 MEGA8测试电路板
二、MEGA8计数
1、程序设计
D:\\zhuoqing\\window\\Atmel\\test\\2023\\SPADCounter\\main.c
(1)主程序
/*
**==============================================================================
** main.c : -- by Dr. ZhuoQing, 2007-3-31
**
** This project is designed for the PumpCnt
**
**==============================================================================
*/
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
void C_task main(void)
unsigned int nCount;
unsigned char ucChar;
unsigned int nShowCount;
//--------------------------------------------------------------------------
Mega8Init();
ControlInit();
//--------------------------------------------------------------------------
//--------------------------------------------------------------------------
nCount = 0;
nShowCount = 0;
TCNT1 = 0;
for(;;)
//----------------------------------------------------------------------
if(++nCount & 0x80) LED_ON;
else LED_OFF;
WaitTime(1);
//----------------------------------------------------------------------
if(++nShowCount > 500)
nShowCount = 0;
SendInt16(g_nCnt1);
SendChar('\\r');
SendChar('\\n');
//----------------------------------------------------------------------
//==============================================================================
// END OF THE FILE : main.c
//------------------------------------------------------------------------------
(2)MEGA8程序
利用TIME1 作为计数器,来对T1的脉冲进行计数。 下面是TIMER1 的初始化程序。设置其中的寄存器:
- TCCR1A = 0x00:表示没有输出波形;
- TCCR1B = 0x6:表示利用外部的T1脉冲作为时钟源。
void timer1_init(void)
TCCR1B = 0x00; //stop
TCNT1H = 0xC1; //setup
TCNT1L = 0x81;
OCR1AH = 0x3E;
OCR1AL = 0x7F;
OCR1BH = 0x3E;
OCR1BL = 0x7F;
ICR1H = 0x3E;
ICR1L = 0x7F;
TCCR1A = 0x00;
TCCR1B = 0x6; //start Timer
在Timer0的1MS中断中,使用:
- g_n1MS : 进行周期读取TCNT1控制;
- g_nCnt1:读取TCNT1,并将TCNT1清零。
#pragma interrupt_handler timer0_ovf_isr:10
void timer0_ovf_isr(void)
unsigned char ucValue;
//--------------------------------------------------------------------------
TCNT0 = 0x06; //0x06; //reload counter value
//--------------------------------------------------------------------------
g_ucCnt ++;
//--------------------------------------------------------------------------
if(g_ucCnt == 0)
g_ucCnt256 ++;
//--------------------------------------------------------------------------
if(++g_n1MS >= 500)
g_n1MS = 0;
g_nCnt1 = TCNT1;
TCNT1 = 0;
//--------------------------------------------------------------------------
CommandReceiveCount();
2、程序测试结果
程序下载之后,可以看到MEGA8给出500毫秒之内的脉冲数量。 这是将红外LED放置在黑盒子里面输出的结果。 如果将LED从黑盒子中拿出来,对应计数输出就增加非常大了。
※ 总 结 ※
本文初步测试了MEGA8单片机对于单光子脉冲计数的功能。 通过编程利用MEGA8内部计数器完成对于单光子脉冲计数。 通过串口将计数数据发送到计算机。
● 相关图表链接:
以上是关于利用MEGA8完成单光子脉冲计数的主要内容,如果未能解决你的问题,请参考以下文章