51单片机基础C程序架构

合集下载

c51程序的基本结构

c51程序的基本结构

c51程序的基本结构一、简介c51程序是指在C语言编写的基于8051单片机的程序。

c51程序的基本结构是指程序的框架和组成部分。

在本文中,我们将深入探讨c51程序的基本结构,包括程序的主要组成部分、编译和连接过程、初始化和中断处理等方面。

二、程序的主要组成部分c51程序的主要组成部分包括以下几个部分:1. 头文件包含在c51程序的开头,需要包含一些常用的头文件,以便在程序中使用一些常用的函数和宏定义。

常见的头文件包括reg51.h、intrins.h等。

2. 函数声明在程序的主体之前,需要进行函数的声明。

函数的声明包括函数的返回类型、函数名和参数列表。

通过函数声明,我们可以通过函数名在程序中调用相应的函数。

3. 全局变量定义在程序的主体之前,可以定义一些全局变量。

全局变量可以在程序的任意位置访问,因此非常适合用来存储一些需要在不同函数间共享的数据。

4. 主函数在c51程序中,主函数是程序的入口。

主函数中包含程序的主要执行逻辑。

在主函数中,可以调用其他函数、执行一些初始化操作以及进行一些逻辑判断和循环等操作。

5. 其他函数除了主函数外,c51程序中还可以定义其他函数。

这些函数可以在主函数中调用,也可以在其他函数中调用。

通过将程序的不同功能模块封装成独立的函数,可以提高程序的可读性和易维护性。

三、编译和连接过程c51程序的编译和连接过程主要包括以下几个步骤:1. 预处理在预处理阶段,编译器将对程序进行宏替换和文件包含操作。

通过宏替换,程序中的宏定义将被替换为相应的代码;通过文件包含,程序中包含的头文件将被插入到相应的位置。

2. 编译在编译阶段,编译器将把预处理后的代码转换成汇编语言。

在这个阶段,编译器将对代码进行词法分析和语法分析,生成汇编语言代码。

3. 汇编在汇编阶段,汇编器将把汇编语言代码转换成机器语言代码。

这个阶段主要涉及符号和地址的分配,以及生成可重定位的目标文件。

4. 链接在链接阶段,链接器将把多个目标文件和库文件合并成一个可执行文件。

51单片机c语言结构体

51单片机c语言结构体

51单片机c语言结构体
51单片机是一种常用的嵌入式微控制器,而C语言结构体是C 语言中的一种复合数据类型,用于存储不同类型的数据。

在51单片机的C语言编程中,结构体可以用来组织和管理相关的数据,以便更好地进行程序设计和开发。

在51单片机的C语言编程中,可以通过结构体来定义和使用自定义的数据类型,以便更好地组织和管理数据。

结构体的定义通常包括结构体名称和成员变量,例如:
c.
struct student {。

int id;
char name[20];
float score;
};
上面的代码定义了一个名为student的结构体,其中包括学生
的学号、姓名和分数三个成员变量。

在使用结构体时,可以通过点
操作符来访问结构体的成员变量,例如:
c.
struct student s1;
s1.id = 1001;
strcpy(, "Tom");
s1.score = 95.5;
上面的代码创建了一个名为s1的结构体变量,并对其成员变量
进行赋值操作。

在51单片机的C语言编程中,结构体可以被用来描
述外设寄存器的布局,以便更方便地访问寄存器中的各个位和字段。

此外,结构体还可以被用来定义复杂的数据结构,如链表、树等,
以便更好地组织和管理数据。

总之,在51单片机的C语言编程中,结构体是一种非常有用的数据类型,可以帮助程序员更好地组织和管理数据,提高程序的可读性和可维护性。

通过合理地使用结构体,可以更好地发挥51单片机的性能和功能,实现更复杂的应用程序设计和开发。

教学课件PPT 89C51单片机的C51程序设计

教学课件PPT 89C51单片机的C51程序设计

