wave_generator_measure2.lst
来自「自己的平时一些制作 现在整理一下 与大家一起分享」· LST 代码 · 共 157 行
LST
157 行
C51 COMPILER V7.20 WAVE_GENERATOR_MEASURE2 03/06/2007 16:18:03 PAGE 1
C51 COMPILER V7.20, COMPILATION OF MODULE WAVE_GENERATOR_MEASURE2
OBJECT MODULE PLACED IN wave_generator_measure2.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE wave_generator_measure2.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /************测低频信号周期的一个程序***********/
2 // 经过数学变换后就可以用来测频率
3 // 思路:数一个周期中有多少个100us,用count放这个计数值
4 /**************************************/
5
6 #include <reg51.h>
7 /*****定义50ms方波的波形输出接口******/
8 sbit led=P1^0;
9
10 sbit int0=P1^1; //被测量信号,当然也可以接到其他的引脚
11
12 //下面两个变量就是用来 切换数码管的序号 和 存放显示的数据
13 unsigned char n;
14 unsigned char d[4];
15
16 //定义全局变量用于存放计算值
17 unsigned int count;
18
19 unsigned char code digit[4]={0xf8,0xf4,0xf2,0xf1}; //数码管显示选择
20 unsigned char code tab[16]={0x3f,6,0x5b,0x4f,0x66,0x6d,0x7d,
21 7,0x7f,0x6f,0x77,0x7c,0x58,0x5e,0x79,0x71};
22 //显示0--9;a--f;
23
24 /********十进制到bcd码转换************/
25 void hextobcd (unsigned int hexs)
26 {
27 1 d[0]=hexs/1000;
28 1 hexs=hexs%1000;
29 1 d[1]=hexs/100;
30 1 hexs=hexs%100;
31 1 d[2]=hexs/10;
32 1 hexs=hexs%10;
33 1 d[3]=hexs;
34 1 }
35
36
37 /********延时子程序***********/
38 void delay(unsigned char dy)
39 {
40 1 while(--dy);
41 1 }
42
43 /*******定时器初始化**********/
44 void Init_Timer (void)
45 {
46 1 TMOD=0x12; //设定定时器的工作模式 定时器1工作在16位定时状态
47 1 //设定定时器0工作在8位自动重装方式
48 1 TH1=(65536-23040)/256; //设定定时常数,产生25ms中断,这样输出的就是周期50ms的方波
49 1 TL1=(65536-23040)%256;
50 1 TH0=(256-92); //设定定时常数,定时100us
51 1 TL0=(256-92);
52 1 EA=1; //cpu开中断
53 1 ET1=1; //定时器1开中断
54 1 ET0=1; //定时器0开中断
55 1 TR1=1; //启动定时器1
C51 COMPILER V7.20 WAVE_GENERATOR_MEASURE2 03/06/2007 16:18:03 PAGE 2
56 1 }
57
58 /*********定时器1中断服务程序************/
59 void timer1 (void) interrupt 3
60 {
61 1 // TR1=0; //停定时器1
62 1 TH1=(65536-23040)/256; //设定定时常数,产生25ms中断,这样输出的就是周期50ms的方波
63 1 TL1=(65536-23040)%256;
64 1 led=!led; //输出去反
65 1 // TR1=1; //启动定时器1
66 1 }
67
68 /*********定时器0中断服务程序**************/
69 /*********定时2毫秒*********/
70 void timer0 (void) interrupt 1
71 {
72 1 count++; //计数
73 1 }
74
75
76 /*******非中断的数码管显示子程序***********/
77 //由于这里中断用完了,所以
78 /******************************************/
79 void display()
80 {
81 1 unsigned char m;
82 1 for(m=0;m<4;m++)
83 1 {
84 2 P2=digit[m]; P0=tab[d[m]];
85 2 delay(250);
86 2 P0=0;
87 2 }
88 1 }
89
90 /****************主函数main****************/
91 /*****实现P1^0输出周期50ms方波,P1^1输入该方波..****/
92 /**..因为这俩个脚比较靠近所以选择这两个引脚****/
93 /*..我们可以用金属线连接两个引脚,....*/
94 /**..从而可以实现本机产生本机测量************/
95 /***数码管显示方波的周期:单位ms**/
96 /***定时器0产生100us中断,定时器1产生25ms中断*****/
97 /***基本思路:****/
98 /**用计算一个脉冲周期内定时器0中断了多少次..***/
99 /***再用定时器的定时间隔乘以次数就能得到总的时间****/
100 //测试结果:数码管在 49-50 之间跳动
101 /************/
102 /*****************************/
103
104 main()
105 {
106 1 unsigned char i;
107 1 unsigned int snumber=0; //周期: 单位ms
108 1 Init_Timer();
109 1 while(1)
110 1 {
111 2 snumber=0; //先给个初值0,他用于累加十次测量值,..
112 2 //..最后再除以10就可以了。
113 2 for(i=0;i<10;i++) //累加十次测量结果
114 2 {
115 3 count=0;
116 3 while(int0==0) ; //测周期长度 //先等待上升沿..
117 3 TR0=1; //..启动定时器0..
C51 COMPILER V7.20 WAVE_GENERATOR_MEASURE2 03/06/2007 16:18:03 PAGE 3
118 3 while(int0==1) display(); //..等待下降沿..
119 3 while(int0==0) display(); //..再等待上升沿..
120 3 TR0=0; //同时停止定时器0
121 3 TH0=(256-92); //设定定时常数,定时100us
122 3 TL0=(256-92);
123 3 snumber=count+snumber; //计算出有几个0.1ms,除以10即可后得到周期。
124 3 }
125 2 hextobcd(snumber/100);
126 2 }
127 1 }
128
129
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 245 ----
CONSTANT SIZE = 20 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 7 2
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?