![第7章-SOC单片机实验介绍_第1页](http://file4.renrendoc.com/view14/M06/3E/3E/wKhkGWeIhkWAH-_IAAEMkPMpNfI827.jpg)
![第7章-SOC单片机实验介绍_第2页](http://file4.renrendoc.com/view14/M06/3E/3E/wKhkGWeIhkWAH-_IAAEMkPMpNfI8272.jpg)
![第7章-SOC单片机实验介绍_第3页](http://file4.renrendoc.com/view14/M06/3E/3E/wKhkGWeIhkWAH-_IAAEMkPMpNfI8273.jpg)
![第7章-SOC单片机实验介绍_第4页](http://file4.renrendoc.com/view14/M06/3E/3E/wKhkGWeIhkWAH-_IAAEMkPMpNfI8274.jpg)
![第7章-SOC单片机实验介绍_第5页](http://file4.renrendoc.com/view14/M06/3E/3E/wKhkGWeIhkWAH-_IAAEMkPMpNfI8275.jpg)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第七章C8051F系列单片机应用系统的开发7.1C8051F020实验系统7.2C8051F单片机实验项目7.3在KeiluVision2中进行C8051F系列单片机的软件开发和调试7.1C8051F020实验系统NMC-20XX核心模块压力传感器和调理电路电位调节直流电机测速和控制模块步进电机实验模块轻触按键和拨动开关12864点阵液晶显示模块HD7279芯片、按键和七段码显示模块红绿LED数码管RS232串口以太网接口电源开关7.1C8051F020实验系统实验系统可进行SOC单片机典型应用的实验,包含三部分:SiliconLaboratories的SOC单片机开发工具;可用于以太网测控的NMC-20XX核心模块;系统实验板。系统性能和运行环境系统的主要性能指标:系统时钟最高可达25MHz。通过RS232接口(或USB)与PC机连接。支持汇编语言和C51源代码级调试。支持第三方软件工具(KeilC)。IDE软件运行环境Windows2000/XP操作系统32MbRAM40Mb自由硬盘空间空闲的COM口,配USB接口的调试电缆可以用USB接口。C8051F020实验系统连接和使用将JTAG扁平电缆一端与适配器(EC2)连接,另一端与目标系统连接;将RS232串行电缆的一端与EC2连接,另一端接到PC机;给目标系统上电;插入CD并运行“SETUP.EXE”,将IDE软件安装到您的PC机,在PC机的开始菜单的“程序”项中选择SiliconLaboratoriesIDE,运行IDE软件。7.1.1C8051F单片机开发工具SiliconLaboratories的开发工具由IDE调试环境软件、适配器和电缆组成。C8051F系列所有的单片机片内均设计有调试电路,该调试电路通过边界扫描方式获取单片机片内信息,通过4线的JTAG接口(有的型号使用二线(C2)接口)与开发工具连接,对单片机在片编程调试。适配器(EC2)一端与计算机相连,另一端与C8051F单片机JTAG口相连,应用SiliconLaboratories提供的IDE调试环境或Keil
的uVision2调试环境就可以进行非侵入式、全速的在系统编程(ISP)和调试。IDE调试环境运行在PC机的Windows系统下,在调试状态下可以观察和修改单片机的存储器和寄存器;支持断点设置、观察点设置、堆栈指示器设置及单步运行、全速运行和停止运行等命令。调试时不需要额外的目标RAM、程序存储器、定时器或通信通道,并且所有的模拟和数字外设都能正常工作。开发工具支持所有C8051Fxxx系列单片机,根据不同单片机型号的调试接口,采用JTAG或C2接口的适配器。7.1.2NMC-20XX核心模块简介NMC-20XX核心模块的外观可参见图中的标注,结构框图。该模块是为用于工业测控(包括以太网测控功能)而设计的,模块中使用C8051F020单片机,片外扩展了128KB的SRAM(UT62L1024芯片),以串行方式扩展了1MB的Flash存储器(AT45DB081芯片);模块用4层PCB板设计,面积仅为42.5mm×53.8mm,模块上设计有连接C8051F020单片机的JTAG调试接口,有用于扩展和应用连接的2×40P双排针,该双排针可与不同用户设计的应用系统连接,在该实验系统上和系统实验板连接。NMC-20XX核心模块示意图单片机(C8051F020)F020I/O、AD引出2×40P双5排插针SRAM(UT6L1024)Flash(AT45DB081)网络芯片(RTL8019)日历时钟(P3530)JTAG调试接口实验箱实验模块步进电机NMC-20XX
核心模块直流电机RJ-45以太网测控RS-485串行口通讯RS232串行口通讯压力传感器模拟量输入JTAG适配器HD7279(4×4键6位LED)16个LED(D1~D16)8路开关量入(K1~K8)温度传感器DS18B20电位器电位AD输入实验箱和核心模块资源介绍(1)系统实验板除与NMC-20XX核心模块连接外,还配置了丰富的硬件资源,可根据需要安排多个实验内容。系统实验板与核心模块组成实验的目标系统,然后由运行在PC机上的集成开发软件、JTAG口的协议转换器(EC2),实现在系统开发调试。实验者可参照本章后面的实验例程编译和下载各应用程序,也可独立设计程序(C或汇编),然后就可开始在系统调试了。该系统实验板由多个相对独立,又能组合的实验硬件模块组成。实验箱模块资源介绍(2)(1)HD7279芯片,6位LED数码显示与4×4键盘扫描电路;(2)开关量输出的D1~D16发光二极管;(3)8路开关量输入接口K1~K8,AN1~AN8;(4)DS18B20数字温度传感器;(5)电位器测量电压模拟输入电路;(6)压力应变片传感器模拟输入电路;(7)128×64点阵液晶显示模块;(8)RS-232通讯接口;(9)RS-485通讯接口;(10)RJ-45以太网接口;(11)直流电机及调速电路;(12)步进电机及控制电路;7.2C8051F单片机实验项目下面介绍7个典型的C8051F020单片机的实验实验一:数据传送实验;实验二:查表实验;实验三:HD7279键盘和显示实验;实验四:定时器和走马灯实验;实验五:步进电机实验;实验六:直流电机测速和控制实验;实验七:温度数据采集实验。 实验一和实验二采用汇编语言编写代码和实现;实验三~实验七采用C51语言编写代码。7.2.1数据传送实验实验目的掌握对C8051F020内部RAM及外部RAM的数据操作方法。实验内容本例程将内部RAM地址为70H~7FH的16个字节数据依次送到外部RAM地址为7000H~700FH的单元中。实验分析本实验中要访问单片机的内外部RAM,涉及到的汇编语言指令是MOV和MOVX,访问内部RAM使用指令MOV,而访问外部RAM使用指令MOVX。实验分析(1)MOV指令较为灵活、变化较多,但是本实验中要求进行读取内部RAM并且需要连续读取多个字节,适合使用间接寻址的“MOVA,@R0”或者“MOVA,@R1”指令,此处R0或者R1作为间接寻址寄存器,存放要读取的RAM单元的地址。比如本实验采用R1来间接寻址访问内部RAM。写外部RAM的MOVX指令相对而言格式较为固定,本实验使用DPTR间接寻址的“MOVX@DPTR,A”指令,能够较容易的实现对相应单元的访问,DPTR作为将要访问的外部RAM的地址寄存器。实验分析(2)因为实验要求传送16个字节,可以考虑采用循环程序结构。而实现循环结构较容易想到的MCS-51的汇编语言指令是“DJNZRn,label”,这里Rn是循环计数器,可以是R0~R7中间的任何一个,一般使用R2~R7中任何一个,而把R0和R1留给间接寻址使用;而标号label代表跳转的目的标号,用于循环结构中就是循环体部分的首条指令。本实验选用R7作为循环计数器。实验分析(3)作为一个结构完整的汇编语言程序,必须指令程序的入口点,对于MCS-51系列单片机,因为程序存储器的开始部分一般预留给中断入口的向量区域,故初始化一般安排在处理器的中断向量区域之后,可以使用汇编语言的伪指令“ORGxxxxH”的形式进行汇编语言指令的定位。考虑到C8051F020单片机一共有21个中断,每个中断入口的8个字节不宜安排它用,最好程序跳过这些区域。比如从0100H这个地址开始就完全不会和中断的区域重叠。本实验主程序就从0100H的程序存储器地址开始安排。单片机复位后执行的第一条指令是程序存储器地址为0的指令,所以一般安排一个跳转指令,转移到主程序开始的地方执行。程序的流程图开始结束传送完成?跳转到主程序R7<-16R1<-70HDPTR<-7000H@R1->@DPTRR1自增1DPTR自增1实验参考程序
ORG
0000H
AJMPMAIN
ORG
0100HMAIN:
MOVR7,#16
MOVR1,#70H
;内部RAM地址70H送R1
MOVDPTR,#7000H
;DPTR指向XRAM地址7000HLOOP1:
MOVA,@R1;内部RAM内容送累加器A
MOVX@DPTR,A;将累加器A的值送到XRAM
INCDPTR
INCR1
DJNZR7,LOOP1;判断数据是否送完HERE:
AJMPHERE
END调试要点(1)可单步执行、可设断点执行程序。(2)打开RAM及EXTERNALMEMORY窗口,观察相对应的数据区的数据在程序执行前后是否一致。7.3.2查表实验
实验目的熟悉MCS-51的查表指令功能和使用方法,掌握查表程序的设计和调试。实验内容程序存储器中存放有一常数表,表中的每个元素为一个字(两个字节),表的内容与索引号的对应关系如下表所示。现已经将索引号放入工作寄存器R0中,试用汇编语言编写根据R0的值查找表中对应元素的程序,将结果放入内部RAM的20H(高字节)和21H(低字节)单元中。比如给定索引6,则查表得到最终结果在内部RAM中的(20H)=8BH,(21H)=0DCH。查表实验的表格01234567898000H1001H8002H5203H4817H69A2H8BDCH7FEDH30F3H04BFH实验分析(1) 本实验主要练习MOVC指令。查表指令有两条:“MOVCA,@A+DPTR”和“MOVCA,@A+PC”这两条指令都采用基址加变址的寻址方式,并且访问的是程序存储器空间,因为程序存储器空间一般是只读存储器,所以往往存放一些常数表格,进行代码转换的应用。使用查表指令时,一般使用DPTR或者PC作为基址寄存器存放表格的起始地址(首个字节的地址),而用变址寄存器A存放待查的偏移量,二者之和就是待查项的地址,然后通过间接寻址的形式取得对应的字节值。实验分析(2)而本实验中,一个索引对应连续的两个字节内容,一次查表指令的执行只能取得一个字节内容,要完成要求必须通过执行两次查表指令来完成。待查元素的地址=表格首地址+2×索引值+字节索引。这里索引值乘以2是因为每个待查项占用程序存储器连续的两个字节空间,而字节索引为0或者1,可以在取第二个字节使地址寄存器加1获得。本实验采用“MOVCA,@A+DPTR”的形式访问程序存储器。实验程序参考框图开始DPTR+1→DPTR表格首址送DPTR结果目的地址送R1结束索引送A查表得数据高位并送入RAM查表得数据低位并送入RAMA左移一位实验参考程序ORG
0000H
AJMPMAIN
ORG
0100HMAIN:
MOVR0,#6
;假如要查表格中第6项
MOVR1,#20H
;将查表所得结果存入内部RAM,地址分别为20H、21H
MOV
DPTR,#Table
;DPTR指向表格首地址
MOVA,R0;R0内容送累加器A
RL A
MOVCA,@A+DPTR;查表指令
MOV@R1,A;存放结果
MOVA,R0;下面进行第二次查表
RLA
INCDPTR
MOVCA,@A+DPTR;查表得第二字节
INCR1;间接寻址指针自增
MOV@R1,A;存放第二个字节的结果HERE:
AJMPHERETABLE:
DW
8000H,1001H,8002H,5203H,4817H,69A2H,8BDCH,7FEDH,30F3H,04BFH
END调试要点(1)在读取键后设置断点,观察DATA_IN的内容与键入值是否相同。(2)在调用查表程序后设置断点,观察R2,R3的内容与表中的内容是否相同。(3)全速运行程序,键入数字键,观察显示器上的内容是否为键值对应的数值。7.3.3七段码显示与按键实验实验目的根据实验电路,阅读HD7279芯片的数据手册,使用C51语言编程实现按键的读取和七段码显示器的控制,加深对HD7279芯片功能的理解,培养单片机应用设计的能力。HD7279A介绍HD7279A是一片具有串行接口的、可同时驱动8位共阴式数码管(或64只独立LED)的显示驱动芯片,该芯片同时还可连接多达64键的键盘矩阵。HD7279A内部含有译码器,可直接接受16进制码,HD7279A还同时具有2种译码方式,HD7279A还具有多种控制指令,如消隐、闪烁、左移、右移、段寻址等。HD7279芯片外观和引脚HD7279引脚介绍和功能说明引脚名称说明1,2VDD正电源3,5NC无连接,必须悬空4VSS接地6CS片选输入端,此引脚为低电平时,可以向芯片发送指令和读取键盘数据7CLK同步时钟输入端,向芯片发送数据及读取键盘数据时,此引脚电平上升沿表示数据有效8DATA串行数据输入/输出端,芯片接收指令时,为输入端,读取键盘数据时,此引脚在读指令的最后一个时钟周期的下降沿变为输出端9KEY按键有效输出端,平时为高电平,当检测到有效按键时,此引脚变为低电平10-16SG-SA段g-段a驱动输出17DP小数点驱动输出18-25DIG0-DIG7数码管0-数码管7驱动输出26CLKO振荡器输出端27RCRC振荡器连接端28RESET复位端HD7279应用电路图图中用蓝色框圈中的是本实验箱安装的数码管和按键HD7279指令介绍(1)HD7279A的显示以及各种控制是靠接收到的指令来完成的,指令有不带数据的纯指令和带有数据的指令,详细指令和指令格式请参考HD7279A数据手册,下面介绍本实验中用到的几个7279的指令。(1)复位指令A4HD7D6D5D4D3D2D1D010100100HD7279指令介绍(2)(2)下载显示数据但不译码其中a2,a1,a0是位地址,选择显示到哪一个七段码上,DP,A,B,C,D,E,F,G是段码,对应了选中的七段码的各段,当相应的段对应的位是1是,点亮,否则熄灭。D7D6D5D4D3D2D1D0D7D6D5D4D3D2D1D010010a2a1a0DPABCDEFG段的定义HD7279指令介绍(3)(3)闪烁控制指令此命令控制各个数码管的闪烁特性,d0~d7分别对应数码管1~8,值是1表示不闪烁,为0表示闪烁,开机默认是不闪烁。D7D6D5D4D3D2D1D0D7D6D5D4D3D2D1D010001000d7d6d5d4d3d2d1d0HD7279指令介绍(4)(4)读键盘数据指令从HD7279A读出当前的按键代码,与其他指令不同,此命令的前一个字节15H是送给HD7279A的指令,而后一个字节d0~d7是HD7279A返回的按键代码,范围是0~3FH(无键按下时返回FFH),各个按键的键盘代码的定义如图所示,图中的键号就是键的代码。指令的前半段,HD7279A的DATA引脚处于高阻输入状态,接收来自微处理器的指令,指令的后半段,DATA引脚从输入状态转为输出状态,输出键盘的代码。当HD7279A检测到有效的按键时,KEY引脚从高电平变为低电平,保持到按键结束,在此期间,如果HD7279A收到读键盘数据的指令,则输出当前按键的代码,如果在收到读键盘指令的时候没有按键,则输出FFH。D7D6D5D4D3D2D1D0D7D6D5D4D3D2D1D000011111d7d6d5d4d3d2d1d0HD7279的读写时序(1)HD7279A采用串行方式与微处理器通讯,串行数据从DATA引脚送入芯片,并与CLK引脚同步,当片选信号变为低电平后,DATA引脚上的数据在CLK引脚的上升沿被写入HD7279A的缓冲寄存器。HD7279A的指令结构有三种类型:①不带数据的纯指令,指令的宽度为8个BIT,即微处理器需发送8个CLK脉冲,时序如下;HD7279的读写时序(2)②带有数据的指令,宽度为16个BIT,即微处理器需发送16个CLK肪冲,时序如下;HD7279的读写时序(3)③读取键盘数据指令,宽度为16个BIT,前8个为微处理器发送到HD7279的指令,后8个BIT为HD7279A返回的键盘代码,时序如下图所示。实验系统上使用的显示和按键的控制芯片就是HD7279A,在实验板上采用了6位共阴式数码管和16个按键。实验内容(1)本实验例程通过C8051F020的P1.6,P1.7连接7279A的CLK和DATA实现串行数据编程,而HD7279A的片选引脚CS连在P5.7,KEY连在比较器1的同相输入端CP1P,比较器1的反相输入端CP1N接2.4V,利用比较器的输出来判断有无按键按下,当无键按下时,KEY引脚保持高电平,所以比较器CP1输出高电平,而当有键按下时,KEY引脚输出低电平,比较器CP1输出低电平。可以采用中断的方式也可以采用查询的方式,本实验中采用查询的方式来判断按键。实现数据的显示,左移,右移及闪烁。(2)编写并调试一个实验程序,完成数据的显示,左移,右移及闪烁。完成从键盘上输入数据并显示的功能。开始时闪烁显示“—”(即最右边的LED闪烁显示“-”),等待用户输入数据。每输入一个数据后原数据左移一位,新输入的数据显示在右起第二位,最右边的一位仍然闪烁显示“-”,等待输入下一个数据。实验箱上HD7279接口电路程序流程图开始关看门狗初始化时钟使能比较器复位7229在最右端数码管闪烁显示“-”读取按键有效按键?数码管更新显示按键是否参考程序分析(1)①实验主程序main.c//-------------------------------------------------------------------------//包含头文件声明//-------------------------------------------------------------------------#include"c8051f020.h"#include<intrins.h>//-------------------------------------------------------------------------//外部函数声明//-------------------------------------------------------------------------extern
voidTest7279(void);参考程序分析(2)//-------------------------------------------------------------------------//函数定义//-------------------------------------------------------------------------//系统时钟初始化函数void
SYSCLK_Init
(void){
inti;
//延迟计数
OSCXCN=
0x67;
//启动外部晶体振荡器,频率11.0592MHz
for
(i=0;i<
256;i++)
;
//等待外部晶振启动
while
(!(OSCXCN&
0x80))
;
//等待外部晶振稳定
OSCICN=
0x88;
//选择外部晶振作为系统时钟
//使能丢失时钟检测器}//端口初始化函数void
PORT_Init
(void){XBR2=
0x40;
//使能交叉开关和弱上拉}参考程序分析(3)//主函数voidmain(void)
{WDTCN=
0xde;WDTCN=
0xad;
//关看门狗
SYSCLK_Init
();
//初始化时钟
PORT_Init();
//初始化端口
CPT1CN|=0x80;
//使能比较器1Test7279();}参考程序分析(4)②HD7279的测试程序test7279.c//------------------------------------------------------------------------//包含头文件声明//------------------------------------------------------------------------#include<c8051f020.h>#include<intrins.h>//------------------------------------------------------------------------//特殊功能位声明//------------------------------------------------------------------------sbitHD7279_DAT=P1^7;sbitHD7279_CLK=P1^6;参考程序分析(5)//------------------------------------------------------------------------//宏定义//------------------------------------------------------------------------#defineNOSELECT7279P5|=0x80//SPICS4(P57)=1#defineSELECT7279P5&=~(0x80)//SPICS4(P57)=0;#defineSet7279DATHD7279_DAT=1#defineClr7279DATHD7279_DAT=0#defineSet7279CLKHD7279_CLK=1#defineClr7279CLKHD7279_CLK=0//------------------------------------------------------------------------//全局变量定义//------------------------------------------------------------------------unsigned
charcodeBdSeg[]={
0x7e,0x30,0x6d,0x79,
//0123的七段码
0x33,0x5b,0x5f,0x70,
//4567的七段码
0x7f,0x7b,0x77,0x1f,
//89ab的七段码
0x4e,0x3d,0x4f,0x47,
//cdef的七段码
0x00,0x01};
参考程序分析(6)//------------------------------------------------------------------------//函数定义//------------------------------------------------------------------------//延时1us函数voidDelay1us(unsigned
charus){
while
(us){_nop_();_nop_();_nop_();_nop_();_nop_();
--us;
}}//给7279发送一个字节函数voidSend7279Byte(unsigned
char
ch)
{
chari;SELECT7279;
//置CS低电平
Delay1us(50);
//延时50μ
for
(i=0;i<8;i++)
{
if
(ch&0x80)Set7279DAT;
//输出7位到HD7279A的DATA端
elseClr7279DAT;Set7279CLK;
//置CLK高电平
ch=ch<<1;
//待发数据左移
Delay1us(8);
//延时8μClr7279CLK;
//置CLK低电平
Delay1us(8);
//延时50μ
}Clr7279DAT;
//发送完毕,DATA端置低,返回}参考程序分析(7)//从7279接收一个字节函数unsigned
charReceive7279Byte(void)
{
unsigned
char
i,ch;
ch=0;
Set7279DAT;
//DATA端置为高电平,输入状态
Delay1us(50);
//延时50μ
for
(i=0;i<8;i++)
{Set7279CLK;
//置CLK高电平
Delay1us(8);
//延时8μ
ch=ch<<1;
//接收数据左移1位
if
(HD7279_DAT)
ch+=1;
//接收1位数据
Clr7279CLK;
//置CLK低电平
Delay1us(8);
//延时8μ
}Clr7279DAT;
//接收完毕,DATA端重新置成低电平(输出状态)
return
ch;}参考程序分析(8)void
DispLED(char
*DispBuf,char
ShowDot)
{
//ShowDot
显示小数点位
char
i,ch;
ShowDot--;
for
(i=0;i<6;i++)
{
ch=DispBuf[i];
if
((ch>='a')
&&
(ch<='f'))
{
ch-='a';ch+=0xa;
}
if
((ch>='A')
&&
(ch<='F'))
{
ch-='A';ch+=0xa;
}Send7279Byte(0x90+5-i);
//不译码
if
(ch=='')Send7279Byte(0x00);
else
if
(ch=='-')Send7279Byte(0x01);
else
{
if
(ShowDot==i)Send7279Byte(0x80|BdSeg[ch&0x0f]);
elseSend7279Byte(BdSeg[ch&0x0f]);
}
}NOSELECT7279;
//置CS高电平}
//控制6个七段码显示的函数/*;b6;----;b1|b0|b5;----small;b2|b3|b4;----.b7*/参考程序分析(9)//读取按键函数,无键按下返回-1,否则返回键值char
GetKeyValue(void)
{
char
KeyValue;
if
(CPT1CN&0x40)
return
-1;
//无键按下返回-1,否则返回键值
Send7279Byte(0x15);
//发读键盘指令
KeyValue=Receive7279Byte();NOSELECT7279;
//置CS高电平
return
KeyValue;
}//等待按键释放函数void
WaitKeyOff(void)
{
while
(!(CPT1CN&0x40));
//判断按键是否释放}
参考程序分析(10)//HD7279测试/演示函数voidTest7279(void)
{
chari,KeyValue,buf[6]="-";
Send7279Byte(0xA4);
//发复位指令
DispLED(buf,0);
//显示"-"Send7279Byte(0x88);
//发闪烁指令
Send7279Byte(0xFE);
//最右边一个七段码闪烁显示
while(1)
{
KeyValue=GetKeyValue();
//读取键盘按键
if(KeyValue!=-1)
{
//如果有按键则刷新显示
for(i=0;i<4;i++)
buf[i]=buf[i+1];
//数据左移一位
buf[4]=0x30|KeyValue;
//新输入的显示到右端
DispLED(buf,0);
//更新显示内容
WaitKeyOff();
//等待按键释放
}
}}
调试要点(1)运行程序,观察显示的数值是否与框图一致,若有错可单步执行,排除程序错误。(2)全速运行程序,实现所要求的显示功能。7.3.4定时器实验实验目的掌握定时器T0~T4的方式选择和编程方法、定时器中断服务程序的设计方法。实验内容(1)使用片内T3定时器产生中断,控制软件计数,计数器每0.1秒加1,当计数器加到5时,改变P2、P3口的状态,P2,P3口驱动发光管实现走马灯效果。(2)设置定时器T3的时钟基准为系统时钟的12分频。系统时钟采用片内2MHz的时钟源。(3)试编写一个程序,可采用T0~T4中任一个定时器,实现上述效果。实验分析将拨码开关S1和S2置于OFF位置,用连接线将CN7(CN8)及CN10(CN11)按顺序连到发光管。CN7(CN8)在实验箱的电路板上被连接到了C8051F020单片机的P2端口,CN10(CN11)被连接到了单片机的P3端口。程序流程图开始关看门狗初始化端口初始化定时器T3结束开中断等待计数器等于5?开始清TF3计数器加1返回计数器清零驱动P2、P3口实现走马灯效果NY参考程序分析(1)//---------------------------------------------------------------------//Blinky.c//本程序使用定时器3的中断服务实现走马灯的效果,//P2口和P3口所连接的指示灯0.5秒改变一次状态//---------------------------------------------------------------------//---------------------------------------------------------------------//包含头文件//---------------------------------------------------------------------#include<c8051f020.h>//SFR的声明在该头文件中//---------------------------------------------------------------------//为方便赋值,进行C8051F020的16位SFR定义//---------------------------------------------------------------------sfr16TMR3RL=
0x92;
//Timer3重装特殊功能寄存器sfr16TMR3=
0x94;
//Timer3计数器特殊功能寄存器//---------------------------------------------------------------------//常量声明//---------------------------------------------------------------------#undefSYSCLK#defineSYSCLK2000000//系统时钟2MHz参考程序分析(2)//---------------------------------------------------------------------//函数原型声明//---------------------------------------------------------------------void
PORT_Init
(void);voidTimer3_Init(intcounts);voidTimer3_ISR(void);unsigned
int
xdatap2led[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//---------------------------------------------------------------------//函数定义//---------------------------------------------------------------------//main函数voidmain(void)
{
//禁用看门狗定时器
WDTCN=
0xde;WDTCN=
0xad;
PORT_Init
();Timer3_Init(SYSCLK/
12
/
10);
//初始化定时器3以0.1秒为周期产生中断
EA=
1;
//全局中断使能
while
(1)
{
}
//循环等待中断发生}参考程序分析(3)//配置交叉开关和IO端口void
PORT_Init
(void)
{XBR2=
0x40;
//使能交叉开关和端口弱上拉}//配置定时器3:自动重装,定时中断周期由counts指明,//以系统时钟的12分频为计数时钟voidTimer3_Init(intcounts)
{TMR3CN=
0x00;
//停止定时器3并且清零TF3
//使用SYSCLK/12作为计数时钟
TMR3RL=
-counts;
//初始化重装寄存器
TMR3=
0xffff;
//使得定时器立即溢出重装初值
EIE2|=
0x01;
//使能定时器3中断
TMR3CN|=
0x04;
//启动定时器3开始定时}参考程序分析(4)//-----------------------------------------------------------------------//中断服务子程序//-----------------------------------------------------------------------//定时器3的中断服务子程序当定时器3溢出时改变LED指示灯的状态.voidTimer3_ISR(void)interrupt14
{
static
intcount;
static
inti=9,j=0;
static
intled=0xff;
TMR3CN&=
~(0x80);
//清除定时器3的溢出标志位TF3count++;
if(count==5)
{count=0;P3=led;P2=p2led[j];led=led<<1;i--;j++;
if(j==8)j=0;
if(i==0){i=9;led=0xff;
}
}}
调试要点观察发光管的显示是否实现了走马灯的效果。如有错误应检查定时器的配置是否正确及P2、P3口的输出是否正确。7.3.5直流电机转速测量控制实验实验目的了解直流电机的工作方式,掌握转速测量及控制的基本原理。转速测量和控制的基本原理直流电机的转速与施加于电机两端的电压大小有关。本例程采用片内的D/A转换器DAC0的输出控制直流电机的电压,从而控制电机的转速。本例程中采用差动方法调节DAC0的输出控制电机的转速。实际操作中可调整算法为PI或PID算法,以达到较好的动态特性和静态特性。转速单位为:转/分。实验板中选用美国普拉格公司生产的3013霍尔开关传感器测量转速,根据霍尔效应原理,将一块磁钢固定在电机转轴的边沿,在转盘下方安装一个霍尔器件,当转盘旋转到霍尔元件上方时,霍尔器件输出脉冲信号,其频率和转速成正比,测量输出脉冲的周期和频率即可计算出转速。直流电机的接口电路测速霍尔元件3013直流电机控制电路实验准备和实验内容实验准备用线将JH端子的CKMOT(转速的反馈信号)与P10(INT0)连接。实验内容(1)采用INT0中断对转速脉冲CKMOT计数,每秒读一次计数值,将此值与预设的转速值比较,若大于预设的转速值则减小DAC0的数值,若小于预设的转速值则增加DAC0的值,不断调整电机的转速,直到转速值等于预设定的值。(2)编写并调试一个实验程序,将电机当前的转速值在七段数码管上显示出来,在电机的可控范围内控制电机转速等于预设值。程序流程图结束开始初始化系统时钟初始化定时器0初始化I/O端口使能比较器1使能片内参考电压使能DAC0初始化7279调用电机控制程序到1S?开始返回读取转速值并与设定值比较,若转速高则减少ADC转换值,若转速低则增加ADC转化值NY参考程序分析(1)实验参考程序①主程序main.c//-------------------------------------------------------------------//包含头文件//-------------------------------------------------------------------#include"c8051f020.h"#include<intrins.h>//-------------------------------------------------------------------//特殊功能寄存器声明//-------------------------------------------------------------------sfr16DAC0=
0xd2;
//DAC0数据寄存器//-------------------------------------------------------------------//常量声明//-------------------------------------------------------------------#defineSetSpeed30参考程序分析(2)//-------------------------------------------------------------------//全局变量定义//-------------------------------------------------------------------unsigned
intCount1s=1000;unsigned
int
SaveMotorCount,MotorCount=0;unsigned
intiDAC0=2048;intSD;unsigned
charCount1ms;//-------------------------------------------------------------------//外部函数声明//-------------------------------------------------------------------extern
void
TestMotor(void);//-------------------------------------------------------------------//函数定义//-------------------------------------------------------------------//系统时钟初始化void
SYSCLK_Init
(void){
inti;
//延迟计数
OSCXCN=
0x67;
//启动外部晶体振荡器,频率11.0592MHz
for
(i=0;i<
256;i++)
;
//等待外部晶振启动
while
(!(OSCXCN&
0x80))
;
//等待外部晶振稳定
OSCICN=
0x88;
//选择外部晶振作为系统时钟
//使能丢失时钟检测器}参考程序分析(3)//端口初始化void
PORT_Init
(void){XBR0=
0x07;
//EnableSMBus,SPI0,andUART0XBR1=
0x04;
//P10<---int0XBR2=
0x40;
//使能交叉开关和弱上拉}//定时器初始化voidTimer0_Init(void){CKCON|=0x8;TMOD|=0x1;
//选择16定时模式
Count1ms=10;TR0=
0;
//定制定时器0TH0=
(-SYSCLK/1000)
>>
8;
//设置定时器溢出周期1msTL0=
-SYSCLK/1000;TR0=
1;
//启动Timer0IE|=
0x2;
}参考程序分析(4)//延时1ms函数voidDelay1ms(unsigned
charT){Count1ms=T;
while
(Count1ms);}//主函数voidmain(void)
{WDTCN=
0xde;WDTCN=
0xad;
//关看门狗
SYSCLK_Init
();
//初始化时钟
Timer0_Init();
//初始化定时器
PORT_Init
();
//初始化IO口
REF0CN=
0x03;
//使能片内参考电压
DAC0CN|=
0x80;
//使能DAC0DAC0H=0;DAC0L=0;IT0=1;IE|=
0x01;
//使能INT0中断
EA=1;
//开中断
TestMotor();}
参考程序分析(5)//--------------------------------------------------------------------//中断服务函数定义//--------------------------------------------------------------------//定时器0中断服务函数voidTimer0_ISR(void)interrupt1
//1ms定时中断服务程序
{
TH0=
(-SYSCLK/1000)
>>
8;
TL0=
-SYSCLK/1000;
if
(Count1ms)Count1ms--;
if
(Count1s)Count1s--;
else{Count1s=1000;
SaveMotorCount=MotorCount;
MotorCount=0;SD=SaveMotorCount/2-SetSpeed;
SaveMotorCount*=30;
if
(SD){
if
((SD>5)||(SD<-5))iDAC0-=SD*4;
elseiDAC0-=SD;DAC0=iDAC0;
}
}}//外部中断0服务函数voidInt0_ISR(void)interrupt0
{
MotorCount++;}
参考程序分析(6)②数模转换程序dac.c/*实验准备:用连接线将JH端子的CKMOT与P10(INT0)连接*///---------------------------------------------------------------------//包含头文件//---------------------------------------------------------------------#include"c8051f020.h"#include<intrins.h>//--------------------------------------------------------------------//特殊功能寄存器声明//--------------------------------------------------------------------sfr16DAC0=
0xd2;
//DAC0数据寄存器参考程序分析(7)//--------------------------------------------------------------------//外部变量声明//--------------------------------------------------------------------extern
unsigned
int
SaveMotorCount;extern
unsigned
intiDAC0;//--------------------------------------------------------------------//外部函数声明//--------------------------------------------------------------------extern
voidDelay1ms(unsigned
charT);extern
void
DispLED(char
*DispBuf,char
ShowDot);
//ShowDot
显示小数点位void
TestMotor(void){
charbuf[6];DAC0=iDAC0;
for
(;;){Delay1ms(100);buf[0]='F';buf[1]='';buf[2]=(SaveMotorCount%10000)/1000;buf[3]=(SaveMotorCount%1000)/100;buf[4]=(SaveMotorCount%100)/10;buf[5]=(SaveMotorCount%10);DispLED(buf,0);
}}参考程序分析(8)③7279显示程序7279disp.c//---------------------------------------------------------------------//包含头文件//---------------------------------------------------------------------#include"c8051f020.h"#include<intrins.h>//---------------------------------------------------------------------//特殊功能位声明//---------------------------------------------------------------------sbitHD7279_DAT=P1^7;sbitHD7279_CLK=P1^6;//--------------------------------------------------------------------//宏定义//--------------------------------------------------------------------#defineNOSELECT7279P5|=0x80//SPICS4(P57)=1#defineSELECT7279P5&=~(0x80)//SPICS4(P57)=0;#defineSet7279DATHD7279_DAT=1#defineClr7279DATHD7279_DAT=0#defineSet7279CLKHD7279_CLK=1#defineClr7279CLKHD7279_CLK=0
参考程序分析(9)//--------------------------------------------------------------------//全局变量定义//-----
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年阿克苏货运从业资格证考试模拟考试题库下载
- 临终关怀的悲伤处理策略考核试卷
- 2025年外研衔接版高二数学上册阶段测试试卷含答案
- 2025年浙教版选择性必修二地理下册阶段测试试卷
- 智能语音助手合作开发合同(2篇)
- 机关单位食堂与供应商的协议书范本(2篇)
- 2025年新科版选修化学下册月考试卷含答案
- 2025年仁爱科普版必修1语文下册阶段测试试卷含答案
- 2025年人民版九年级数学上册阶段测试试卷
- 2025年人教A新版选择性必修2化学上册月考试卷含答案
- 2025年华侨港澳台学生联招考试英语试卷试题(含答案详解)
- 2024-2025学年北京石景山区九年级初三(上)期末语文试卷(含答案)
- 第一章 整式的乘除 单元测试(含答案) 2024-2025学年北师大版数学七年级下册
- JD37-009-2024 山东省存量更新片区城市设计编制技术导则
- 中国高血压防治指南(2024年修订版)
- GB/Z 44765.3-2024用户端能源管理系统和电网侧管理系统间的接口第3部分:架构
- 《春酒》琦君完整版
- 北师大版(2024新版)七年级上册数学第四章《基本平面图形》测试卷(含答案解析)
- 湖南省邵阳市武冈市2024届高三上学期期中考试地理含答案解析
- 春节后复工安全教育培训考试试题及答案
- 分部分项工程质量检验计划表
评论
0/150
提交评论