文档库 最新最全的文档下载
当前位置:文档库 › 51单片机C语言程序设计经典案例

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

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

项目三C51程序设计语言基础

任务1 C51程序的识读

1.C51程序结构

例3-1 P_test

/********************* //注释,还可用//注释掉一行

File name:P_test.c

Chip name:STC89C51RC

Clock frequency:1.20MHz

***********************/

#include “reg52.h”//预处理命令,文件包含预处理命令,后缀名都是.h,标准的MCS-51单片机头文件为”reg51.h”,STC89系列单片机头文件为”reg52.h”

#define unit unsigned int //宏定义预处理命令

sbit BZ=P3`7 ;

sbit key=P1`0;

void delay(unit ms)

{

unit i;

while( ms --)

{

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

}

}

void main(void)

{

while(1)

{

if(key==0)

{

BZ=0x0;

delayms(10);

BZ=0x1;

delayms(50);

P0=0xFF;

}

else

{

P0=~P0;

delayms(500);

}

}

}

2.C51的数据类型

位变量型bit

字符型无符号字符型unsigned char

有符号字符型signed char

C51的数据类型整数型无符号整数型unsigned int

基本类型有符号整数型signed int

长整数型无符号长整数型unsigned long int

有符号长整数型signed long int

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

双精度浮点型double

数组类型array

结构体类型struct

构造类型共用体union

枚举enum

指针类型

空类型(void)

表3-1 C51基本数据类型的长度和值域

类型长度/bit 长度/byte 范围

位变量型bit 1 0 ,1

无符号字符型unsigned char 8 单字节0-255

有符号字符型signed char 8 单字节-128-127

无符号整数型unsigned int 16 双字节0-65536

有符号整数型signed int 16 双字节-32768-32767

无符号长整数型unsigned long int 32 四字节

有符号长整数型signed long int 32 四字节

单精度浮点型float 32 四字节

双精度浮点型double 32 四字节

一般指针类型24 三字节

3.C51的标识符和关键字

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

表3-2 C51中的关键字

关键字用途说明

auto 存储种类声明用来声明局部变量

bdata 存储器类型说明可位寻址的内部数据存储器

break 程序语句退出最内层循环体

bit 位变量语句位变量的值是1(true)或0(flase)case 程序语句switch语句中的选择项

char 数据类型的声明单字节整数型或字符型数据

关键字用途说明

code 存储器类型声明程序存储器

const 存储类型说明在程序执行过程中不可修改的变量值continue 程序语句退出本次循环,转向下一次循环

data 存储器类型说明直接寻址的内部数据存储器

default 程序语句Switch语句中的失败选择项

do 程序语句构成do...while循环结构

double 数据类型说明双精度浮点数

else 程序语句构成if...else选择结构

enum 数据类型说明枚举

extern 存储类型说明在其他程序模块中声明了的全局变量float 数据类型说明单精度浮点型

for 程序语句构成for循环结构

goto 程序语句构成goto循环结构

idata 存储器类型说明间接寻址的内部数据存储器

if 程序语句构成do...while循环结构

int 数据类型说明基本整数型

interrupt 中断声明定义一个中断函数

long 数据类型说明长整数型

pdata 存储器类型说明分页寻址的内部数据存储器

register 存储类型说明使用CPU内部的寄存器变量reentrant 再入函数说明定义一个再入函数

return 程序语句函数返回

sbit 位变量声明声明一个可位寻址的变量

short 数据类型说明短整数型

signed 数据类型说明有符号数,二进制的最高位位符号位sizeof 运算符计算表达式或数据类型的字节数

Sfr 特殊功能寄存器声明声明一个特殊功能寄存器

Sfr16 特殊功能寄存器声明声明一个16位的特殊功能寄存器static 存储类型说明静态变量

struct 数据类型说明结构类型数据

switch 程序语句构成switch选择语句

typedef 数据类型说明重新进行数据类型定义

union 数据类型说明联合数据类型

unsigned 数据类型说明无符号数据

using 寄存器组定义定义芯片的工作寄存器

void 数据类型说明无符号数据

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

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-3 C51存储类型与MCS-51单片机存储空间的对应关系及其大小

存储类型与存储空间的对应关系长度/bit 长度/byte 存储范围data 直接寻址片内数据存储区,访问速度快

8 1 0-255

(128B)

bdata 可位寻址片内数据存储区,允许位与字节混

8 1 0-255

合访问(16B)

idata 间接寻址片内数据存储区,可访问片内全部

8 1 0-255

RAM地址空间(256B)

8 1 0-255 pdata 分页寻址片外数据存储区,由MOVX @Ri

访问

xdata 寻址片外数据存储区(64KB),由MOVX

16 2 0-65535

@DPTR访问

16 2 0-65535 code 寻址代码存储区(64KB),由MOVC

@DPTR访问

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

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

表3-4 存储模式及说明

存储模式说明

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

RAM,栈长由函数的嵌套导数决定。

COMPACT 参数及局部变量放入分页片外存储区(最大为256B,默认的存储类型为

pdata),通过寄存器R0和R1(@R0、@R1)间接寻址,栈空间位于MCS-51

系统内部数据存储区中。

LARGE 参数及局部变量直接放入片外数据存储区(最大为64KB,默认存储类型为xdata),使用数据指针DPTR来进行寻址。用此数据指针进行访问效率较低,

尤其是对两个或多个字节的变量,这种数据类型的访问机制直接影响代码的

长度。另一不方便之处在于这种数据指针不能对称操作。

任务2 运算符和表达式

表3-5 C语言常用的运算符

51单片机实例程100讲全集

目录 目录 (1) 函数的使用和熟悉 (4) 实例3:用单片机控制第一个灯亮 (4) 实例4:用单片机控制一个灯闪烁:认识单片机的工作频率 (4) 实例5:将P1口状态分别送入P0、P2、P3口:认识I/O口的引脚功能 (5) 实例6:使用P3口流水点亮8位LED (5) 实例7:通过对P3口地址的操作流水点亮8位LED (6) 实例8:用不同数据类型控制灯闪烁时间 (7) 实例9:用P0口、P1 口分别显示加法和减法运算结果 (8) 实例10:用P0、P1口显示乘法运算结果 (9) 实例11:用P1、P0口显示除法运算结果 (9) 实例12:用自增运算控制P0口8位LED流水花样 (10) 实例13:用P0口显示逻辑"与"运算结果 (10) 实例14:用P0口显示条件运算结果 (11) 实例15:用P0口显示按位"异或"运算结果 (11) 实例16:用P0显示左移运算结果 (11) 实例17:"万能逻辑电路"实验 (11) 实例18:用右移运算流水点亮P1口8位LED (12) 实例19:用if语句控制P0口8位LED的流水方向 (13) 实例20:用swtich语句的控制P0口8位LED的点亮状态 (13) 实例21:用for语句控制蜂鸣器鸣笛次数 (14) 实例22:用while语句控制LED (15) 实例23:用do-while语句控制P0口8位LED流水点亮 (16) 实例24:用字符型数组控制P0口8位LED流水点亮 (17) 实例25:用P0口显示字符串常量 (18) 实例26:用P0 口显示指针运算结果 (19) 实例27:用指针数组控制P0口8位LED流水点亮 (19) 实例28:用数组的指针控制P0 口8 位LED流水点亮 (20) 实例29:用P0 、P1口显示整型函数返回值 (21) 实例30:用有参函数控制P0口8位LED流水速度 (22) 实例31:用数组作函数参数控制流水花样 (22) 实例32:用指针作函数参数控制P0口8位LED流水点亮 (23) 实例33:用函数型指针控制P1口灯花样 (25) 实例34:用指针数组作为函数的参数显示多个字符串 (26) 实例35:字符函数ctype.h应用举例 (27) 实例36:内部函数intrins.h应用举例 (27) 实例37:标准函数stdlib.h应用举例 (28) 实例38:字符串函数string.h应用举例 (29) 实例39:宏定义应用举例2 (29) 实例40:宏定义应用举例2 (29) 实例41:宏定义应用举例3 (30)

单片机35个实例1(汇编)

1.闪烁灯 1.实验任务 如图4.1.1所示:在P1.0端口上接一个发光二极管L1,使L1在不停地一亮一灭,一亮一灭的时间间隔为0.2秒。 2.电路原理图 图4.1.1 3.系统板上硬件连线 把“单片机系统”区域中的P1.0端口用导线连接到“八路发光二极管指示模块”区域中的L1端口上。

4.程序设计内容 (1).延时程序的设计方法 作为单片机的指令的执行的时间是很短,数量大微秒级,因此, 我们要求的闪烁时间间隔为0.2秒,相对于微秒来说,相差太 大,所以我们在执行某一指令时,插入延时程序,来达到我们 的要求,但这样的延时程序是如何设计呢?下面具体介绍其原 理: 如图4.1.1所示的石英晶体为12MHz,因此,1个机器周期为1微秒 机器周期微秒 MOV R6,#20 2个 2 D1: MOV R7,#248 2个 2 2+2×248 =498 20× DJNZ R7,$ 2个2×248 (498 DJNZ R6,D1 2个2×20=40 10002

因此,上面的延时程序时间为10.002ms。 由以上可知,当R6=10、R7=248时,延时5ms,R6=20、R7 =248时,延时10ms,以此为基本的计时单位。如本实验要求 0.2秒=200ms,10ms×R5=200ms,则R5=20,延时子程序如 下: DELAY: MOV R5,#20 D1: MOV R6,#20 D2: MOV R7,#248 DJNZ R7,$ DJNZ R6,D2 DJNZ R5,D1 RET (2).输出控制 如图1所示,当P1.0端口输出高电平,即P1.0=1时,根据 发光二极管的单向导电性可知,这时发光二极管L1熄灭;当 P1.0端口输出低电平,即P1.0=0时,发光二极管L1亮;我 们可以使用SETB P1.0指令使P1.0端口输出高电平,使用 CLR P1.0指令使P1.0端口输出低电平。 5.程序框图

c51单片机实例下载大全

单片机资料教程下载,省去找资料的麻烦,只供学习参考用,下载24内删掉,祝大家学习进步 单片机点阵学习资料 https://www.wendangku.net/doc/ba11794777.html,/thread-1703-1-1.html 手把手教你学单片机--教程视频 https://www.wendangku.net/doc/ba11794777.html,/thread-1688-1-1.html 力天把手教你学单片机视频教程 https://www.wendangku.net/doc/ba11794777.html,/thread-1689-1-1.html 谱中单片机开发板例程 https://www.wendangku.net/doc/ba11794777.html,/thread-1683-1-2.html 初学单片机的30,硬件简单对初学者有帮助 https://www.wendangku.net/doc/ba11794777.html,/thread-1962-1-1.html 用单片机制作的MP3 https://www.wendangku.net/doc/ba11794777.html,/thread-1701-1-2.html 51单片机应用开发大全所含100个范例代码及电路图 https://www.wendangku.net/doc/ba11794777.html,/thread-1820-1-1.html 【含28个单片机实例流程图】 https://www.wendangku.net/doc/ba11794777.html,/thread-1959-1-2.html 谱中单片机程序烧录工具STC https://www.wendangku.net/doc/ba11794777.html,/thread-1682-1-2.html 《单片机技术》32讲

