8051单片机波特率计算公式(配套C语言例程)
水寒8051 182 views 0 Comments发表评论
8051单片机使用定时器1工作在方式2的情况下作为串口波特率发生器,其波特率=(2smod/32)×(定时器T1溢出率),其中smod是PCON<7>,表示是否波特率加倍,Fsoc是系统的晶振大小。
波特率公式中:T1溢出率=溢出周期的倒数;溢出周期=(256-TH1)×12/Fosc;
最终公式:
我们一般不太关注波特率的计算,而是关心选用的传输速度(波特率)去反算定时器1(自动重装模式)的初值(TH1),所以将上面的公式导一下,得到TH1的公式:
下面针对串口发送程序,水寒写下例程,供大家参考。(我使用的是STC12C5A40S2调试,原则上在STC89C5x、AT89C5x等8051核心的单片机上都能够成功,由于程序比较简单,我没有试,但应该没有问题的)
#include "Reg52.H"
/******************************************************************* 请提前计算一下所选晶振能达到的最高速度,波特率不能超过最高速度
(1) 波特率加倍(SMOD=1): Max_Baud = FOSC/12/16
(2) 波特率不加倍(SMOD=0):Max_Baud = FOSC/12/32
例如:22.1184MHz晶振,波特率加倍时,最大波特率=22118400/12/16=115200 *******************************************************************/ #define FOSC 22118400 //振荡频率
#define BAUD 9600 //波特率
#define SMOD 1 //是否波特率加倍
#if SMOD
#define TC_VAL (256-FOSC/16/12/BAUD)
#else
#define TC_VAL (256-FOSC/32/12/BAUD)
#endif
typedef unsigned char uint8;
typedef unsigned int uint16;
code const char str1[] = "Ther string is transmitted from 80C51!\r\n"; code const char str2[] = "Author: xqlu(at)https://www.doczj.com/doc/c86275340.html,\r\n";
/***************函数声明*******************/
void InitUART(void);
void SendOneByte(uint8);
void SendrStr(const uint8 *ptr);
/****************主函数********************/
void main(void)
{
uint8 i=0;
InitUART();
while(str2[i]!='\0')
{
SendOneByte(str2[i++]);
}
SendrStr(str1);
while(1);
}
/****************中断服务函数***************/
void UART_ISR(void) interrupt 4
{
uint8 RX_Data;
//只响应“接收”中断,“发送”中断来了就直接抹掉
if(RI)
{
RI = 0; //串口中断标志不能自己清除,需要手动清除
RX_Data=SBUF;
SendOneByte(RX_Data);
}
else
TI = 0; //串口发中断是发送完缓冲区数据之后产生
}
/****************串口初始化函数*************/
void InitUART(void)
{
TMOD = 0x20;
SCON = 0x50;
TH1 = TC_VAL;
TL1 = TH1;
PCON = 0x80; //发送速率加倍
ES = 1;
EA = 1;
TR1 = 1;
}
/**************串口发送字符函数*************/
void SendOneByte(uint8 c)
{
ES = 0; //禁止发送中断
SBUF = c;
while(!TI);
TI = 0;
ES = 1;
}
/**************串口发送字符串函数*************/
void SendrStr(const uint8 *ptr)
{
do
{
SendOneByte(*ptr);
}while(*ptr++!='\0');
}
目录 目录 (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 (16) 实例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:用数组作函数参数控制流水花样 (23) 实例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) 1/192
单片机c语言中nop函数的使用方法和延时计算 标准的C语言中没有空语句。但在单片机的C语言编程中,经常需要用几个空指令产生短延时的效果。 这在汇编语言中很容易实现,写几个nop就行了。 在keil C51中,直接调用库函数: #include
第一、定义的C51中循环变量,尽量采用无符号字符型变量。 第二、在FOR循环语句中,尽量采用变量减减来做循环。 第三、在do…while,while语句中,循环体内变量也采用减减方法。这因为在C51编译器中,对不同的循环方法,采用不同的指令来完成的。 下面举例说明: unsigned char I; for(i=0;i<255;i++); unsigned char I; for(i=255;i>0;i--); 其中,第二个循环语句C51编译后,就用DJNZ指令来完成,相当于如下指令: MOV09H,#0FFH LOOP:DJNZ09H,LOOP 指令相当简洁,也很好计算精确的延时时间。 同样对do…while,while循环语句中,也是如此 例: unsigned char n; n=255; do{n--}
单片机C语言(非常通俗易懂) (一) 相信很多爱好电子的朋友,对单片机这个词应该都不会陌生了吧。不过有些朋友可能只听说他叫单片机,他的全称是什么也许并不太清楚, 更不用说他的英文全称和简称了。单片机是一块在集成电路芯片上集成了一台有一定规模的微型计算机。简称为:单片微型计算机或单片机 (Single Chip Computer)。单片机的应用到处可见,应用领域广泛,主要应用在智能仪表、实时控制、通信、家电等方面。不过这一切都没 什么关系,因为我(当然也包括任何人)都是从不知道转变成知道的,再转变成精通的。现在我只想把我学习单片机的经历,详细地讲叙给大 家听听,可能有些大虾会笑话我,想:那么简单的东西还在这里卖弄。但是你错了,我只是把我个人学习的经历讲述一遍而已,仅仅对那些想 学习单片机,但又找不到好方法或者途径的朋友,提供一个帮助,使他们在学习过程中,尽量少走些弯路而已! 首先,你必须有学习单片机的热情,不是说今天去图书馆看了一个下午关于单片机的书,而明天玩上半天,后天就不知道那个本书在讲什 么东西了。还是先说说我吧,我从大二的第一个学期期末的时候才开始接触单片机,但在这之前,正如上面所说的:我知道有种芯片叫单片机, 但是具体长成什么样子,却一点也不知道!看到这里很多朋友一定会忍不住发笑。嘿嘿,你可千万别笑,有些大四毕业的人也同样不知道单片 机长成什么样子呢!而我对单片机的痴迷更是常人所不能想象的地步,大二的期末考试,我全放弃了复习,每当室友拿着书在埋头复习的时候, 我却捧着自己从图书馆借的单片机书在那看,虽然有很多不懂,但是我还是坚持了下来,当时我就想过,为了单片机值不值得我这样去付出, 或许这也是在一些三流学校的好处吧,考试挂科后,明年开学交上几十元一门的补考费,应该大部分都能过了。于是,我横下一条心,坚持看 我的单片机书和资料。 当你明白了单片机是这么一回事的时候,显而易见的问题出来了:我要选择那种语言为单片机编写程序呢?这个问题,困扰了我好久。具 体选择C51还是A51呢?汇编在我们大二之前并没有开过课,虽然看着人家的讲解,很容易明白单片机的每一时刻的具体工作情况,但是一合上 书或者资料,自己却什么也不知道了,根本不用说自己写程序了。于是,我最终还是决定学C51,毕竟C51和我们课上讲的C语言,有些类似, 编程的思想可以说是相通的。而且C51还有更大的优点就是编写大程序时的优越性更不言而喻,当然在那时,我并没有想的那么深远,C51的特 点,还是在后来的实践过程中,渐渐体会到的!朋友如果你选择了C51,那么请继续往下看,如果你选择了A51,那么你可以不要看了!因为下面讲 的全是C方面的,完全在浪费你的时间! 呵呵 ^_^ 第二,既然你想学好单片机,你必须得舍得花钱,如果不买些芯片回来自己动手焊焊拆拆的(但是在后期会介绍给大家一个很好用的硬件 仿真软件,并不需要你用实验板和仿真器了,直接在你的PC上完成,但是软件毕竟是软件,从某个特定的意义上来说是并不能代替硬件的),即使
函数原形的头文件读者可参考返回非整型值的函数 assert.h - assert(), 声明宏 ctype.h –字符类型函数 float.h –浮点数原形 limits.h –数据类型的大小和范围 math.h –浮点运算函数 stdarg.h –变量参数表. stddef.h –标准定义 stdio.h –标准输入输出IO 函数 stdlib.h –包含内存分配函数的标准库 string.h –字符串处理函数 3 字符类型库 下列函数按照输入的ACS II 字符集字符分类使用这些函数之前应当用"#include
C语言习题集 习题一 一.填空题 1.C程序是由()构成的,一个C程序中至少包含()。因此,( ) 是C程序的基本单位。 2. 函数体是有符号____开始,符号____结束。函数体当中,前面是变量的____部分,后面变量的____部分。3.一个C源程序中至少应包括一个_______。 4.在一个C源程序中,注释部分两侧的分界符分别为_____和________。在C语言的每条语句后面都要有____结束 二.判断题 1.一个C程序的执行总是从该程序的main函数开始,在main函数最后结束。【】 2.main函数必须写在一个C程序的最前面。【】 3.一个C程序可以包含若干的函数。【】 4.C程序的注释部分可以出现在程序的任何位置,它对程序的编译和运行不起任何作用。但是可以增加程序的可读性。【】 5.C程序的注释只能是一行。【】 6.C程序的注释不能是中文文字信息。【】 三、选择题 1 一个C程序的执行是从________。 (A)本程序的main函数开始,到main函数结束。 (B)本程序的第一个函数开始,到本程序文件的最后一个函数结束。 (C) 本程序的main函数开始,到本程序文件的最后一个函数结束。 (D)本程序的第一个函数开始,到本程序main函数结束。 2 以下叙述不正确的是_________。 (A)一个C源程序可由一个或多个函数组成。 (B)一个C源程序必须包含一个main函数。 (C) 程序的基本组成单位是函数。 (D)在C程序中,/**/类的注释说明只能位于一条语句的后面 3 C语言规定:在一个源程序中,main函数的位置___。 (A)必须在最开始(B)必须在所有函数的后面 (C)可以任意(D)必须在最后 四.程序阅读 1、找出该程序中的错误并改正。 #include
PICC库函数 本章将详细列出PICC编译器的库函数。每个函数均从函数名开始,然后按照以下几个标题给出详细解释。 提要:函数的C语言定义以及定义函数的头文件。 描述:对函数及其目的进行叙述性描述。 例程:给出一个能说明该函数的应用例子。 数据类型:列出函数中使用的一些特殊的数据类型(如结构体等)的C语言定义。这些数据类型的定义包含在提要标题下列出的头文件中。 参阅:给出相关联的函数。 返回值:如果函数有返回值,则在本标题下将给出返回值的类型和性质,同时还包括错误返回的信息。 1 ABS函数 1. 提要 #include
void main (void) { int a = -5; printf("The absolute value of %d is %d\n",a,abs(a)); } 4. 返回值 j的绝对值。 2 ACOS函数 1. 提要 #include
main (void) { float i,a; for(i = -1.0,i < 1.0;i += 0.1) { a = acos(i)*180.0/3.141592; printf("acos(%f) = %f degrees\n",i,a); } } 4.参阅 sin( ),cos( ),tan( ),asin( ),atan( ),atan2( ) 5.返回值 返回值是一个用弧度表示的角度,区间是[0,π]。如果函数参数超出区间[-1,1],则返回值将为0。 3 ASCTIME函数 1. 提要 #include
转自:https://www.doczj.com/doc/c86275340.html,/article/304.html 在单片机中要开平方.可以用到下面算法: 算法1: 本算法只采用移位、加减法、判断和循环实现,因为它不需要浮点运算,也不需要乘除运算,因此可以很方便地运用到各种芯片上去。 我们先来看看10进制下是如何手工计算开方的。 先看下面两个算式, x = 10*p + q (1) 公式(1)左右平方之后得: x^2 = 100*p^2 + 20pq + q^2 (2) 现在假设我们知道x^2和p,希望求出q来,求出了q也就求出了x^2的开方x了。 我们把公式(2)改写为如下格式: q = (x^2 - 100*p^2)/(20*p+q) (3) 这个算式左右都有q,因此无法直接计算出q来,因此手工的开方算法和手工除法算法一样有一步需要猜值。 我们来一个手工计算的例子:计算1234567890的开方 首先我们把这个数两位两位一组分开,计算出最高位为3。也就是(3)中的p,最下面一行的334为余数,也就是公式(3)中的(x^2 - 100*p^2)近似值 3 --------------- | 12 3 4 56 78 90 9 --------------- | 3 34 下面我们要找到一个0-9的数q使它最接近满足公式(3)。我们先把p乘以20写在334左边: 3 q --------------- | 12 3 4 56 78 90 9 --------------- 6q| 3 34 我们看到q为5时(60+q*q)的值最接近334,而且不超过334。于是我们得到: 3 5 --------------- | 12 3 4 56 78 90 9 --------------- 65| 3 34 | 3 25 --------------- 9 56 接下来就是重复上面的步骤了,这里就不再啰嗦了。
C51的常用库函数详解 C51语言的编译器中包含有丰富的库函数,使用库函数可以大大简化用户程序设计的工作量,提高编程效率。每个库函数都在相应的头文件中给出了函数原型声明,在使用时,必须在源程序的开始处使用预处理命令#include将有关的头文件包含进来。 C51库函数中类型的选择考虑到了8051单片机的结构特性,用户在自己的应用程序中应尽可能地使用最小的数据类型,以最大限度地发挥8051单片机的性能,同时可减少应用程序的代码长度。下面将C51的库函数分类列出并详细介绍其用法。 1 字符函数 字符函数的原型声明包含在头文件CTYPE.H中。常用的一些字符函数介绍如下。1.1 检查英文字母函数 检查英文字母函数用于检查形参字符是否为英文字母,其函数原型如下: bit isalpha(char c); 其中,c为待判断的字符,如果是英文字母则返回1,否则返回0。程序示例如下: 1.2 检查字母数字函数 检查字母数字函数用于检查形参字符是否为英文字母或数字字符,其函数原型如下:bit isalnum(char c);
1.3 检查控制字符函数 检查控制字符函数用于检查形参字符是否为控制字符,其函数原型:bit iscntrl (char c);其中,c为待判断的字符。控制字符其取值范围为0x00~0xlF之间或等于0x7F,如果是,则返回1,否则返回0。
1.4 十进制数字检查函数 十进制数字检查函数用于检查形参字符是否为十进制数字,其函数原型如下: bit isdigit (char c); 其中,c为待判断的字符,如果是十进制数字则返回1,否则返回0。 1.5 可打印字符检查函数 可打印字符检查函数用于检查形参字符是否为可打印字符,其函数原型如下: bit isgraph (char c); 其中,c为待判断的字符。可打印字符的取值范围为0x21~0x7C,不包含空格,如果是可打印字符则返回1,否则返回0。
C语言编写单片机程序的注意要点 1.C语言的特点 1.1函数 函数是C程序的基本单位,一个C源程序至少包括一个函数,一个C源程序有且只有一个名为main()的函数,也可能包含其它函数,main()作为整个程序的入口。主程序通过直接书写语句和调用其它函数来实现有关功能,这些其它函数可以是由C语言本身提供,称之为库函数,也可以是用户自己编写,称之为用户自定义函数。那么库函数和用户自定义函数有什么区别呢?简单地说,任何使用Keil C语言的人,都可以直接调用C的库函数而不需要为这个函数写任何代码,只需要包含具有该函数说明的相应的头文件即可;而自定义函数则是完全个性化的,是用户根据自己需要而编写的。Keil C提供了100多个库函数供我们直接使用。 一个函数由两部份组成: (1)函数的首部、即函数的第一行。包括函数名、函数类型、函数属性、函数参数(形参)名、参数类型。 例如:void mDelay(unsigned int DelayTime) 一个函数名后面必须跟一对圆括号,即便没有任何参数也是如此。 (2)函数体,即函数首部下面的大括号“{}”内的部份。如果一个函数内有多个大括号,则最外层的一对“{}”为函数体的范围。 函数体一般包括: 声明部份:声明在这部份中定义所用到的变量。 执行部份:由若干个语句组成。 在某此情况下也可以没有声明部份,甚至即没有声明部份,也没有执行部份,如:void mDelay(){}这是一个空函数,什么也不干,但它是合法的。 具体到开始编程时,可以利用空函数搭建程序框架,比如主程序需要调用一个延时函数,可具体延时多少,怎么个延时法,暂时还不清楚,我们可以主程序的框架结构弄清,先编译通过,把架子搭起来再说,至于里面的细节,可以在以后慢慢地填,这时利用空函数,先写这么一个函数,这样在主程序中就可以调用它了。 1.2入口函数:一个C语言程序,总是从main函数开始执行的,而不管物理位置上这个main()放在什么地方。
一》宏定义: 1、不带参数: #define 标识符常量表达式 /*#define是宏定义命令,宏名(标识符)好习惯用大写*/ #define NIL 0x80 2、带参数:/*相当于小函数*/ #define 宏名(参数表) 字符串 /*不仅要时行字任串替换还要进行参数的替换,在宏定义时,宏名与带参数的括弧之间不应该加空格,否则将空格以后的字符串都作为替代字符串的一部分,这可是很容易出错的*/ 如:#define SQ(a,b) a*b 使用:x=12;y=10;area=SQ(x,y);/*则area=12*10=120*/ 二》文件包含: #include <文件名>或#include "文件名" /*在C中用双引用形式更保险,在C51中常用物是尖括弧形式*/ 三》条件编译: /*一般源程序中的所有程序行都参加编译,但有时希望对其中一部分内容只在满足一定条件下才进行编译,也就是对一部分内容指定编译的条件。*/ #if、#elif、#else、#endif、#ifdef、#ifndef /*选择不同的编译范围,产生不同的代码,提供通用性。*/ /*如对8051在6MHZ与12MHZ下有*/ #ifdef cpu==8051 #define FREQ 6 /*程序段*/ #else #define FREQ 12/*程序段*/ #endif /*这样下面的原程序不用做任何修改便可以使用于两种时钟频率的单片机系统*/ 四》其他: 1、#error:捕捉不可预料的编译条件 #if (myv!=0&&myv!=1)/*假定其值必为0或1*/ #error myv must be 1 or 0/*出错时显示*/ #endif
单片机的C语言轻松入门 随着单片机开发技术的不断发展,目前已有越来越多的人从普遍使用汇编语言到逐渐使用高级语言开发,其中主要是以C语言为主,市场上几种常见的单片机均有其C语言开发环境。这里以最为流行的80C51单片机为例来学习单片机的C语言编程技术。 本书共分六章,每章一个专题,以一些待完成的任务为中心,围绕该任务介绍C语言的一些知识,每一个任务都是可以独立完成的,每完成一个任务,都能掌握一定的知识,等到所有的任务都完成后,即可以完成C语言的入门工作。
第1章 C语言概述及其开发环境的建立 学习一种编程语言,最重要的是建立一个练习环境,边学边练才能学好。Keil软件是目前最流行开发80C51系列单片机的软件,Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(μVision)将这些部份组合在一起。 在学会使用汇编语言后,学习C语言编程是一件比较容易的事,我们将通过一系列的实例介绍C语言编程的方法。图1-1所示电路图使用89S52单片机作为主芯片,这种单片机性属于80C51系列,其内部有8K的FLASH ROM,可以反复擦写,并有ISP功能,支持在线下载,非常适于做实验。89S52的P1引脚上接8个发光二极管,P3.2~P3.4引脚上接4个按钮开关,我们的任务是让接在P1引脚上的发光二极管按要求发光。 1.1简单的C程序介绍 例1-1:让接在P1.0引脚上的LED发光。 /************************************************* 平凡单片机工作室 https://www.doczj.com/doc/c86275340.html, Copyright 2003 pingfan's mcustudio All rights Reserved 作者:周坚 dddl.c 单灯点亮程序 *************************************************/
单片机C语言(C51)常用库函数 1 C51 的常用库函数详解 C51 语言的编译器中包含有丰富的库函数,使用库函数可以大大简化用户程序设计的工作量,提高编程效率。每个库函数都在相应的头文件中给出了函数原型声明,在使用时,必须在源程序的开始处使用预处理命令#include 将有关的头文件包含进来。 C51 库函数中类型的选择考虑到了 8051 单片机的结构特性,用户在自己的应用程序中应尽可能地使用最小的数据类型,以最大限度地发挥 8051 单片机的性能,同时可减少应用程序的代码长度。下面将 C51 的库函数分类列出并详细介绍其用法。 1 字符函数 字符函数的原型声明包含在头文件 CTYPE.H 中。常用的一些字符函数介绍如下。 1.1 检查英文字母函数检查英文字母函数用于检查形参字符是否为英文字母,其函数原型如下: bit isalpha(char c); 其中,c 为待判断的字符,如果是英文字母则返回 1,否则返回 0。程序示例如下: 1.2
检查字母数字函数检查字母数字函数用于检查形参字符是否为英文字母或数字字符,其函数原型如下: bit isalnum(char c); 1.3 检查控制字符函数检查控制字符函数用于检查形参字符是否为控制字符,其函数原型:bit iscntrl (char c);其中,c 为待判断的字符。控制字符其取值范围为 0_00~0_lF 之间或等于 0_7F,如果是,则返回 1,否则返回 0。 1.4 十进制数字检查函数十进制数字检查函数用于检查形参字符是否为十进制数字,其函数原型如下: bit isdigit (char c); 其中,c 为待判断的字符,如果是十进制数字则返回 1,否则返回 0。 1.5 可打印字符检查函数可打印字符检查函数用于检查形参字符是否为可打印字符,其函数原型如下: bit isgraph (char c); 其中,c 为待判断的字符。可打印字符的取值范围为 0_21~0_7C,不包含空格,如果是可打印字符则返回 1,否则返回 0。 1.6
单片机C语言中常用到的关键字及数据类型 单片机C语言中常用到的关键字及数据类型如下: include:包含用法:#include sbit:位定义用法:sibt bit :二进制位定义用法:bit flag; define:宏定义用法:#define void:声明函数无返回值用法:void main() main:主函数 while:当用法:while(1)或者while(表达式) do:执行用法:do 表达式 for:循环用法:for(i=0;i<10;i++) switch:选择 break:跳出(断开) if:判断用法:if(i==2) else:否则用法:else i=0; char:8位的字符定义,有符号。范围(-128~127)。对应uchar; int:16位的字符定义,有符号。范围(-32768~32767)对应uint; return:返回。一般是返回一个值,供其他函数调用。 为了说明问题,以提到过的一个小程序为例。程序的功能是点亮单片机某一端口(也可是任意端口)的led: 1. #include
单片机c语言函数定义分类 2011-08-06 10:59 函数是预先定义的功能模块(由代码组成),编写函数的目的是能够反复调用它,提高代码的重用性和可读性。 c语言程序是由函数构成的,一个c源程序至少包含一个main()主函数,main ()函数是程序执行的起点。 c语言函数的分类: 1. 从函数定义的角度看,函数可分为库函数和用户定义函数两种。 (1)库函数 由C编译器提供,用户无须定义,也不必在程序中作类型说明,只需在程序前包含有该函数原型的头文件即可在程序中直接调用。 如三角函数 float sin(float x)返回x的正弦值,x为弧度,使用时必须在程序开头加入#include