单片机应用技术(C 语言版)任务9 制作简易频率计_第1页
单片机应用技术(C 语言版)任务9 制作简易频率计_第2页
单片机应用技术(C 语言版)任务9 制作简易频率计_第3页
单片机应用技术(C 语言版)任务9 制作简易频率计_第4页
单片机应用技术(C 语言版)任务9 制作简易频率计_第5页
已阅读5页,还剩20页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

主编:李文华“十四五”职业教育国家规划教材经全国职业教育教材审定委员会审定制作简易频率计任务要求单片机系统的振荡频率fosc=11.0592MHz,定时/计数器T1作计数器使用,对T1/P3.5引脚输入的频率小于100Hz的脉冲进行计数。单片机的P1口外接8只发光二极管显示电路,以BCD码形式显示T1/P3.5引脚输入脉冲的频率。其中,P1.7~P1.4所接的4只发光二极管显示脉冲数的十位,P1.3~P1.0所接的4只发光二极管显示脉冲数的个位。相关知识1、定时/计数器作计数器使用⑴计数器对输入脉冲的要求输入信号的频率不高于fosc/24,并且要求脉冲信号的高﹑低电平的持续时间不少于一个机器周期。对于12MHz的单片机系统而言,系统只能对不高于0.5MHz的外部输入脉冲进行计数。相关知识1、定时/计数器作计数器使用⑵计数值的读取①定时/计数器处于停止状态时,直接读取THi和TLi中的值,所读值为当前计数值。②定时/计数器处于运行状态时,直接读取THi和TLi中的值,所读值与当前计数值不一定相同,有可能出现读第一个字节时尚未产生低字节向高字节进位,而读第二个字节时却已经产生了低字节向高字节进位,在这种情况下,读数就会出错。1、定时/计数器作计数器使用

②定时/计数器处于运行状态时,正确的读数方法是,先读THi,再读TLi,再读THi。若前后两次读得的THi值相等,则读数过程中没发生进位,读数正确。否则重新读取计数值,则第2次所读数据正确。将TH0和TL0中的内容读到变量CountH和CountL的程序如下:

CountH=TH0; //读TH0CountL=TL0; //读TL0if(CountH!=TH0) //判断读数期间是否发生过进位{ CountL=TL0; //产生了进位,则重新读数 CountH=TH0; }2、测量频率的方法有两种方法⑴测量固定脉冲数的时间用一个定时/计数器作定时器,定时器选用低级中断。用另一个定时/计数器作计数器对外部脉冲计数,计数器选用高级中断,计数器计满n个脉冲产生中断,在中断服务程序中读取这n个脉冲的对应时间t,则输入脉冲的频率f=n/t。这种方法常用于测量低频脉冲的频率。⑵测量固定时间的脉冲数用一个定时/计数器作计数器对外部脉冲计数,计数器的初值一般设为0,工作方式选用方式1。用另一个定时/计数器作定时器,在定时中断服务函数中当时间满t(t一般取0.1ms、1ms、10ms、10ms或者1s)后读取计数器中所计入的脉冲个数n,则输入脉冲的频率f=n/t。这种方法常用于测量高频脉冲的频率。2、测量频率的方法有两种方法⑴测量固定脉冲数的时间用一个定时/计数器作定时器,定时器选用低级中断。用另一个定时/计数器作计数器对外部脉冲计数,计数器选用高级中断,计数器计满n个脉冲产生中断,在中断服务程序中读取这n个脉冲的对应时间t,则输入脉冲的频率f=n/t。这种方法常用于测量低频脉冲的频率。⑵测量固定时间的脉冲数用一个定时/计数器作计数器对外部脉冲计数,计数器的初值一般设为0,工作方式选用方式1。用另一个定时/计数器作定时器,在定时中断服务函数中当时间满t(t一般取0.1ms、1ms、10ms、10ms或者1s)后读取计数器中所计入的脉冲个数n,则输入脉冲的频率f=n/t。这种方法常用于测量高频脉冲的频率。任务实施1、搭建电路电路图如下:2、编写软件程序(1)流程图(2)程序代码