https://www.wendangku.net/doc/ba11794777.html,/thread-1693-1-1.html 51单片机c语言100例教程 https://www.wendangku.net/doc/ba11794777.html,/thread-1700-1-1.html 单片机超级精华包 https://www.wendangku.net/doc/ba11794777.html,/thread-1687-1-1.html 新手学的多功能电子钟 https://www.wendangku.net/doc/ba11794777.html,/thread-1679-1-1.html 十天学会单片机和c语言视频教程 https://www.wendangku.net/doc/ba11794777.html,/thread-1692-1-1.html C语言函数库速查手册 https://www.wendangku.net/doc/ba11794777.html,/thread-1696-1-1.html 历史上最全的KEIL中文学习资料 https://www.wendangku.net/doc/ba11794777.html,/thread-1729-1-2.html 单片机c语言程序设计实训100例--基于AVR+PROTUES https://www.wendangku.net/doc/ba11794777.html,/thread-1695-1-2.html (有电路图和程序) https://www.wendangku.net/doc/ba11794777.html,/thread-1965-1-1.html 关于单片机抗干扰的资料 https://www.wendangku.net/doc/ba11794777.html,/thread-1961-1-1.html 单片机矩阵扫描键盘程序 https://www.wendangku.net/doc/ba11794777.html,/thread-1723-1-1.html 共享通过串口在线调试51单片机的专业版培训资料

单片机编程100例说课讲解

单片机编程100例

单片机编程实例100例大全 单片机编程实例 *实例1:使用P3口流水点亮8位LED #include //包含单片机寄存器的头文件 / 函数功能:延时一段时间 void delay(void) { unsigned char i,j; for(i=0;i<250;i++) for(j=0;j<250;j++) ; } / 函数功能:主函数 void main(void) { while(1) { P3=0xfe; //第一个灯亮 delay(); //调用延时函数 P3=0xfd; //第二个灯亮 delay(); //调用延时函数 P3=0xfb; //第三个灯亮

delay(); //调用延时函数 P3=0xf7; //第四个灯亮 delay(); //调用延时函数 P3=0xef; //第五个灯亮 delay(); //调用延时函数 P3=0xdf; //第六个灯亮 delay(); //调用延时函数 P3=0xbf; //第七个灯亮 delay(); //调用延时函数 P3=0x7f; //第八个灯亮 delay(); //调用延时函数 } / / } *实例2:通过对P3口地址的操作流水点亮8位LED #include //包含单片机寄存器的头文件 sfr x=0xb0; //P3口在存储器中的地址是b0H,通过sfr可定义8051内核单片机 //的所有内部8位特殊功能寄存器,对地址x的操作也就是对P1口的操作 / 函数功能:延时一段时间 /

