1、目 录第一篇:51 单片机 C 语言实验及实践教程_316 位数显频率计数器第二篇:方波测频-频率计第三篇:单片机频率计程序第四篇: 单片机原理与应用实验报告51 单片机 C 语言实验及实践教程 _31 6 位数显频率计数器发布: 2009-4-04 18:07 | 作者: 孙青安 | 查看: 80 次1 实验任务 利用 AT89S51 单片机的 T0、T1 的定时计数器功能,来完成对输入的信号进行频率计数,计数的频率结果通过 8 位动态数码管显示出来。要求能够对 0250KHZ 的信号频率进行准确计数,计数误差不超过1HZ。2 电路原理图 图 4.31.13 系统板上硬件连线 (1) 把“单
2、片机系统”区域中的 P0.0P0.7 与“动态数码显示”区域中的 ABCDEFGH 端口用 8 芯排线连接。(2) 把“单片机系统”区域中的 P2.0P2.7 与“动态数码显示”区域中的 S1S2S3S4S5S6S7S8 端口用 8 芯排线连接。(3) 把“单片机系统”区域中的 P3.4(T0)端子用导线连接到“频率产生器”区域中的 WAVE 端子上。4 程序设计内容 (1) 定时/计数器 T0 和 T1 的工作方式设置,由图可知,T0 是工作在计数状态下,对输入的频率信号进行计数,但对工作在计数状态下的T0,最大计数值为 fOSC/24,由于 fOSC12MHz,因此:T0 的最大计数频率为
3、 250KHz。对于频率的概念就是在一秒只数脉冲的个数,即为频率值。所以 T1 工作在定时状态下,每定时 1 秒中到,就停止 T0 的计数,而从 T0 的计数单元中读取计数的数值,然后进行数据处理。送到数码管显示出来。(2) T1 工作在定时状态下,最大定时时间为 65ms,达不到 1 秒的定时,所以采用定时 50ms,共定时 20 次,即可完成 1 秒的定时功能。#include unsigned char code dispbit=0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f; unsigned char code dispcode=0x3f,0x06,0
4、x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40; unsigned char dispbuf8=0,0,0,0,0,0,10,10; unsigned char temp8; unsigned char dispcount; unsigned char T0count; unsigned char timecount; bit flag; unsigned long x; void main(void) unsigned char i; TMOD=0x15; TH0=0; TL0=0; TH1=(65536-4000)/256; TL1=(6
5、5536-4000)%256; TR1=1; TR0=1; ET0=1; ET1=1; EA=1; while(1) if(flag=1) flag=0; x=T0count*65536+TH0*256+TL0; for(i=0;i/*数码管位代码表(P0 口)*/unsigned char code dispbit=0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f;/*数码管段代码表(P2 口,共阴且高位接 a,低位接 h 笔段)*/ unsigned char code dispcode=0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0
6、xE0,0xFE,0xF6,0xEE,0x3E,0x9C,0x7A,0x9E,0x8E,0x00;/*8 位数据缓冲器*/ unsigned char dispbuf8; unsigned char temp8; unsigned char dispcount; unsigned char T0count;unsigned char timecount;bit flag; unsigned long x; /*初始化模块*/void initial(void)TMOD=0x15; TH0=0;TL0=0;TH1=(65536-4000)/256;TL1=(65536-4000)%256;TR1
7、=0;TR0=0;ET0=1;ET1=1;EA=1;/*/*显示模块*/void dataDisplay()unsigned char i; for(i=0;i=500) TR0=0;TR1=0;EA=0; freq=T0count*65536+TH0*256+TL0; initial(); ifStart=0; x=freq; dataDisplay(); /*/ 这个是运行正常的程序,不过只写了测频的,测周的没写完。 单片机原理与应用实验报告实验 3:简单频繁计姓名 院系 计算机应用 学号任课教师 谭家兴 指导教师 谭家兴 评阅教师 谭家兴实验地点 电子实验室 实验时间2010 年 6 月
8、 17 日星期四实验目的:单片计算机即单片微型计算机。(Single-Chip Microcomputer ),是 集CPU ,RAM ,ROM ,定时,计数和多种接口于一体的微控制器。他体积小,成本低,功能强,广泛应用于智能产品和工业自动化上。而 51 单片机是各单片机中最为典型和最有代表性的一种。这次课程设计通过对它的学习,应用,从而达到学习、设计、开发软、硬的能力。实验要求:设计一个频率计,输入某个频率的信号.能用单片机检测出这个信号的频率.也就是统计一秒钟内收到多少个脉冲实验原理:通过信号发生器产生一个信号.通过单片机3.5端口(外部中断0) 接收.把外部中断0设置成下降沿触发方式.统
9、计收到的脉冲个数,把定时计数器0设置成方式1(13 位定时器).通过一个按钮启动定时器 0和外部中断0,定时器开始计时.外部中断0开始计数,一秒钟后用数码管显示中断收到的脉冲个数实验过程中遇到的问题以及如何解决的?实验中由于信号发生器产生的信号电压过低,外部中断端口未能识别收到的脉冲数,后来提高电压后正常接收数码管显示的时候.未能正常显示数的各个位,经过反复调试还是显示出来了仿真软件显示效果:一秒钟后按下按钮后显示的结果:流程图:源代码:#include /头文件端口声明#define uchar unsigned char /变量宏定义#define uint unsigned intuns
10、igned char code table1= /共阳极 0f 数码管编码0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e;/共阴极的数码管 0f 的段编码是这样的:unsigned char code table2=/共阴极 0f 数码管编码0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, /470x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71;uint count=0; /定义脉冲计数变量sbit K1=P10;sbit
11、 K2=P17;void delay(uchar y) / 延时子程序 uchar x;while(y-)for(x=110;x0;x-); display(count) / 显示子程序 uchar wan,qian,bai,shi,ge,i=2; / 将要显示的数分解成各位wan=count/10000;qian=count%10000/1000;bai=count%1000/100;shi=count%100/10;ge=count%10;P2=0x7f;P0=table2ge; /送个位数delay(i);P2=0xbf;P0=table2shi; /送十位数delay(i);P2=0x
12、df;P0=table2bai;delay(i);P2=0xef;P0=table2qian;delay(i);P2=0xf7;P0=table2wan;delay(i);void main()IE=0x8a; / 开总中断和 T0,T1TMOD=0x51; / 设置中断工作方式TH0=(65536-50000)/256;TL0=(65536-50000)%256;while(1)if(K1=0)delay(11);if(K1=0) count=0;TR0=TR1=1; /当按键按下时启动T0 和 T1display(count); void t0() interrupt 1 /定时计数器 T0 子程序 uchar K;TH0=(65536-50000)/256;TL0=(65536-50000)%256;if(+K=20) TR1=TR0=K=0; /关两个中断count=TH1*256+TL1; /当到一秒后,计下 T1 收到的脉冲个数TH1=TL1=0; /T1 清零本次实验的体会(结论)做实验首先要把实验原理设计出来,按实验原理来写程序.不能一开始就开始写程序做实验需要很大的耐心,在无法得到正确结果的时候不能放弃,要反复调试以找到问题所在,加以更正.评阅教师特殊评语:评阅教师:日 期: