51单片机实现c语言字母滚动,51单片机C语言程序设计经典案例

本文介绍了51单片机C51程序设计的基础知识,包括C51程序结构、数据类型、标识符、关键字、常量与变量等内容。并通过一个实例程序详细展示了C51的基本语法和编程技巧。
AI助手已提取文章相关产品:

51单片机C语言程序设计经典案例

项目三C51程序设计语言基础任务1C51程序的识读1.C51程序结构例3-1P_test

6988b976ef2eb8318d6741c117d6d731.png

/*********************//注释,还可用//注释掉一行Filename:P_test.c

Chipname:STC89C51RCClockfrequency:1.20MHz***********************/#include“reg52.h”//预处理命令,文件包含预处理命令,后缀名都是.h,标准的MCS-51单片机头文件为”reg51.h”,STC89系列单片机头文件为”reg52.h”#defineunitunsignedint//宏定义预处理命令sbitBZ=P3`7;sbitkey=P1`0;voiddelay(unitms){

uniti;

while(ms--){

for(i=0;i<120;i++);}}

voidmain(void){

while(1)

{

if(key==0)

{

BZ=0x0;delayms(10);BZ=0x1;delayms(50);P0=0xFF;}else{

P0=~P0;

delayms(500);}}}

2.C51的数据类型

C51的数据类型

构造类型

位变量型bit字符型无符号字符型unsignedchar

有符号字符型signedchar

整数型无符号整数型unsignedint

有符号整数型signedint

长整数型无符号长整数型unsignedlongint

有符号长整数型signedlongint

实数型(浮点型)单精度浮点型float

双精度浮点型double

数组类型array结构体类型struct共用体union枚举enum

表3-1类型

指针类型空类型(void)

C51基本数据类型的长度和值域

长度/bit18816163232323224

单字节单字节双字节双字节四字节四字节四字节四字节三字节长度/byte

范围0,10-255-128-1270-65536-32768-32767

位变量型bit

无符号字符型unsignedchar有符号字符型signedchar无符号整数型unsignedint有符号整数型signedint

无符号长整数型unsignedlongint有符号长整数型signedlongint单精度浮点型float双精度浮点型double一般指针类型

3.C51的标识符和关键字

标识符是由字母、数字和下划线组成的字符串,第一个字符必须是字母或下划线,不超过32个字符。

表3-2C51中的关键字关键字autobdatabreakbitcasechar

用途

存储种类声明存储器类型说明程序语句位变量语句程序语句数据类型的声明

说明

用来声明局部变量

可位寻址的内部数据存储器退出最内层循环体

位变量的值是1(true)或0(flase)switch语句中的选择项单字节整数型或字符型数据

关键字codeconstcontinuedatadefaultdodoubleelseenumexternfloatforgotoidataifintinterruptlongpdataregisterreentrantreturnsbitshortsignedsizeofSfrSfr16staticstructswitchtypedefunionunsignedusingvoidvolatilewhilexdata

用途

存储器类型声明存储类型说明程序语句存储器类型说明程序语句程序语句数据类型说明程序语句数据类型说明存储类型说明数据类型说明程序语句程序语句存储器类型说明程序语句数据类型说明中断声明数据类型说明存储器类型说明存储类型说明再入函数说明程序语句位变量声明数据类型说明数据类型说明运算符

特殊功能寄存器声明特殊功能寄存器声明存储类型说明数据类型说明程序语句数据类型说明数据类型说明数据类型说明寄存器组定义数据类型说明数据类型说明程序语句存储器类型说明

说明程序存储器

在程序执行过程中不可修改的变量值退出本次循环,转向下一次循环直接寻址的内部数据存储器Switch语句中的失败选择项构成do...while循环结构双精度浮点数构成if...else选择结构枚举

在其他程序模块中声明了的全局变量单精度浮点型构成for循环结构构成goto循环结构间接寻址的内部数据存储器构成do...while循环结构基本整数型定义一个中断函数长整数型