void delay(void) { unsigned char i,j; for(i=0;i<250;i++) for(j=0;j<250;j++) ; //利用循环等待若干机器周期,从而延时一段时间} / 函数功能:主函数 / void main(void) { while(1) { x=0xfe; //第一个灯亮 delay(); //调用延时函数 x=0xfd; //第二个灯亮 delay(); //调用延时函数 x=0xfb; //第三个灯亮 delay(); //调用延时函数 x=0xf7; //第四个灯亮 delay(); //调用延时函数

51单片机50个实例代码

51单片机50个例程代码程序里有中断,串口等驱动,直接复制即可使用1-IO输出-点亮1个LED灯方法1 /*----------------------------------------------- 名称:IO口高低电平控制 论坛:https://www.wendangku.net/doc/ba11794777.html, 编写:shifang 日期:2009.5 修改:无 内容:点亮P1口的一个LED灯 该程序是单片机学习中最简单最基础的, 通过程序了解如何控制端口的高低电平 ------------------------------------------------*/ #include //包含头文件,一般情况不需要改动, //头文件包含特殊功能寄存器的定义 sbit LED=P1^0;// 用sbit 关键字定义LED到P1.0端口, //LED是自己任意定义且容易记忆的符号 /*------------------------------------------------ 主函数 ------------------------------------------------*/ void main (void) { //此方法使用bit位对单个端口赋值 LED=1; //将P1.0口赋值1,对外输出高电平 LED=0; //将P1.0口赋值0,对外输出低电平 while (1) //主循环 { //主循环中添加其他需要一直工作的程序 } } 2-IO输出-点亮1个LED灯方法2 /*-----------------------------------------------

名称:IO口高低电平控制 论坛:https://www.wendangku.net/doc/ba11794777.html, 编写:shifang 日期:2009.5 修改:无 内容:点亮P1口的一个LED灯 该程序是单片机学习中最简单最基础的, 通过程序了解如何控制端口的高低电平 ------------------------------------------------*/ #include //包含头文件,一般情况不需要改动, //头文件包含特殊功能寄存器的定义 /*------------------------------------------------ 主函数 ------------------------------------------------*/ void main (void) { //此方法使用1个字节对单个端口赋值 P1 = 0xFF; //P1口全部为高电平,对应的LED灯全灭掉, //ff换算成二进制是1111 1111 P1 = 0xfe; //P1口的最低位点亮,可以更改数值是其他的灯点亮 //0xfe是16进制,0x开头表示16进制数, //fe换算成二进制是1111 1110 while (1) //主循环 { //主循环中添加其他需要一直工作的程序 } } 3-IO输出-点亮多个LED灯方法1 /*----------------------------------------------- 名称:IO口高低电平控制 论坛:https://www.wendangku.net/doc/ba11794777.html, 编写:shifang 日期:2009.5 修改:无 内容:点亮P1口的多个LED灯

51单片机仿真实例

51单片机仿真实例 l示例6—扫描与判断—(单端口)位扫描与字节(多端口)扫描 这是一个常用程序段—子程序—标准程序, 通过端口扫描而获得输入数据或控制输出数据,达到节 省位或字节的目的—节约硬件资源。 关于扫描,可以从位及其取反实现流水灯着手来理解。 可以通过移位实现流水灯—扫描。可以通过字节数据(01H,02H,04H,08H,10H,20H,40H,80H—阳极管)的端口发送实现流水灯—扫描。可以通过数据表(DB01H,02H,04H,08H,10H,20H,40H,80H—阴极管)实现流水灯—扫描。可以通过循环跳转实现流水灯—扫描。扫描注意入比出查—获得输入要比 较数据、发送输出要检查出口 扫描获取端口字节 扫描输出位移动产生动态效果(01、02、04、08、10、20、40、80),可以用字节表 扫描输出字符字节,通过延时可以变换字符以便造成数 字进位效果

ORG 0000H START: dbufequ30h;置存储区首址tempequ40h;置缓冲区首址org 00h mov 30h,#2 ;存入数据mov 31h,#0 mov 32h,#1 mov 33h,#0 mov 34h,#7 mov 35h,#1 mov r0,#dbuf mov r1,#temp

mov r2,#6;六位显示器 mov dptr,#segtab ;段码表首地址dp00:mov a,@r0 ;取要显示的数据 movc a,@a+dptr ;查表取段码mov @r1,a;段码暂存 inc r1 inc r0 djnz r2,dp00 disp0:mov r0,#temp;显示子程序mov r1,#6;扫描6次 mov r2,#01h;从第一位开始 dp01:mov a,@r0 mov p2,a;段码输出 mov a,r2 ;取位码 mov p1,a;位码输出 acall delay;调用延时 mov a,r2 rl a mov r2,a inc r0 djnz r1,dp01

C51单片机实战100例

目录 目录 1 函数的使用和熟悉 6 实例3:用单片机控制第一个灯亮7 实例4:用单片机控制一个灯闪烁:认识单片机的工作频率7 实例5:将P1口状态分别送入P0、P2、P3口:认识I/O口的引脚功能8

实例6:使用P3口流水点亮8位LED 9 实例7:通过对P3口地址的操作流水点亮8位LED 11 实例8:用不同数据类型控制灯闪烁时间13 实例9:用P0口、P1 口分别显示加法和减法运算结果15 实例10:用P0、P1口显示乘法运算结果15 实例11:用P1、P0口显示除法运算结果16 实例12:用自增运算控制P0口8位LED流水花样17 实例13:用P0口显示逻辑"与"运算结果18 实例14:用P0口显示条件运算结果18 实例15:用P0口显示按位"异或"运算结果 19 实例16:用P0显示左移运算结果19 实例17:"万能逻辑电路"实验20 实例18:用右移运算流水点亮P1口8位LED 20 实例19:用if语句控制P0口8位LED的流水方向 22 实例20:用swtich语句的控制P0口8位LED的点亮状态23 实例21:用for语句控制蜂鸣器鸣笛次数25 实例22:用while语句控制LED 27 实例23:用do-while语句控制P0口8位LED流水点亮29 实例24:用字符型数组控制P0口8位LED流水点亮30 实例25:用P0口显示字符串常量 32 实例26:用P0 口显示指针运算结果33 实例27:用指针数组控制P0口8位LED流水点亮34

实例28:用数组的指针控制P0 口8 位LED流水点亮35 实例29:用P0 、P1口显示整型函数返回值37 实例30:用有参函数控制P0口8位LED流水速度38 实例31:用数组作函数参数控制流水花样40 实例32:用指针作函数参数控制P0口8位LED流水点亮41 实例33:用函数型指针控制P1口灯花样44 实例34:用指针数组作为函数的参数显示多个字符串45 实例35:字符函数ctype.h应用举例48 实例36:内部函数intrins.h应用举例48 实例37:标准函数stdlib.h应用举例49 实例38:字符串函数string.h应用举例 51 实例39:宏定义应用举例2 52 实例40:宏定义应用举例2 52 实例41:宏定义应用举例3 53 中断、定时器54 实例42:用定时器T0查询方式P2口8位控制LED闪烁54 实例43:用定时器T1查询方式控制单片机发出1KHz音频55 实例44:将计数器T0计数的结果送P1口8位LED显示56 实例45:用定时器T0的中断控制1位LED闪烁57 实例46:用定时器T0的中断实现长时间定时59 实例47:用定时器T1中断控制两个LED以不同周期闪烁60 实例48:用计数器T1的中断控制蜂鸣器发出1KHz音频62

51单片机仿真100实例

《单片机C语言程序设计实训100例—基于8051+Proteus仿真》案例 第01 篇基础程序设计 01 闪烁的LED /* 名称:闪烁的LED 说明:LED按设定的时间间隔闪烁 */ #include #define uchar unsigned char #define uint unsigned int sbit LED=P1^0; //延时 void DelayMS(uint x) { uchar i; while(x--) { for(i=0;i<120;i++); } } //主程序 void main() { while(1) { LED=~LED; DelayMS(150); } } 02 从左到右的流水灯 /* 名称:从左到右的流水灯 说明:接在P0口的8个LED 从左到右循环依次点亮,产生走 马灯效果 */ #include #include #define uchar unsigned char #define uint unsigned int

//延时 void DelayMS(uint x) { uchar i; while(x--) { for(i=0;i<120;i++); } } //主程序 void main() { P0=0xfe; while(1) { P0=_crol_(P0,1); //P0的值向左循环移动 DelayMS(150); } } 03 8只LED左右来回点亮 /* 名称:8只LED左右来回点亮 说明:程序利用循环移位函数_crol_和_cror_形成来回滚动的效果*/ #include #include #define uchar unsigned char #define uint unsigned int //延时 void DelayMS(uint x) { uchar i; while(x--) { for(i=0;i<120;i++); } } //主程序 void main() { uchar i; P2=0x01; while(1) {

51单片机C语言编程100例

目录 实例3:用单片机控制第一个灯亮 (3) 实例4:用单片机控制一个灯闪烁:认识单片机的工作频率 (3) 实例5:将 P1口状态分别送入P0、P2、P3口:认识I/O口的引脚功能 (4) 实例6:使用P3口流水点亮8位LED (4) 实例7:通过对P3口地址的操作流水点亮8位LED (5) 实例8:用不同数据类型控制灯闪烁时间 (6) 实例9:用P0口、P1 口分别显示加法和减法运算结果 (8) 实例10:用P0、P1口显示乘法运算结果 (8) 实例11:用P1、P0口显示除法运算结果 (9) 实例12:用自增运算控制P0口8位LED流水花样 (9) 实例13:用P0口显示逻辑"与"运算结果 (10) 实例14:用P0口显示条件运算结果 (10) 实例15:用P0口显示按位"异或"运算结果 (10) 实例16:用P0显示左移运算结果 (10) 实例17:"万能逻辑电路"实验 (11) 实例18:用右移运算流水点亮P1口8位LED (11) 实例19:用if语句控制P0口8位LED的流水方向 (12) 实例20:用swtich语句的控制P0口8位LED的点亮状态 (12) 实例21:用for语句控制蜂鸣器鸣笛次数 (14) 实例22:用while语句控制LED (15) 实例23:用do-while语句控制P0口8位LED流水点亮 (16) 实例24:用字符型数组控制P0口8位LED流水点亮 (16) 实例25:用P0口显示字符串常量 (17) 实例26:用P0 口显示指针运算结果 (18) 实例27:用指针数组控制P0口8位LED流水点亮 (18) 实例28:用数组的指针控制P0 口8 位LED流水点亮 (19) 实例29:用P0 、P1口显示整型函数返回值 (20) 实例30:用有参函数控制P0口8位LED流水速度 (21) 实例31:用数组作函数参数控制流水花样 (22) 实例32:用指针作函数参数控制P0口8位LED流水点亮 (23) 实例33:用函数型指针控制P1口灯花样 (24) 实例34:用指针数组作为函数的参数显示多个字符串 (25) 实例35:字符函数ctype.h应用举例 (26) 实例36:内部函数intrins.h应用举例 (27) 实例37:标准函数stdlib.h应用举例 (27) 实例38:字符串函数string.h应用举例 (28) 实例39:宏定义应用举例2 (28) 实例40:宏定义应用举例2 (29) 实例41:宏定义应用举例3 (29) 实例42:用定时器T0查询方式P2口8位控制LED闪烁 (30) 实例43:用定时器T1查询方式控制单片机发出1KHz音频 (31) 实例44:将计数器T0计数的结果送P1口8位LED显示 (31)

51单片机交通灯实例,带仿真电路图(汇编)

ORG 0000H JMP MAIN ORG 000BH JMP INT_T0 ORG 001BH JMP INT_T1 ORG 003BH MAIN:MOV TMOD,#61H MOV TH0 ,#3CH MOV TL0 ,#0B0H MOV TH1 ,#0F9H MOV TL1 ,#0F9H SETB ET1 SETB ET0 SETB TR1 SETB TR0 SETB EA MOV P0,#0CH MOV R0,#70 MOV R1,#00H MOV R2,#35 MOV B ,#10 MOV R3,#40 MOV R4,#5 MOV R5,#0FFH JMP $ INT_T0: MOV TH0,#3CH MOV TL0,#0B0H CPL P3.0 RETI INT_T1: DEC R0 CJNE R0,#40,D1 MOV P0,#0AH MOV R1,#01H D1: CJNE R0,#39,D2 CPL P0.1 D2: CJNE R0,#38,D3 CPL P0.1 D3: CJNE R0,#37,D4 CPL P0.1 D4: CJNE R0,#36,D5 CPL P0.1

D5: CJNE R0,#35,D6 MOV P0,#21H MOV R1,#02H D6: CJNE R0,#5 ,D7 MOV P0,#11H MOV R1,#03H D7: CJNE R0,#4 ,D8 CPL P0.4 D8: CJNE R0,#3 ,D9 CPL P0.4 D9: CJNE R0,#2 ,D10 CPL P0.4 D10: CJNE R0,#1 ,D11 CPL P0.4 D11: CJNE R0,#0 ,D12 MOV P0,#0CH MOV R1,#00H MOV R0,#70 D12: CJNE R1,#00H,B1 MOV A,R0 SUBB A,R2 LCALL D_To_H MOV P1,A MOV A,R0 SUBB A,R3 LCALL D_To_H MOV P2,A B1: CJNE R1,#01H,B2 MOV P2,#00H MOV A,R0 SUBB A,R2 LCALL D_To_H MOV P1,A B2: CJNE R1,#02H,B3 MOV A,R0 LCALL D_To_H MOV P2,A MOV A,R0 SUBB A,R4 LCALL D_To_H MOV P1,A B3: CJNE R1,#03H,B4 MOV P1,#00H MOV P2,R0

51单片机实例(含详细代码说明)

1 ?实验任务 如图4.1.1所示:在端口上接一个发光二极管L1,使L1在不停地一亮一灭, 亮一灭的时间间隔为秒。 2. 电路原理图 图 4.1.1 3. 系统板上硬件连线把“单片机系统”区域中的端口用导线连接到“八路发光二极管指示模块”区域中的L1端口上 4. 程序设计内容 (1).延时程序的设计方法作为单片机的指令的执行的时间是很短,数量大微秒级,因此,我们要求的闪烁时间间隔为秒,相对于微秒来说,相差太大,所以我们在执行 某一指令时,插入延时程序,来达到我们的要求,但这样的延时程序是如何设计呢下面具体介绍其原理: 1 ?闪烁灯 13 FO OJADQ FO 1 /AD] FO.2/AD2 FCi 3j*AOTi PO 4/AE>4 FtJ.6fAO& i^U.7/AD7 五尿5¥尸二 7/Jk 1 J5 尸N G/-A 1 ■* J - i/JL U P2 /IfA 1 J RZ W 1 1 g 3劇in P3 L/A91 F3 G/AH F-Ji CJ/I2CD I rTZK G pj 3/1H T1 P^JS/T 1 £/暫冠 理 监 居 . ■ V 11111111 PPP沪厂JLH甘 r3Hb