程序存储器(64K字节)
对应MOVC @DPTR访问
可位寻址片内数据存储器(16字节,128位) 允许位和字节混合访问
间接寻址片内数据存储器(256字节)
可访问片内全部RAM空间
分页寻址片外数据存储器(256字节)
对应MOVX @R0访问
4.2 C51程序设计基础
C51存储类型定义举例:
unsigned char data x,y,z; /*在内部RAM区定义了3个无符号字节型变量x,y,z*/
40M/80M/100M,而且还有很多是单周期的。
4.2 C51程序设计基础
4.2.1 C51变量/常量存储类型
C51存储类型 对应89C51单片机存储器空间
data
直接寻址片内数据存储器(128字节)
xdata
片外数据存储器(64K字节)
说明 访问速度快 对应MOVX @DPTR访问
code bdata idata pdata
序号 语句
1
=
2
if
3
表达式1 ? 表达式2 : 表达式3
4
switch/case
5
while
6
do-while
7
for
8
函数
含义 赋值语句 条件语句 条件运算符 多分支语句 循环语句 循环语句 循环语句 模块化程序设计
4.2 C51程序设计基础
表4-6 常用语句
序号 语句
1
=
2
if
3
表达式1 ? 表达式2 : 表达式3
4.3 C51程序举例
例4:把外部数据RAM中从地址2000H单元开始的100个有符号 数逐一取出,若为正数则放回原单元,若为负数则求补后放回。

51单片机编程开发之c语言基础

51单片机编程开发之c语言基础

51单片机编程开发之c语言基础51单片机是一种非常常用的单片机,而C语言是51单片机编程的基础。

本文将从C语言基础的角度,介绍如何在51单片机上进行编程开发。

我们需要了解C语言的基本语法和数据类型。

C语言是一种结构化的、高级的编程语言,它不仅可以进行底层的操作,还具备高级语言的特性。

在C语言中,我们可以使用各种数据类型来存储和处理数据,例如整型、浮点型、字符型等。

同时,C语言还提供了丰富的运算符和控制语句,使得程序的编写更加灵活和高效。

在51单片机上进行C语言编程,我们需要使用相关的开发工具和编译器。

目前,市面上有很多种开发工具可供选择,例如Keil、IAR 等。

这些开发工具可以帮助我们创建、编辑和编译C语言程序,并将其下载到51单片机上运行。

在开始编写程序之前,我们需要对51单片机的硬件结构有一定的了解。

51单片机由CPU、存储器、外设等组成。

我们可以通过C语言编写程序来控制这些硬件,实现各种功能。

例如,我们可以通过C 语言控制LED灯的亮灭、读取按键的状态、驱动液晶屏显示等。

在编写程序时,我们需要熟悉51单片机的寄存器和外设的相关操作。

51单片机的寄存器用于控制和配置各种硬件,我们可以通过C语言对寄存器进行读写操作,来实现对硬件的控制。

同时,51单片机还提供了丰富的外设接口,例如串口、定时器、ADC等,我们可以通过C语言编写程序来实现对这些外设的配置和操作。

在编写程序时,我们需要使用51单片机的特定的编程语法和函数库。

51单片机的编程语法与标准C语言有一些差异,我们需要了解这些差异并进行相应的调整。

同时,51单片机还提供了一些特定的函数库,例如LCD显示库、PWM波形库等,我们可以使用这些函数库来简化编程的过程。

在编写程序时,我们需要注意一些常见的问题和技巧。

例如,51单片机是一种8位的单片机,其存储器空间有限,我们需要合理利用存储空间,避免浪费。

同时,由于51单片机的时钟频率有限,我们需要注意程序的效率,避免出现性能瓶颈。

第3章51系列单片机程序设计(C语言部分)

第3章51系列单片机程序设计(C语言部分)

