单片机c语言教程全集
- 格式:docx
- 大小:357.18 KB
- 文档页数:24
STC单片机C语言程序设计STC单片机C语言编程入门STC单片机是一种广泛应用于嵌入式系统和物联网设备中的微控制器。
它具有体积小、功耗低、运算能力强等特点,被广泛应用于各种控制系统中。
本文将介绍STC单片机C语言程序设计的入门知识,以帮助初学者快速上手。
首先,我们需要了解一些基本的概念和术语。
1.单片机:单片机是一种集成电路芯片,其中包含了中央处理器、存储器、输入输出接口等功能模块。
它可以独立完成特定的任务,不需要额外的硬件设备与之配合。
2.C语言:C语言是一种高级编程语言,被广泛应用于嵌入式系统开发中。
它具有简洁、高效的特点,易于理解和学习。
了解了上述基本概念后,接下来我们将介绍一些STC单片机C语言程序设计的入门知识。
2. 程序结构:一个C语言程序通常由多个函数组成,其中一个函数名为main(。
程序从main(函数开始执行,执行完main(函数后程序结束。
3.数据类型:C语言中有多种数据类型,包括整型、浮点型、字符型等。
在使用数据类型时,需要根据需要选择合适的数据类型。
4.变量和常量:在C语言中,可以使用变量和常量来存储数据。
变量是可以改变值的,而常量是固定不变的值。
5. 输入和输出:C语言中使用标准库函数scanf(和printf(来实现输入和输出操作。
通过这两个函数可以从键盘获取输入数据,并将结果输出到屏幕上。
6. 控制语句:在C语言中,可以使用if语句、for循环和while循环等控制语句来控制程序的执行流程。
通过控制语句,可以实现条件判断、循环执行等功能。
7.函数:函数是C语言中的重要概念,它可以将一段代码封装成一个独立的模块,方便重复使用。
在编写程序时,可以自定义函数来实现特定的功能。
8.数组:数组是一种存储相同类型数据的连续内存区域。
在C语言中,可以使用数组来存储一组数据,并对数据进行操作。
9.文件操作:C语言提供了文件操作函数,可以对文件进行读写操作。
通过文件操作,可以实现数据的持久化存储。
我们在单片机最小系统上接个LED,看我们能否点亮它!对了,上面也有好几次提到过单片机最小系统了,所谓单片机最小系统就是在单片机上接上最少的外围电路元件让单片机工作。
一般只须连接晶体、VCC、GND、RST即可,一般情况下,A T89C51的31脚须接高电平。
#include<reg51.h> //头文件定义。
或用#include<at89x51.h>其具体的区别在于:后者定义了更多的地址空间。
//在Keil安装文件夹中,找到相应的文件,比较一下便知!sbit P1_0 = P1 ^ 0; //定义管脚void main (void){while(1){P1_0 = 0;//低电平有效,如果把LED反过来接那么就是高电平有效}}就那么简单,我们就把接在单片机P1_0上的LED点亮了,当然LED是低电平,才能点亮。
因为我们把LED的正通过电阻接至VCC。
P1_0 = 0; 类似与C语言中的赋值语句,即把0 赋给单片机的P1_0引脚,让它输出相应的电平。
那么这样就能达到了我们预先的要求了。
while(1)语句只是让单片机工作在死循环状态,即一直输出低电平。
如果我们要试着点亮其他的LED,也类似上述语句。
这里就不再讲了。
点亮了几个LED后,是不是让我们联想到了繁华的街区上流动的彩灯。
我们是不是也可以让几个LED依次按顺序亮呢?答案是肯定的!其实显示的原理很简单,就是让一个LED灭后,另一个立即亮,依次轮流下去。
假设我们有8个LED分别接在P1口的8个引脚上。
硬件连接,在P1_1--P1_7上再接7个LED即可。
例程如下:#include<reg51.h>sbit P1_0 = P1 ^ 0;sbit P1_1 = P1 ^ 1;sbit P1_2 = P1 ^ 2;sbit P1_3 = P1 ^ 3;sbit P1_4 = P1 ^ 4;sbit P1_5 = P1 ^ 5;sbit P1_6 = P1 ^ 6;sbit P1_7 = P1 ^ 7;void Delay(unsigned char a){unsigned char i;while( --a != 0){for(i = 0; i < 125; i++); //一个; 表示空语句,CPU空转。
51单片机C语言编程100例1. 引言51单片机是一款常用于嵌入式系统的微控制器,其强大的功能和广泛的应用使得掌握51单片机C语言编程成为许多电子工程师和学习者的首选。
本文将介绍并讲解51单片机C语言编程的100个例子,帮助读者逐步掌握编程技巧和开发经验。
2. 闪烁LED灯第一个例子是闪烁LED灯。
我们将通过C语言编写程序,控制51单片机上的一个LED灯以固定的频率闪烁,展示基本的输入输出操作。
通过学习这个例子,读者可以了解到C语言与单片机的交互方式。
3. 数码管计数器第二个例子是数码管计数器。
我们将使用C语言编写程序,通过按键操作控制数码管上的数字进行计数。
这个例子展示了如何使用中断和定时器来实现交互功能和多任务处理。
4. PWM波控制第三个例子是PWM波控制。
我们将使用C语言编程,通过调整占空比来控制51单片机上的PWM波输出。
这个例子展示了如何利用51单片机的定时器和中断模式来生成模拟信号。
5. 温度采集与显示第四个例子是温度采集与显示。
我们将利用51单片机内置的ADC模块,通过连接温度传感器来实现温度采集,并将采集到的数据在液晶屏上显示。
这个例子展示了如何使用模拟到数字转换和外部模块的接口技术。
6. 蓝牙通信控制第五个例子是蓝牙通信控制。
我们将利用51单片机的串口功能和蓝牙模块,实现与蓝牙设备之间的通信和控制。
通过学习这个例子,读者可以熟悉串口通信和外部设备的接口编程。
7. 距离测量与报警第六个例子是距离测量与报警。
我们将使用超声波传感器和蜂鸣器,通过C语言编程实现距离的测量和报警功能。
这个例子展示了如何使用外部传感器和控制器进行物理量的检测和反馈。
8. 数字音乐播放器第七个例子是数字音乐播放器。
我们将使用51单片机的PWM功能和SD卡模块,通过C语言编程实现音乐的播放和控制。
这个例子展示了如何使用定时器和外部存储设备进行数据的读取和解码。
9. 图形液晶显示第八个例子是图形液晶显示。
我们将利用51单片机的并行接口和图形液晶屏,通过C语言编程实现图形和字符的显示功能。
目录例2.2.1 编写程序,点亮第一个发光二极管(part2_1.c P27 )...................................... - 4 -例2.5.1利用for语句延时特性,编写第一个发光二极管以间隔1S亮灭闪动的程序(part2_3.c P42) ........................................................................................................................................... - 5 -例2.6.1编写程序使第一个发光二极管以间隔500ms亮灭闪动。
(part2_4.c P48) ........ - 5 -例2.7.1编写程序使第一个二极管以亮200ms、灭800ms的方式闪动。
(part2_5.c P49) - 6 -例2.8.3利用C51自带库_crol_(),以间隔500ms,实现流水灯程序(part2_6.c P53)..... - 6 -例3.2.1编写程序使第一个数码管显示8(part2.1_.1c P59)............................................. - 7 -例3.2.2让实验板上6个数码管同时点亮,依次显示0到F,时间间隔为0.5ms,循环下去。
(part2.1_2.c P61) ................................................................................................................. - 8 -例3.3.1第一个数码管显示1,时间为0.5s,然后关闭它,立即让第二个数码管显示2,时间为0.5s,在关闭它……一直到最后一个数码管显示6,时间同样为0.5s,关闭它之后再回来显示第一个数码管,一直循环下去。
STC单片机C语言程序设计STC单片机C语言编程入门
1.了解STC单片机的内部结构和外部接口:STC单片机的内部结构包
括CPU、存储器、I/O接口等,需要了解各部分的功能和连接方式。
此外,还需要熟悉STC单片机的外部接口,包括输入/输出端口、串口、定时器等。
2.学习C语言的基础知识:C语言是一种结构化的高级编程语言,具
有简洁、灵活、高效的特点。
初学者可以通过学习C语言的基本语法,如
数据类型、变量、运算符、条件语句、循环语句等,来掌握C语言的编程
技巧。
4.学习STC单片机的编程技巧:在实际的STC单片机编程中,需要掌
握一些常用的编程技巧。
例如,如何读写内部寄存器、如何使用定时器、
如何进行中断处理等。
这些技巧的掌握可以提高程序的效率和稳定性。
5.开发简单的应用程序:通过学习STC单片机的C语言编程,可以编
写一些简单的应用程序,如LED灯控制、蜂鸣器控制、数码管显示等。
这
些程序的编写可以帮助初学者熟悉STC单片机的编程流程和操作步骤。
总之,STC单片机的C语言编程是嵌入式开发中的重要环节,通过学
习和实践,可以掌握STC单片机的编程技巧,开发出各种应用程序。
初学
者可以通过学习相关教材、参加培训班等方式入门,逐步提高自己的编程
水平。
51单片机C语言编程100例-单片机c语言编程(共19页)-本页仅作为预览文档封面,使用时请删除本页-目录实例3:用单片机控制第一个灯亮...................... 错误!未定义书签。
实例4:用单片机控制一个灯闪烁:认识单片机的工作频率错误!未定义书签。
实例5:将 P1口状态分别送入P0、P2、P3口:认识I/O口的引脚功能错误!未定义书签。
实例6:使用P3口流水点亮8位LED.................... 错误!未定义书签。
实例7:通过对P3口地址的操作流水点亮8位LED........ 错误!未定义书签。
实例8:用不同数据类型控制灯闪烁时间................ 错误!未定义书签。
实例9:用P0口、P1 口分别显示加法和减法运算结果.... 错误!未定义书签。
实例10:用P0、P1口显示乘法运算结果................ 错误!未定义书签。
实例11:用P1、P0口显示除法运算结果................ 错误!未定义书签。
实例12:用自增运算控制P0口8位LED流水花样........ 错误!未定义书签。
实例13:用P0口显示逻辑"与"运算结果................ 错误!未定义书签。
实例14:用P0口显示条件运算结果.................... 错误!未定义书签。
实例15:用P0口显示按位"异或"运算结果.............. 错误!未定义书签。
实例16:用P0显示左移运算结果...................... 错误!未定义书签。
实例17:"万能逻辑电路"实验......................... 错误!未定义书签。
实例18:用右移运算流水点亮P1口8位LED............. 错误!未定义书签。
实例19:用if语句控制P0口8位LED的流水方向....... 错误!未定义书签。
第一课建立你的第一个KeilC51项目随着单片机技术的不断发展,以单片机C语言为主流的高级语言也不断被更多的单片机爱好者和工程师所喜爱。
使用C51肯定要使用到编译器,以便把写好的C程序编译为机器码,这样单片机才能执行编写好的程序。
KEIL uVISION2 是众多单片机应用开发软件中优秀的软件之一,它支持众多不一样公司的MCS51架构的芯片,它集编辑,编译,仿真等于一体,同时还支持,PLM,汇编和C语言的程序设计,它的界面和常用的微软VC++的界面相似,界面友好,易学易用,在调试程序,软件仿真方面也有很强大的功能。
下面结合8051介绍单片机C语言的优越性:·无须懂得单片机的具体硬件,也能够编出符合硬件实际的专业水平的程序;·不懂得单片机的指令集,也能够编写完美的单片机程序;·不同函数的数据实行覆盖,有效利用片上有限的RAM空间;·提供auto、static、const等存储类型和专门针对8051单片机的data、idata、pdata、xdata、code等存储类型,自动为变量合理地分配地址;·C语言提供复杂的数据类型(数组、结构、联合、枚举、指针等),极大地增强了程序处理能力和灵活性;·提供small、compact、large等编译模式,以适应片上存储器的大小;·中断服务程序的现场保护和恢复,中断向量表的填写,是直接与单片机相关的,都由C编译器代办;·程序具有坚固性:数据被破坏是导致程序运行异常的重要因素。
C语言对数据进行了许多专业性的处理,避免了运行中间非异步的破坏·提供常用的标准函数库,以供用户直接使用;·有严格的句法检查,错误很少,可容易地在高级语言的水平上迅速地被排掉;·可方便地接受多种实用程序的服务:如片上资源的初始化有专门的实用程序自动生成;再如,有实时多任务操作系统可调度多道任务,简化用户编程,提高运行的安全性等等。
·头文件中定义宏、说明复杂数据类型和函数原型,有利于程序的移植和支持单片机的系列化产品的开发;以上简单介绍了KEILC51 软件,要使用KEILC51软件,必需先要安装它,这也是学习单片机编程语言所要求的第一步――建立学习环境。
安装好后,您是不是想建立自己的第一个单片机C语言程序项目呢?下面就让我们一起来建立一个小程序吧,请根据教程一步步的来,你绝对可以在短时间内熟悉c51的。
本教程所涉及c51源代码请点此下载首先当然是运行KEIL软件,接着按下面的步骤建立您的第一个项目:(1)点击Project 菜单,选择弹出的下拉式菜单中的New Project,如图1-2。
接着弹出一个标准Windows 文件对话窗口,如图1-3。
在“文件名”中输入您的第一个C 程序项目名称,这里我们用“test”。
“保存”后的文件扩展名为uv2,这是KEIL uVision2 项目文件扩展名,以后能直接点击此文件以打开先前做的项目。
图1-2 New Project 菜单图1-3 文件窗口(2)选择所要的单片机,这里选择常用的Ateml 公司的AT89c51。
而且本单片机c语言教程里的大部分程序都是基于此芯片的,此时屏幕如图1-4 所示。
AT89c51 有什么功能、特点呢?看图中右边有简单的介绍。
完成上面步骤后,就可以进行程序的编写了。
(3)首先在项目中创建新的程序文件或加入旧程序文件。
如果您没有现成的程序,那么就要新建一个程序文件。
在KEIL 中有一些程序的Demo,在这里我们还是以一个 C 程序为例介绍如何新建一个 C 程序和如何加到您的第一个项目中吧。
点击图1-5 中 1 的新建文件的快捷按钮,在 2 中出现一个新的文字编辑窗口,这个操作也能通过菜单File-New 或快捷键Ctrl+N 来实现。
好了,现在能编写程序了。
下面是经典的一段程序,呵,如果您看过别的程序书也许也有类似的程序:#include#includevoid main(void)SCON = 0x50;1’89c89c89c0”1”0”1”0”1”104L034L字]e[±]数字,[]中的内容为可选项,其中内容根据具体情况可有可无,但其余部分必须有,如125e3,7e9,。
3.字符型常量是单引号内的字符,如‘a’,‘d’等,不能显示的控制字符,能在该字符前面加一个反斜杠“\”组成专用转义字符。
常用转义字符表请看表4-1。
4.字符串型常量由双引号内的字符组成,如“test”,“OK”等。
当引号内的没有字符时,为空字符串。
在使用特殊字符时同样要使用转义字符如双引号。
在 C 中字符串常量是做为字符类型数组来处理的,在存储字符串时系统会在字符串尾部加上\o 转义字符以作为该字符串的结束符。
字符串常量“A”和字符常量‘A’是不一样的,前者在存储时多占用一个字节的字间。
表4-1 常用转义字符表常量可用在不必改变值的场合,如固定的数据表,字库等。
常量的定义方式有几种,下面来加以说明。
#difine False 0x0; 7F7F89c89c89c数据存储模式存储模式决定了没有明确指定存储类型的变量,函数参数等的缺省存储区域,共三种:1. 1. Small模式所有缺省变量参数均装入内部RAM,优点是访问速度快,缺点是空间有限,只适用于小程序。
2. 2. Compact模式所有缺省变量均位于外部RAM区的一页(256Bytes),具体哪一页可由P2口指定,在文件中说明,也可用pdata指定,优点是空间较Small为宽裕速度较Small慢,较large要快,是一种中间状态。
3. 3. large模式所有缺省变量可放在多达64KB的外部RAM区,优点是空间大,可存变量多,缺点是速度较慢。
提示:存储模式在单片机c语言编译器选项中选择。
之前提到简单提到sfr,sfr16,sbit定义变量的方法,下面我们再来仔细看看。
sfr和sfr16能直接对51单片机的特殊寄存器进行定义,定义方法如下:sfr 特殊功能寄存器名= 特殊功能寄存器地址常数;sfr16 特殊功能寄存器名= 特殊功能寄存器地址常数;我们能这样定义AT89c51的P1口sfr P1 = 0x90; 2LKeil c51指针变量单片机c语言支持一般指针(Generic Pointer)和存储器指针(Memory_Specific Pointer).1. 1. 一般指针一般指针的声明和使用均与标准C相同,不过同时还能说明指针的存储类型,例如:long * state;为一个指向long型整数的指针,而state本身则依存储模式存放。
char * xdata ptr;ptr为一个指向char数据的指针,而ptr本身放于外部RAM区,以上的long,char等指针指向的数据可存放于任何存储器中。
一般指针本身用3个字节存放,分别为存储器类型,高位偏移,低位偏移量。
2. 2. 存储器指针基于存储器的指针说明时即指定了存贮类型,例如:char data * str;str指向data区中char型数据int xdata * pow; pow指向外部RAM的int型整数。
这种指针存放时,只需一个字节或2个字节就够了,因为只需存放偏移量。
3. 3. 指针转换即指针在上两种类型之间转化:l 当基于存储器的指针作为一个实参传递给需要一般指针的函数时,指针自动转化。
l 如果不说明外部函数原形,基于存储器的指针自动转化为一般指针,导致错误,因而请用“#include”说明所有函数原形。
l 能强行改变指针类型。
变量的存储类别一、static(静态局部)变量。
1、静态局部变量在程序整个运行期间都不会释放内存。
2、对于静态局部变量,是在编译的时候赋初值的,即只赋值一次。
如果在程序运行时已经有初值,则以后每次调用的时候不再重新赋值。
3、如果定义局部变量的时候不赋值,则编译的时候自动赋值为0。
而对于自动变量而言,定义的时候不赋值,则是一个不确定的值。
4、虽然静态变量在函数调用结束后仍然存在,但是其他函数不能引用。
二、用extern声明外部变量。
用extern声明外部变量,是为了扩展外部变量的作用范围。
比如一个程序能由多个源程序文件组成。
如果一个程序中需要引用另外一个文件中已经定义的外部变量,就需要使用extern来声明。
正确的做法是在一个文件中定义外部变量,而在另外一个文件中使用extern对该变量作外部变量声明。
一个文件中:int abc;另外一个文件中:extern abc;例子:用extern将外部变量的作用域扩展到其他文件:文件1:002A002C002A002C0A1C1c89C89C89C89C11.0592M89C89c89c89c 89C89C12M1M12M1M11.0592M11.0592M12M11.0592M11.0592M12M12M12M11.0592M12M 的文件中用#include "文件名.h"引入。
如果被调函数的定义和主调函数不是在同一文件中的,则要用如下的方式进行说明,说明被调函数的定义在同一项目的不一样文件之上,其实库函数的头文件也是如此说明库函数的,如果说明的函数也能称为外部函数。
extern 类型标识符函数的名称(形式参数表); 函数的定义和说明是完全不一样的,在编译的角度上看函数的定义是把函数编译存放在ROM 的某一段地址上,而函数说明是告诉编译器要在程序中使用那些函数并确定函数的地址。
如果在同一文件中被调函数的定义在主调函数之前,这个时候能不用说明函数类型。
也就是说在main 函数之前定义的函数,在程序中就能不用写函数类型说明了。
能在一个函数体调用另一个函数(嵌套调用),但不允许在一个函数定义中定义另一个函数。
还要注意的是函数定义和说明中的“类型、形参表、名称”等都要相一致。
三.中断函数中断服务函数是编写应用程序不可缺少的。
中断服务函数只有在中断源请求响应中断时才会被执行,这在处理突发事件和实时控制是十分有效的。
例如:电路中一个按钮,要求按钮后LED 点亮,这个按钮何时会被按下是不可预知的,为了要捕获这个按钮的事件,通常会有三种方法,一是用循环语句不断的对按钮进行查询,二是用定时中断在间隔时间内扫描按钮,三是用外部中断服务函数对按钮进行捕获。
在这个应用中只有单一的按钮功能,那么第一种方式就能胜任了,程序也很简单,但是它会不停的在对按钮进行查询浪费了CPU 的时间。
实际应用中一般都会还有其它的功能要求同时实现,这个时候能根据需要选用第二或第三种方式,第三种方式占用的CPU 时间最少,只有在有按钮事件发生时,中断服务函数才会被执行,其余的时间则是执行其它的任务。
如果你学习过汇编语言的话,刚开始写汇编的中断应用程序时,你一定会为出入堆栈的问题而困扰过。