如图4.1.1所示的石英晶体为12MHz因此,1个机器周期为1微秒机器周期微秒 = ___________ ___________ MOV R6,#20 2 个2 L ______ D1: MOVR7,#248 2 个2 2+ 2X 248= 498 20X =— DJNZ R7,$ 2 个2X 248 (498 DJNZ R6,D1 2 个2X 20= 40 10002 因此,上面的延时程序时间为。 由以上可知,当R6= 10、R7= 248时,延时5ms R6= 20、R7= 248时, 延时10ms,以此为基本的计时单位。如本实验要求秒=200ms 10m X R5 =200ms贝U R5= 20,延时子程序如下: DELAY: MOV R5,#20 D1: MOV R6,#20 D2: MOV R7,#248 DJNZ R7,$ DJNZ R6,D2 DJNZ R5,D1 RET

单片机编程100例

单片机编程实例100例大全 单片机编程实例 *实例1:使用P3口流水点亮8位LED #include

delay(); //调用延时函数 P3=0xf7; //第四个灯亮 delay(); //调用延时函数 P3=0xef; //第五个灯亮 delay(); //调用延时函数 P3=0xdf; //第六个灯亮 delay(); //调用延时函数 P3=0xbf; //第七个灯亮 delay(); //调用延时函数 P3=0x7f; //第八个灯亮 delay(); //调用延时函数 } / / } *实例2:通过对P3口地址得操作流水点亮8位LED #include〈reg51、h〉 //包含单片机寄存器得头文件 sfr x=0xb0; //P3口在存储器中得地址就是b0H, 通过sfr可定义8051内核单片机 //得所有内部8位特殊功能寄存器,对地址x得操作也就就是对P1口得操作 / 函数功能:延时一段时间 /

void delay(void) { unsigned char i,j; for(i=0;i<250;i++) for(j=0;j〈250;j++) ; //利用循环等待若干机器周期,从而延时一段时间} / 函数功能:主函数 / void main(void) { while(1) { x=0xfe; //第一个灯亮 delay();//调用延时函数 x=0xfd; //第二个灯亮 delay(); //调用延时函数 x=0xfb; //第三个灯亮 delay(); //调用延时函数 x=0xf7;//第四个灯亮 delay(); //调用延时函数

51单片机读写SD卡程序实例完整版(学习)

SD卡在现在的日常生活与工作中使用非常广泛,时下已经成为最为通用的数据存储卡。在诸如MP3、数码相机等设备上也都采用SD卡作为其存储设备。SD卡之所以得到如此广泛的使用,是因为它价格低廉、存储容量大、使用方便、通用性与安全性强等优点。既然它有着这么多优点,那么如果将它加入到单片机应用开发系统中来,将使系统变得更加出色。这就要求对SD卡的硬件与读写时序进行研究。对于SD卡的硬件结构,在官方的文档上有很详细的介绍,如SD卡内的存储器结构、存储单元组织方式等内容。要实现对它的读写,最核心的是它的时序,笔者在经过了实际的测试后,使用51单片机成功实现了对SD卡的扇区读写,并对其读写速度进行了评估。下面先来讲解SD卡的读写时序。 (1)SD卡的引脚定义: SD卡引脚功能详述: 注:S:电源供给I:输入O:采用推拉驱动的输出 PP:采用推拉驱动的输入输出

SD卡SPI模式下与单片机的连接图: SD卡支持两种总线方式:SD方式与SPI方式。其中SD方式采用6线制,使用CLK、CMD、DAT0~DAT3进行数据通信。而SPI方式采用4线制,使用CS、CLK、DataIn、DataOut进行数据通信。SD方式时的数据传输速度与SPI方式要快,采用单片机对SD 卡进行读写时一般都采用SPI模式。采用不同的初始化方式可以使SD卡工作于SD方式或SPI方式。这里只对其SPI方式进行介绍。 (2) SPI方式驱动SD卡的方法 SD卡的SPI通信接口使其可以通过SPI通道进行数据读写。从应用的角度来看,采用SPI接口的好处在于,很多单片机内部自带SPI控制器,不光给开发上带来方便,同时也见降低了开发成本。然而,它也有不好的地方,如失去了SD卡的性能优势,要解决这一问题,就要用SD方式,因为它提供更大的总线数据带宽。SPI接口的选用是在上电初始时向其写入第一个命令时进行的。以下介绍SD卡的驱动方法,只实现简单的扇区读写。 1)命令与数据传输 1. 命令传输 SD卡自身有完备的命令系统,以实现各项操作。命令格式如下: 命令的传输过程采用发送应答机制,过程如下:

51单片机应用实例小制作

51单片机应用实例小制作16x16点阵显示屏、蜂鸣器、独立键盘 制作:赵建业 2016/12/1

原理图(芯片)

功能说明: 1、通电后进入问候界面。 2、四个按键(实时有效): 1> GIF :按下后进入动画显示模式。 2> WORLD :按下后进入文字显示模式。 3> MUSIC :按下后进入音乐模式,由于51硬件限制,暂时不能同时显示16x16点阵。 4> NEXT :按下后,切换当前模式的下一个内容。为循环播放。 3、滑动变阻器:音乐模式下调节音量大小。 注意事项: 1、程序代码由于在world 中保存格式原因,复制到编译软件后可能会出现错误。或可以向本人索要源代码。 2、由于本程序内容较多,占用内存较大,89c51的内存放不下,因此需要用89c52或更高版本芯片。它们只是内存大小不容。 原理图(16x16LED 点阵)

程序代码: main.c #include #include #include"yinfu.h" //自定义音符头文件 #define uchar unsigned char #define uint unsigned int #define ulong unsigned long #define KEY P2 sbit sound=P1^6; sbit MOSIO = P1^0; sbit R_CLK = P1^1; sbit S_CLK = P1^2; unsigned char Keymun1,Keymun2;//存按键序号 unsigned char Keystay;//按键状态,有按键按下为1,无按键按下为0 unsigned int C; unsigned char x,y; uchar code tab0[] = {0x00, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80, 0x00}; uchar code hi[]={ 0,0,0,0,0,0,3,12,2,12,2,0,2,0,58,14,70,8,66,8,66,8,66,8,66,8,231,62,0,0,0,0 };//开机问候语:“hi” uchar code jif1[22][32] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,1,128,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,192,3,64,2,64,2,192,3,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,224,7,32,4,160,5,160,5,32,4,224,7,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,240,15,16,8,208,11,80,10,80,10,208,11,16,8,240,15,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,248,31,8,16,232,23,40,20,168,21,168,21,40,20,232,23,8,16,248,31,0,0,0,0,0,0, 0,0,0,0,252,63,4,32,244,47,20,40,212,43,84,42,84,42,212,43,20,40,244,47,4,32,252,63,0,0,0,0, 0,0,254,127,2,64,250,95,10,80,234,87,42,84,170,85,170,85,42,84,234,87,10,80,250,95,2,64,254,127,0,0, 255,255,1,128,253,191,5,160,245,175,21,168,213,171,85,170,85,170,213,171,21,168,245,175,5,160,253,191,1,128,255,255, 128,1,128,1,128,1,128,1,128,1,128,1,128,1,255,255,255,255,128,1,128,1,128,1,128,1,128,1,128,1,128,1, 1,128,3,192,6,96,12,48,24,24,48,12,96,6,192,3,128,1,192,3,96,6,48,12,24,24,12,48,6,96,3,192, 128,1,128,1,128,1,128,1,128,1,128,1,128,1,255,255,255,255,128,1,128,1,128,1,128,1,128,1,128,1,128,1, 1,128,3,192,6,96,12,48,24,24,48,12,96,6,192,3,128,1,192,3,96,6,48,12,24,24,12,48,6,96,3,192, 128,1,128,1,128,1,128,1,128,1,128,1,128,1,255,255,255,255,128,1,128,1,128,1,128,1,128,1,128,1,128,1, 1,128,3,192,6,96,12,48,24,24,48,12,96,6,192,3,128,1,192,3,96,6,48,12,24,24,12,48,6,96,3,192, 128,1,128,1,128,1,128,1,128,1,128,1,128,1,255,255,255,255,128,1,128,1,128,1,128,1,128,1,128,1,128,1, 64,2,64,2,64,2,64,2,64,2,64,2,127,254,0,0,0,0,127,254,64,2,64,2,64,2,64,2,64,2,64,2, 32,4,32,4,32,4,32,4,32,4,63,252,0,0,0,0,0,0,0,0,63,252,32,4,32,4,32,4,32,4,32,4,

51单片机实例程100讲全集

