单片机应用技术(C 语言版)任务13 用计算机控制秒表_第1页
单片机应用技术(C 语言版)任务13 用计算机控制秒表_第2页
单片机应用技术(C 语言版)任务13 用计算机控制秒表_第3页
单片机应用技术(C 语言版)任务13 用计算机控制秒表_第4页
单片机应用技术(C 语言版)任务13 用计算机控制秒表_第5页
已阅读5页,还剩40页未读 继续免费阅读

付费下载

下载本文档

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

文档简介

主编:李文华“十四五”职业教育国家规划教材经全国职业教育教材审定委员会审定用计算机控制秒表的启停与清零任务13

STC89C52单片机的fosc=11.0592MHz,T0作秒表的基准时间定时器,同时作数码管扫描显示的时间控制器,P1、P2口外接两位数码管作秒表的显示器。单片机按照10位一帧的帧格式,用T2作波特率发生器,以4800bps的波特率与PC机进行通信,用PC机控制秒表的启停与清0,其控制要求如下:①上电时,秒表显示时间为0、停止走时。②PC机向单片机发送0x00时,秒表暂停走时;发送0x01时,秒表在当前显示值的基础上走时;发送0x02时,秒表计时清0,并停止走时;发送其他数据时秒表不作任何反应。③单片机接收到PC机发送来的数据后,将所接收到的数据回送给PC机显示,以便在PC机上观察单片机是否接收到数据。任务要求相关知识1、用T2作串口的波特率发生器

⑴相关的特殊功能寄存器STC89C52单片机用T2作波特率发生器时主要涉及到T2CON、RCAP2L、RCAP2H、TL2、TH2等5个特殊功能寄存器,如下表所示寄存器地址功能复位值说明T2CON0xc8T2控制寄存器。用来设置T2的工作方式。0x00可位访问。RCAP2L0xcaRCAP2L为捕获寄存器的低字节,RCAP2H为捕获寄存器的高字节。RCAP2H、RCAP2L用来存放T2的计数初值。0x00可组合成16位的特殊功能寄存器。RCAP2H0xcb0x00TL20xccTL2为T2计数器的低字节,TH2为T2计数器的高字节。TH2、TL2存放的是T2当前计数值。0x00可组合成16位的特殊功能寄存器。TH20xcd0x00相关知识1、用T2作串口的波特率发生器T2CON的结构T2CON中与波特率发生器设置有关的位是RCLK、TCLK、TR2,其用法如下:RCLK(D5)位:串行口接收时钟选择控制位。RCLK=1时,单片机用T2作串口方式1、方式3的接收波特率发生器。RCLK=0时,单片机用T1作串口方式1、方式3的波特率发生器。TCLK(D4)位:串行口接收时钟选择控制位。TCLK=1时,单片机用T2作串口方式1、方式3的发送波特率发生器。RCLK=0时,单片机用T1作串口方式1、方式3的波特率发生器。TR2(D2)位:定时/计数器2的启动/停止控制位。TR2=1,启动T2计数。TR2=0,停止T2计数。相关知识1、用T2作串口的波特率发生器有关说明①标准的MCS-51单片机中不包括T2,头文件reg51.h中无T2CON、TH2、TL2、RCAP2H、RCAP2L这5个特殊功能寄存器的定义。如果要使用T2,则需在程序的开头处对上述5个特殊功能寄存器进行定义。

②宏晶公司为STC89C52单片机编写了定义特殊功能寄存器的头文件,该文件为STC89C5xRC.h,如果采用项目一中所介绍的方法在keil中添加了STC单片机,可在程序的开头处用“#include<STC89C5xRC.h>”命令将定义STC89C52单片机特殊功能寄存器的头文件包含至应用程序中。

③STC89C5xRC.h文件中只定义了8位的特殊功能寄存器和特殊位,无16位的特殊功能寄存器定义,如果用户想以16位的方式访问T2(TL2、TH2)、RCAP2(RCAP2H、RCAP2L)等寄存器,则需在程序开头处对16位寄存器进行定义。

相关知识1、用T2作串口的波特率发生器⑵波特率的确定T2作波特率发生器,其工作方式与T1的工作方式2相似,它是用TH2、TL2作16位的加1计数器,RACAP2H、RACAP2L保存计数初值。当计数值达到65536时,计数器就会发生溢出,硬件电路会自动将RCAP2H、RACAP2L中的数装入TH2、TL2中,并开始下一轮的计数。T2发生溢出时,不产生中断。T2作波特率发生器时,串口的波特率BR为:

112时钟模式其中,n= 26时模式12时钟模式:每12个时钟周期为1个机器周期6时钟模式:每6个时钟周期为1个机器周期已知波特率BR,确定RCAP2H、RCAP2L的方法RCAP2=65536-[n×fosc/(32×BR)]

相关知识1、用T2作串口的波特率发生器⑶波特率发生器的设置

对于52单片机,串口工作在方式1、方式3时,可选用T1作波特率发生器,也可以用T2作波特率发生器。到底选择哪一个,取决于T2CON的RCLK、TCLK、TR2的取值状态。它们的之间的关系如下表所示:TR2RCLKTCLKT2CON接收波特率发生器发送波特率发生器0××0x00T1T11000x04T1T11010x14T1T21100x24T2T11110x34T2T2

单片机复位后,T2CON的值为0x00,单片机自动地选用T1作串口方式1、方式3的波特率发生器。相关知识1、用T2作串口的波特率发生器

串行口初始化设置方法

①设置SCON:其值详见P141表6-4。

②设置TH2、TL2:查P167表6-12,将计数初值分别赋给TH2、TL2或者直接赋给16位的特殊功能寄存器T2。

③设置RCAP2H、RCAP2L:查P167表6-12,将计数初值分别赋给RCAP2H、RCAP2L或者直接赋给16位的特殊功能寄存器RCAP2。

④设置T2CON:TR2位置1,若作发送波特率发生器,则将TCLK位置1,若作接收波特率发生器,则将RCLK位置1。相关知识1、用T2作串口的波特率发生器#include<STC89C5xRC.h> //包含STC98C52特殊功能寄存器的头文件sfr16 RCAP2=0xca; //定义16位的特殊功能寄存器RCAP2sfr16 T2=0xcc; //定义16位的特殊功能寄存器T2void init_serial(void){SCON=0x50; //串口采用方式1、允许接收T2=65536-144; //T2计数器赋初值RCAP2=65536-144; //计数初值存入RCAP2H、RCAP2L中TCLK=1; //用T2作发送波特率发生器RCLK=1; //用T2作接收波特率发生器TR2=1; //启动T2}【例6.4】fosc=11.0592MHz,STC89C52单片机采用12时钟模式,串口工作在方式1下,用T2作发送和接收波特率发生器,波特率BR=2400bps。试写出其初始化程序相关知识2、PC机的USB口USB是UniversalSerialBus的缩写,是英特尔、康柏、IBM、Microsoft等公司为了统一外设接口、方便用户使用而提出来的“通用的串行总线”,它采用菊花链的方式将外设连接起来,可支持高达127个外设的连接,具有传输速度快、支持热插拨等特点。常用的USB连接器USB连接器的引脚USB连接器的引脚功能引脚电气符号功能1VCC+5V电源2D-数据-3D+数据+4GND电源地相关知识3、CH340接口芯片CH340的引脚分布MCS-51单片机的串口不能直接挂接在计算机的USB口上与计算机进行通信。需用PL2303、CH340等芯片将计算机的USB口转换成串口再与单片机的串口进行通信。CH340用于将USB口转换成串口、IrDA红外口或者打印口等,有CH340T、CH340R、CH340G等几个品种。其引脚分布如下:相关知识3、CH340接口芯片CH340的引脚分布相关知识3、CH340接口芯片CH340的引脚分布相关知识3、CH340接口芯片USB转串口电路

采用CH340将USB口转换成串口的电路非常简单,仅需使用CH340的UD-、UD+、RXD、TXD、XI、XO、VCC、GND、V3共9个引脚。其中,VCC、GND引脚为CH340提供电源,当供电电压为5V时,V3对地接一个0.01µF的退耦电容。XI、XO引脚外接12MHz的晶振,用来产生CH340所需要的12MHz时钟信号,UD+、UD-分别与USB口的UD+、UD-相接,RXD、TXD分别为转换后的串行接收引脚和发送引脚,分别与其他串行通信设备的TXD引脚和RXD引脚相接。USB转串口的电路如图相关知识3、CH340接口芯片USB转串口电路仅使用9个引脚:UD-、UD+、RXD、TXD、XI、XO、VCC、GND、V3VCC、GND引脚为CH340提供电源当供电电压为5V时,V3对地接一个0.01µF的退耦电容。XI、XO引脚外接12MHz的晶振,用来产生CH340所需要的12MHz时钟信号UD+、UD-分别与USB口的UD+、UD-相接RXD、TXD分别为转换后的串行接收引脚和发送引脚,分别与其他串行通信设备的TXD引脚和RXD引脚相接。任务实施1、搭建硬件电路用CH340芯片将计算机的USB口转换成的TTL电平的串行口,再与单片机的串行相接任务实施2、编写软件程序⑴单片机的程序任务14与任务11存在两方面的差异:

在任务14中秒表的基准时间定时器与数码管扫描显示的时间定时器为同一个定时器,不能像任务11那样通过控制秒表的基准时间定时器的启停来实现秒表的启动与停止。否则,数码管不能正常显示。

在任务14中,秒表的运行控制不是用键盘控制的,而是用PC机控制的,需要编写串行通信程序,用接收数据的解释处理代替任务11中的键盘解释处理。任务实施2、编写软件程序⑴单片机的程序

任务14的程序编写方法

用全局变量timcnt记录定时中断的中断次数,用全局位变量entime控制是否允许对timcnt加1计数。

在T0定时中断服务函数中对entime进行判断,若entime=1,则对timcnt进行加1计数,若entime=0,则不对timcnt加1。然后再判断timcnt是否计满1s,并作相应处理。在串行接收中断服务函数中,对接收数据进行判断,若接收数据为0x00(暂停秒表),则将entime位清0。若接收数据为0x01(启动秒表),则将entime位置1。若接收数据为0x02(秒表清0),则将entime位清0,并将变量timcnt、second都清0。任务实施2、编写软件程序单片机程序的流程图任务实施2、编写软件程序main函数#include <reg51.h>#define uchar unsignedchar#define DCOUNT2 //3数码2#define portled_sP1 //段选口#define portled_bP2 //位选口sfr T2CON=0xc8;sfr16 RCAP2=0xca;sfr16 T2=0xcc;bit entime; //0:禁止秒计时uchar data wcnt,timcnt,second;uchar code led[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};uchar code ledctrl[]={0x0fe,0x0fd};void main(void){SP=0x5f;second=0;timcnt=0;wcnt=0; entime=0;TMOD=0x01;SCON=0x50;T2=65536-72;RCAP2=65536-72;T2CON=0x34;TL0=(65536-9216)%256;TH0=(65536-9216)/256;PT0=1; ES=1;ET0=1;EA=1;TR0=1;while(1) { PCON|=0x01; }}任务实施2、编写软件程序串行中断服务函数void serial() interrupt4using1{uchar rdat; //接收数据if(RI==1) //或者if(RI){ RI=0; rdat=SBUF;

switch(rdat)

{case01:entime=1;break;

case02: timcnt=0;second=0;

case0: entime=0;

default:break;

}SBUF=rdat;}else TI=0;}任务实施2、编写软件程序T0中断服务函数void tim0() interrupt1using 2{TL0=(65536-9216)%256;//重赋计数初值TH0=(65536-9216)/256;if(entime==1) //若允许秒计时{ timcnt++; //10ms中断次数加1 if(timcnt>=100) //计满1s {timcnt=0; //10ms中断次数回0 second++; //秒计数值加1 if(second>=60) //计满1分吗? second=0; //秒计数清0 } //计满1s处理结束} //允许秒计时处理结束display(second); //显示秒}任务实施2、编写软件程序显示时间函数void display(uchar time) //61display函数:扫描显示time{portled_s=0; //62段选口输出熄灭数码管的显示码portled_b=ledctrl[wcnt]; //63位选口输出wcnt号管点亮的控制码if(wcnt==1) //64判断显示位置

portled_s=led[time/10]; //65非0号管,则段选口输出秒十位的笔型码else //66 portled_s=led[time%10]; //670号管,段选口输出秒个位的笔型码wcnt++; //68显示位置计数值加1wcnt=wcnt%DCOUNT; //69计数值对2取余,保证其值为0或者1}任务实施2、编写软件程序⑵PC机端通信程序

可以用VB、VC编写,但是最简单的方法是直接使用串口调试工具软件。

本任务中STC-ISP下载软件中的“串口助手”作为PC机端的通信软件。

用“串口助手”与单片机通信的方法如下:

①编写单片机端的程序,再用USB线将计算机的某个USB口与实训平台上的USB口相接。

②按照项目一中介绍的方法安装好USB转串口的驱动程序并将单片机端的程序下载至单片机中。任务实施2、编写软件程序③单击

“串口助手”标签名④选择USB所映射的串口编号,再选择与单片机通信的波特率、数据校验方式、数据位的长度、停止位的位数④单击“打开串口”按钮任务实施2、编写软件程序⑤在此文本框中输入数据“1”单击此按钮,秒表就开始走时此处显示单片机回送来的接收数据“01”⑥单击此按钮,在“发送缓冲区”文本框中输入数据“0”,单击“发送数据”按钮,秒表就停止走时,“接收缓冲区”文本框中就显示单片机回送来的接收数据“00”应用总结与拓展

⑴C51对二维数组的理解1、二维数组的指针与指向二维数组的指针变量

设有一个3×4的二维数组a[3][4],它的定义如下:inta[3][4]={{10,12,14,16}, //行元素a[0]:第0行各列{18,20,22,24}, //行元素a[1]:第1行各列{26,28,30,32}}; //行元素a[2]:第2行各列这个数组可以理解为:a是数组名,数组a包含3个行元素a[0]、a[1]、a[2]每一个元素都是一个一维数组,它包含4个列元素如a[1]代表的是a[1][0]、a[1][1]、a[1][2]、a[1][3]二维数组是一个一维的行数组,其中的每一个元素都是一个一维数组,这个数组的长度为二维数组的列长。应用总结与拓展

⑵二维数组的地址1、二维数组的指针与指向二维数组的指针变量包括数组的地址、行地址、元素的地址。数组a[3][4]各地址的表示方法地址表示方法数组的首地址a第0行的首地址a第i行的首地址a[i]或者a+i第0行0列的首地址a第i行j列元素的首地址a[i]+j或者*(a+i)+j应用总结与拓展

⑶指向二维数组的指针变量1、二维数组的指针与指向二维数组的指针变量定义格式[存储类型1]数据类型

(*[存储类型2] 指针变量名

)[常量表达式]“常量表达式”用来说明指针变量所指向的二维数组中每行的元素的个数,即行数组的长度。该项一个必选项,其中的方括号不能省略用来说明指针变量的存储类型,该项为可选项。用来说明指针变量所指向变量的存储类型,该项为可选项。只能放在“数据类型”之前园括号不能省略,也不可改变位置例如:unsignedint(* data pa)[4]; //pa在data区,指向每行有4个元素的

//二维数组idata unsignedint (*pb)[5]; //pb指向idata区每行有5个元素的二

//维数组应用总结与拓展⑷通过指向二维数组的指针变量访问二维数组1、二维数组的指针与指向二维数组的指针变量

假定有以下定义:int a[3][4];int(*pa)[4];

若先使行指针变量pa指向了数组a[3][4]的第0行(即pa=a),则指针变量的表示含义及其用法如下:

①pa++(或者pa+=1):使指针变量指向下一行。pa的实际增加值为1×n×d。其中n为行数组中元素的个数,d为每个元素所占字节数。

②pa+i:第i行首地址。

③*(pa+i):第i行首元素的地址。

④*(pa+i)+j:元素a[i][j]的首地址。请注意其表达方式。

⑤*(*(pa+i)+j):第i行j列元素a[i][j]。

⑥*(*pa+j):pa所指行(第0行)的第j列元素。应用总结与拓展

【例6.5】求数组a[3][4]的第2列元数之和,并将和值存入变量sum中。#define uint unsigned int //1void main(void) //2{idata uint(* idata pa)[4]; //3uint idata sum=0,a[3][4]={{2,4,6,8}, //4 {10,12,14,16}, //5 {18,20,22,24}}; //6for(pa=a;pa<a+3;pa++) //7{sum+=*(*pa+2); } //8} //9在idata区定义指向位于idata区的每行有4个元素的unsignedint型二维数组的指针变量pa。在idata区定义unsignedint型变量sum和二维数组a[3][4],并对变量sum和数组a[3][4]赋初值。第4~6行书写的是一条语句使指针pa指向数组a[3][4]首行,其中,a是二维数组的首行地址判断pa是否指向数组a[3][4]的有效行。数组a[3][4]的行号为0~2,行首址分别为a、a+1、a+2,a+3是数组的最后一行之后地址使指针变量pa指向数组的下一行for循环的循环体功能是将pa所指向行的第2列元素的值与sum相加,并将和值存入变量sum中。语句中的“*(*pa+2)”表示pa所指行的第2列元素应用总结与拓展上述是通过移动指针pa来遍历数组中各行的第2列元素的。程序运行的结果如图1、二维数组的指针与指向二维数组的指针变量应用总结与拓展程序2#define uchar unsigned char //1#define uint unsigned int //2void main(void) //3{data uint(* data pa)[4]; //4uint data sum=0,a[3][4]={{2,4,6,8},{10,12,14,16},{18,20,22,24}}; //5uchar i; //6pa=a; //7for(i=0;i<3;i++) //8{sum+=*(*(pa+i)+2); } //9} //10程序2的实现方法是,指针变量pa始终指向数组a[3][4]的首行,通过改变行变量i的值来遍历数组中各行的第2列元素。将数组a[3][4]的第i行的第2列元素与sum相加,并将和值存入变量sum中。语句中,“*(*(pa+i)+2)”代表pa所指行之后的i行的第2列元素。应用总结与拓展程序2运行的结果1、二维数组的指针与指向二维数组的指针变量应用总结与拓展⑴指针变量的定义1、二维数组的指针与指向二维数组的指针变量定义格式如下: struct 结构体类型名 * 指针变量名;或者是, struct {

成员表列 } * 指针变量名;例如: struct date * pd; //定义指向structdate类型

数据的指针变量应用总结与拓展

⑵指针变量的引用1、二维数组的指针与指向二维数组的指针变量设有以下定义:struct date //定义结构体{unsigned int year;unsigned char month;unsigned char day;};struct date dat1,dat[10]; //定义structdate类型的变量和数组struct date *pd; //定义指向structdate类型数据的

指针变量指针变量pd与结构变量dat1、结构体数组dat[10]存在以下关系:应用总结与拓展

⑵指针变量的引用1、二维数组的指针与指向二维数组的指针变量

①指针变量pd是用来指向structdate结构体类型数据的,pd未赋值时,指针变量pd与变量dat1和数组dat[]没有关系,不可引用指针变量pd。

②执行语句“pd=&dat1;”后,指针变量pd指向结构体变量dat1。这时,dat1的同一成员有3种表示方法:

结构体变量名.成员名

例如:dat1.year第二种方法:

(*指针变量).成员名

例如:(*pd).year应用总结与拓展

2、指向结构体类型数据的指针变量struct date //定义结构体{unsigned int year;unsigned char month;unsigned char day;};struct date dat1,dat[10]; //定义structdate类型的变量和数组struct date *pd; //定义指向structdate类型数据的指针变量第三种方法:

指针变量->成员名例如:pd->year其中,*pd表示指针变量pd所指向的结构体变量。(*pd).成员名:指针变量pd所指向的结构体变量的成员。由于运算“.”的优先级最高,括号用来使pd与指针运算符结合。括号不能省略,否则就等价于*(pd.成员名),这是错误的。pd->成员名:指针变量pd所指向的结构体变量的成员,是“(*pd).成员名”的直观表示形式。“->”是指向结构体变量成员运算符。应用总结与拓展

2、指向结构体类型数据的指针变量

③执行语句“pd=dat;”后,指针变量pd指向结构体数组的首元素dat[0],则有:pd->year: 得到pd指向结构体变量(dat[0])的成员year的值。pd->year++:得到pd指向结构体变量(dat[0])的成员year的值,用完该值后使该成员的值加1。++pd->year:先使pd所指向结构体变量(dat[0])的成员year的值加1,再使用该值。pd++:指针变量指向数组中下一个结构体变量(数组中下一个元素),指针变量的实际增加值为结构体变量的长度。dat+3:数组中元素dat[3]的首地址,即第3个结构体变量(编号从0开始计算)的地址。(pd++)->year:先取pd所指向结构体变量的成员year的值,再使指针变量指向数组中下一结构体变量。(++pd)->year:先使指针变量pd指向数组中下一结构体变量,再取该结构体变量的year成员的值。应用总结与拓展例如,下列程序中,设数组dat[3]的首地址为0x0a,程序运行后,各语句执行后的结果如语句后面的注释所示。struct date //定义结构体{unsigned int year;unsigned char month;unsigned char day;};void main(void){struct date idata dat[3]={{1989,12,3},{1949,10,1},{2010,8,25}};struct date idata * idata pd;unsigned int m;pd=dat;m=pd->year++; //m=1989 pd=0x0a(dat)m=pd->year; //m=1

温馨提示

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

评论

0/150

提交评论