数组是具有相同数据类型的有序数据的组合,一般来讲数组定义后满足以下三个条件:
(1)具有相同的数据类型
(2)具有相同的名字
(3)在存储器中是被连续存放的
数据类型 数组名【数组长度】;
(1)同一个数组中的元素具有相同的数据类型。
(2)数组名必须为字母、数字、下划线组成且第一个字符必须是字母或者下划线。
(3)数组长度可以是常量或者常量表达式,且必须是正整数。
数据类型 数组名【数组长度】={初值列表};
(1)c语言程序中,是不能一次使用整个数组的,只能使用数组的单个元素。
(2)数组元素的方括号里的下标可以是整型常数、整型变量或者表达式,而数组初始化方括号里的数字必须是常熟而不能是变量。
(3)数组整体赋值只能在初始化的时候进行,程序执行代码中只能对单个数码赋值。
if……else
分支过多时可以采用switch语句,避免if……else配对出错。
switch(表达式)
{
case 常量表达式1:语句1;
case 常量表达式2:语句2;
…
default:语句n+1;
}
首先计算“表达式”的值,然后从第一个case开始,与“常量表达式x”进行比较,若于当前值不相等,不执行冒号后面的语句,一旦发现和某个常量表达式的值相等,则执行之后的所有语句。
改进:
switch(表达式)
{
case 常量表达式1:语句1;break;
case 常量表达式2:语句2;break;
…
default:语句n+1;break;
}
break,跳出当前循环,包括for或者while,同时还可以用来结束switch语句块。
动态显示(动态扫描):多个数码管显示实际上是轮流点亮数码管,利用人眼的视觉暂留(余晖效应),看起来像是所有数码管同时亮了。
完成一次全部数码管的扫描需要10ms以内,只要刷新频率大于100Hz,即刷新时间小于10ms,就可以做到无闪烁。
在数码管位选和段选的瞬态会产生余晖,为了避免可采取以下措施:
(1)刷新之前关闭所有的段,改变位选后再打开段。
赋值语句前加上 P0=0xFF 。
(2)关闭数码管的位,赋值好之后再打开。
在赋值语句前加上 ENLED=1 ,赋值刷新语句完成后 ENLED=1 。
仍存在问题:亮度不一
例如在秒表倒计时程序中由于每个数码管的显示时间为1s, 实际显示时间为“1s+从上一次刷新值到这一次刷新值执行代码耗费的时间”,由于后者的时间差会导致几个数码管亮度不一。故需要采用其他思路解决这个问题。
明确定时器和中断不是一回事!
定时器是单片机模块的一个资源,确确实实存在的一个模块,而中断则是单片机的一种运算机制。
标准的51单片机中控制中断的寄存器有两个,一个是中断使能寄存器,另一个是中断优先级寄存器。
IE----中断使能寄存器的位分配(地址0xA8 可位寻址 )
中断使能寄存器IE的位0~5控制了 6 个中断使能,第 6 位没用到,第 7 位是总开关。0~5位相当于分开关。故只要用到中断就必须先写 EA=1 。
T0中断,要使用这个中断那么就要把它的中断使能为 ET0 置1。
中断函数写好后,每当满足中断条件而触发中断后,系统就会自动来调用中断函数。
中断优先级有两种,一种是抢占优先级,一种是固有优先级。
IP的每一位表示对应中断的抢占优先级,每一位的复位值都是0,当把某一位置1时,这一位的优先级就比其他位的优先级高。
当进入低优先级中断中执行时,如又发生了高优先级的中断,则立刻进入高优先级中断执行,处理完高优先级级中断后,再返回处理低优先级中断,这个过程就叫做 中断嵌套 ,也称为抢占。所以抢占优先级的概念就是,优先级高的中断可以打断优先级低的中断的执行,从而形成嵌套。当然反过来,优先级低的中断是不能打断优先级高的中断的。
既然有抢占优先级,自然也有非抢占优先级,也成为 固有优先级 。如表 6 - 5 中断优先级编号中,数字越小优先级越高,不具有抢占的特性。即使在低优先级中断执行过程中又发生了高优先级的中断,也只能等到低优先级执行完之后才能得到响应。