脉冲计数器
实验成员:吴敏、马文铂
指导老师:王磊老师
参看文献:51单片机C 语言编程(电子工业出版社 郭天祥主编)
实验原理:
单片机外部中断,是由低电平触发,由此可以给方波脉冲
计数,同时,可以通过控制键盘输入来给计数设置一个基数,基数、
脉冲数都可以通过液晶显示出来,达到脉冲计数的目的。
实验步骤:
1) 通过键盘输入,在液晶上显示输入的值,液晶输入分
为写命令和写数据两步。
2) 通过检测外部中断端口,检测低电平,继而给外部脉
冲计数。同时把脉冲计数值放在一个变量里。
3) 同过定时器定时,当时间达到1秒时,把脉冲计数值
显示出来,同时把存放脉冲的变量清零。
4) 把脉冲值和通过键盘输入的计数相乘,把结果显示在
液晶显示屏上
实验中所遇到的问题:
1) 我先通过外部按键来控制外部中断的输入,这就存在
一个按键检测延时的问题,而脉冲的频率很大,每次
的延时检测都会使程序一直呆在中断里面而计数器
不工作,所以液晶上也就一直不会显示脉冲的个数。
2) 外部信号发生器,我一开始是接的50欧的脉冲发生
器,而这个信号发生器是需要一定的工作电阻的,所
以液晶显示结果与信号发生器上的频率不符。
3) 当我改为TTL 脉冲发生器时,液晶显示结果还是与信
号发生器上的不符,检查发现是由于信号发生器一段
没有接地,也就是单片机与信号发生器没有共地。共
地之后,液晶显示结果与信号发生器上的频率完全相
符合,实验成功。
程 序:
#include
#include
#define uint unsigned int
#define uchar unsigned char
uchar code table[10] = {0x03, 0x9f, 0x25, 0x0d, 0x99, 0x49, 0x41, 0x1f, 0x01, 0x09};
uint Count = 0;
uchar x = 0;
sbit KEY = P3^2
sbit E=P2^7;
sbit RW=P2^6;
sbit RS=P2^5;
void Delay_1ms(uint i)
{
uchar x,j;
for(j=0;j
for(x=0;x
}
void Delay(uint del)
{
uint i,j;
for(i=0; i
for(j=0; j
;
}
void delay()
{
int i,j;
for(i=0; i
for(j=0; j
;
}
void Outside_Init(void)
{
EX0 = 1;
IT0 = 1;
EA = 1;
}
void Outside_Int(void) interrupt 0
{
//Delay(3); //延时30ms ,去掉这行会出现按一下中断几次的情况
// if(KEY == 0) //对按键迚行抗干扰处理
// {
Count++;
//}
}
void Time0_Init()
{
// PT0=1;
TMOD = 0x01;
TH0 = 0x4c;
TL0 = 0x00;
TR0 = 1;
}
void Time0_Int() interrupt 1
{
TH0 = 0x4c;
TL0 = 0x00;
x++;
}
uchar Convert(uchar In_Date)
{
uchar i, Out_Date = 0, temp = 0;
for(i=0; i
{
temp = (In_Date >> i) & 0x01;
Out_Date |= (temp
}
return Out_Date;
}
void enable(uchar del)
{
P0 = Convert(del);
RS = 0;
RW = 0;
E = 0;
delay();
E = 1;
delay();
}
void write(uchar del)
{
P0 = Convert(del);
RS = 1;
RW = 0;
E = 0;
delay();
E = 1;
delay();
}
void L1602_init(void)
{
enable(0x01);
enable(0x38);
enable(0x0c);
enable(0x06);
enable(0xd0);
}
void L1602_char(uchar hang,uchar lie,char sign)
{
uchar a;
if(hang == 1) a = 0x80;
if(hang == 2) a = 0xc0;
a = a + lie - 1;
enable(a);
write(sign);
}
void L1602_string(uchar hang,uchar lie,uchar *p)
{
uchar a;
if(hang == 1) a = 0x80;
if(hang == 2) a = 0xc0;
a = a + lie - 1;
enable(a);
while(1)
{
if(*p == '\0') break;
write(*p);
p++;
}
}
uchar Keyscan(void)
{
uchar i,j, temp, Buffer[4] = {0xef, 0xdf, 0xbf, 0x7f};
for(j=0; j
{
P1 = Buffer[j];
_nop_();
_nop_();
_nop_();
temp = 0x01; for(i=0; i
{
if(!(P1 & temp))
{
return (i+j*4);
}
temp
}
}
}
void Main(void)
{
uchar Key_Value;
L1602_init();
L1602_string(1,1,"maicong ");
L1602_string(2,1,"You Press The ");
Outside_Init();
Time0_Init(); ET0=1; EX0=1; while(1) { P1 = 0xf0; if(P1 != 0xf0) {
}
}
}
Delay_1ms(15); if(P1 != 0xf0) { Key_Value = Keyscan(); } L1602_char(2,15,Key_Value / 10 + 48); L1602_char(2,16,Key_Value % 10 + 48); if(x==20) { EX0=0; L1602_char(1,16,(Key_Value*Count) % 1000%100%10 + 48); L1602_char(1,15,(Key_Value*Count) % 1000%100/10 + 48); L1602_char(1,14,(Key_Value*Count) % 1000/100 + 48); L1602_char(1,13,(Key_Value*Count) / 1000 + 48); L1602_char(1,11,Count % 100%10 + 48); L1602_char(1,10,Count %100/10 + 48); L1602_char(1,9,Count / 100 + 48); Count=0; x=0; EX0=1; }