目录 目录1 函数的使用和熟悉4 实例3:用单片机控制第一个灯亮4 实例4:用单片机控制一个灯闪烁:认识单片机的工作频率4 实例5:将P1口状态分别送入P0、P2、P3口:认识I/O口的引脚功能5实例6:使用P3口流水点亮8位LED5 实例7:通过对P3口地址的操作流水点亮8位LED6 实例8:用不同数据类型控制灯闪烁时间7 实例9:用P0口、P1 口分别显示加法和减法运算结果8 实例10:用P0、P1口显示乘法运算结果9 实例11:用P1、P0口显示除法运算结果9 实例12:用自增运算控制P0口8位LED流水花样10 实例13:用P0口显示逻辑"与"运算结果10 实例14:用P0口显示条件运算结果10 实例15:用P0口显示按位"异或"运算结果11 实例16:用P0显示左移运算结果11 实例17:"万能逻辑电路"实验11 实例18:用右移运算流水点亮P1口8位LED12 实例19:用if语句控制P0口8位LED的流水方向12 实例20:用swtich语句的控制P0口8位LED的点亮状态13 实例21:用for语句控制蜂鸣器鸣笛次数14 实例22:用while语句控制LED15 实例23:用do-while语句控制P0口8位LED流水点亮16 实例24:用字符型数组控制P0口8位LED流水点亮17 实例25:用P0口显示字符串常量18 实例26:用P0 口显示指针运算结果19 实例27:用指针数组控制P0口8位LED流水点亮19 实例28:用数组的指针控制P0 口8 位LED流水点亮20 实例29:用P0 、P1口显示整型函数返回值21 实例30:用有参函数控制P0口8位LED流水速度21 实例31:用数组作函数参数控制流水花样22 实例32:用指针作函数参数控制P0口8位LED流水点亮23 实例33:用函数型指针控制P1口灯花样24 实例34:用指针数组作为函数的参数显示多个字符串25 实例35:字符函数ctype.h应用举例27 实例36:内部函数intrins.h应用举例27 实例37:标准函数stdlib.h应用举例28 实例38:字符串函数string.h应用举例28 实例39:宏定义应用举例229 实例40:宏定义应用举例229 实例41:宏定义应用举例330

51单片机新手入门实例详解

51单片机新手入门实例详解 1.硬件和软件准备 ●实验系统:EL89C单片机学习开发系统一套 ●电脑:具有标准串口的台式机或笔记本电脑,如果没有串口也可购 买一条USB转串口线代替 ●工具软件:Keil uVision2(用于编写和编译源程序、仿真调试); 光盘上非安装烧写软件,路径 \单片机EL89C\EL89C光盘\STC52单片机下载程序 \stc-isp-v4.79-not-setup\STC_ISP_V483.exe (EL89C的编程控制烧写软件) 2.源程序编写和编译 EL89C的8个发光二极管负极通过限流电阻接入单片机的P1.0~P1.7端口,下面的范例程序可以使这8个发光二极管轮流点亮,形成流水灯效果。 我们使用的开发工具是Keil C51,是目前世界上最优秀、最强大的51单片机应用平台之一,它集编辑、编译、仿真调试于一体,支持汇编、C语言以及混合编程。同时具备功能强大的软件仿真和硬件仿真功能。 下面以一个简单的流水灯程序为例子来介绍Keil C51的使用方法: 2.1首先在硬盘上建立一个文件夹,命名为ledtest(当然可以是其他名字),为 方便程序的编写和调试,我们将调试过程中产生的文件都将放在这个目录中。 2.2启动Keil软件,点击菜单project,选择new project,然后选择你要保存 的路径,输入工程文件的名字,我们现在保存到刚才建立的ledtest目录中,工程文件命名为ledtest,然后点击保存。 2.3这时会弹出下面的对话框Select Device for Target,要求你为刚才的项目选 择一个CPU。我们选择Atmel的AT89C52,如图所示,选择AT89C52之后,右边一栏是对这个单片机的基本的说明,然后点击确定。

51单片机50个实例代码

程序里有中断,串口等驱动,直接复制即可使用1-IO输出-点亮1个LED灯方法1 /*----------------------------------------------- 名称:IO口高低电平控制 论坛:https://www.wendangku.net/doc/ba11794777.html, 编写:shifang 日期:2009.5 修改:无 容:点亮P1口的一个LED灯 该程序是单片机学习中最简单最基础的, 通过程序了解如何控制端口的高低电平 ------------------------------------------------*/ #include //包含头文件,一般情况不需要改动, //头文件包含特殊功能寄存器的定义 sbit LED=P1^0;// 用sbit 关键字定义 LED到P1.0端口, //LED是自己任意定义且容易记忆的符号 /*------------------------------------------------ 主函数 ------------------------------------------------*/ void main (void) { //此方法使用bit位对单个端口赋值 LED=1; //将P1.0口赋值 1,对外输出高电平 LED=0; //将P1.0口赋值 0,对外输出低电平 while (1) //主循环 { //主循环中添加其他需要一直工作的程序 } } 2-IO输出-点亮1个LED灯方法2 /*-----------------------------------------------

名称:IO口高低电平控制 论坛:https://www.wendangku.net/doc/ba11794777.html, 编写:shifang 日期:2009.5 修改:无 容:点亮P1口的一个LED灯 该程序是单片机学习中最简单最基础的, 通过程序了解如何控制端口的高低电平 ------------------------------------------------*/ #include //包含头文件,一般情况不需要改动, //头文件包含特殊功能寄存器的定义 /*------------------------------------------------ 主函数 ------------------------------------------------*/ void main (void) { //此方法使用1个字节对单个端口赋值 P1 = 0xFF; //P1口全部为高电平,对应的LED灯全灭掉, //ff换算成二进制是 1111 1111 P1 = 0xfe; //P1口的最低位点亮,可以更改数值是其他的灯点亮 //0xfe是16进制,0x开头表示16进制数, //fe换算成二进制是 1111 1110 while (1) //主循环 { //主循环中添加其他需要一直工作的程序 } } 3-IO输出-点亮多个LED灯方法1 /*----------------------------------------------- 名称:IO口高低电平控制 论坛:https://www.wendangku.net/doc/ba11794777.html, 编写:shifang 日期:2009.5 修改:无 容:点亮P1口的多个LED灯

相关文档
相关文档 最新文档