idata
间接寻址片内数据存储区,可访问片内全部RAM地址空间(256字节)
pdata
分页寻址片外数据存储区(256字节)由MOV @Ri访问(i=0,1)
xdata
片外数据存储区(64 KB)由MOVX @DPTR访问
code
程序存储器64 KB空间,由MOVC @DPTR访问
第3章 51系列单片机程序设计(C部分)
/* Ary37定义为abry[3]的第7位 */
第3章 51系列单片机程序设计(C部分)
3.5 数 组
数组:数组是一组类型相同 有序数据的集合。用数组名 和下标来唯一确定数组中的 元素。
第3章 51系列单片机程序设计(C部分)
3.5.1 一维数组
一、一维数组的定义 形式:类型说明符 数组名 [常量表达式]
使用C51进行编程时,MCS-51片内的I/O口与片外扩展的I/O可以统一在一个头文 件中定义,也可以在程序中(一般在开始的位置)进行定义。
对于MCS-51片内I/O口按特殊功能寄存器方法定义。 例如:
sfr P0=0x80 ; /* 定义P0口,地址为80H */ sfr P1=0x90 ; /* 定义P1口,地址为90H */
第3章 51系列单片机程序设计(C部分)
3.4.3 C51数据的存储类型与MCS-51存储结构
表 3.4.2 C51存储类型与MCS-51存储空间的对应关系
存储类型 与存储空间的对应关系
data
直接寻址片内数据存储区,访问速度快(128字节)
bdata
可位寻址片内数据存储区,允许位与字节混合访问(16字节)
据 浮点型(float) 类
型 指针类型
详细见表3.4.1

第二课_51单片机C程序设计基础

第二课_51单片机C程序设计基础

第二课 51单片机C程序设计基础教学内容:51单片机C程序基础知识教学重点: 51单片机C程序基础知识教学难点:51单片机C程序基础知识教学目的:1、掌握51单片机C程序基础知识2、掌握KEILC51软件使用从一个例子开始:/********************************************************// 第一个发光管以间隔200ms闪烁// 晶振为11.0592M/*********************************************************/#include<reg52.h> //52单片机头文件#define uint unsigned int //宏定义#define uchar unsigned char //宏定义sbit led1=P0^0; //单片机管脚位声明void delay(uint z) //延时函数,z的取值为这个函数的延时ms数,如delay(200);大约延时200ms.{ //delay(500);大约延时500ms.uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void main() //主函数{while(1) //大循环{led1=0; //点亮小灯delay(200); //延时200毫秒led1=1; //熄灭小灯delay(200); //延时200毫秒}}●C-51与ASM-51相比,具有如下优点:1)不需要了解51单片机的指令系统,仅仅要求对存储器结构有初步了解2)寄存器分配,存储器寻址以及数据类型等细节可由编译器管理3)程序有规范的结构,课分为不同函数,使得程序结构化4)程序更具可读性5)高的编程及程序调试效率6)提供的库包含许多标准子程序,具有较强的数据处理能力7)程序易于做到模块化,便于移植一、数据结构●数据的不同格式称为数据类型●数据按一定的数据类型进行的排列、组合、架构称为数据结构1、数据类型1)char(字符型):unsigned char 0~255signed char -128~+127例:#define uchar unsigned charuchar i,j;一般使用无符号数据类型,因为,有符号运算比无符号运算耗资源2)int(整型):unsigned int 0~65535Signed int -32767~+32768例: #define uint unsigned intuint x,y;一般能用char就不用int,节省空间3)* 指针型*——地址——数据类似于寄存器间接寻址4)C-51的数据类型扩充定义sfr :特殊功能寄存器声明sfr16:16位特殊功能寄存器声明sbit:特殊功能位声明bit:位变量声明例:sfr P0 = 0x80;sfr P1 = 0x90;sfr P2 = 0xA0;sfr P3 = 0xB0;sbit CY = PSW^7;sbit AC = PSW^6;sbit F0 = PSW^5;sbit RS1 = PSW^4;sbit RS0 = PSW^3;sbit OV = PSW^2;2、常量与变量●常量:在程序运行过程中值不能改变的量●变量:在程序运行过程中值不断能改变化的量二、运算符与表达式●>> 位右移●<< 位左移补0●i++ 使用后+1,i=1, i+1=2●++i 使用前+1 , i+1=2, i=2●== 测试等于●!= 测试不等于●&& 逻辑与三、main 函数●格式:void main()●特点:无返回值,无参任何一个C程序有且仅有一个main函数,它是整个程序开始执行的入口●例:void main(){总程序从这里开始;其他语句;}四、小结:通过本次课的学习,学生必须掌握C-51的一些基本特点,能读懂一些简单的程序。

单片机C-51程序设计

单片机C-51程序设计

;定义LED表示P1端 口的P1.0口线 ,用 于控制发光二极管 ;定义KEY表示P1端 口的P1.7口线 ,用 于控制按键
C-51的几个特殊之处 : (续)
2. 中断服务程序 定义方式:
Void 函数名( ) interrupt n [using m] 中断号n和中断源的对应关系
中断号
0 1 2 3 4
㈡ C -51的程序结构
与一般C语言的结构相同 , 以main ()函数为程序人 口 , 程序体中包含若干语句还可以包含若干函数。
㈢ C -51的数据类型
常用的数据类型有:
位型 bit 1位
字符型 char
1字节
整型 int 2字节
长整型 long int
4字节
浮点型 float 4字节
数组型
指针型
math.h (定义常用数学运算);
㈥ C-51的运算符
与C语言基本相同:
+ - * / (加 减 乘 除)
> >= < <= (大于 大于等于 小于 小于等于)
== !=
(测试等于 测试不等于)
&& | | !
(逻辑与
逻辑或 逻辑非 )
>> <<
&|
^
~
(位右移
(按位与 (按位异或
位左移) 按位或) 按位取反)
f)理解KEIL C51中存储模式的区别:
Small : 变量存储在内部ram里 , Idata; Compact:变量存储在外部ram里 ,使用
·
页8位间接 寻址 ,Pdata;
Large :变量存储在外部Ram里,使用16位
间接寻址 ,Xdata;

51单片机C语言编程基础及实例

51单片机C语言编程基础及实例

51单片机C语言编程基础及实例51单片机C语言编程基础及实例C语言是一门通用计算机编程语言,应用广泛。

下面是店铺整理的51单片机C语言编程基础及实例,希望对大家有帮助!单片机的外部结构:DIP40双列直插;P0,P1,P2,P3四个8位准双向I/O引脚;(作为I/O输入时,要先输出高电平)电源VCC(PIN40)和地线GND(PIN20);高电平复位RESET(PIN9);(10uF电容接VCC与RESET,即可实现上电复位)内置振荡电路,外部只要接晶体至X1(PIN18)和X0(PIN19);(频率为主频的12倍)程序配置EA(PIN31)接高电平VCC;(运行单片机内部ROM中的程序)P3支持第二功能:RXD、TXD、INT0、INT1、T0、T1单片机内部I/O部件:(所为学习单片机,实际上就是编程控制以下I/O部件,完成指定任务)四个8位通用I/O端口,对应引脚P0、P1、P2和P3;两个16位定时计数器;(TMOD,TCON,TL0,TH0,TL1,TH1) 一个串行通信接口;(SCON,SBUF)一个中断控制器;(IE,IP)针对AT89C52单片机,头文件AT89x52.h给出了SFR特殊功能寄存器所有端口的定义。

C语言编程基础:十六进制表示字节0x5a:二进制为01011010B;0x6E为01101110。

如果将一个16位二进数赋给一个8位的字节变量,则自动截断为低8位,而丢掉高8位。

++var表示对变量var先增一;var—表示对变量后减一。

x |= 0x0f;表示为 x = x | 0x0f;TMOD = ( TMOD & 0xf0 ) | 0x05;表示给变量TMOD的低四位赋值0x5,而不改变TMOD的高四位。

While( 1 ); 表示无限执行该语句,即死循环。

语句后的分号表示空循环体,也就是{;}在某引脚输出高电平的编程方法:(比如P1.3(PIN4)引脚)代码#include //该头文档中有单片机内部资源的符号化定义,其中包含P1.3void main( void ) //void 表示没有输入参数,也没有函数返值,这入单片机运行的复位入口{P1_3 = 1; //给P1_3赋值1,引脚P1.3就能输出高电平VCCWhile( 1 ); //死循环,相当 LOOP: goto LOOP;}注意:P0的每个引脚要输出高电平时,必须外接上拉电阻(如4K7)至VCC电源。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

51单片机基础C程序架构作者:u010785142keil基本步骤:(1)新建一个工程:Project——New uVision Project(2)选择型号:AT89C52(3)新建.c文件:File——new——a.c保存为:.c后缀(4)添加.c文件:(5)编写程序以下是基本程序架构:很重要的笔记A. 基本程序框架:(点亮小灯)#include<reg52.h>sbit LED=P1^0;void main (void){LED=0; // P1 = 0xfe;while (1){//空循环}}B. for循环语句:(小灯循环点亮)unsigned char i;for(i=0;i<10;i++){;}执行顺序:i=0; —— i<10; —— {}中的内容—— i++ ——。

C. 左移/右移(小灯逐个往左/右移动亮)P1=0xfe; // P1=0x7f;for(i=0;i<8;i++) //加入for循环,表明for循环大括号中的程序循环执行8次 {Delay(50000);P1<<=1; //P1>>=1;}循环左移/右移:for(i=0;i<8;i++) //加入for循环,表明for循环大括号中的程序循环执行8次 {Delay(50000);P1<<=1; //P1>>=1;P1=P1|0x01; //P1=P1|0x80;//左移后,最右端自动赋值0,所以需要该语句赋值1}P1=0xfe; //P1=0x7f; //重新赋初始值D. 数组的使用:unsigned char code table[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe, 0xff,0xff,0x00,0x00, 0x55,0x55,0xaa,0xaa};for(i=0;i<16;i++){P1=table[i];Delay(3000);}E. PWM调光sbit LED0=P1^0;void main (void){unsigned int CYCLE=600,PWM_LOW=0;while(1){LED0=1;Delay(6000);for(PWM_LOW=1;PWM_LOW<CYCLE;PWM_LOW++){LED0=0;Delay(PWM_LOW);LED0=1;Delay(CYCLE-PWM_LOW);}LED0=0;for(PWM_LOW=CYCLE-1;PWM_LOW>0;PWM_LOW--){LED0=0;Delay(PWM_LOW);LED0=1;Delay(CYCLE-PWM_LOW);}}F. 共阳数码管显示(循环显示数字)unsignedchar codedofly_table[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,};P1=dofly_table[i];{P1=dofly_table[i];Delay(60000);}G. 独立按键(按键控制数码管显示数字) switch选择语句switch(P3) //P3口作为独立按键输入端{case0xfe:P1=dofly_table[1];break;case 0xfd:P1=dofly_table[2];break;default:break;}H. 数码管静态显示:位锁存与段锁存(8位数码管显示其中之一/二)#define DataPort P0 //定义数据端口程序中遇到DataPort 则用P0 替换sbit LATCH1=P2^2;//定义锁存使能端口段锁存sbit LATCH2=P2^3;// 位锁存main(){while(1){DataPort=0xfe; //取位码第一位数码管选通,即二进制1111 1110 之一// DataPort=0x7e; //取位码第一位数码管选通,即二进制0111 1110 之二LATCH2=1; //位锁存LATCH2=0;DataPort=0x4F; //取显示数据,段码“3”共阴字符码LATCH1=1; //段锁存LATCH1=0;}}I. 数码管动态显示:位锁存与段锁存#define DataPort P0 //定义数据端口程序中遇到DataPort 则用P0 替换sbit LATCH1=P2^2;//定义锁存使能端口段锁存sbit LATCH2=P2^3;// 位锁存unsignedchar codedofly_DuanMa[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值01234567unsigned char codedofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //分别对应相应的数码管点亮,即位码main(){unsigned char i=0;while(1){DataPort=dofly_WeiMa[i]; //取位码LATCH2=1; //位锁存LATCH2=0;DataPort=dofly_DuanMa[i]; //取显示数据,段码//DataPort=dofly_DuanMa[num+i]; LATCH1=1; //段锁存LATCH1=0;Delay(200); //扫描间隙延时,时间太长会闪烁,太短会造成重影i++;if(8==i) //检测8位扫描完全结束?如扫描完成则从第一个开始再次扫描8位i=0;}}J. 定时器0(1)模式0(13位计数器)void Init_Timer0(void) //初始化{TMOD &= 0xF0; //定时器0运行在模式0,13位计数器// GATE0=0;C/T0#=0; M1=0; M0=0;TH0 = 0x00; //设置初值0x00,所以计数值为8192,若是时钟频率为12MHzTL0 = 0x00; //则8192μs中断一次;注:2的13次方是8192ET0=1; //允许定时器0中断EA=1; //允许总中断TR0=1; //启动定时器0}voidTimer0_isr(void) interrupt 1{ }(2)模式1(16位定时器)重要void Init_Timer0(void) //初始化{TMOD |= 0x01; //模式1,16位定时器,使用"|"符号在使用多个定时器时不受影响TH0=0x00; //给定初值,这里用定时器最大值从0开始计数一直到65535溢出TL0=0x00; //一次最多可定时65.536ms// TH0=(65535-50000)/256=0x3c=60(10); //50ms// TL0=(65535-50000)%256=0xb0=176(10);EA=1; //总中断打开ET0=1; //定时器中断打开TR0=1; //定时器开关打开}void Timer0_isr(void) interrupt 1 using 1{TH0=0x00; //重新赋值TL0=0x00;LED=~LED; //定时到了:执行的内容}注:时间计算51单片机1个机器周期=12个时钟周期,频率为12MHZ,则一个机器周期为1US,具体到定时器程序就是,假如你想定1MS,那么单片机每次加一个一,就要过1US,那么1MS 就要加1000次,所以用65535-1000=64535;再把64535换成16进制为FC17,把FC 付给TH0,17给TLO,即可定时1MS,因为65535他就溢出进入中断。

(3)模式2(8位重装模式)void Init_Timer0(void) //初始化{TMOD &= 0xF0; //模式2,8位重装模式TMOD|=0x0A; //GATE0=1;C/T0#=0; M1=1; M0=0;TH0=0x06; //设定初值;0x06= 0000 0110TL0=0x06; //计数值为250,若为12MHz,相当于250us;EA=1; //总中断打开ET0=1; //定时器中断打开TR0=1; //定时器开关打开}void Timer0_isr(void) interrupt 1 using 1{n=n++; //没中断一次,n+1,每两次中间间隔250usif(n=40)//n=40,就是中断40次,相当于250*4=10ms{n=0;m++; //每10ms,m+1if(m==100) //m=100,相当于10ms*100=1s{m=0;}}(4)模式3定时器0工作于方式3 时,占用了定时器1的TR1和TF0。

K. 定时器1(功能与定时器0一样,定时器1还可以用做串口的波特率发生器)voidInit_Timer1(void) //初始化{TMOD |= 0x10; //模式1,16位定时器,使用"|"符号在使用多个定时器时不受影响TH1=0x00; //给定初值,这里用定时器最大值从0开始计数一直到65535溢出TL1=0x00;// TH0=(65535-50000)/256=0x3c=60(10); //50ms// TL0=(65535-50000)%256=0xb0=176(10);EA=1; //总中断打开ET1=1; //定时器中断打开TR1=1; //定时器开关打开}void Timer1_isr(void) interrupt 3 using 1{TH1=0x00; //重新赋值TL1=0x00;LED=~LED; //LED闪烁}L. 定时器2voidTIM2Inital(void) //初始化{RCAP2H = (65536-60000)/256; //晶振12M 60ms 16bit 自动重载RCAP2L = (65536-60000)%256;ET2=1; //打开定时器中断EA=1; //打开总中断TR2=1; //打开定时器开关}void TIM2(void) interrupt 5 using 1//定时器2中断{TF2=0;LED=~LED; //执行函数}M. 产生方波(定时器0模式1)(1)产生1ms方波sbitOUT=P1^2;voidInit_Timer0(void){TMOD |= 0x01;//使用模式1,16位定时器//TH0=0x00; //给定初值,这里使用定时器最大值从0开始计数一直到65535溢出 //TL0=0x00;EA=1; //总中断打开ET0=1; //定时器中断打开TR0=1; //定时器开关打开}main(){Init_Timer0();while(1);}void Timer0_isr(void) interrupt 1 using 1{TH0=(65536-500)/256; //重新赋值12M晶振计算,指令周期1uS,TL0=(65536-500)%256; //1mS方波半个周期500uS,即定时500次//溢出然后输出端取反OUT=~OUT; //用示波器可看到方波输出}(2)产生200ms方波void Timer0_isr(void)interrupt 1 using 1{staticunsigned char i;TH0=(65536-10000)/256; //重新赋值12M晶振计算,指令周期1uS,TL0=(65536-10000)%256; //直接定时器不够用,定时10ms,然后循环10次 i++;if(i==11){i=0;OUT=~OUT; //用示波器可看到方波输出}}N. 独立按键(控制一个led)KEY=1; //按键输入端口电平置高while (1) //主循环{if(!KEY) //如果检测到低电平,说明按键按下LED=0;elseLED=1;}一个led状态转换:while (1) //主循环{if(!KEY) //如果检测到低电平,说明按键按下{DelayMs(10); //延时去抖,一般10-20msif(!KEY) //再次确认按键是否按下,没有按下则退出{while(!KEY);//如果确认按下按键等待按键释放,没有释放则一直等待{LED=!LED;//释放则执行需要的程序}}}}O. 外部中断0(P3^2)main(){P1=0x55; //P1口初始值EA=1; //全局中断开EX0=1; //外部中断0开IT0=0; //电平触发//IT0=1; //边沿触发while(1){//在此添加其他程序}}voidISR_Key(void) interrupt 0 using 1{P1=~P1; //进入中断程序执行程序,//此时可以通过EA=0指令暂时关掉中断}P. 外部中断1(P3^3)main(){LED=0; //LED灯点亮EA=1; //全局中断开EX1=1; //外部中断0开IT1=0; //T1=0表示电平触发// IT1=1; //IT1=1表示边沿触发while(1){//在此添加其他程序}}void ISR_INT1(void) interrupt 2{if(!INT1){DelayMs(10);//在此处可以添加去抖动程序,防止按键抖动造成错误 if(!INT1)while(!INT1);//等待按键释放{LED=!LED;}}Q. T0/T1外部计数输入voidInit_Timer0(void){TMOD |= 0x01 | 0x04; //模式1,16位计数器,用"|"符号在使用多个定时器时不受影响 TH0=0xFF; //给定初值TL0=245; //从245计数到255EA=1; //总中断打开ET0=1; //定时器中断打开TR0=1; //定时器开关打开}main(){Init_Timer0();while(1);}void Timer0_isr(void) interrupt 1 using 1{TH0=0xFF; //重新给定初值TL0=245;LED=~LED; //指示灯反相,可以看到闪烁}void Init_Timer1(void){TMOD |= 0x10 | 0x40; //模式1,16位计数器,用"|"符号用多个定时器时不受影响TH1=0xFF; //给定初值TL1=245; //从245计数到255EA=1; //总中断打开ET1=1; //定时器中断打开TR1=1; //定时器开关打开}R. 看门狗溢出测试sfr WDTRST = 0xA6;voidRst_Watchdog( void ) //喂狗{WDTRST = 0x1E; //先赋值1E 然后赋值E1WDTRST = 0xE1;}void main( void){int i; // 设置看门狗时间为1个时钟循环后Rst_Watchdog(); //关看门狗一个时钟循环for( i = 0; i < 500; i++){Rst_Watchdog();}P1=0x00;while(!key) //按下按键不松开,表示程序一直在按键处循环,//并用LED显示0x55{P1=0x55; //模拟出错正常情况应该一直显示LED,//但是加看门狗之后不间断复位,倒是LED闪烁}}S. 步进电机转动原理sbit A1=P1^0; //定义步进电机连接端口sbit B1=P1^1;sbit C1=P1^2;sbit D1=P1^3;#define Coil_A1 {A1=1;B1=0;C1=0;D1=0;}//A相通电,其他相断电#define Coil_B1 {A1=0;B1=1;C1=0;D1=0;}//B相通电,其他相断电#define Coil_C1 {A1=0;B1=0;C1=1;D1=0;}//C相通电,其他相断电#define Coil_D1 {A1=0;B1=0;C1=0;D1=1;}//D相通电,其他相断电#define Coil_OFF {A1=0;B1=0;C1=0;D1=0;}//全部断电unsigned char Speed;main(){//unsigned int i=64*16; //转2周停止Speed=5; //调整速度while(1){Coil_A1 //遇到Coil_A1 用{A1=1;B1=0;C1=0;D1=0;}代替DelayMs(Speed); //改变这个参数可以调整电机转速,//数字越小,转速越大,力矩越小Coil_B1DelayMs(Speed);Coil_C1DelayMs(Speed);Coil_D1DelayMs(Speed);}}T. 串口通讯voidInitUART (void){SCON = 0x50; // SCON: 模式1, 8-bit UART, 使能接收TMOD |= 0x20; //TMOD: timer 1, mode 2, 8-bit 重装TH1 = 0xFD; // TH1: 重装值9600 波特率晶振11.0592MHz TR1 = 1; // TR1: timer 1 打开EA = 1; //打开总中断//ES = 1; //打开串口中断}void SendByte(unsigned char dat) //发送一个字节{SBUF = dat;while(!TI);TI = 0;}void SendStr(unsigned char *s) //发送一个字符串{while(*s!='\0')// \0 表示字符串结束标志,//通过检测是否字符串末尾{SendByte(*s);s++;}}void main (void){InitUART();while (1){SendStr("UART test,技术论坛: thankyou!");DelayMs(240);//延时循环发送DelayMs(240);}}U. 串口通讯中断voidInitUART (void){SCON = 0x50; // SCON: 模式1, 8-bit UART, 使能接收TMOD |= 0x20; //TMOD: timer 1, mode 2, 8-bit 重装TH1 = 0xFD; // TH1: 重装值9600 波特率晶振11.0592MHz TR1 = 1; // TR1: timer 1 打开EA = 1; //打开总中断// ES = 1; //打开串口中断}void main (void){InitUART();SendStr("UART test,技术论坛:请在发送区输入任意信息"); ES = 1; //打开串口中断while (1){ }}void UART_SER (void) interrupt 4 //串行中断服务程序{unsigned char Temp; //定义临时变量if(RI) //判断是接收中断产生{RI=0; //标志位清零Temp=SBUF; //读入缓冲区的值P1=Temp; //把值输出到P1口,用于观察SBUF=Temp; //把接收到的值再发回电脑端}if(TI) //如果是发送标志位,清零TI=0;}V. RS485通讯原理(与串口通讯类似)voidmain (void){InitUART();Ctrl_EN=1; //发送模式(多了这条设定)while (1){SendStr("UART test,技术论坛: thank you!");DelayMs(240);//延时循环发送DelayMs(240);}}。

相关文档
最新文档