/ 字符串处理函数 /
stract函数 字符串连接函数
例:printf(“%s”, stract(str1, str2));
strcpy(字符串或字符数组名)和strncpy 字符串复制函数
例:strcpy (str1, str2); 作用是把字符串2复制到字符串1去。
例:strncpy(str1, str2, 2); 作用是将str2中的前两个字符取代str1的前两个字符
strcmp(字符串1, 字符串2); (也可以吧字符串换成字符数组名) 字符串比较函数
将两个字符串自左向右逐个字符相比(按ASCII码值进行大小比较),直至出现/0为止
1.如果全部字符相同,则认为两个字符串相同
2.如果出现不同字符,则以第一对不相同的字符的比较结果为准。
strlen(字符数组名或字符串常量) 测试字符串长度的函数
strlwr(字符串) 将字符串中的大写字符换成小写字母
strupr(字符串) 将字符串中的小写字母换成大写字母
/ 用函数实现模块化程序设计 /
定义函数的方法
定义无参函数
类型名 函数名()
{
函数体
}
或者
类型名 函数名(void)
{
函数体
}
定义有参函数
类型名 函数名(形式参数表列)
{
函数体
}
定义空函数
类型名 函数名()
{ }
它什么工作都不做,只是为了方便以后 写函数来代替它
函数的返回值
通过return获得返回值,例如
max(int x, int y)
{
return(x>y?x:y);
}
定义函数的时候就应该制定函数的类型
Int max(float x, float y)
不带返回值的函数,应当用定义函数为“void类型”,即“空类型”,此时在该函数中不得出现return语句
对被调用的函数的声明
函数类型 函数名(参数类型1 参数名; 参数类型2 参数名;。。。。参数类型n 参数名n)
或者
函数类型 函数名(参数类型1; 参数类型2; 。。。。参数类型n)
C语言定义函数时,一个函数内不能再定义另外一个函数,
但可以嵌套调用函数
函数的递归调用:直接或间接的调用该函数本身
数组作为函数参数
数组是一个整体,在内存中连续易断存储单元
数组元素作为函数实参:数组传递到方向是从实参传到形参,单向传递
一维数组名作为函数参数:数组名作函数实参时向形参(数组名或指针变量)传递的是数组首元素的地址,即他们公共占用同一个存储单元
形参可不指定大小,但实参一定要指定
二维数组名作为函数参数:形式参数数组定义时可以指定每一维的大小,也可以省略第一维的大小说明,即不可省略第二维及其他高维的大小说明
例如:
当实参定义 int score[5][10]
形参可定义为 int score[ ][10]或int score[5][10]
定义变量的3种情况
1.在函数开头定义
2.在函数内的符合函数内定义
3.在函数的外部定义
在一个函数内部定义的变量只在本函数范围内有效,
在复合语句内定义的变量只在本复合语句的范围内有效。
主函数内定义的变量也只有在主函数内部有效
全局变量
在函数之外定义的函数称为外部变量,外部变量是全局变量
全局变量的有效范围为从定义变量的位置开始到本源文件结束
不在必要时不使用全局变量
同一个源文件中,全局变量与局部变量同名,在局部变量的作用范围内,局部变量有效,全局变量被“屏蔽”,即它不起作用。
变量的存储方式和生存期
变量存储的两种方式:静态存储方式和动态存储方式
静态存储方式是指在程序运行期间由固定的存储空间的方式
动态存储方式是在程序运行期间根据需要进行动态的分配存储空间的方式
在c语言中每一个变量和函数都有两个属性:数据类型和数据的存储类别
C的存储类别有四种:自动的(auto)、静态的(static)、
寄存器的(register)、外部的(extern)
1.自动变量(auto变量)
函数中的局部函数,如果不专门声明为static存储类别,则数据都是储存在动态存储区中(不写auto则隐含指定为自动变量)
2.静态局部变量(static局部变量)
有时希望函数中的局部变量的值在函数调用结束后不消失,即其占用 的存储单元不释放,在下一次再调用该函数时,该变量已有值((维持上一次函数调用结束时的值)
3.寄存器变量(register变量)
变量(包括静态存储方式和动态存储方式)的值是存放在内存中的。如果有一些变量使用频繁(例如要用10000次),则为存取变量的值要花费不少的时间,为提高执行效率,允许将局部变量的值放在cup中去存取,需要时直接从寄存器中取出参加运算,即可提高效率。这种变量叫做寄存器变量,
用register作声明,例如
register int f;
全局变量都是存储在静态存储区当中的,一般来说外部变量是在函数的外部定义的全局变量,它的作用域是从变量的开始处开始,到本程序文件的末尾
在一个文件内扩展外部变量的作用域,应该在引用之前用关键字extern对该变量做“外部变量声明”
如果一个程序包含两个文件,在两个文件中都要用到同一个外部变量Num时,不能在两个文件中各自定义一个外部变量Num,否则在进行程序的链接时会出现“重复定义”的错误。正确的做法是在一个文件中定义外部变量Num,而在另一个文件中用extern对Num作“外部变量声明”,即“extern Num”
有时希望在程序设计中某些外部变量只限于被本文件引用(避免出现重复定义的错误),而不能被其他文件引用,则可以在定义外部变量时加一个static声明,在若干人分别完成各个模块,个人可以独立地在其设计的文件中使用相同的外部变量名。例如
Static int A;
用static声明一个变量的作用是:
1.对局部变量用static声明,把它分配在静态存储区,该变量在整个程序执行期间不释放,其所分配的空间始终存在。
2.对全局变量用static声明,则该变量的作用域只限于本文件模块(即被声明的文件中)。
关于变量的声明和定义
一个函数一般由两部分组成:声明部分和执行语句。声明的部分作用是对有关的标识符(如变量、函数、 结构体、共用体等)的属性进行声明。对于函数而言,函数的声明是函数的原型,而函数的定义是对函数功能的定义。对被调用函数的声明是放在主调函数的声明部分中的,而函数的定义时一个独立的模块。
对于变量而言,声明部分出现的变量有两种情况:一种是建立存储空间的(如“int a;”),一种是不需要建立存储空间的(如“extern a;”)。前者称为定义性声明,简称定义;后者称为引用性声明。
广义地说,声明包括定义,但并非所有的声明都是定义。
而为了方便叙述,把建立存储空间的声明称为定义,而把不需要建立存储空间声明的称为声明。
内部函数和外部函数
函数就是功能,每一个函数用来实现一个特定的功能。
内部函数:如果一个函数只能被本文件中的其他函数所调用,在定义内部函数(又称静态函数)时,加static,例如
static 类型名 函数名(形参表)
外部函数:可供其他文件调用,例如
extern int sum(int a,int b);
c语言规定,如果在定义函数时省略extern,也默认其是外部函数。
/ 指针 /
由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元,将地址形象化地称为“指针”
直接访问:直接按变量名进行的访问
间接访问:即将变量i的地址存放在另一个变量中,然后通过该变量来找到变量i的地址,从而访问变量。
指针变量:该变量专门用来存放另一个变量的地址,指针变量的值是地址(即指针)
“&” 取地址运算符 (“&a”是变量a的地址)
“*” 指针运算符(“*p”代表指针变量 p指向的对象)
运用指针可以达到的效果
1、运用指针,可以在一个函数内部改变外部的变量
2、运用指针,可以实现函数“有多个返回值”
书第224页中的函数
void swap()
{
Int temp;
temp = *p1;
*p1 = *p2;
*p2 = temp;
}
如果把其中的*都不要,改成temp = p1;p1=p2;p2=temp;是不对的,c语言中实参变量和形参变量之间的数据传递是单向的“值传递”方式,用指针变量也遵循同样的规则,不可能通过执行调用函数来改变实参指针变量的值,但是可以改变实参指针变量所指变量的值。
通过指针引用数组
所谓数组元素的指针就是数组元素的地址
引用数组元素有下标法,例如“a[3]”也可以使用指针法。
使用指针法能使目标程序质量高(占内存更少,运行速度更快)
int a[5] ={1, 2, 3, 4, 5};
int *p;
P = &a[0]; //把a[0]元素的地址赋给指针变量p
C语言中,p = &a[0] 和p = a 是等价的。(因为在c语言中,数组名(不包括形参数组名)代表数组中首元素的地址)
/ 51单片机 /
12M的晶振,它的晶振频率是12Mhz,
它的时钟周期是(1/12)us,
它的状态周期是(2/12)us,
它的机器周期是(12/12)us.
实际情况下,delay函数里1大约要10微秒
时钟周期:为单片机提供时钟脉冲信号的震荡的周期
机器周期:一个机器周期包括12个时钟周期,在一个机器周期内,CPU可以完成一个独立操作。
浅谈延迟函数执行一次延迟多少秒以及跑马灯的感想_脱去三千烦恼丝-CSDN博客_delay50000是延时了多少毫秒
上面这两个可以进一步学习
P3.0 RXD串行口输入
P3.1 TXD串行口输入
P3.2 INT0外部中断0输入
P3.3 INT1外部中断1输入
P3.4 T0定时器0外部输入
P3.5 T1定时器1外部输入
P3.6 WR外部写控制
P3.7 RD外部读控制
中断
1.CPU在处理事件A时,发生了另一事件B的请求(中断请求);
2.CPU暂时中断当前的工作,转去处理事件B(中断响应中断服务);
3.待CPU处理完事件B后,再回到原来事件A被中断的地方继续处理事件A。
各中断允许控制位=0,开关断开; =1,开关接通;
中断函数的写法
void 函数名()interrupt 中断信号
{
;
}
三极管:是一种控制电流的半导体器件,其作用是把微弱信号放大成幅度值较大的电信号。