📄 wave_generator_measure.c
字号:
#include <reg51.h>
/*****定义50ms方波的波形输出接口******/
sbit led=P1^0;
sbit int0=P3^2; //被测量信号,当然也可以接到其他的引脚
//下面两个变量就是用来 切换数码管的序号 和 存放显示的数据
unsigned char n;
unsigned char d[4];
//定义全局变量用于存放计算值
unsigned char count;
unsigned char code digit[4]={0xf8,0xf4,0xf2,0xf1}; //数码管显示选择
unsigned char code tab[16]={0x3f,6,0x5b,0x4f,0x66,0x6d,0x7d,
7,0x7f,0x6f,0x77,0x7c,0x58,0x5e,0x79,0x71};
//显示0--9;a--f;
/********十进制到bcd码转换************/
void hextobcd (unsigned int hexs)
{
d[0]=hexs/1000;
hexs=hexs%1000;
d[1]=hexs/100;
hexs=hexs%100;
d[2]=hexs/10;
hexs=hexs%10;
d[3]=hexs;
}
/********延时子程序***********/
void delay(unsigned char dy)
{
while(--dy);
}
/*******定时器初始化**********/
void Init_Timer (void)
{
TMOD=0x11; //设定定时器的工作模式 定时器1工作在16位定时状态
TH1=(65536-23040)/256; //设定定时常数,产生25ms中断,这样输出的就是周期50ms的方波
TL1=(65536-23040)%256;
TH0=(65536-1843)/256; //设定定时常数,定时2ms
TL0=(65536-1843)%256;
EA=1; //cpu开中断
ET1=1; //定时器1开中断
ET0=1; //定时器0开中断
TR1=1; //启动定时器1
}
/*********定时器1中断服务程序************/
void timer1 (void) interrupt 3
{
TR1=0; //停定时器1
TH1=(65536-23040)/256; //设定定时常数,产生25ms中断,这样输出的就是周期50ms的方波
TL1=(65536-23040)%256;
led=!led; //输出去反
TR1=1; //启动定时器1
}
/*********定时器0中断服务程序**************/
/*********定时2毫秒*********/
void timer0 (void) interrupt 1
{
count++; //计数
TH0=(65536-1843)/256; //设定定时常数,定时2ms
TL0=(65536-1843)%256;
}
/*******非中断的数码管显示子程序***********/
//由于这里中断用完了,所以
/******************************************/
void display()
{
unsigned char m;
for(m=0;m<4;m++)
{
P2=digit[m]; P0=tab[d[m]];
delay(250);
P0=0;
}
}
/*****主函数main****/
/*******实现P1^0输出周期50ms方波,P3^2输入该方波..****/
/**..我们可以用金属线连接两个引脚*******/
/***显示方波的周期:单位ms**/
/***定时器0产生2ms中断,定时器1产生25ms中断*****/
/*****************************/
main()
{
unsigned char i;
unsigned int snumber; //周期: 单位ms
Init_Timer();
while(1)
{
count=0;
for(i=0;i<10;i++) { display(); delay(250);} //显示及延时
TH0=(65536-1843)/256; //设定定时常数,定时2ms
TL0=(65536-1843)%256;
while(int0==0) ; //测周期长度 //先等待上升沿..
TR0=1; //..启动定时器0..
while(int0==1) display(); //..等待下降沿..
while(int0==0) display(); //..再等待上升沿..
TR0=0; //同时停止定时器0
snumber=count*2; //计算出有几个2ms,乘以2后得到周期。
hextobcd(snumber); //显示出有几个ms
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -