九层妖塔 起于垒土
电平是指电路中两点或几点在相同阻抗下电量的相对比值。
●3.6V
~5V 1 高电平
●0~3.6V
0 低电平
添加的头文件在Keil的安装目录的子目录下,如:D:\Keil_v5\C51\INC
在电脑端完成单片机上的程序开发后,就需要将程序固化到单片机内部的程序存储器。
●ISP(In System Programming)在系统可编程
通过单片机专用的串行编程接口和STC提供的串口固化程序软件,对单片机内部的Flash存储器进行编程。一般来说,实现ISP只需要很少外部电路。
●IAP(In Application Programming)在应用可编程
IAP计数是从结构上将Flash存储器映射为两个存储空间。当运行一个存储空间的用户程序时,可以对另一个存储空间重新编程。随后,将控制从一个存储空间转向另一个存储空间。IAP的实现更加灵活。
支持ISP方式的单片机,不一定支持IAP方式;
但是,支持IAP方式的单片机,一定支持ISP方x式
●双列直插封装(Dual lnline-pin Package,DIP)
●表面贴装封装(Surface Mounted Devices,SMD)
●data
是指存储在内部RAM中的数据。
●xdata
是指存储在扩展RAM中的数据。
●code
是存储在ROM中的数据。
●IO
:I/O口直接控制编程方式
●MM
:存储器映射编程方式
●在中断服务程序中一般不要写过多的处理语句,因为如果语句过多,中断服务程序中的代码还未执行完毕,而下一次中断又来临,这样就会丢失这次中断。
●8051内核单片机可以外扩64K字节的RAM和ROM空间,传统的8051单片机具有16位地址总线和8位数据总线,其中P0口作为数据和地址低字节的复用端口,P2作为高8位地址线。
●CT107D的存储器映射扩展方式(MM),是一种可以像操作外部RAM一样,操作其它外设。
● MM编程需要 添加头文件absacc.h
●打开第一个LED灯:
○XBYTE[0X8000]=OXFE;
●数码管显示1:
○XBYTE[0XC000]=0X01;
XBYTE[0XE000]=0XF9;
intrins.h
头文件 ●_crol_
字符循环左移
●_cror_
字符循环右移
●_irol_
整数循环左移
●_iror_
整数循环右移
●_lrol_
长整数循环左移
●_lror_
长整数循环右移
●_nop_
空操作(相当于8051 NOP指令)
●_testbit_
测试并清零位(相当于8051 JBC指令)
●例:
循环指令
P0 = _crol_(0XFE,LED);
头文件是一种包含功能函数,数据接口声明 的载体文件,用于保存程序的声明。
main函数 ,又称主函数,是程序执行的起点。
①左移<<
●将运算符 左侧运算对象的每一位的值向左移动运算符 右侧运算对象指定的位数。
●左侧运算对象左移后左末端位的值丢失,用0
填充空出的位置。
●<<
该操作产生了一个新的值,但是不改变其运算对象的值。
test
为1,即0001,test<<2
为4,即0100,但是test
本身不变,仍为1.
●左移赋值运算符<<=
char test = 1; //0001
test << 2; //表达式的运算结果为4,即0100;此时test=1;
num = test << 2;//test = 1; num = 4;
test <<= 2; //表达式的运算结果为4,此时test=4,0110;
②右移>>
●将运算符 左侧运算对象的每一位的值向右移动运算符 右侧运算对象指定的位数。
●左侧运算对象右移后右末端位的值丢失,对于无符号类型,用0
填充空出的位置;
③移位运算符用于乘除法
number << n; //number乘以2的n次幂
number >> n; //如果number为非负,则用number除以2的n次幂
for
语句●一般形式:
for(表达式1;表达式2;表达式3)
循环体
●3个表达式的主要作用:
表达式1:设置初始化条件,只会在for循环开始时执行一次。
表达式2:循环条件表达式,用来判断是否继续循环。在每次执行循环体前,先执行此表达式。若此表达式为真,则继续执行循环;若为假,则循环结束。
表达式3:执行更新。在执行完循环体后才计算表达式3。
●常用形式:
for(循环变量赋初值;循环条件;循环变量增值)
循环体
循环体可以是以分号结尾的一条简单语句,也可以是花括号括起来的复合语句。
●流程图
while
语句●一般形式
while(表达式)
循环体
●先判断循环条件表达式,若为真即给定的条件成立,就执行循环体。
●流程图
①函数的定义
●定义无参函数
类型名 函数名(void)
{
函数体
}
函数体
包括声明部分
和语句部分
●定义有参函数
类型名 函数名(形式参数列表)
{
函数体
}
函数返回值的类型名 函数名(参数类型1 形参1,参数类型2 形参2,……)
{
声明部分
语句部分
}
●定义空函数;即函数体为空
类型名 函数名()
{}
void dummy() {}
②调用函数
●三种函数调用的形式
○函数调用语句
//不要求函数带回值,只要求函数完成一定的操作。
printf_star();
○函数表达式
//函数调用出现在另一个表达式中,这时要求函数带回一个确定的值以参加表达式的运算。
c = 2*max(a,b); //max(a,b)是一次函数调用,它是赋值表达式的一部分。
//函数调用本身无分号
○函数参数
//函数调用作为另一个函数调用的实参。
m = max(a,max(b,c)); //函数调用本身无分号
printf("%d",maxc(a,b));
●函数调用时的数据传递
○形式参数,实际参数:单向传递,只能由实参传递给形参。
●函数调用的过程
○出现调用函数,函数的形参才被临时分配内存单元。
○将实参的值传递给对应的形参。
○执行函数,使用已经赋值过的形参参与运算。
○通过return
语句将函数值带回到主调函数;若函数不需要返回值,则函数的类型应定义为void
类型,并且不需要return
语句。
○调用结束,形参单元被释放;但实参单元仍然保留并维持原值。
●函数的返回值
○函数的返回值是通过函数中的return
语句获得的。
return 表达式;
return(表达式);
当程序执行到return语句时,程序的流程就返回到调用该函数的地方,即 退出调用函数,并带回函数值。在同一函数内,可以出现多处return,以实现在函数体的不同部位退出函数。return语句只能执行一次。
○函数类型决定返回值的类型。
○不带返回值的函数函数应定义为“void
类型”(“空类型”)
●函数的声明:
○一般形式:
函数类型 函数名(参数类型1 形参1,参数类型2 形参2,……);
○在文件开头(所有函数之前,在主调函数的外部,在主函数的外部),对要调用的函数进行声明,称为外部声明。
运算符的优先级和结合性:
优先级 | 运算符 | 含义 | 运算对象的个数 | 结合方向 | 说明 |
---|---|---|---|---|---|
1 | ( ) | 圆括号 | 自左至右 | 初等运算符 | |
[ ] | 下标运算符 | ||||
2 | ! | 逻辑非运算符 | 1 (单目运算符) |
自右至左 | 单目运算符 |
~ | 按位取反运算符 | ||||
++ | 自加运算符 | ||||
-- | 自减运算符 | ||||
- | 负号运算符 | ||||
3 | * | 乘法运算符 | 2 (双目运算符) |
自左至右 | 算术运算符 |
/ | 除法运算符 | ||||
% | 求余运算符 | ||||
4 | + | 加法运算符 | 2 (双目运算符) |
自左至右 | |
- | 减法运算符 | ||||
5 | << | 左移运算符 | 2 (双目运算符) |
自左至右 | 位运算符 |
[ ] | 下标运算符 | ||||
6 | < <= > >= |
关系运算符 | 2 (双目运算符) |
自左至右 | 关系运算符 |
7 | == | (测试)等于运算符 | 2 (双目运算符) |
自左至右 | |
!= | (测试)不等于运算符 | ||||
8 | & | 按位与运算符 | 2 (双目运算符) |
自左至右 | 位运算符 |
9 | ^ | 按位异或运算符 | 2 (双目运算符) |
自左至右 | |
10 | | | 按位或运算符 | 2 (双目运算符) |
自左至右 | |
11 | && | 逻辑与运算符 | 2 (双目运算符) |
自左至右 | 逻辑运算符 |
12 | || | 逻辑或运算符 | 2 (双目运算符) |
自左至右 | |
13 | ? : | 条件运算符 | 3 (三目运算符) |
自右至左 | 条件运算符 |
14 | = += …… |
赋值运算符 | 2 (双目运算符) |
自右至左 | 赋值算符 |
15 | , | 逗号运算符 (顺序求值运算符) |
自左至右 | 逗号运算符 |
●初等→单目→算术→关系→逻辑→条件→赋值→逗号
●位运算符加圆括号
●同一优先级的运算符,运算次序由结合方向决定。
例:
- i ++
相当于 - (i ++)
●条件运算符:
○一般形式:
表达式1 ? 表达式2 : 表达式3
//if else 表达形式
if(a>b) max=a;
else max=b;
//将条件表达式的值赋值给max
max = (a>b) ? a : b;
//表达式2和表达式3是赋值表达式
a > b ? (max=a) : (max=b);
●存储空间:程序区,静态存储区,动态存储区。
●变量按照作用域可以分为:局部变量,全局变量。
●局部变量的存储类别:
1、自动变量(auto
)(动态局部变量):
○局部变量默认为自动变量,数据存储在动态存储区。
○函数的形参;在函数中定义的局部变量;在复合语句中定义的局部变量。
○离开函数,值就消失:在调用该函数时,系统会该这些变量分配动态存储空间,在函数调用结束时释放这些空间。
○在函数调用时对自动变量赋初值,每调用一次函数重新给一次初值。
○若在定义时不赋初值,自动变量的初值不确定。每次函数调用结束后存储单元已释放,下次调用时又重新另分配存储单元,而所分配的单元中的内容是不可知的。
2、静态局部变量(static
局部变量)
○离开函数,值任保留:数据存储在静态存储区,在程序整个运行期间都不释放。
○在编译时赋初值,即只赋值一次,在程序运行时它已有初值。在以后每次调用函数时不再重新赋初值而只是保留上次函数调用结束时的值。
○若在定义时不赋初值,则在编译时自动赋初值0(对数值型变量)或’\0’(对字符变量)。
○其他函数不能引用静态局部变量,只能被本函数引用。
3、寄存器变量(register变量):存储在CPU中的寄存器中。