#include <reg51.h> //1#define uchar unsignedchar //2宏定义:uchar代表unsignedchar#define ledport P1 //3宏定义:P1口为LED控制端口uchar TimCnt; //4全局变量TimCnt(10ms中断次数计数器)void display(uchar); //5display函数说明#define ledport P1 //3宏定义:ledport代表P1(P1口为LED控制端口)uchar TimCnt,PlusCnt; //4定义全局变量TimCnt,PlusCntvoid display(uchar); //5display函数说明void main(void) //6main函数{ TimCnt=0; //7软件初始化:10ms中断次数计数器赋初值0 PlusCnt=0; //8软件初始化:脉冲个数为0 TMOD=0x51; //9T0:定时、方式1,T1:计数、方式1 TH0=(65536-9216)/256; //10T0计数器赋初值:10ms TL0=(65536-9216)%256; //11 TL1=0; //12T1计数器赋初值0 TH1=0; //13 ET0=1; //14开T0中断 EA=1; //15开全局中断 TR0=1; //16启动定时/计数器T0 TR1=1; //17启动定时/计数器T1 while(1) //18while死循环,循环体为语句19 { display(PlusCnt); }//19调用display函数显示计数值} //20main函数结束2、编写软件程序Voidtime0(void) interrupt1using 1//21T0中断服务函数,中断类型号为1{ TL0=(65536-9216)%256; //22T0重置计数初值:10ms TH0=(65536-9216)/256; //23 TimCnt++; //2410ms中断次数计数值加1 if(TimCnt>99) //25计满1s吗? { TimCnt=0; //26满1s则10ms中断次数计数值清0 PlusCnt=TL1; //27读T1计数值。见代码说明 TL1=0; //28T1计数值清0 TH1=0; //29 } //30计满1s处理结束} //31T0中断服务函数结束//显示子程序void display(uchar m) //33display函数定义{ledport=~(((m/10)<<4)|(m%10));} //34分离m的个位和十位并拼成BCD码显示2、编写软件程序应用总结与拓展1、共用体是一种构造类型数据,它与结构体有些类似,可以包含多个不同类型的变量,但这些变量都是从同一地址开始存放的,不同的变量共用同一个内存空间。⑴共用体变量的定义①先定义共用体类型,再定义共用体变量共用体类型的定义格式 union 共用体类型名 { 成员列表 };共用体变量定义格式 union 共用体类型名 变量名1,变量名2,…,变量名n;应用总结与拓展union wordbyte //定义共用体类型,wordbyte是共用体类型名{unsigned int word; //成员1:名字为word,类型为unsigned intunsigned char byte; //成员2:名字为byte,类型为unsignedchar};union wordbytex; //定义共用体变量x举例1、共用体②在定义共用体类型的同时定义共用体变量定义格式如下: union 共用体类型名 {成员表列}变量名1,变量名2,…,变量名n;③直接定义共用体变量定义格式如下: union {成员表列}变量名1,变量名2,…,变量名n;程序中只能对共用体变量中的最低级成员进行引用。引用共用体变量成员的格式如下:⑵共用体变量的引用共用体变量名.成员名⑶共用体类型数据的特点①共用体变量虽然有多个成员,但这些成员共用同一地址空间,如果更改了某一个成员的值,其他成员就不起作用了(值有可能发生了变化)。例如,对前面定义的x变量的成员赋值:x.word=0x1234; //赋值后,x.word=0x1234,x.byte=0x12。x.byte=0x56; //赋值后,x.word=0x5634,x.byte=0x56。1、共用体②共用体变量的地址和它的各成员的地址相同。③不能对共用体变量名赋值,也不能企图引用变量名来得到一个值,不能在定义共用体变量时对它初始化。④共用体变量不能作为函数的参数,也不能作为函数的返回值,但共用体变量的成员可以作为函数的返回值。⑤共用体变量的成员可以是数组,也可以是一个结构体变量。1、共用体【例】若定时/计数器T0作计数器使用,采用方式1,试用共用体将T0的计数值存放在无符号整型变量中。unsigned int rdval(void){union{ unsigned int word; unsigned char byte[2];}cval;cval.byte[0]=TH0;cval.byte[1]=TL0;return cval.word;}程序说明整型数据在内存中存放的格式是,高字节存放在低地址处,低字节存放在高地址处。数组中各元素在内存是连续存放的,且下标小的元素存放在低地址处。因此,cval.byte[0]就是cval.word的高字节,cval.byte[1]就是cval.word的低字节。1、共用体1、共用体【例】利用共用体变量将一个长整型数据addat的中间两个字节取出来存放到一个整型变量adval中。union //定义共用体变量convert{unsigned long addat; //第一个元素为长整型变量dadatstruct //第二个元素为结构体变量adval{unsigned char byte; //adval的第一个元素占1个字节

unsigned int word; //adval的第二个元素占2个字节}adval;}convert;编程分析:整型、长整型数据在内存中存放格式是,高字节存放在低地址处,而低字节存放在高地址处。共用体变量中,各成员的起始地址相同。结构体变量中各成员是按其先后顺序从低地址处连续存放的。作如下定义:它对应convert.addat的中间两字节1、共用体程序代码void main(void){unsigned long addat=0x12345678; //待截取的数unsigned int adval; //存放截取的结果union //定义共用体变量convert{ unsignedlong addat; //第一个元素为长整型变量dadat struct //第二个元素为结构体变量adval {unsigned char byte; //adval的第一个元素占1个字节

unsigned int word; //adval的第二个元素占2个字节

}adval;}convert;convert.addat=addat; //待截取的数存放到convert的addat元素中adval=convert.adval.word; //取中间2个字节}1、共用体程序运行的结果2、枚举类型enum 枚举类型名 {元素1,元素2,…,元素n};所谓枚举就是将变量的值一一列举出来,变量的值只限于所列举值的范围。如果一个变量只有几种可能值,就可以把它定义成枚举类型。枚举变量有两种定义方式

①先定义枚举类型,再定义枚举变量枚举类型的定义格式如下:

其中,“enum”为关键字,用来说明后面的名字是是枚举类型。“枚举类型名”是所定义的枚举类型的名字,用于定义后续的枚举变量。大括号中的各元素是枚举类型变量的可能取值,一般是用字符表示。例如,每周的天数只有星期天~星期六这7种取值,分别表示为sun、mon、tue、wed、thu、fri、sat,每周的天数就可以定义成一个枚举类型:enum weekday {sun,mon,tue,wed,thu,fri,sat};枚举变量的定义格式如下:例如:enum weekday{sun,mon,tue,wed,thu,fri,sat}; //定义枚举类型enum weekdaydat1,dat2; //定义枚举变量dat1、dat2这样定义后,变量dat1和dat2是enumweekday型的枚举变量,它们的取值范围是sun~sat。enum 枚举类型名 变量名1,变量名2,…,变量名n;2、枚举类型enum 枚举类型名 {枚举值1,枚举值2,…,枚举值n}变量名表列;②在定义枚举类型的同时定义枚举变量例如:enum weekday {sun,mon,tue,w

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论