C51频率计数器实验原理图程序设计
单片机C51数字频率计程序
单片机C51数字频率计程序**//头文件部分,文件名:plj.h/**************************************************#include<reg52.h>#include<absacc.h>#include <intrins.h>#define uint unsigned int#define uchar unsigned charextern const uchar NoDisp=0; //无显示extern const uchar NoCur=1; //有显示无光标extern const uchar CurNoFlash=2; //有光标但不闪烁extern const uchar CurFlash=3; //有光标且闪烁extern void LcdPos(uchar,uchar); //确定光标位置extern void LcdWd(uchar); //写字符extern void LcdWc(uchar); //送控制字(检测忙信号)extern void LcdWcn(uchar ); //送控制字子程序(不检测忙信号)extern void mDelay(uchar ); //延时,毫秒数由j决定extern void WaitIdle(void); //正常读写操作之前检测LCD控制器状态extern void RstLcd(void); //复位LCD控制器extern void WriteChar(uchar c,uchar xPos,uchar yPos);//在指定的行与列显示指定的字符,xpos:行,ypos:列,c:待显示字符extern void WriteString(uchar *s,uchar xPos,uchar yPos);extern void SetCur(uchar Para); //设置光标extern void ClrLcd(void); //清屏命令extern void WaitIdle(void); // 正常读写操作之前检测LCD控制器状态extern void mDelay(uchar j);/**************************************************/**************************************************//液晶1602子程序,文件名:1602.c/**************************************************;连线图:; DB0---DPROT.0 DB4---DPROT.4 RS-------------P3.5 ; DB1---DPROT.1 DB5---DPROT.5 RW-------------P3.6 ; DB2---DPROT.2 DB6---DPROT.6 E--------------P3.7 ; DB3---DPROT.3 DB7---DPROT.7 VLCD接10K可调电阻到GND*; 需要11根单片机口线;80C51的晶振频率为12MHz;液晶显示程序;**************************************************/#include <reg52.h>#include <intrins.h>#define uint unsigned int#define uchar unsigned charsbit RS = P3^5;sbit RW = P3^6;sbit EN = P3^7;#define DPORT P1void LcdPos(uchar,uchar); //确定光标位置void LcdWd(uchar); //写字符void LcdWc(uchar); //送控制字(检测忙信号)void LcdWcn(uchar ); //送控制字子程序(不检测忙信号)void mDelay(uchar ); //延时,毫秒数由j决定void WaitIdle(); //正常读写操作之前检测LCD控制器状态//在指定的行与列显示指定的字符,xpos:行,ypos:列,c:待显示字符void WriteChar(uchar c,uchar xPos,uchar yPos){LcdPos(xPos,yPos);LcdWd(c);}void WriteString(uchar *s,uchar xPos,uchar yPos){ uchar i;if(*s==0) //遇到字符串结束return;for(i=0;;i++){if(*(s+i)==0)break;WriteChar(*(s+i),xPos,yPos);xPos++;if(xPos>=15) //如果XPOS中的值未到15(可显示的最多位)break;}}void SetCur(uchar Para) //设置光标{ mDelay(2);switch(Para){ case 0:{ LcdWc(0x08); //关显示break;}{ LcdWc(0x0c); //开显示但无光标break;}case 2:{ LcdWc(0x0e); //开显示有光标但不闪烁break;}case 3:{ LcdWc(0x0f); //开显示有光标且闪烁break;}default:break;}}void ClrLcd() //清屏命令{ LcdWc(0x01);}// 正常读写操作之前检测LCD控制器状态void WaitIdle(){ uchar tmp;RS=0;RW=1;EN=1;_nop_();for(;;){ tmp=DPORT;tmp&=0x80;if( tmp==0)}EN=0;}void LcdWd(uchar c) //写字符子程序{ WaitIdle();RS=1;RW=0;DPORT=c; //将待写数据送到数据端口EN=1;_nop_();_nop_();EN=0;}void LcdWc(uchar c) //送控制字子程序(检测忙信号){ WaitIdle();LcdWcn(c);}void LcdWcn(uchar c) //送控制字子程序(不检测忙信号){ RS=0;RW=0;DPORT=c;EN=1;_nop_();EN=0;}void LcdPos(uchar xPos,uchar yPos) //设置第(xPos,yPos)个字符的DDRAM地址{ unsigned char tmp;xPos&=0x0f; //x位置范围是0~15yPos&=0x01; //y位置范围是0~1if(yPos==0) //显示第一行tmp=xPos;elsetmp=xPos+0x40;tmp|=0x80;LcdWc(tmp);}void RstLcd() //复位LCD控制器{ mDelay(15); //如果使用12M或以下晶振,此数值不必改,如用24M晶振,须用30LcdWc(0x38); //显示模式设置LcdWc(0x08); //显示关闭LcdWc(0x01); //显示清屏LcdWc(0x06); //显示光标移动位置LcdWc(0x0c); //显示开及光标设置}void mDelay(uchar j) //延时,毫秒数由j决定{ uint i=0;for(;j>0;j--){ for(i=0;i<124;i++){;}}}//主函数:/*===================================== ========================================= ====公司名称:河海大学电气工程学院 *模块名:AT89C52单片机系统,全国电子设计大赛 *创建人:南东亮日期:2007。
基于C51单片机数字频率计课程设计资料
(华)课程设计(论文)目录摘要................................................. .....错误!未定义书签。
1 引言 (2)1.1数字频率计概述 (2)1.2频率测量仪的设计思路与频率的计算 (2)1.3 基本设计原理 (3)2 数字频率计(低频)的硬件结构设计 (4)2.1 系统硬件的构成 (4)2.2 系统工作原理图 (4)2.3 AT89C51单片机及其引脚说明 (5)2.4 信号调理及放大整形模块 (7)2.5 时基信号产生电路 (7)2.6显示模块 (9)3软件设计 (13)3.1量程转换 (13)3.2 BCD转换 (13)3.3 LCD显示的功能 (13)4模块电路仿真 (14)5 结束语 (16)参考文献 (17)附录汇编源程序代码 (18)1 引言本应用系统设计的目的是通过在“单片机原理及应用”课堂上学习的知识,以及查阅资料,培养一种自学的能力。
并且引导一种创新的思维,把学到的知识应用到日常生活当中。
在设计的过程中,不断的学习,思考和同学间的相互讨论,运用科学的分析问题的方法解决遇到的困难,掌握单片机系统一般的开发流程,学会对常见问题的处理方法,积累设计系统的经验,充分发挥教学与实践的结合。
全能提高个人系统开发的综合能力,开拓了思维,为今后能在相应工作岗位上的工作打下了坚实的基础。
1.1数字频率计概述数字频率计是计算机、通讯设备、音频视频等科研生产领域不可缺少的测量仪器。
它是一种用十进制数字显示被测信号频率的数字测量仪器。
它的基本功能是测量正弦信号,方波信号及其他各种单位时间内变化的物理量。
在进行模拟、数字电路的设计、安装、调试过程中,由于其使用十进制数显示,测量迅速,精确度高,显示直观,经常要用到频率计。
本数字频率计将采用定时、计数的方法测量频率,采用一个1602A LCD 显示器动态显示6位数。
测量范围从1Hz —10kHz 的正弦波、方波、三角波,时基宽度为1us ,10us ,100us ,1ms 。
第4讲 C51基本结构程序设计(6)
(a)
例4.1: 输入两个整数,输出其中的大数。 void main( ) { int a,b,max; // 定义数据类型 printf(“\n input two numbers: ”);
//在屏幕上打印(显示)“input two numbers ”,提示用户输入两个数 字
scanf(“%d%d”,&a,&b); // 输入两个数字(如a=3,b=7) max=a; // 赋值(max=3) if (max<b) max=b; //判别大小,满足条件则,赋值(max=7) printf(“max=%d”,max); //打印输出: max=7 }
3.第三种形式为if-else-if形式
前二种形式的if语句一般都用于两个分支的情况。 当有多个分支选择时, 可采用if-else-if语句,其一般形式为: if(表达式1) 语句1; K=? else if(表达式2) K=0 K=1 …… K=n … 语句2; else if(表达式3) 语句3; A0 A1 An … else if(表达式m) 语句m; else ( c) 语句n; 其语义是:依次判断表达式的值,当出现某个值为真时, 则执行其对应 的语句。然后跳到整个if语句之外继续执行程序。 如果所有的表达式均 为假,则执行语句n 。然后继续执行后续程序。
1.
2.
另一种是循环次数未知,这时可根据给定 的问题条件来判断是否继续。
4.3.1 while语句
while语句的一般形式为: while(表达式) 语句; 其中表达式是循环条件,
语句为循环体。
while语句的语义是:计
算表达式的值,当值为真(非
0)时, 执行循环体语句。其 执行过程可用图 (a)表示。
单片机C51语言及程序设计
贰
壹
叁
C51编译器在头文件“REG51.H”中定义了全部sfr/sfr16和sbit变量。 用一条预处理命令#include <REG51.H>把这个头文件包含到C51程序中,无需重新定义即可直接使用它们的名称。
应用举例:
片内数据存储器,片外数据存储器和程序存储器。
通常下划线开头的标识符是编译系统专用的,因此在编写C语言源程序时一般不使用以下划线开头的标识符,而将下划线用作分段符。C51编译器规定标识符最长可达255个字符,但只有前32个字符在编译时有效,因此标识符的长度一般不要超过32个字符。
关键字是一种已被系统使用过的具有特定含义的标识符。用户不得再用关键字给变量等命名。C语言关键字较少,ANSI C标准一共规定了32个关键字,见表
变量名具有字母大小写的敏感性,如SUM和sum代表不同的变量。
【存储类别】 数据类型 【存储器类型】 变量名
变量名不得使用标准C语言和C51语言的关键字。
unsigned char data system_status = 0;
//定义system_status为无符号字符型自动变量,该变量位于data区中且初值为0。
sfr或sfr16型 51MCU中有21个SFR,如何定义与这些单元相关的变量?
例如,sfr P0 = 0x80; //定义P0口地址80H sfr PCON = 0x87; //定义PCON地址87H sfr16 DPTR=0x82; //定义DPTR的低端地址82H
单精度浮点数
for
程序语句
构成for循环结构
goto
程序语句
构成goto转移结构
if
程序语句
C51单片机原理图
GND SW1/51 3 SW2/AVR
HEADER 5X2
四位共阴数码管
R1 1K GND
P2.7 P2.6 P2.5 P0.7 P0.6 P0.5 P0.4 P0.3 P0.2 P0.1 P0.0 P2.4 P2.3 P2.2
P2.7 12 12 9 8 6 9 8 6
D
GND VCC KT1/10K
IC8 位控制 A B C D E F G H P2.6 1 2 3 4 5 6 7 15
VCC
PR2 470-5.1K都可以
GND 1 2 3 4 1 3 5 7
8位LED发光管
P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 NTC1 温度电阻 22P C8 X1 20 19 18 17 16 15 14 13 IO 11 10 9 8 7 6 5 4 3 2 1 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 LED1 红色 P2.7 P3.7 1 P3.6 2 P3.5 3 P3.4 4 P3.3 5 P3.2 6 TXD P3.1 7 RXD P3.0 8 STR P1.7 1 P1.6 2 P1.5 3 P1.4 4 P1.3 5 P1.2 6 P1.1 7 P1.0 8 VCC LED2 红色 LED3 黄色 P2.5 LED4 黄色 LED5 红色 P2.3 LED6 红色 LED7 绿色 P2.1 LED8 绿 1 2 3 R4 1K STR
A P5 2 1 SPEK RL1
标准AT ISP下载接口
P1.5 RESET P1.7 P1.6 VCC 1 2 1 3 5 7 9 2 4 6 8 10 VCC R5 10K
基于C51单片机的000-999计数器
[2]迟忠君.单片机应用技术.北京:北京邮电大学出版社,2016(6):3-5。
三、设计执行过程(请根据以下内容填写对该设计项目用到的理论知识)
1、总体设计框图(画出总体设计框图,并结合设计框图简述工作原理,写不下可另附页)
五、项目结题评审(请根据以下内容做好记录,并提交完整的项目设计报告给老师打分)
1、项目答辩记录(请将老师提的问题和答案记录下来)
问题一:
问题二:
记录人:年月日
2、结题答辩组评审意见(以下由老师填写)
成绩专家组:、年月日
3、项目成绩评定(请将老师提的问题和答案记录下来)
项目教学活页成绩:。
答辩成绩:。
若干
12MHz晶振
1个
0.8mm焊锡
若干
30pF瓷片电容
2个
10uF电解电容
1个
10k电阻
1个
5、焊接图纸和说明(用铅笔或专业软件画出详细的焊接布局设计图,元件引脚标注详细清晰。)
说明:使用ProtellDXP画出pcb布线图,布线图采用双层布线模式,蓝色导线位于底层,红色导线位于顶层。
6、实物效果照片和功能说明(用高清相机拍出实物的效果照片,此页彩色打印,要体现出任务书中的功能效果,图片高清,并附有功能效果的文字说明,可另附页。)
说明:考虑到数码管位置的摆放问题,故将程序的P1和P0对调,P0控制十位数显示,P1口控制百位数显示,其余不变。
四、项目总结(请根据以下内容做工作总结,并提交完整的项目设计报告)
1、学习小结(对学习到的知识点进行总结、归纳)
通过这次000-999计数器的设计,总体来说,我的收获很大。无论是在培养自己的实验动手能力还是在自己独立思考能力方面。在此次点阵设计的过程中,更进一步的熟悉了proteus软件和DXP软件的使用以及加深了对芯片结构的了解和掌握,加强了对c语言的认识,学会了如何拆分数字的百位,十位以及个位,并将其传送到单片机的各个端口,了解了数码管的内部结构,在以后的学习中会有很大的帮助。
基于51单片机数字频率计的设计
基于51单片机数字频率计的设计在电子技术领域中,频率计是一种常见的测试仪器,它可以用来测量信号的频率。
在本文中,我们将通过介绍基于51单片机数字频率计的设计实现来了解它的工作原理和设计流程。
1. 确定设计需求在进行任何项目之前,我们需要明确自己的设计需求。
对于频率计而言,它的主要需求就是准确地测量信号的频率。
因此,我们需要确定我们需要测量的频率范围和精确度。
2. 确定硬件设计在确定了设计需求之后,我们需要确定硬件设计。
对于数字频率计而言,它需要一个计数器来计算信号的脉冲数量。
在本设计中,我们采用74LS90计数器芯片来实现计数功能。
我们还需要一个51单片机来读取计数器的计数值,并将其转换为对应的频率值。
另外,我们还需要硬件板、LCD显示屏、按键等元件来搭建数字频率计的电路结构。
3. 确定软件设计硬件设计完成后,我们需要开发相应的软件来实现我们的需求。
在本设计中,我们使用KEIL C51软件来编写51单片机的程序。
编写软件的主要步骤是读取计数器计数值、计算出对应的频率值、将频率值显示在LCD屏幕上,并实现按键控制。
我们需要将这些步骤按照程序流程依次实现。
4. 进行测试在软件编写完成后,我们需要对数字频率计进行测试,以确保其满足我们的需求。
我们可以使用信号发生器给数字频率计输入不同频率的信号,然后观察LCD屏幕上显示出来的相应频率值是否准确。
如果测试结果不满足我们的需求,则需要对硬件或软件进行优化或调试,直到数字频率计能够正常工作为止。
总之,基于51单片机的数字频率计设计是一个较为简单的电子设计项目。
通过上述步骤的详细介绍,我们了解了数字频率计的设计流程和工作原理,并明确了设计中需要注意的细节和注意事项。
希望能够对大家理解数字频率计的设计过程有所帮助。
基于AT89C51单片机的频率计设计
基于AT89C51单片机的频率计设计频率计是一种测量信号频率的仪器。
在工业自动化、仪器仪表和电子实验等领域广泛应用。
本文将基于AT89C51单片机设计一个简单的频率计。
一、设计原理频率计的工作原理是通过计数单位时间内输入信号的脉冲数量,并将其转化为频率进行显示。
本设计使用AT89C51单片机作为控制核心,采用外部中断引脚INT0作为计数脉冲输入口,通过对计数器的计数值进行处理,最终转化为频率并在LCD1602液晶屏上进行显示。
二、硬件设计硬件电路主要包括AT89C51单片机、LC1602液晶显示屏、脉冲输入引脚INT0,以及供电电路等。
其中,AT89C51单片机的P0口用于与LC1602液晶屏的数据口连接,P2口用于与液晶屏的控制口连接。
脉冲输入引脚INT0连接到外部信号源,通过中断请求实现计数器的计数功能。
液晶显示屏的VDD和VDDA引脚接5V电源,VSS和VSSA引脚接地,RW引脚接地,RS引脚接P2.0,E引脚接P2.1,D0-D7引脚接P0口。
三、软件设计软件设计主要包括初始化设置、中断服务程序、计数器计数和频率转换、液晶屏显示等模块。
1.初始化设置:首先设置P0和P2为输出端口,中断引脚INT0为外部触发下降沿触发中断,计数器为初始值0。
2.中断服务程序:中断服务程序负责处理外部脉冲输入引脚INT0的中断请求。
每当INT0引脚检测到下降沿时,计数器加13.计数和频率转换:在主函数中,通过读取计数器的值并根据单位时间计算频率。
通过AT89C51单片机的定时器模块,我们可以设置一个单位时间进行计数。
在单位时间结束后,将计数器的值除以单位时间得到频率。
4.液晶屏显示:通过P0口向液晶屏的数据口发送频率值,并通过P2口向液晶屏的控制口发送控制信号,完成频率的显示。
四、测试结果将生成的二进制固件烧录到AT89C51单片机中,将脉冲信号输入到INT0引脚,即可在LCD1602液晶显示屏上看到实时的频率值。
等精度频率测量(c51)
等精度频率测量
2012.4.6
KX
康芯科技
等精度频率计设计
在此完成的设计项目可达到的指标为:
(1)频率测试功能:测频范围0.1Hz~100MHz。测频精度:测 频全域相对误差恒为百万分之一。 (2)脉宽测试功能:测试范围0.1μs~1s,测试精度0.01μs 。 (3)占空比测试功能:测试精度1%~99%。
KX
康芯
KX
康芯科技
等精度频率法测量误差 Nx计数无误差, Ns最多相差 一个脉冲 结论:等精度频率法的相对误 差与被测信号频率无关,仅 与fs有关。闸门时间越长, 标准频率越高,测量相对误 差越小。
fx
Nx Nx 1 N x fs T NsTs Ns
f x N x Ts fx Nx Ts
KX
康芯科技
测周期(低频测量)
KX
康芯科技
测量公式 测量误差
Nx Nx 1 fx N x fs T NsTs Ns
f x N x Ts N x 1 fx Nx Ts Nx Nx
第一项为计数误差,第二项为晶振误差 f=1MHz,闸门T=1s,δ=10-6 f=500kHz, δ=10-6,则T=N/f=2s F=10Hz, δ=10-6,则T=N/f=10-6/10=100000s
测频率 测周期 测相位 测脉冲宽度
被测信号 放大整形 晶振 分频器
KX
康芯科技
门
控
计数
显示
0.01s, 0.1s, 1s, 10s
KX
康芯科技
测频法(高频测量>1MHz)
输入fx 门控信号T & 计数N fx=N/T
数字频率计(51单片机)
数字频率计(51单片机)数字频率计(51单片机)数字频率计(Digital Frequency Counter)是一种常用的电子测量仪器,可用于测量信号的频率。
在本文中,我们将介绍如何使用51单片机实现一个简单的数字频率计。
一、原理简介数字频率计的基本原理是通过计算信号波形周期内的脉冲数来确定频率。
在实际应用中,我们通常使用51单片机作为微控制器,通过计数器和定时器模块来实现频率计算。
二、硬件设计1.信号输入首先,我们需要将待测信号输入到频率计中。
可以使用一个输入接口电路,将信号连接到51单片机的IO口上。
2.计时模块我们需要使用51单片机的定时器/计数器来进行计时操作。
在这里,我们选择使用定时器0来进行计数,同时可以利用定时器1来进行溢出次数的计数,以扩展计数范围。
3.显示模块为了显示测量结果,我们可以使用数码管、LCD液晶显示屏等显示模块。
通过将结果以可视化的方式呈现,方便用户进行观察和读数。
三、软件设计1.定时器配置首先,我们需要对定时器进行配置,以确定计时器的计数间隔。
通过设置定时器的工作模式、计数范围和时钟频率等参数,可以控制定时器的计数精度和溢出时间。
2.中断服务程序当定时器溢出时,会触发中断,通过编写中断服务程序,实现对计数器的相应操作,例如将计数值累加,记录溢出次数等。
3.数字频率计算根据计数器的值和溢出次数,我们可以计算出信号的频率。
通过简单的公式计算,即可得到测量结果。
四、实验步骤1.搭建硬件电路,将待测信号连接到51单片机的IO口上,并连接显示模块。
2.根据硬件设计要求,配置定时器的工作模式和计数范围。
3.编写中断服务程序,实现对计数器的相应操作。
4.编写主程序,实现数字频率计算和显示。
5.下载程序到51单片机,进行测试。
五、实验结果与分析通过实验,我们可以得到信号的频率测量结果,并将结果以数码管或LCD屏幕的形式进行显示。
通过对比实际频率和测量频率,可以评估数字频率计的准确性和稳定性。
基于单片机c51频率计设计程序
#include<reg52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intvoid display10(uchar m, uchar n, uchar *p);//汉字显示函数void lcd_int(void);//液晶初始化函数void lcd_set(void);//LCD功能设置函数void write(uchar command);//LCD写指令函数void read(uchar data0);//LCD写数据函数void lcd_clear(void);//LCD清屏函数void maikuan(void);//脉宽计算函数void ini(void);//定时器中断系统初始化函数void t0(void);//定时器0中断服务函数void delay(uint m);//延时函数uchar keyscan(void);//键扫函数void display(void);//频率显示函数void display1(void);//正脉宽计算显示函数void display2(void);//负脉宽计算显示函数void cemaikuan(void);//测脉宽函数void cepinlv(void);//测频率函数void cezhouqi(void);//测周期函数void zhankongbi(void);//测占空比函数void zhouqi(void);//周期计算显示函数void bi(void);//占空比计算显示函数void pinlv(void);//测频率函数(以f=1/T计算法获得)uchar measure() ;//测频率函数/********************LCD控制信号定义********************/sbit AA=P3^5; // 外部被测信号输入口sbit rs = P2^0;sbit rw = P2^1;sbit en = P2^2;sbit psb = P2^3;sbit ret = P2^5; //可以不用接uchar a; //a计数溢出次数uchar command;unsigned long b,z,j,h,hz,rate,count;uchar code yejingtable[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x39};//0--9void main(void){lcd_int();lcd_set();lcd_clear();ini();while(1){uchar A;A=keyscan();switch(A){case 0x88:TR0=0;TR1=0;ET0=1;lcd_clear();cemaikuan(); //测脉宽break;case 0x84:TR0=0;TR1=0;ET0=1;lcd_clear();zhankongbi(); //测占空比break;case 0x82:TR0=0;TR1=0;ET0=1;lcd_clear();cezhouqi(); //测周期break;case 0x81:TR0=0;TR1=0;lcd_clear();cepinlv(); //利用周期测频,适合测低频break;case 0x11: TR0=1;TR1=1;lcd_clear();delay(60000);display(); //计数器测频,适合测高频}}}/***********************测脉宽函数******************/void cemaikuan(void){display10(1,3,"测脉宽");display10(3,1,"正脉宽");display10(2,1,"负脉宽");while(AA);while(!AA);TR0=1;while(AA);TR0=0;delay(10000);display1();z=b;a=0;b=0;TH0=0;TL0=0;while(!AA);while(AA);TR0=1;while(!AA);TR0=0;delay(10000);display2();h=b;b=0;a=0;TH0=0;TL0=0;}/******************************正脉宽计算显示函数***************************/ void display1(void){uchar m1,m2,n1,n2,z1,z2;maikuan();m1=b/100000;n1=b/10000%10;m2=b/1000%10;n2=b/100%10;z1=b/10%10;z2=b%10;write(0x8c);read(yejingtable[m1]);read(yejingtable[n1]);read(yejingtable[m2]);read(yejingtable[n2]);read(yejingtable[z1]);read(yejingtable[z2]);read(0x75);read(0x73);}/******************************负脉宽计算显示函数***************************/ void display2(void){uchar m1,m2,n1,n2,z1,z2;maikuan();m1=b/100000;n1=b/10000%10;m2=b/1000%10;n2=b/100%10;z1=b/10%10;z2=b%10;write(0x94);read(yejingtable[m1]);read(yejingtable[n1]);read(yejingtable[m2]);read(yejingtable[n2]);read(yejingtable[z1]);read(yejingtable[z2]);read(0x75);read(0x73);}/******************************测占空比函数***************************/ void zhankongbi(void){display10(1,3,"测占空比");display10(3,1,"正占空比:");display10(2,1,"负占空比:");while(AA);while(!AA);TR0=1;while(AA);TR0=0;delay(10000);maikuan();z=b;a=0;b=0;TH0=0;TL0=0;while(!AA);while(AA);TR0=1;while(!AA);TR0=0;delay(10000);maikuan();h=b;b=0;a=0;TH0=0;TL0=0;bi();}/******************************占空比计算显示函数***************************/ void bi(void){float x,y,q;uint m1,m2;uchar n1,n2,n3,z1,z2,z3;j=z+h;q=j/1.0;x=z/q;y=h/q;m1=x*1000;m2=y*1000;n3=m1/100;n2=m1/10%10;n1=m1%10;z3=m2/100;z2=m2/10%10;z1=m2%10;write(0x8c);read(yejingtable[n3]);read(yejingtable[n2]);read(0x2e);read(yejingtable[n1]);read(0x25);write(0x94);read(yejingtable[z3]);read(yejingtable[z2]);read(0x2e);read(yejingtable[z1]);read(0x25);}/***************************测周期函数**********************/void cezhouqi(void){display10(1,3,"测周期");while(AA);while(!AA);TR0=1;while(AA);TR0=0;delay(10000);maikuan();z=b;a=0;b=0;TH0=0;TL0=0;while(!AA);while(AA);TR0=1;while(!AA);TR0=0;delay(10000);maikuan();h=b;b=0;a=0;TH0=0;TL0=0;zhouqi();}/******************************周期计算显示函数***************************/ void zhouqi(void){uchar m1,m2,n1,n2,z1,z2;j=z+h;m1=j/100000;n1=j/10000%10;m2=j/1000%10;n2=j/100%10;z1=j/10%10;z2=j%10;write(0x90);read(yejingtable[m1]);read(yejingtable[n1]);read(yejingtable[m2]);read(yejingtable[n2]);read(yejingtable[z1]);read(yejingtable[z2]);read(0x75);read(0x73);}/********************测频率函数*****************/void cepinlv(void){display10(1,3,"测频率");while(AA);while(!AA);TR0=1;while(AA);TR0=0;delay(10000);maikuan();z=b;a=0;b=0;TH0=0;TL0=0;while(!AA);while(AA);TR0=1;while(!AA);TR0=0;delay(10000);maikuan();h=b;b=0;a=0;TH0=0;TL0=0;pinlv();}/******************************频率计算显示函数***************************/ void pinlv(void){uchar m1,m2,n1,n2,z1,z2;j=z+h;hz=1000000/j;m1=hz/100000;n1=hz/10000%10;m2=hz/1000%10;n2=hz/100%10;z1=hz/10%10;z2=hz%10;write(0x90);read(yejingtable[m1]);read(yejingtable[n1]);read(yejingtable[m2]);read(yejingtable[n2]);read(yejingtable[z1]);read(yejingtable[z2+1]);read(0x48);read(0x7a);}/******************键扫函数*********************/uchar keyscan(void){uchar scan,tmp;P1=0xf0; //发全行0扫描码if((P1&0xf0)!=0xf0) //若有键按下{delay(100); // 延时去抖if((P1&0xf0)!=0xf0) //延时再判键是否还按下{scan=0xfe;while((scan&0x10)!=0) //逐行扫描{P1=scan; //输出行扫描码if((P1&0xf0)!=0xf0) //本行有键按下{tmp=(P1&0xf0)|0x0f;return ((~scan)|(~tmp));} //还回键值else scan=(scan<<1)|0x01; //行扫描码左移一位}}}return (0); //无键按下,还回0}/******************延时函数***********************/void delay(uint m){while(--m);}/******************脉宽计算函数*********************/ void maikuan(void){b=a*50000+TH0*250+TL0;}/******************LCD初始化函数*********************/ void lcd_int(void){ret=0;delay(10);ret=1;_nop_();psb=1;_nop_();}/******************LCD功能设置函数******************/ void lcd_set(void){command=0x34;write(command);command=0x30;write(command);command=0x01;write(command);command=0x06;write(command);command=0x0c;write(command);}/*******************清屏函数*********************/ void lcd_clear(void){command=0x01;write(command);command=0x34;write(command);command=0x30;write(command);}/*****************写指令函数********************/void write(uchar command){delay(100);rs=0;rw=0;P0=command;en=1;_nop_();_nop_();en=0;}/*****************写数据函数********************/void read(uchar data0){delay(100);rs=1;rw=0;P0=data0;en=1;_nop_();_nop_();en=0;}/*****************汉字显示函数******************/void display10(uchar m, uchar n, uchar *p){ //m表示行n表示列都为首地址switch (m){case 1:write(0x7f+n); break; //液晶第一行case 2:write(0x8f+n); break; //0x90+(x-1)case 3:write(0x87+n); break;case 4:write(0x97+n); break;default:break;}while(*p)read(*p++);}/*************************定时器中断系统初始化函数**********************/void ini(void){TMOD=0X51; //设置定时器0定时50ms,定时器1计数;TH0=(65536-50000)/256; //定时时间为50msTL0=(65536-50000)%256;TH1=0X00; // 计数TL1=0X00; //TR1=0; //开定时器1计数TR0=0; //开定时器0定时ET0=1; //开定时器0中断EA=1; //开总中断}/********************定时器0中断服务函数***********************/ void t0(void) interrupt 1 using 2{TH0=(65536-50000)/256; //定时时间为50msTL0=(65536-50000)%256;a++;measure();}/*********************** 频率显示函数*******************/void display(void){uchar m1,m2,n1,n2,z1,z2;m1=rate/100000;n1=rate/10000%10;m2=rate/1000%10;n2=rate/100%10;z1=rate/10%10;z2=rate%10;display10(1,3,"测频率");write(0x88); //显示首地址read(yejingtable[m1]);read(yejingtable[n1]);read(yejingtable[m2]);read(yejingtable[n2]);read(yejingtable[z1]);read(yejingtable[z2]);read(0x48); //Hread(0x5a); //z}/********************测频函数*******************/ uchar measure(){{TR0=0;TR1=0;count=TH1*256+TL1; //读出定时器一的计数rate=count*20;TH1=0X00; // 计数TL1=0X00;}TR0=1;TR1=1;return(rate);}。
51简易频率计课程设计
51简易频率计课程设计一、课程目标知识目标:1. 学生能理解并掌握简易频率计的基本原理和功能。
2. 学生能运用所学的电子元件和电路知识,设计并搭建一个简易频率计。
3. 学生能通过实验和数据分析,掌握频率、周期等基本物理概念。
技能目标:1. 学生能够运用所学知识,独立完成简易频率计的搭建和调试。
2. 学生能够运用电子测量工具,进行数据采集、处理和分析。
3. 学生能够通过团队协作,解决实际操作过程中遇到的问题。
情感态度价值观目标:1. 学生培养对电子科技的兴趣和热情,提高创新意识和动手能力。
2. 学生在实践过程中,体验科学探究的乐趣,增强对科学研究的信心和好奇心。
3. 学生通过团队协作,培养合作精神、沟通能力和共享成果的意识。
本课程针对五年级学生,结合电子技术基础知识,以简易频率计为载体,旨在让学生在动手实践中掌握基本原理和技能。
课程注重培养学生的实际操作能力、团队协作能力和科学素养,为后续深入学习电子技术打下坚实基础。
通过对课程目标的分解和实现,教师可以更好地进行教学设计和评估,确保学生在知识、技能和情感态度价值观方面的全面发展。
二、教学内容1. 简易频率计原理:介绍频率、周期的基本概念,讲解简易频率计的工作原理和电路组成。
相关教材章节:第五章第三节“频率与周期”;第六章第一节“简易频率计的原理与设计”。
2. 电子元件认知:学习常用电子元件(如电阻、电容、二极管、三极管等)的原理和功能。
相关教材章节:第三章“常用电子元件及其特性”。
3. 电路设计与搭建:学习并实践简易频率计电路的设计方法,掌握电路搭建和调试技巧。
相关教材章节:第六章第二节“简易频率计电路设计”;第六章第三节“电路搭建与调试”。
4. 数据采集与处理:运用电子测量工具进行数据采集,学习数据处理和分析方法。
相关教材章节:第四章“数据采集与处理”。
5. 团队协作与成果展示:分组进行项目实践,培养学生团队协作能力,展示并分享项目成果。
相关教材章节:第二章“科学探究方法与实践”。
c51单片机计数器触发机制
c51单片机计数器触发机制
摘要:
一、概述C51单片机计数器
二、C51单片机计数器的工作原理
1.触发机制
2.计数器的工作模式
三、应用实例及电路设计
1.手动计数器设计
2.显示电路
四、程序编写与调试
1.编写计数器程序
2.调试与优化
正文:
一、概述C51单片机计数器
C51单片机是一款广泛应用于嵌入式系统的微控制器,其内部集成了多种功能模块,其中之一便是计数器。
C51单片机计数器可用于计时、计数等应用,为我们的生活和工作带来便利。
二、C51单片机计数器的工作原理
1.触发机制:C51单片机计数器可以通过外部触发信号进行计数。
当触发信号发生时,计数器进行加1操作。
触发信号的来源可以是各种传感器、按键等。
2.计数器的工作模式:C51单片机计数器支持多种工作模式,如定时器模式、外部中断模式等。
根据实际应用需求选择合适的工作模式。
三、应用实例及电路设计
1.手动计数器设计:通过连接一个共阴数码管,实现0-99的计数。
硬件电路图如图所示。
2.显示电路:使用74LS47芯片驱动共阴数码管显示,单片机输出数据控制。
四、程序编写与调试
1.编写计数器程序:使用C语言编写计数器程序,实现触发计数、显示等功能。
2.调试与优化:使用Keil UVision4软件进行程序调试,确保计数器功能正常运行。
如有问题,对程序进行优化调整。
通过以上步骤,我们可以充分利用C51单片机计数器功能,实现各种计时、计数等应用。
第5章 C51定时器计数器程序设计
T
T
方式控制寄存器TMOD
“天华杯”
教师培训
温锦辉
8位分为两组,高4位控制T1,低4位控制T0。 位分为两组, 位控制T1, 位控制T0。 T1 T0 GATE—— ——门控位 (1)GATE——门控位 TRX(X=0,1)来启动定时器/计数器运行。 0:以TRX(X=0,1)来启动定时器/计数器运行。 用外中断引脚(INT (INT0 INT1 上的高电平和TRX TRX来启动定 1:用外中断引脚(INT0*或INT1*)上的高电平和TRX来启动定 时器/计数器运行。 时器/计数器运行。 ——工作方式选择位 (2)M1、M0——工作方式选择位 M1 M0 工 作 方 式 方式0 13位定时器 计数器。 位定时器/ 0 0 方式0,13位定时器/计数器。 方式1 16位定时器 计数器。 位定时器/ 0 1 方式1,16位定时器/计数器。 方式2 1 0 方式2,8位常数自动重新装载 方式3 仅适用于T 分成两个8 1 1 方式3,仅适用于T0,T0分成两个8 位计数器, 停止计数。 位计数器,T1停止计数。 ——计数器模式和定时器模式选择位 (3) C/T*——计数器模式和定时器模式选择位 定时器模式。 0:定时器模式。 计数器模式。 1:计数器模式。
“天华杯” 教师培训 温锦辉
5.2 定时器/计数器工作模式0的C51程序设计 • 51系列单片机的定时器/计数器工7)计数器(TH0或 TH1)和一个具有32位分频的低8位计数器中的 (TL0或TL1)的低5位(0~4)组成。
“天华杯”
教师培训
温锦辉
5.2.1 定时器/计数器工作模式0
“天华杯”
教师培训
温锦辉
5.2.2 定时器/计数器模式0的程序设计
• 定时器/计数器模式0的程序设计可以按照前面介绍的初始 化步骤来实现。假定8051单片机(或者其它兼容型号单片 机)外接6MHz晶振,需要在P0.2端口输出频率为500Hz的方 波,即周期为2ms。此时可以采用定时器T0工作于模式0, 使定时器产生1ms的定时,通过定时中断来产生P0.2端口的 方波信号输出。 • 由于采用了6MHz的晶振,因此单片机的机器周期为 12÷6MHz=2×10-6s=2µs。根据前面介绍的定时初值的计数 方法,定时时间=1ms=1×10-3=(213-X)×2×10-6,因此定 时器初值X=7692=1E0CH。则根据工作模式0的特点,其为13 位定时器,定时器T0的初值应该设置为TH0=0F0H,TL0=0CH。
c51的简易计算器(已通过实测)初学者参考
清零键
功能键
状态清零
根据上次功能键和输 入的数据计算结果
本次功能 键?
结果送显示缓冲 结果送显示缓冲
等待数值输入
等待数值输入
数值送显示缓冲
结果送显示缓冲 等待数值输入
LCD 显示
5
五 硬软件的调试及方法
我个人遇到的主要问题出现在 LCD1602 上,要不是我自己买了块新的 LCD 恐怕我的结 论,就只能在软件仿真实现了。
下面是源代码: #include<reg51.h> #define CLEARSCREEN
LCD_write_command(0x01)
8
#define uint unsigned int #define uchar unsigned char
/**************定义接口************************/
{
if(n<10)//键值小于 10
{
t1=t1*10+n;
LCD_write_command(0x00);//写命令语句
LCD_write_dat(mayuan[n]);//写数据函数
}
else
{
if(n==10){LCD_init();t1=0;t2=0,t=0;k=1;}
else{
if(n<15){
t=t2*t1; break; case 13: t=t2-t1; break; case 14: t=t2+t1; break; } if(t<=9){ LCD_write_command(0x00); LCD_write_dat(t+48);} if(t>9) {
六 实验结果与性能达标
单片机原理及接口技术(C51编程)定时器计数器的工作原理及应用
7.2.2 方式1
方式1和方式0差别仅仅 在于计数器的位数不同,方 式1为16位计数器,由THx高 8位和TLx低8位构成(x = 0, 1),方式0则为13位计数器, 有关控制状态位含义(GATE、 C/T* 、TFx、TRx)与方式0 相同。
7.2.3 方式2
方式0和方式1最大特点是计数溢出后,计数器为全0。 因此在循环定时或循环计数应用时就存在用指令反复装入计 数初值的问题,这会影响定时精度,方式2就是为解决此问 题而设置的。
7.2.1 方式0
GATE位状态决定定时器/计数器运行控制取决于TRx一 个条件,还是取决于TRx和INTx*引脚状态两个条件。
GATE=0时,A点(见图7-4)电位恒为1,B点电位仅 取决于TRx状态。TRx=1,B点为高电平,控制端控制 电子开关闭合,允许T1(或T0)对脉冲计数。TRx=0, B点为低电平,电子开关断开,禁止T1(或T0)计数。
【例7-1】 在AT89S51的 P1口上接有8只 LED,原理电路 见图7-13。采 用T0方式1的定 时中断方式,使 P1口外接的8只 LED每0.5s闪亮 一次。
图7-13 方式1定时 中断控制LED闪亮
7.4.1 P1口控制8只LED每0.5s闪亮一次
(1)设置TMOD寄存器
T0工作在方式1,应使TMOD寄存器的M1、M0=01; 应设置C/T*=0,为定时器模式;对T0的运行控制仅由TR0 来控制,应使相应的GATE位为0。定时器T1不使用,各相关 位均设为0。所以,TMOD寄存器应初始化为0x01。
T0;TR0=0,则停止定时器T0定时。
7.4.1 P1口控制8只LED每0.5s闪亮一次
参考程序:
#include<reg51.h> char i=100; void main () {
《频率计数器》电路原理图
《频率计数器》电路原理图1《频率计数器》产品电路元器件清单一、频率计的重要作用频率是表示单位时间波形振动的次数,与周期互为倒数,是最基本的电路测量参数之一。
所以电子工程师经常需要测量频率、时间间隔、相位和对事件计数,电子设备的测试离不开频率计数器或它的同类产品。
这些仪器能为研发提供精准的电路分析数据,能大大提高生产效率并为维修提供低成本和便携性的测试工具。
二、本简易频率计数器装置测量功能、性能1、功能由函数信号发生器输出5V,频率为1~99999Hz 的信号,包括正弦波信号、矩形波信号或者三角波信号等,接到频率计的输入端,频率计的数码管可显示该信号的频率,单位为Hz。
2、性能频率计的频率测量范围是,频率为1~99999Hz 的信号。
三、工作原理简介1、电源部分根据电路原理图连接模块后,接人5Ⅴ电源,经过VD1 防接反二极管保护,再经过滤波后,发光二极管LED1 亮,表示正确接人电源。
2、频率计数原理(1)信号输入要测量信号的幅值控制在5Ⅴ以内,频率在1Hz~1MHz 范围内(可以是正弦波、三角形波或矩形波),并把它接人电路的“信号输人”端。
(2)频率计数由IC8 脉冲信号发生器的Q14 提供 1 个频率为2Hz 的信号给IC7 十进制计数器的CP 端口,经由CD4017 处理后由Q0 输出,分别送到两个IC1 和IC4 三位计数器的MR 端口,当Q输出的脉冲信号为高电平时,该信号对IC1 和IC4 清零,Q0 脉冲信号在0.5s 后变为低电平,低三位的计数器IC1 开始对输入信号进行计数。
1s 后IC7 的CD4017 中Q3(实际包含Q3~Q9)端口输出的脉冲(高电平时)送到IC1 和IC4 的LE 端,对IC1 和IC4 进行锁存。
此时,数码管显示的数值即为1s 内信号的计数值,也就是要测量的信号频率。
该数值锁存5s 后,CD4017 的Q0 又输出高电平,如此循环,频率计数器显示的始终是信号的频率。
c51汇编程序设计实验
c51汇编程序设计实验C51汇编程序设计实验C51汇编是一种嵌入式系统中常用的汇编语言,广泛应用于单片机的开发和嵌入式系统的设计中。
本文将介绍C51汇编程序设计实验的相关内容,包括实验目的、实验步骤、实验结果及分析等。
一、实验目的C51汇编程序设计实验的目的是通过编写汇编语言程序,实现特定的功能。
通过这个实验,可以加深对C51汇编语言的理解,锻炼编程能力,培养解决问题的能力。
二、实验步骤1. 确定实验要求:首先,需要明确实验的要求和功能。
例如,实验要求设计一个计数器,能够实现从0到9的循环计数。
2. 编写程序:根据实验要求,使用C51汇编语言编写程序。
程序可以包括初始化、计数、显示等功能模块。
3. 调试程序:编写完程序后,需要进行调试,确保程序能够正确运行。
可以使用仿真器或者实际的硬件进行调试。
4. 测试程序:在实验完成后,需要进行程序的测试。
可以输入不同的测试数据,观察程序的输出是否符合预期结果。
5. 分析结果:对于测试结果进行分析,判断程序的运行是否正确。
如果有错误,需要进行错误的定位和修正。
三、实验结果及分析在本次实验中,我们设计了一个计数器程序,能够实现从0到9的循环计数。
经过调试和测试,程序运行正常,实现了预期的功能。
通过这个实验,我们对C51汇编语言的使用有了更深入的了解。
通过编写程序,我们学会了如何使用C51汇编语言实现特定的功能。
同时,我们也锻炼了编程能力和解决问题的能力。
总结:C51汇编程序设计实验是一项很有挑战性的任务,要求我们熟练掌握C51汇编语言的语法和用法。
通过这个实验,我们不仅可以加深对C51汇编语言的理解,还可以培养解决问题的能力。
因此,我们应该认真对待这个实验,认真编写程序,仔细调试和测试,确保程序能够正确运行。
在以后的学习和工作中,C51汇编语言将会是我们经常使用的工具之一。
通过这个实验,我们可以为以后的学习和工作打下良好的基础,提高自己的编程能力和解决问题的能力。
单片机c51计数器ppt
2
6.1.1
• •
定时器/ 定时器/计数器的结构
•
8051单片机内部设有两个 位可编程定时器 计数器,简称 单片机内部设有两个16位可编程定时器 计数器, 单片机内部设有两个 位可编程定时器/计数器 为定时器0(T0)和定时器 和定时器1(T1)。 为定时器 和定时器 。 16位的定时器 计数器分别由两个 位寄存器组成,即:T0 位的定时器/计数器分别由两个 位寄存器组成, 位的定时器 计数器分别由两个8位寄存器组成 构成, 由 构成。 由TH0和TL0构成,T1由TH1和TL1构成。每个寄存器均可 和 构成 和 构成 单独访问,这些寄存器是用于存放定时初值或计数初值的。 单独访问,这些寄存器是用于存放定时初值或计数初值的。 有一个8位的定时器方式寄存器 位的定时器方式寄存器TMOD和一个 位的定时器 和一个8位的定时器 有一个 位的定时器方式寄存器 和一个 控制寄存器TCON。这些寄存器之间是通过内部总线和控 控制寄存器 。 制逻辑电路连接起来的,定时器/计数器的工作方式 计数器的工作方式、 制逻辑电路连接起来的,定时器 计数器的工作方式、定时 时间和启停控制通过由指令来确定这些寄存器的状态来实 主要用于设定定时器的工作方式 现。TMOD主要用于设定定时器的工作方式,TCON主要 主要用于设定定时器的工作方式, 主要 用于控制定时器的启动与停止 并保存T0、 的 定时器的启动与停止, 用于控制定时器的启动与停止,并保存 、T1的溢出和中 断标志。 断标志。
定时器控制寄存器TCON的作用是控制定时器的启动与停 的作用是控制定时器的启动与停 定时器控制寄存器 并保存T0、 的溢出和中断标志 的溢出和中断标志。 止,并保存 、T1的溢出和中断标志。 TCON的格式 的格式: 的格式
各位的功能说明: 各位的功能说明: (1) TF1(TCON.7):定时器 溢出标志位。当定时器 计满溢出 溢出标志位。 :定时器1溢出标志位 当定时器1计满溢出 由硬件自动使TF1置1,并申请中断。对该标志位有两 时,由硬件自动使 置 ,并申请中断。 种处理方法,一种是以中断方式工作, 种处理方法,一种是以中断方式工作,即TF1置1并申请中 置 并申请中 响应中断后,执行中断服务程序, 断,响应中断后,执行中断服务程序,并由硬件自动使 TF1清0;另一种以查询方式工作,即通过查询该位是否为 清 ;另一种以查询方式工作, 1来判断是否溢出,TF1置1后必须用软件使 来判断是否溢出, 后必须用软件使TF1清0。 来判断是否溢出 置 后必须用软件使 清 。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验报告
课程名称C51单片机实习
专业班级电子1142
姓名赵宜琳
学号1104451209
电气与信息学院
和谐勤奋求是创新
实验教学考核和成绩评定办法
1.课内实验考核成绩,严格按照该课程教学大纲中明确规定的比重执行。
实验成绩不合格者,不能参加课程考试,待补做合格后方能参加考试。
2.单独设立的实验课考核按百分制评分,考核内容应包括基本理论、实验原理和实验。
3.实验考核内容包括:1)实验预习;2)实验过程(包括实验操作、实验记录和实验态度、表现);3)实验报告;权重分别为0.2 、0.4 、0.4;原则上根据上述三个方面进行综合评定。
学生未取得1)和2)项成绩时,第3)项成绩无效。
4.实验指导教师应严格按照考核内容分项给出评定成绩,并及时批改实验报告,给出综合成绩,反馈实验中出现的问题。
实验成绩在教师手册中有记载。
实验报告主要内容
一.实验目的
二.实验仪器及设备
三.实验原理
四.实验步骤
五.实验记录及原始记录
六.数据处理及结论
七.实验体会(可选项)
注:1. 为了节省纸张,保护环境,便于保管实验报告,统一采用A4纸,实验报告建议双面打印(正文采用宋体五号字)或手写,右侧装订。
2. 实验类别指验证、演示、综合、设计、创新(研究)、操作六种类型实验。
3. 验证性实验:是指为了使学生巩固课程基本理论知识而开设的强调演示和证明,注重实验结果(事
实、概念或理论)的实验。
4. 综合性实验:是指实验内容涉及本课程的综合知识或本课程相关的课程知识的实验。
5. 设计性实验:是指给定实验目的、要求和实验条件,由学生自行设计实验方案并加以实现的实验。
实验题目单片机控制的花样流水灯设计
实验室电子实验室实验时间年月日实验类别同组人数
成绩指导教师签字:姜航
一、实验目的
1)掌握51系列单片机的基本硬件结构及工作原理
2)掌握51系列单片机的C语言及基本程序设计方法
3)学习并掌握使用51系列单片机开发控制系统的基本步骤
二、实验装置
Proteus软件,keil软件
三、实验内容
1.proteus图
2.根据实验目的,画出程序流程图。
子程序如图:
外部中断0服务如图:
定时中断服务程序外部中断1服务程序
3.根据程序流程图,编写程序。
#include<stdio.h>
sbit P10=P1^0;//定义位变量
sbit P11=P1^1;
unsigned char a;//定义a位流水灯变化状态
int flag=0; //记录流水灯变化标志位
int timecout=0; //定时次数
int cout=1; //定时次数判断
unsigned char m=5;//
unsigned char funcl(unsigned char a, int n) //左移n位{unsigned char y,z;
y=a>>(8-n);
z=a<<n;
a=y|z;
return a;
}
unsigned char flashhalf(unsigned char a) //半闪{ a=~a;
return a;
}
unsigned char funcr(unsigned char a,n) //右移n位{ unsigned char y,z;
y=a<<(8-n);
z=a>>n;
a=y|z;
return a;
}
unsigned char flashall(unsigned char a) //全闪
{ a=~a;
return a;
}
void main()
{ TCON=TCON|0x15; //中断初始化
TMOD=0x01; //设置定时器T0模式1
IE=0x87; //开中断
a=0x01;
while(1)
{cout=m*100+1 ;
if(timecout==cout)
{P0=~a;
timecout=0;
switch(flag)
{case 0:a=funcl(a,1); break; //调用1个LED闪动右移方式子程序
case 1:a=funcl(a,2); break; //调用2个LED闪动右移方式子程序
case 2:a=funcl(a,3); break; //调用3个LED闪动右移方式子程序
case 3:a=flashall(a); break;//调用半闪子程序
case 4:a=funcr(a,1); break; //调用1个LED闪动右移方式子程序
case 5:a=funcr(a,2); break; //调用2个LED闪动右移方式子程序
case 6:a=funcl(a,3); break; //调用3个LED闪动右移方式子程序
case 7:a=flashall(a); break;//调用全闪子程序
default:{flag=0;a=0x01;}break;}
}
}
}
//外部中断0服务程序
void interrupt0() interrupt 0 using 0
{
{flag=flag+1; //下一个状态变化
switch(flag)
{ case 0:a=0x01;break; //流水灯变化初值
case 1:a=0x03;break;
case 2:a=0x07;break;
case 3:a=0x0f;break;
case 4:a=0x80;break;
case 5:a=0xc0;break;
case 6:a=0x70;break;
case 7:a=0xff;break;
default:{flag=0;a=0x01;}break;
}
}
}
//外部中断1服务程序
void interrupt1() interrupt 2 using 2
{ P1=0xff;
if(P10==0) //减速
{m=m+1;}
if(P11==0) //加速
{m=m-1;}
}
//定时中断服务程序
void time0() interrupt 1 using 1
{ TH0=(65536-5000)/255;//定时TH0,TL0装值
TL0=(65536-5000)%255;
timecout=timecout+1 ;
}
4.把程序导入proteus,运行得到结果。
正序流水灯1个正序流水灯2个正序流水灯3个半闪
反序流水灯1个反序流水灯2个
反序流水灯3个全闪
四、实验总结
本次的单片机实习的课题是花样流水灯设计,通过查找相关资料,然后对老师所给的程序不断的修改,最终做出了符合要求的电路原理图及有条理的程序。
在这个过程中,不但可以使自己的动手能力和分析能力得到了增强;而且还使自己的专业知识得到了丰富;并且还让自己学习单片机必须加强动手,要理论与实践相结合。
在做事上也要认真细心不可马马虎虎,一小小的失误都会影响整个实验结果。