分页寻址的内部数据存储器使用CPU内部的`寄存器变量定义一个再入函数函数返回

声明一个可位寻址的变量短整数型

有符号数,二进制的最高位位符号位计算表达式或数据类型的字节数声明一个特殊功能寄存器声明一个16位的特殊功能寄存器静态变量结构类型数据构成switch选择语句重新进行数据类型定义联合数据类型无符号数据

定义芯片的工作寄存器无符号数据

声明该变量在程序执行中可被隐含改变构成while和do...while循环语句外部数据存储器

4.C51的常量和变量1)常量

常量就是在程序运行过程中,其值不能改变的数据,包括整型常量、字符常量、字符串常量、实数常量、位标量等。

(1)整型常量:可以用二进制、八进制、十进制、十六进制表示。

无符号整数常量在一个数字后面加上“u”或“U”表示。长整数型常量在后面加上“l”或“L”,无符号长整数型常量在数字后面加上“ul”或“UL”,实数型常量在后面加“f”或“F”。

(2)字符常量:单引号内的字符,不可以显示的控制字符在前加“\”组成专用转义字符。(3)字符串常量:双引号内的字符,当双引号内没有字符时是空字符串。在C语言中,字符串常量是作为字符类型数组来处理的,在存储字符串时,系统在字符串尾部加上转义字符“\o”,作为该字符串的结束符。

(4)实数常量:有十进制和指数两种表示形式。指数表示的实数为“[±]数字[.数字]e[±]数字”,[]中的内容为可选项

(5)位标量:位标量的值是一个二进制数。2)变量

变量就是在程序运行过程中,其值可以被改变的数据。必须先用标识符作为变量名,并指出所用的数据类型和存储模式,这样编译系统才能为变量分配相应的存储空间。定义变量的格式:[][存储器类型];类型定义和标识符是必要的。存储模式有四种,自动(auto)、外部(extern)、静态(static)和寄存器(register),默认类型为自动(auto)。

表3-3C51存储类型与MCS-51单片机存储空间的对应关系及其大小存储类型databdataidatapdataxdatacode

与存储空间的对应关系

直接寻址片内数据存储区,访问速度快(128B)

可位寻址片内数据存储区,允许位与字节混合访问(16B)

间接寻址片内数据存储区,可访问片内全部RAM地址空间(256B)

分页寻址片外数据存储区,由MOVX@Ri访问

寻址片外数据存储区(64KB),由MOVX@DPTR访问

寻址代码存储区(64KB),由MOVC@DPTR访问

长度/bit88881616

长度/byte111122

存储范围0-2550-2550-2550-2550-655350-65535

如果在变量定义时省略了存储类型标识符,则编译器会自动选择默认的存储类型。默认的存储类型进一步由SMALL、COMPACT、和LARGE存储模式指令限制。

存储模式决定了变量的默认存储类型、参数传递区和无明确存储类型说明变量的存储类型。在SMALL模式下,参数传递是在片内数据存储区中完成的。

51单片机C语言程序设计经典案例

COMPACT和LARGE模式允许参数在外部存储器中传递。

表3-4存储模式及说明存储模式SMALL

说明

参数及局部变量放入可直接寻址的片内存储器(最大为128B,默认存储类型为data),因此访问十分方便。另外,所有对象(包括栈)都必须嵌入片内RAM,栈长由函数的嵌套导数决定。

参数及局部变量放入分页片外存储区(最大为256B,默认的存储类型为pdata),通过寄存器R0和R1(@R0、@R1)间接寻址,栈空间位于MCS-51系统内部数据存储区中。

参数及局部变量直接放入片外数据存储区(最大为64KB,默认存储类型为xdata),使用数据指针DPTR来进行寻址。用此数据指针进行访问效率较低,尤其是对两个或多个字节的变量,这种数据类型的访问机制直接影响代码的长度。另一不方便之处在于这种数据指针不能对称操作。

COMPACT

LARGE

任务2运算符和表达式表3-5C语言常用的运算符

【51单片机C语言程序设计经典案例】相关文章:

您可能感兴趣的与本文相关内容

1.基本要求 能够实现如下功能: ‹ 首先用蓝色清屏 ‹ 在屏幕中央显示由字符串“-============#”组成的黄色的小球,#为球, 按下方向键可以控制上述小球球行方式在屏幕上行走 ‹ 在行进过程中,球只能左转、右转或继续前进,不能掉转 180 度 2.鼓励实现完整的彩球滚动游戏,鼓励有新的创意 3.提示 ①通过调用 INT 16H 的 0 号功能可以读取光标控制键的扩展码 光标控制键: ↑ ↓ ← → 扩展码(十进制): 72 80 75 77 ②在指定位置用指定属性显示字符的方法有两种:一是直接写显示缓冲区,二是利用 BIOS 屏显功能调用。解: 功能描述(基本上是全部功能):本程序有以下功能 共分为7关,可以手工选择关卡(带有输入异常处理)。走完一关后,如果后面还有关, 直接跳到下一关。否则,结束游戏。各个关之间的差别是速度不同。 按下方向键,球能够按照题的要求在屏幕上行走。按下 ESC 键,退出游戏,按下其他键, 程序不理会。 长时间不按键,球会自动前进。 能够产生随机数,作为蛋。球的初始大小为 14,当大小为 20 时,此关结束。 如果球运动到了边界,球死亡。游戏结束。 ① 设计思路 程序开始时,由用户指定一个关卡,进入游戏。 每次用清屏加显示字符的方式重新显示球和蛋。 当检测到有键子按下时,判断是什么键子,如果是 esc,退出游戏,如果是方向键,按 正确的方向走(如果方向键与球运动方向相反,不理会按键),如果按下的时其它键, 不理会。 设置一个等待时间,如果超过等待时间仍没有按键,球自动前行一步。否则,重新比较 时间。 每次球运动或有键子被按下时,判断是否撞到了自身和边界。 如果吃到了一个蛋,更新完球的位置后,将原球的位置加入球中。 如果球的长度达到了 20(设置的球的最大大小),判断后面是否还有关,没有了,就结 束程序,还有,就跳到下一关卡。 ② 算法说明 设置两个标记变量,分别记录球的大小 ssize 和球上次的大小 befor。设置标记变量, 分别记录蛋的横纵座标 xlabel 和 ylabel,设置标记变量,记录球的位置 tailx 和 taily。设置 snake 记录球各个部分的位置,设置球的最大大小为 20。设置变量 TIME 为等待按键时间。 关卡的选择:程序开始时,从键盘读入一个数字,当作关卡,根据读入的数据,设置等 待时间,也就实现了对球的速度的控制。 清屏和显示小球和蛋。调用 bios 中断可以实现。每次输出 1 个球,下面说一下如何实现小球的手工移动(有按键输入时)。可以知道,如果把球看成一个 个单元,球每移动一次,它的身体的位置都等于它的前一个身体单元的上一步 的位置,因此,可以从尾部进行循环,把前一节的位置给后一节。这样循环 ssize-1 次 就更新了身体,再根据输入的按键判断如何如移动头部,如果按键是左或者右, 只需将球的列加减 1,如果按键是上或者下,只需将球的行加减 1。至此,完成了 对球的显示位置的更新,之后重新清屏、显示,可以使球移动了。 在判断球是否向相反方向走时,可以采用如下算法:已知按键了(以向上为例),检查 球和身体第一节的行号,如果球行号大,说明此时设在向下运动,按键无效。 判断球撞到边界的算法如下(以向上键为例):判断球此时的行号是否为 0,如果是 0, 又按下了向上键,结束游戏,输出“I AM DEAD!!!”。如果球运动过程中撞到了自己, 也同撞到边界的操作。算法是这样的:取出球的位置,依次和每个身体和尾巴的位置 进行比较(从球开始比较),如果相等,说明撞上了,结束游戏。 如何实现球的自动移动。可以用 INT 10H 的 1 号功能检测是否有按键输入,如果有,转 到手工移动模块,否则,调用 INT 1AH 中的 00 号功能,读取当前时间。与上次读的时 间相比,如果小于设定的时间,重新比较,否则,球自动前移。实现前移的算法与手工 移动相似,也是将身体的某一单元的位置置成塔前一单元上一次的位置,之后判断球 方向。 产生并输出蛋。相当于产生一个随机数,我已经读去了当前时间,可以利用 DX 移位(防 止溢出)以后,对 80 和 25 取余,获得位置的随机数。之后判断球的大小 ssize 和 befor, 先让 ssize 为 14,befor 为 13,每产生一个随机数,befor 加 1,每吃一个蛋,ssize 加 1。比较 ssize 和 befor,如果相等,证明球没有吃蛋,不用产生新的随机数,仍在 原位置输出随机数,否则,产生新的随机数。球的大小的变化。每次吃到一个蛋后,ssize加1,并且将更新前球的位置加入到snake, 这样下次输出就能够多输出一个球,实现了大小的增加。 关卡的切换:每当球吃了一个蛋以后,判断是否达到了球的最大大小20,如果达到了, 继续判断是否的达到了等待时间的最小值(也就是最高的一关),如果没有达到,就更 新等待时间,进入下一关卡之前,还要将球的大小 ssize 和初始大小befor 分别设为 14 和 13。将记录球位置的内存 snake 的前 14 个字更新到屏幕中央。之后,就可以进入下 一关了。如果已经达到了最高关,并且通过了,就结束程序。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值