内容正文:
项目一:设计制作广告灯
项目1设计制作广告灯
本项目学习目标
1)了解MCS-51的资源及掌握最小系统的构成;
2)了解MCS-51的寻址方式及指令系统;
3)掌握C51程序设计语言;
4)了解MCS-51程序的基本结构,掌握C51的简单程序设计;
5)掌握程序设计软件Keil uVision2、仿真软件Proteus及程序下载工具的使用;
6)学会简单单片机控制系统的设计、仿真、制作与调试。
项目1设计制作广告灯
项目描述
1.项目名称
项目名称:设计制作广告灯
2.项目要求
1)用Keil uVision2、Proteus、下载软件等作开发工具;
2)用AT89C51单片机作控制;
3)依次实现功能:8只LED灯闪烁8次,8只LED灯奇偶交替点亮8次,L1-L4与L8-8交替闪烁8次,8只LED灯全灭1次;
4)闪烁周期时间自定;
5)发挥扩充功能:从左至右(或从右至左)轮流闪烁、拉幕功能等。
项目1设计制作广告灯
3.设计制作任务
1)拟定总体设计制作方案;
2)设计硬件电路;
3)编制软件流程图及设计源程序;
4)仿真调试广告灯;
5)安装元件,制作广告灯,调试功能指标;
6)完成项目报告。
项目描述
项目1设计制作广告灯
相关知识--数制
十进制
十进制以10为基数,共有0〜9十个数码,计数规律为低位向高位逢十进一。各数码在不同位的权不一样,故值也不同。例如444,三个数码虽然都是4,但百位的4表示400,即4×102;十位的4表示40,即4×101;个位的4表示4,即4×100;其中102、101、100称为十进制数各位的权。如一个十进制数585.5按每一位数展开可表示为:
(585.5)10 = 5×102+8×101+5×100+5×10-1
项目1设计制作广告灯
二进制
计算机中经常采用二进制。二进制的基数为2,共有0和1两个数码,计数规律为低位向高位逢二进一。各数码在不同位的权不一样,故值也不同。二进制数用下标B或“2”表示,其权为:…,22,21,20,2-1,…。 如一个二进制数101. 101按每一位数展开可表示为:
(101. 101)2 = l×22+0×21+l×20+l×2-1+0×2-2+l×2-3。
相关知识--数制
项目1设计制作广告灯
八进制数
在八进制数中,基数为8。因此,在八进制数中出现的数字字符有8个:0,1,2,3,4,5,6,7。每一位计数的原则为"逢八进一",用下标“o” 或“8”表示。其权为:…,82,81,80,8-1,…。例如一个八进制数(61.3)8按每一位数展开可表示为:
(61.3)8= 6×81+1×80+3×8-1。
相关知识--数制
项目1设计制作广告灯
十六进制数
在十六进制数中,基数为16。因此,在十六进制数中出现的数字字符有16个:0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,其中A、B、C、D、E、F分别表示值10,11,12,13,14,15。十六进制数中每一位计数原则为"逢十六进一",用下标H表示.或0X(C51)开头表示。
相关知识--数制
项目1设计制作广告灯
相关知识--数制
其权为:…,162,161,160,16-1,…。
例如一个十六进制数(-A0.8)16按每一位数展开可表示为:
(-A0.8)16=-(10×161+0×160+8×16-1).
项目1设计制作广告灯
各数制之间的转换
1)R(R表示任何数制的基数)进制数转换为十进制数
二进制、八进制和十六进制数转换为等值的十进制数,采用按权相加法。用多项式表示并在十进制下进行计算,所得的结果就是十进制数。
例如,将二进制数1011101转换为十进制数
(1011101)2 =(1×26+0×25+1×24+1×23+1×22+0×21+1×20)10
=(64+0+16+8+4+0+1)10
=(93)10
相关知识--数制
项目1设计制作广告灯
十进制数转换为R进制数
十进制数转换为等值的二进制、八进制和十六进制数,需要对整数部分和小数部分分别进行转换。其整数部分用连续除以基数R取余数倒排法来完成,小数部分用连续乘以基数R取整顺排法来实现。
相关知识--数制
项目1设计制作广告灯
例如: 将十进制数44.375转换成二进制数(取小数点后三位)
根据转换规则,整数部分44用除2取余倒排法:
(44)10 = (101100)2
相关知识--数制
项目1设计制作广告灯
小数部分0.375采用乘2取整顺排法:
(0.375)10 = (0.011)2
所以:(44.375)10=(101100.011)2
相关知识--数制
项目1设计制作广告灯
二进制数与八进制数、十六进制数的转换
二进制数与八进制数的转换应以"3位二进制数对应1位八进制数”的原则进行。二进制数与十六进制数的转换应以"4位二进制数对应1位十六进制数"的原则进行。
例如:(101100)2转换成十六进制数
(101100)2=(2C)H
相关知识--数制
项目1设计制作广告灯
二进制数的运算原则
加法:逢二进一;
减法:借一当二;
乘法:与算术乘法形式相同;
除法:与算术除法形式相同。
数据类型及数据单位
数据的两种类型:数值型数据和字符型数据
用三个数据单位:位、字节和字
1B(字节)=8bit(位)
1KB(千字节)=1024B(字节)
1MB(兆字节)=1024KB(千字节)
相关知识--数制
项目1设计制作广告灯
8421BCD 码
用4位二进制数码表示1位十进制数,简称二一十进制码,又叫BCD码。其中8421 BCD码是最常用的BCD码,它和四位自然二进制码相似,各位的权值为8、4、2、1,和四位自然二进制码不同的是:它只选用了四位二进制码中前10组代码,即用0000〜1001分别代表它所对应的十进制数0~9,余下的六组代码不用。
相关知识—编码
项目1设计制作广告灯
ASCⅡ 码
ASCII 码使用指定的7 位或8 位二进制数组合来表示128 或256 种可能的字符。标准ASCII 码也叫基础ASCII码,使用7 位二进制数来表示所有的大写和小写字母,数字0 到9、标点符号,以及在美式英语中使用的特殊控制字符。
相关知识—编码
项目1设计制作广告灯
相关案例---常用开发系工具及使用
案例一:应用1.Keil uVision2编辑编译程序
1.Keil uVision2开发软件使用
1)启动Keil uVision2
用鼠标左键双击图标,进入KEILL uVision2的工作界面,如图1-1所示.
图1-1
项目1设计制作广告灯
2)建立项目及设置项目
(1)建立项目
①在KEILL uVision2工作界面上用鼠标左键点下拉菜单“Project”,在弹出的菜单上点“New Project”;桌面弹出图1-3所示的“Creat New Project”创建项目对话框。
图1-3 “Creat New Project”创建新项目对话框
相关案例---常用开发系工具及使用
项目1设计制作广告灯
相关案例
②在新建项目对话框中选择保存文件位置,单击保存。
③保存项目文件后,弹出如图1-4所示的单片机型号选择对话框,左侧是date base栏,选择CPU型号,在右边栏为选中CPU的介绍。
项目1设计制作广告灯
相关案例
(2)设置项目
建立项目文件后,通常要对项目文件进行设置,才能够对源程序进行编译等操作。其设置过程是:
①如图1-5所示,在项目工作界面上点击菜单“Project”,选“Options for Target ‘Target 1’”。弹出图1-6所示项目设置界面。
图1-5 项目设置操作图
项目1设计制作广告灯
相关案例
图1-6 项目设置界面
②项目设置界面上部有多个选项卡,大多保留默认设置即可。仅“Target”、“Output”选项卡要设置。“Target”选项卡的Xtal(时钟)一项要设置与CPU及系统相符的参数。 “Output”选项卡,在“Creat HEX file”前的复选框内打“√”;
在“HEX”后的文本框中选择“HEX-80”;在“Browse Information”前的复选框内打“√”。设置后点击“确定”按钮。
项目1设计制作广告灯
相关案例
3)源程序文件管理
①新建文件:在项目工作界面,点击“File”菜单,选中“new”选项,在项目窗口的右侧打开新建源程序文件编辑窗口,在编辑窗口可以编辑源程序。
项目1设计制作广告灯
例如:输入如下程序。
#include<reg51.h>
void delay( unsigned int time )
{
unsigned int I;
unsigned char j;
for(i=0;i<time;i++)
for(j=0;j<120;j++)
;
}
main()
{
while(1)
{
P1=0xf0;
delay( 2000 );
P1=0x0f;
delay( 2000);
}
}
相关案例
项目1设计制作广告灯
相关知识
②文件保存:点击“File”菜单,选中“Save as”选项弹出保存文件对话框,在文件名栏输入自定义的文件名,选择保存路径,点击保存,源程序文件将保存在指定的位置
注意:若用C51语言编写,扩展名为“.c”,若用汇编语言编写,扩展名为“.asm”。.
③打开文件:在项目工作界面,点击“File”菜单,选中“open”选项,弹出打开文件对话框,按保存路径、程序文件扩展名类型(.c或.asm)找到要打开的源程序文件,点击打开,将在编辑窗口打开已保存的源程序文件。
项目1设计制作广告灯
相关知识
④添加源程序到项目:单击项目窗口中“Target1”前面“+”号展开目录。在“Source Group 1”目录上单击鼠标右键,选中弹出菜单项“Add files to Group ‘Source Group 1’”。最后在弹出的对话框中按“文件类型” 找到要添加的源程序文件,点击add将源程序文件添加到项目。
在项目窗口先点击Target 1前“+”展开目录,再点击Source Group 1前“+”即可看到添加到的程序文件
添加源程序后效果图
项目1设计制作广告灯
相关案例
4)编译调试和运行
①编译
如图1-8所示,在项目工作界面点击Project菜单在下拉菜单中选中Translate,将编译当前文件;选中Build target,将编译当前文件并生成应用;选中ReBuild all target file将重新编译所有文件并生成应用。在输出窗口可以观察有无语法错误。无语法错误则编译成机器码。如图1-9所示。
图1-8 编译方式选择图
图1-9 编译后输出窗口效果图
项目1设计制作广告灯
相关案例
②运行与调试
如图1-10所示,编译成功后,在项目工作界面点击Debug菜单,在下拉菜单中选中Start/Stop Debug session,开始和停止调试。选择:
step 单步运行调试,
step over 跳过子程序单步运行。
Go 运行程直到一个中断。
图1-10 选择调试运行方式图
项目1设计制作广告灯
如图1-11所示,单击View菜单,在弹出的下拉菜单中选择:
Watch & Call stack windows 观察堆栈窗口;
memory,观察内存窗口,在Address栏存储空间类型(C、D、I、X)及地址(如:C:00010),观察指定空间(如ROM中10H)的内容。
相关案例
图1-11 选择调试观察窗口图
项目1设计制作广告灯
相关案例
进入调试模式后,单击Peripherals菜单,在弹出的下拉菜单中选择选择:
Interrupt:中断
I/O Port: I/O口
Time:定时器
Serial:观察窗口进行设置和观察
图1-12 选择外围模拟器件
项目1设计制作广告灯
相关案例
例如:编译程序text.asm后,在Peripherals菜单中I/O Port打开P1观察窗口,选择在debug菜单中选择step(单步运行),将在P1端口观察到程序运行时的执行结果。如图1-13所示。
图1-13 I/O口调试图
项目1设计制作广告灯
相关案例--- Proteus仿真软件使用
案例二: 用Proteus仿真案例一程序。
1)启动Proteus ISIS
双击桌面上的ISIS 6 Professional图标进入如图1-14所示的Proteus ISIS集成环境。
图1-14Proteus ISIS集成环境
项目1设计制作广告灯
相关案例
2)文件管理
① 建立文件
单击“file”菜单,在下拉菜单中选择“New Design”,弹出设计纸张对话框选择纸张(例如landscapeA4)进入设计如图1-15所示设计工作环境。
图1-15proteus设计工作环境图
项目1设计制作广告灯
相关案例
② 保存文件
单击“file”菜单,在下拉菜单中选择“Save Design As”,弹出保存路径对话框,填写文件名和选择路径,点击保存按钮将保存文件。
③ 打开文件
单击“file”菜单,在下拉菜单中选择“Load Design”,弹出寻找路径对话框,找到待打开的设计文件,点击打开按钮将打开文件。
3)建立仿真模型
①建立元件库
选择设计工作环境界面工具箱上图标componet(元件选取工具)图标
项目1设计制作广告灯
相关案例
如图1-16a所示,点击对象选择器的p按钮(pick Devices)元件如图1-16b所示,在打开的对话框keyword文本框键入要找的元件(如AT89C51),在备选对象中选择元件(如AT89C51),点击OK,元件将添加到库文件库,如图1-17所示。
常用元件keyword:
Resististors (电阻)、
Ceramic(电容)
Genleect(电解电容)
Crysta(晶振)
Led-Red(红色发光二极管)
1-16a 图1-16b
图-17 添加库元件图
项目1设计制作广告灯
相关案例
② 放置元件
在元件库中,选择待放置的元件(如AT89C51),点击原理图编辑窗口放置元件,如图1-18所示。
图1-18 放置仿真元件图
项目1设计制作广告灯
相关案例
③元件编辑
在元件上单击右键选中元件,单击并按住左键将拖动元件移动;选择工具将调整元件放置方向;
单击左键将弹出元件参数设置对话框,在对话框进行参数和序号设置等。
如图1-19所示为CPU参数设置图。
图1-19 CPU参数设置图
其中Program File栏为添加.HEX文件项,通过点击按钮浏览打开.HEX文件(如c51.hex)添加。
项目1设计制作广告灯
相关案例
④ 电路连线
绘制件点击图标,把元件连接成仿真电路,如图1-20所示,为简单仿真电路模型。
图1-20 简单仿真电路模型
项目1设计制作广告灯
相关案例
3)仿真
点击 工具图标运行、暂停、停止仿真。可以观察仿真效果。
3. 程序固化工具使用
单片机下载工具和软件目前常用的有周立功编程器、伟福编程器、ISP下载等,实现把编译成的机器码烧录到单片机芯片或程序存储器中。
这些工具使用流程硬件连接->运行下载软件->选择CPU型号->打开.hex文件->设置下载模式->下载。
项目1设计制作广告灯
相关知识---程序固化工具使用
3. 程序固化工具使用
单片机下载工具和软件目前常用的有周立功编程器、伟福编程器、ISP下载等,实现把编译成的机器码烧录到单片机芯片或程序存储器中。
这些工具使用流程硬件连接->运行下载软件->选择CPU型号->打开.hex文件->设置下载模式->下载。
项目1设计制作广告灯
相关知识
单片机简介
计算机系统向巨型化、单片化、网络化方向发展。把计算机系统集成在一块半导体芯片上。这种单片计算机简称单片机。
1)MCS-51单片机及兼容产品(Intel 、 PHilips、Atmel、ADI等 )
2) 其他类型的单片机产品(Motorola、TI、MicrocHip、ST、Epson 、MPS430等 )
3)单片机处理器的应用范围
通信、网络、金融、交通、医疗、消费电子、仪器仪表、制造业控制等领域;航天、航空、军事装备领域。
项目1设计制作广告灯
相关知识
1.MCS-51单片机简介
MCS-51单片机结构及指令系统
子
系
列 片内ROM形式 R
O
M
容
量 R
A
M
容
量 寻
址
范
围 I/O口端口 中
断
源
无 ROM EPROM 计数器 并行口 串行口
51
系
列 8031 8051 8751 4KB 128B 2*64KB 2*16 4*8 1 5
80C31 80C51 87C51 4KB 128B 2*64KB 2*16 4*8 1 5
52
系
列 8032 8052 8752 8KB 256B 2*64KB 3*16 4*8 1 6
80C32 80C52 87C52 8KB 256B 2*64KB 3*16 4*8 1 6
项目1设计制作广告灯
相关知识
2. 8051/8052的引脚功能说明
1) 信号引脚
P0.0 ~ P0.7 :P0口8位双向口线。
P1.0 ~ P1.7 :P1口8位双向口线。
P2.0 ~ P2.7 :P2口8位双向口线。
P3.0 ~ P3.7 :P3口8位双向口线。
P0-P3口都由锁存器、输入缓冲器/输出驱动器所组成,
P1、P2、P3内置上拉电阻,P0口需外接10K左右的上拉电阻。
P0-P3口作输入口时,必须先写入“1”.
1-21 8051 /8052引脚图
项目1设计制作广告灯
相关知识
ALE:地址锁存控制信号。在系统扩展时,ALE用于控制把P0口输出的低8位地址锁存器锁存起来,以实现低位地址和数据的隔离。此外,ALE以晶振六分之一的固定频率输出的正脉冲,可作为外部时钟或外部定时脉冲使用。
/PSEN:外部程序存储器读选通信号。在读外部ROM时/PSEN有效(低电平),以实现外部ROM单元的读操作。
/EA:访问程序存储控制信号。当/EA信号为低电平时,对ROM的读操作限定在外部程序存储器;当/EA信号为高电平时,则对ROM的读操作是从内部程序存储器开始,可延至外部程序存储器。
项目1设计制作广告灯
相关知识
RST:复位信号。当输入的复位信号延续2个机器周期以上高电平即为有效,用以完成单片机的复位操作。
XTAL1和XTAL2 :外接晶体引线端。当使用芯片内部时钟时,用于外接石英晶体和微调电容;当使用外部时钟时,用于接外部时钟脉冲信号。
VSS:地线。
VCC:+5V电源。
项目1设计制作广告灯
相关知识
(1)P3口线的第二功能
2) 信号引脚的第二功能
引脚 第二功能 信号名称
P3.0 RXD 串行数据接收
P3.1 TXD 串行数据发送
P3.2 /INT0 外部中断0申请
P3.3 /INT1 外部中断1申请
P3.4 T0 定时器/计数器0的外部输入
P3.5 T1 定时器/计数器1的外部输入
P3.6 /WR 外部RAM写选通
P3.7 /RD 外部RAM读选通
项目1设计制作广告灯
相关知识
(2)EPROM存储器程序固化所需要的信号
30脚(ALE/PROG):编程脉冲。
31脚/EA(/VPP):编程电压(25V)。
(3)备用电源引入
9脚(RST/VPD):备用电源。
注:各种型号的芯片,其引脚的第一功能信号是相同的,所不同的只在引脚的第二功能信号。
项目1设计制作广告灯
相关知识
1) 内部数据存储器RAM
8051的内部RAM共有256个单元,通常把这256个单元按其功能划分为低128单元(单元地址00H~7FH)和高128单元(单元地址80H~FFH)两部分。
(1) 低128单元内部数据存储器
低128单元(单元地址00H~7FH)低128单元是单片机的真正RAM存储器,按其用途划分为三个区域配置如图1-22所示。
3.存储器结构
项目1设计制作广告灯
相关知识
30H ~7FH 数据缓冲区
20H ~2FH 位寻址区(00H~7FH)
18H ~1FH 工作寄存器3区(R7~R0)
10H ~17H 工作寄存器2区(R7~R0)
08H ~0FH 工作寄存器1区(R7~R0)
00H ~07H 工作寄存器0区(R7~R0)
图1-22 片内RAM的配置
项目1设计制作广告灯
相关知识
①寄存器区
共有四组寄存器,每组8个寄存单元(各为8位),各组都以R0~R7作寄存单元编号。寄存器常用于存放操作数及中间结果等,由于它们的功能及使用不作预先规定,因此称之为通用寄存器(也叫工作寄存器)。
在任一时刻,CPU只能使用其中的一组寄存器,由程序状态字寄存器PSW中RS1、RS0位的状态组合来决定,并且把正在使用的那组寄存器称之为当前寄存器组。
项目1设计制作广告灯
相关知识
②位寻址区
内部RAM的20H~2FH单元,既可作为一般RAM单元使用,进行字节操作,也可以对单元中每一位进行操作(位操作),因此把该地址范围称之为位寻址区。位寻址区共有16个RAM单元,计128位,位地址为00H~7FH,如表1-4所示。MCS-51具有布尔处理机功能,这个位寻址区可以构成布尔处理机的存储空间。
项目1设计制作广告灯
相关知识
表1-4 片内RAM位寻址区的位地址
位地址/位名称 字节
地址
D7 D6 D5 D4 D3 D2 D1 D0
7F 7E 7D 7C 7B 7A 79 78 2FH
77 76 75 74 73 72 71 70 2EH
6F 6E 6D 6C 6B 6A 69 68 2DH
67 66 65 64 63 62 61 60 2CH
5F 5E 5D 5C 5B 5A 59 58 2BH
57 56 55 54 53 52 51 50 2AH
4F 4E 4D 4C 4B 4A 49 48 29H
47 46 45 44 43 42 41 40 28H
3F 3E 3D 3C 3B 3A 39 38 27H
37 36 35 34 33 32 31 30 26H
2F 2E 2D 2C 2B 2A 29 28 25H
27 26 25 24 23 22 21 20 24H
1F 1E 1D 1C 1B 1A 19 18 23H
17 16 15 14 13 12 11 10 22H
0F 0E 0D 0C 0B 0A 09 08 21H
07 06 05 04 03 02 01 00 20H
项目1设计制作广告灯
相关知识
(2)高128单元内部数据存储器
内部RAM的高128单元为专用寄存器使用,其单元地址为80H~FFH。因这些寄存器的功能已作专门规定,故而称之为专用寄存器(Special Function Register),也可称为特殊功能寄存器,8051共有21个专用寄存器。
①部分专用寄存器(SFR)
程序计数器(PC——Program Counter)
PC是一个16位的计数器,它的作用是控制程序的执行顺序。存放下一条将要执行指令的地址,寻址范围达64KB。PC有自动加1功能,从而实现程序的顺序执行。用户不能对它进行读写。
项目1设计制作广告灯
相关知识
累加器(ACC)
累加器为8位寄存器,是最常用的专用寄存器,功能较多,地位重要。用于存放操作数及运算的中间结果。
B寄存器
B寄存器是一个8位寄存器,主要用于乘除运算。乘法运算时,B是乘数。乘法操作后,乘积的高8位存于B中,除法运算时,B是除数。除法操作后,余数存于B中。此外,B寄存器也可作为一般数据寄存器使用。
程序状态字(PSW——Program Status Word)
程序状态字是一个8位寄存器,用于存程序运行中的各种状态信息。其中有些位状态是根据程序执行结果,由硬件自动设置的,有些位状态则使用软件方法设定。PSW的位状态可以用专门指令进行测试,也可以用指令读出。各位定义如表1-5所示。
项目1设计制作广告灯
相关知识
表1-5 PSW的各位定义表
PSW位地址 D7H D6H D5H D4H D3H D2H D1H D0H
字节地址D0H CY AC F0 RS1 RS0 OV P
CY(PSW.7)——进位标志位。
AC(PSW.6)——辅助进位标志位。
F0(PSW.5)——用户标志位。
RS1和RS0(PSW.4,PSW.3)——寄存器组选择位。
OV(PSW.2)——溢出标志位。
P(PSW.0)——奇偶标志位。
项目1设计制作广告灯
相关知识
数据指针(DPTR)
MCS-51中一个16位寄存器。DPTR通常在访问外部数据存储器时作地址指针使用,
堆栈指针(SP----Stack Pointer)
堆栈是一个特殊的存储区,用来暂存数据和地址,它是按“先进后出”的原则存取数据的。堆栈共有两种操作:进栈和出栈。
MCS-51单片机堆栈设在内部RAM中, SP是一个8位寄存器. 系统复位后,SP的内容为07H, 堆栈实际上从08H单元开始。但08H~1FH单元分别属于工作寄存器1~3区, 程序中常要用到这些区,一般地,堆栈开辟在内部RAM的30H~7FH单元中。
项目1设计制作广告灯
相关知识
②专用寄存器中的字节寻址和位地址
MCS-51系列单片机有21个可寻址的专用寄存器,其中有11个专用寄存器是可以位寻址的。
21个可字节寻址的专用寄存器是不连续地分散在内部RAM高128单元之中,尽管还余有许多空闲地址,但用户不能使用。
对专用寄存器只能使用直接寻址方式,书写时既可使用寄存器符号,也可使用寄存器单元地址。
项目1设计制作广告灯
相关知识
2)内部程序存储器
片内外的ROM 是统一编址的。
如/EA端保持高电平, 8051的程序计数器PC在0000H~0FFFH地址范围内 (即前4KB地址) 是执行片内ROM中的程序, 当PC在1000H~FFFFH地址范围时,自动执行片外程序存储器中的程序,
当/EA保持低电平时,只能寻址外部程序存储器,片外存储器可以从0000H开始编址。
MCS-51的程序存储器中有些单元具有特殊功能,系统复位后,(PC)=0000H,单片机从0000H单元开始取指令执行程序。
项目1设计制作广告灯
相关知识
五个中断源的中断地址区。
0003H~000AH 外部中断0中断地址区
000BH~0012H 定时器/计数器0中断地址区
0013H~001AH 外部中断1中断地址区
001BH~0022H 定时器/计数器1中断地址区
0023H~002AH 串行中断地址区
中断响应后,按中断源自动转到各中断区的首地址(即中断入口地址)去执行程序。
项目1设计制作广告灯
相关知识
1)时钟系统
18和19两个脚外接石英晶振和陶瓷电容和CPU内部组成完整的振荡电路构成CPU的时钟系统,如图1-23所示。C1、C2为振荡频率微调电容,时钟频率为外接晶振的谐振频率,晶振频率最高位12M。
图1-23 时钟电路图
4.MCS-51的CPU时钟系统与运行速度
项目1设计制作广告灯
相关知识
CPU完成一种基本操作(取指令等)称为机器周期,机器周期的宽度分为6个状态. 每个状态的周期时钟为两个时钟周期, 因此一个机器周期等于12个时钟周期(机器周期就是振荡脉冲的十二分频)。
时钟频率为12 MHZ时
机器周期为1/(12M/12)=1us
3)指令周期
执行一条指令所需要的时间称之为指令周期。它一般由若干个机器周期组成。
MCS-51 单片机通常可以分为单周期指令、双周期指令和四周期指令等三种, 四周期指令只有乘法和除法指令两条,其余均为单周期和双周期指令。
2)机器周期
项目1设计制作广告灯
相关知识
5.复位电路
1)复位电路
MCS-51单片机的复位是外部电路来执行的,在RST引脚(9)加上持续二个机器周期(即24个振荡周期)以上的高电平就执行状态复位。单片机常见的复位电路如图(a)(b)所示。
(a) 上电复位电路(b)
(b) 按键复位电路
项目1设计制作广告灯
相关知识
单片机复位期间不产ALE和/PSEN信号,即ALE和/PSEN为高电平,单片机复位期间没有取指操作。复位后,内部各专用寄存器状态如表1-8所示。
2)寄存器的复位状态
表1-8 专用寄存器复位状态表
寄存器 状态 寄存器 状态
PC 0000H IE 0**00000B
ACC 00H TMOD 00H
B 00H TCON 00H
PSW 00H TH0 00H
SP 07H TL0 00H
DPTR 0000H TH1 00H
P0~P3 FFH TL1 00H
IP ***00000B SCON 00H
SBUF 不定 PCON 0***0000B
项目1设计制作广告灯
相关知识
单片机本身的资源外加时钟电路,复位电路及电源电路便可以构成单片机的最小系统。
图1-25 单片机最小系统图
6.单片机最小系统
项目1设计制作广告灯
相关知识
1) 指令格式
标号 :操作码 空格操作数或操作数地址;注释
2)寻址方式
(1)寄存器寻址 如 MOV R1,A
(2)直接寻址 如 MOV A,3AH
(3)立即数寻址 如 MOV A,#3AH
(4)寄存器间接寻址 如MOV A,@R0
(5)变址寻址 如MOVC A,@A+DPTR
(6)相对寻址 如SJMP 50H
(7) 位寻址 如SETB 3DH
7.指令系统
项目1设计制作广告灯
相关知识
MOV A,Rn :A(Rn)
MOV A,direct :A (direct)
MOV A,@Ri :A ((Ri))
MOV A,#data :A data
3)指令系统
共111条指令
例如:数据传送类指令
① 内部8位数据传送指令
以累加器A为目的地址的传送指令(4条)。指令的结果影响程序状态字寄存器PSW的P标志。
以Rn为目的地址的传送指令(3条)。指令的结果不影响程序状态字寄存器PSW标志。
MOV Rn, A :(Rn) (A)
MOV Rn, direct :(Rn)(direct)
MOV Rn, #data :(Rn)data
项目1设计制作广告灯
2024/7/10
C51程序设计
项目1设计制作广告灯
2024/7/10
68
C51语言特点
◆C51语言兼具高级语言和汇编语言的特点
◆C51语言简洁、运算符丰富、数据结构众多
◆C51采用结构化设计程序,程序可移植性好
◆生成目标代码效率高
相关知识
项目1设计制作广告灯
68
C51语言程序结构 文件名*.c
#include <reg51.h> /*预处理命令(不加分号)*/
int func-1(形参); /*函数类型声明 */
char func-2(形参);
……
unsigned char count; //定义全局变量
void main(void)
{
说明;
语句1;
语句2;
func-1( ); //调用函数
……
}
相关知识
int func-1(形参) //函数定义
{
说明;
语句;
}
项目1设计制作广告灯
C51的字符集、标识符与关键字
C51的字符集:数字、大小写英文字母,空格,下划线等
C51标识符 :字母、数字和下划线组成,由字母或者下划线开头
如init_time( )
关键字:有固定名称和特定含义的特殊标识符
相关知识
项目1设计制作广告灯
字符型 :unsigned char型和signed char
存放一个字节的数据
整型 :unsigned int型和signed int
存放两个字节的数据
长整型 :unsigned long型和signed long型
存放四个字节的数据
浮点型 :float型
字节地址 3 2 1 0
浮点数内容 SEEEEEEE EMMMMMMM MMMMMMMM MMMMMMMM
S位符号位,E为阶码位,M为尾数的小数部分
相关知识
单击此处编辑母版文本样式
第二级
第三级
第四级
第五级
项目1设计制作广告灯
位型 :bit型和sbit型 ,占用一位二进制位
寄存器型 :sfr和sfr16两种类型
sfr为字节型特殊功能寄存器类型,占用一个字节单元
sfr16为双字节型特殊功能寄存器类型,占用两个字节单元
相关知识
项目1设计制作广告灯
C51常量
整型常量 :二进制 例如——11110000
十进制 例如——123、-25
十六进制 例如——0x123
浮点型常量 :[±]整数部分.小数部分e[±]指数部分
例如:123.456e-3、-1.23e2
字符型常量 :例如——‘0’、‘a’、‘1’、‘!’、‘
’
字符串常量 :例如:“12ab34”、“CHINESE”
相关知识
项目1设计制作广告灯
C51变量
变量定义一般格式为:
[存储种类] 数据类型 [存储器类型] 变量名1[=初值],……
存储种类 :动态(auto)、外部(extern)、静态(static)
寄存器(register)
auto动态变量 ——在函数或者复合语句内部定义的变量,动态变量只在函数被调用时,系统才给动态变量分配存储单元,函数执行结束时释放存储空间。
相关知识
项目1设计制作广告灯
extern外部变量——要使用一个其它文件中定义的变量,该变量在函数体中要用extern说明.
static静态变量---静态变量在程序运行时始终占用存储单元
register寄存器变量 ——变量存放在CPU内部RAM的寄存器中,处理速度快 。
c编译器编译时能自动识别使用频率高的变量,并自动将其作为寄存器变量,用户可以不必专门声明。
相关知识
项目1设计制作广告灯
数据类型:char型、int型、bit型、long型、float型
例如:unsigned char name;//定义变量name为无符号字符型变量
int x; //定义变量x为带符号整型变量
bit y; //定义变量y为位型变量
相关知识
项目1设计制作广告灯
存储器类型 ——指定变量的存储区域
存储器类型 存储区域 说明
data 内部RAM的00H~7FH区域 直接寻址的内部RAM,存取速度最快
bdata 内部RAM的20H~2FH区域 位寻址区、允许位和字节的混合访问
idata 内部RAM的00H~FFH区域 间接寻址访问,用@R0、@R1间接访问
pdata 外部RAM某一页0~FFH区域 用MOVX @R0、@R1间接访问
xdata 整个外部RAM 0~FFFFH区域 用MOVX @DPTR间接访问
code 64KB的程序存储器区域 用MOVC指令访问
相关知识
单击此处编辑母版文本样式
第二级
第三级
第四级
第五级
项目1设计制作广告灯
变量名 :变量名可以由字母、数字和下画线组成,
但第一个字符必须是字母或者下画线 。
例如:unsigned char x=0x12,y=0x34,z=0x56;
相关知识
项目1设计制作广告灯
C51扩展数据类型的变量定义: C51程序设计中支持4种新的数据类型的变量定义,这4种数据类型分别为bit型、sbit型、sfr型和sfr16型
bit普通位变量: 普通位变量用来定义存放在内部RAM可以位寻址区域的变量
格式:bit [存储器类型] 变量名
例如:bit data key_in;
bit bdata key_a;
bit idata key_b;
相关知识
项目1设计制作广告灯
sbit可位寻址的特殊位变量 :可位寻址的特殊位变量可以位于内部RAM的20H~2FH区域和SFR中可以位寻址的位
sbit的格式: sbit 位变量名=位地址
相关知识
项目1设计制作广告灯
(1)用于指定已定义的可位寻址的SFR或者20H~2FH单元的某一位
例如:sbit F0=PSW^5; //定义F0为PSW.5
sbit F1=PSW^1; //定义F1为PSW.1
例如:unsigned char bdata display;
//在bdata区域定义无符号字符变量display
sbit dis_on=display^0; //定义dis_on为display.0
sbit dis_off=display^1; //定义dis_off为display.1
sbit3种定义方法:
相关知识
项目1设计制作广告灯
(3)直接指定可寻址的位地址
例如:sbit F0=0xd5;
sbit dis_on=0x0;
(2)指定可以位寻址的地址单元的某一位
例如:sbit dis_on=0x20^0;
sbit dis_off=0x20^1;
sbit F0=0xd0^5;
相关知识
项目1设计制作广告灯
sfr特殊功能寄存器变量
功能:sfr直接指定8位的特殊功能寄存器的直接地址
定义格式为: sfr 特殊功能寄存器名=绝对地址
例如: sfr P0=0x80;
sfr SP=0x81;
sfr TCON=0x88;
sfr TH0=0x8c;
sfr TL0=0x8a;
相关知识
项目1设计制作广告灯
sfr16 16位特殊功能寄存器变量
用sfr16定义16位的特殊功能寄存器的低端地址
定义格式为:
sfr16 16位特殊功能寄存器名=绝对地址的低端地址
例如:sfr16 DPTR=0x82;
相关知识
项目1设计制作广告灯
C51绝对地址访问
1.使用宏定义访问绝对地址
定义格式如下:
#include <absacc.h>
#define 变量名 DBYTE [绝对地址]
//在内部RAM中定义绝对地址字节变量
#define 变量名 DWORD [绝对地址]
//在内部RAM中定义绝对地址字变量
#define 变量名 CBYTE [绝对地址]
//在ROM中定义绝对地址字节变量
#define 变量名 CWORD [绝对地址]
//在ROM中定义绝对地址字变量
宏名
相关知识
项目1设计制作广告灯
#define 变量名 XBYTE [绝对地址]
//在外部RAM中定义绝对地址字节变量
#define 变量名 XWORD [绝对地址]
//在外部RAM中定义绝对地址字变量
#define 变量名 PBYTE [绝对地址]
//在外部RAM中某一页中定义绝对地址字节变量
#define 变量名 PWORD [绝对地址]
//在外部RAM中某一页中定义绝对地址字变量
相关知识
项目1设计制作广告灯
例1 用define定义绝对地址变量
#include <absacc.h>
#define PA8255 XBYTE[0X0000]
#define PB8255 XBYTE[0X0001]
#define PC8255 XBYTE[0X0002]
#define COM8255 XBYTE [0x0003]
COM8255=0x83; //把控制字写入8255控制寄存器
PA8255=0x0f; //把数据写入8255的PA口
unsigned char a1,a2;
a1=PB8255; //把8255PB口的数据写入变量a1
a2=XBYTE[0x0002]
//把外部RAM地址为0002H单元的数据送给变量a2
相关知识
项目1设计制作广告灯
2.使用关键字_at_指定绝对地址
格式 :[存储器类型] 数据类型 变量名_at_ 地址常数;
例2 使用关键字_at_对绝对地址访问
#include <reg52.h>
main ( )
{
data unsigned char x1_at_0x30;
//指定变量x1在内部RAM的30H单元
xdata unsigned char x2_at_0x3000;
x1=0x0f;
x2=0xf0;
}
相关知识
项目1设计制作广告灯
储存模式
SMALL模式:在SMALL模式下,缺省存储器类型时,默认变量
存放在idata区域,即片内数据存储器00H~0FFH单元。
COMPACT模式:在COMPACT模式下,缺省存储器类型时,默认变量
存放在pdata区域,即存放在片外RAM的低256B空间。
LARGE模式:在LARGE模式下,缺省存储器类型时,默认变量
存放在xdata区域,即存放于片外RAM的64KB空间。
相关知识
项目1设计制作广告灯
在程序中变量的存储模式由#pragma预处理命令来实现,函数存储模式可通过在函数定义时后面带存储模式来说明.如果没有指定,则系统都默认为SMALL模式。
例3 变量和函数的存储模式
#pragma small //变量存储模式为SMALL模式
unsigned char a;
#pragma compact //变量存储模式为COMPACT模式
unsigned char b;
int func1(int x1,int x2) large //函数存储模式为LARGE模式
{
return (x1*x2);
}
相关知识
项目1设计制作广告灯
1算术运算符与算术表达式
双目运算符 :+(加)、-(减)、
*(乘)、/(除)、%(取余)
单目算术运算符:+(取正)、-(取负)、++(自增1)、
--(自减1)
2逻辑运算符与逻辑表达式
1.&& 逻辑与
2.||逻辑或
3.!逻辑非
相关知识---C51运算符和表达式
项目1设计制作广告灯
3关系运算符与关系表达式
<(小于)、<=(小于等于)、>(大于)、>=(大于等于)、
= =(等于)、!=(不等于)
关系表达式的一般格式为: 表达式1 关系运算符 表达式2
关系表达式的运算结果为逻辑值,要么为真(值为1),
要么为假(值为0)
相关知识
项目1设计制作广告灯
4位操作运算符与位表达式
6种位运算符:&(按位与)、|(按位或)、^(按位异或)、
~ (按位取反)、<<(左移)、>>(右移)
例如:P0=P0&0xfe; //该语句的功能为把P0.0清0
例如:P0=P0|0x01; //该语句的功能为把P0.0置1
例如:P0=P0^0x01; //该语句的功能为把P0.0取反
例如:unsigned char a=0x7f,b;
b= ~ a;
执行结果为b=0x80
相关知识
项目1设计制作广告灯
左移运算
其功能是将一个操作数左移若干位,高位溢出舍去,低位补0。
例如:unsigned char a=0x3f,b;
b=a<<2;
执行结果为b=0xfc,相当于b=a*22
右移运算
其功能是将一个操作数右移若干位,对于无符号的数高端
移入0,低端移出舍掉。如果是带符号的数,高端移入操作数的
符号位,右端移出位被舍掉。
例如:signed char a=-5,b;
b=a>>1;
则执行结果为b=0xfd
相关知识
项目1设计制作广告灯
5 赋值运算符与赋值表达式
赋值表达式的一般格式为: 变量 = 表达式
复合赋值运算符 :+=、- =、*=、/=、%=、<<=、>>=、&=、^=、|=
6逗号运算符与逗号表达式
逗号表达式的一般形式为:
表达式1,表达式2,表达式3,……,表达式n
例如:a=1,b=2;
相关知识
项目1设计制作广告灯
if语句
if语句有3种形式:
(1)if (表达式)
语句;
(2) if (表达式)
语句1;
else
语句2;
相关知识---C51语句
项目1设计制作广告灯
(3) if (表达式1)
语句1;
else if (表达式2)
语句2;
else if (表达式3)
语句3;
……
else if(表达式n)
语句n
else
语句n+1;
相关知识
项目1设计制作广告灯
switch语句
switch语句是直接处理多分支的选择语句,
一般格式为:
switch (表达式)
case 常量表达式1:语句1;
case 常量表达式2:语句2;
……
case 常量表达式n:语句n;
default:语句n+1;
相关知识
项目1设计制作广告灯
while语句
while语句的一般形式为:
while(表达式) 语句;
do-while语句
do-while语句的一般形式为:
do
{ 语句;}
while (表达式)
相关知识
项目1设计制作广告灯
for语句
for语句的一般形式为:
for(表达式1;表达式2;表达式3)
语句;
(1)goto语句为无条件转移语句,它的一般形式为:
goto 标号;
goto语句、
相关知识
项目1设计制作广告灯
break语句
break语句只能用在switch语句和循环语句中。
在switch语句中可以用break语句跳出switch结构,使程序继续执行switch结构后面的一个语句;
在循环语句中,使用break语句从循环体中跳出循环,提前结束循环而执行循环结构下面的语句。
continue语句
continue语句用在循环体结构中,用于结束本次循环,
跳过循环体中continue下面尚未执行的语句,直接进行下一次是否执行循环的判断。
相关知识
项目1设计制作广告灯
return语句
return语句一般放在函数的最后位置,用于终止函数的执行,并控制程序返回调用该函数时所处的位置 。
相关知识
项目1设计制作广告灯
函数的定义
定义一个函数的一般形式如下:
[函数数据类型] 函数名 (形参列表)
形参说明
{
局部变量定义;
语句;
}
有返回值的函数必须有一个或几个return语句
相关知识---函数、库函数和预处理命令
项目1设计制作广告灯
函数的调用和声明
1.函数的调用
函数调用的一般形式为:函数名 (实参列表)
例如:int a,b,c;
c=min(a,b); //调用上节中的min函数,求a,b中的最小值
2.函数的声明
函数声明的一般格式为:
[函数数据类型] 函数名 (形参列表)
若调用外部函数,则函数声明的一般格式为:
extern [函数数据类型] 函数名 (形参列表)
相关知识
项目1设计制作广告灯
中断函数
1.中断函数的定义
C51中用关键字interrupt和中断号定义中断函数,一般格式如下:
[void] 中断函数名( ) interrupt 中断号m [using n]
{
函数体
}
中断号m的取值为0~5,分别对应51系列单片机中的6个中断源。外中断0(INT0)的中断号为0,定时计数器T0的中断号为1,外中断1(INT1)的中断号为2,定时计数器T1的中断号为3,串行口中断的中断号为4,定时计数器T1的中断号为5。
相关知识
项目1设计制作广告灯
选项[using n],指定中断函数中使用的工作寄存器组号,n的取值为0~3,表示可以选择中断函数中使用工作寄存器为0、1、2或者3区的工作寄存器。
相关知识
项目1设计制作广告灯
库函数
C51软件包的库包含标准的应用程序,也称为库函数,包括本征函数和非本征函数,一些特定功能的库函数包含在一个头文件中,如果需要使用某一库函数,必须在源程序中用预处理命令定义与该函数相关的头文件。
例如:
#include <intrins.h> //包含文件名为intrins.h的头文件
# include <reg52.h> //包含文件名为reg52.h的头文件
#include <ctype.h> //包含文件名为ctype.h的头文件
相关知识
项目1设计制作广告灯
预处理命令
1.宏定义命令#define
宏定义命令用来指定标识符的值,一般定义格式为:
#define 标识符 数字或字符序列
#define 标识符(形参) 数值或字符序列
例如:
#define PI 3.1415926
宏定义后PI作为一个常量使用,预处理时将程序中的PI换成
数值3.1415926。
#define s(a,b) a*b
area=s(2,3);
预处理时将area换成2*3。
相关知识
项目1设计制作广告灯
2.文件包含命令#include
包含命令的一般格式为:
#include <头文件名> 或者#include “文件名”
例如:#include math.h //包含数学计算函数库的头文件
相关知识
项目1设计制作广告灯
C语言是一种结构化程序设计语言,以函数为基本单位,每个函数的编程都由若干基本结构组成。归纳起来C51与汇编程序设计一样有三种基本结构:顺序结构、选择结构和循环结构,如图1-47所示。
图1-47 程序基本结构
相关知识---程序结构
程序基本结构
项目1设计制作广告灯
单片机程序设计的基本步骤
●分配存储空间、工作寄存器及有关端口地址。
● 画出程序流程图。程序流程图是用符号表示程序执行流程的框图。表示符号有以下几种。
● 编制源程序。
● 仿真、调试和优化程序。
● 固化程序。
相关知识
项目1设计制作广告灯
完备和详尽的程序注释
用“//”符号开头来注释一行,如“//变量声明”。
用“/*”符号开头,并以“*/”符号结束。采用这种方法,可以对C51源程序中的任何部分进行注释,如“/*声明整型变量count */”。
良好的编程规范
相关知识
项目1设计制作广告灯
整齐的代码书写格式
if、do、while等块结构语句中的“{”和“}”要配对对齐,这样便于理解该结构的起始点和结束点。
为了程序理解的方便,最好将每个语句单独写在一行,并加以注释。如果相连的语句具有相近的功能,则可以放置在一行。
代码书写时,可以通过适当的空格以及Tab键来实现代码对齐,这样代码整齐美观,便于阅读。
对于源程序文件不同结构部分之间要留有空行来区分。例如,头文件声明、自定义函数声明、main()函数以及自定义函数之间均要空一行。
简洁清晰的命名
相关知识
项目1设计制作广告灯
项目实施
广告灯总体设计思路
基本功能部分的实现思路是:用AT89C51单片机构建最小系统;单片机的一个I/O口作广告灯显示端口,CPU分别时间先后与间隔长短输出不同的控制码,则显示不同式样。总体框图如下:
项目1设计制作广告灯
项目实施
项目1设计制作广告灯
设计广告灯硬件电路
AT89C51单片机采用上电复位形式,时钟电路采用12MHz的振荡频率,20PF电容作微调电容,P0口作广告灯显示输出端口,原理图如图所示。
项目实施
项目1设计制作广告灯
项目实施
项目1设计制作广告灯
用左移或右移的方法,循环8次,从左到右和从右到左轮流使连接发光二极管的端口输出“0”,并延迟一定时间,实现轮流点亮LED。端口输出高低相反的电平,并延迟一定时间,实现LED开关8次,从端口奇数、偶数引脚轮流输出高低相反的电平,并延迟一定时间,实现左右闪烁。分4次输出不同的控制码到端口,从中间(或两端)开始依次点亮LED灯,实现两边向中间(或中间向两边)依次点亮。主程序参考流程图如图所示。
程序设计思路
项目实施
项目1设计制作广告灯
相关案例
项目1设计制作广告灯
/************单个LED灯从左到右点亮*******/
led_val=0x01;
for(i=0;i<8;i++)
{
P0=~led_val;
delay(100);
led_val<<=1;
}
相关案例
项目1设计制作广告灯
/*******单个LED灯从右到左点亮************/
led_val=0x80;
for(i=0;i<8;i++)
{
P0=~led_val;
delay(100);
led_val>>=1;
}
相关案例
项目1设计制作广告灯
/**************所有的LED开关8次***************/
led_val=0xfF;
for(i=0;i<8;i++)
{
P0=led_val;
delay(100);
P0=~led_val;
delay(100);
}
相关案例
项目1设计制作广告灯
/************ LED等左右闪烁8次*************/
led_val=0xAA;
for(i=0;i<8;i++)
{
P0=led_val;
delay(100);
P0=~led_val;
delay(100);
}
相关案例
项目1设计制作广告灯
/************ 8个灯两边向中间依次点亮**************/
P0=0XFF;
delay(200);
for(i=0;i<8;i++)
{
P0=0x7e;
delay(100);
P0=0xbd;
delay(100);
P0=0xdb;
delay(100);
P0=0xe7;
delay(100);
}
相关案例
项目1设计制作广告灯
/********* 8个灯中间向两边依次点亮****************/
P0=0XFF;
delay(200);
for(i=0;i<8;i++)
{
P0=0xe7;
delay(100);
P0=0xdb;
delay(100);
P0=0xbd;
delay(100);
P0=0x7e;
delay(100);
}
}
}
相关案例
项目1设计制作广告灯
/************延时函数**************/
void delay(unsigned int time) //定义延时函数
{
unsigned int t;
unsigned char bt;
for(t=0;t<time;t++)
for(bt=0;bt<250;bt++)
;
}
项目相关案例
项目1设计制作广告灯
仿真广告灯
项目实施
项目1设计制作广告灯
调试广告灯
1)安装元器件及检测
仿真调试成功后,按原理图安装元件,制作广告灯(单片机芯片最好用芯片插座),并进行动态和静态检测。
2)固化程序
仿照前面固化程序的案例,将广告灯.hex文件固化到单片机芯片中。
项目实施
项目1设计制作广告灯
3)运行广告灯
断开电源,断开下载线;然后再接通电源,运行广告灯系统。测试通行的状态的功能与指标。对比、分析是否达到功能与指标,如没有达到要求,修改、优化程序,重新调试、下载、运行程序,测试性能指标,直达实现基本的功能与指标。
项目实施
项目1设计制作广告灯
项目一 结束
谢 谢!
项目1设计制作广告灯
2 44 余数 低位
2 22 ……… 0=K0
2 11 ……… 0=K1
2 5 ……… 1=K2
2 2 ……… 1=K3
2 1 ……… 0=K4
0 ……… 1=K5 高位
0.375
× 2 整数 高位
0.750 ……… 0=K-1
0.750
× 2
1.500 ……… 1=K-2
0.500
× 2
1.000 ……… 1=K-3 低位
$$