1s亮灭闪动
◤
#include
#define uint unsigned int //宏定义
sbit led1=P1^0; //声明单片机P1口的第一位
uint i,j;
void main() //主函数
{
while(1) //大循环
{
led1=0;
for(i=1000;i>0;i--) //延时程序
for(j=110;j>0;j--);
led1=1;
for(i=1000;i>0;i--) //延时程序
for(j=110;j>0;j--);
}
}
◣
★ #define宏定义
格式:#define 新名称原内容
§2.4 不带参数函数的写法及调用
void delay1s() //子函数体
{
uint i,j;
for(i=1000;i>0;i--) // i=1000即延时约1000毫秒
for(j=110;j>0;j--);
}
§2.5 带参数函数的写法及调用
void delayms(unsigned int xms)
{
uint i;j;
for(i=xms;i>0;i--) // i=xns即延时约xms毫秒
for(j=110;j>0;j--);
}
例2.5.1 完整程序,让实验板上第一个发光二极管亮200ms、灭800ms
◤
#include //52系列单片机头文件
#define uint unsigned int //宏定义
sbit led1=P1^0; //声明单片机P1口的第一位
void delayms(uint); //声明子函数
void main() //主函数
{
while(1) //大循环
{
led1=0;
delayms(200); //延时200毫秒
led1=1;
delayms(800); //延时800毫秒
}
}
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--) //i=xms即延时约xms毫秒
for(j=110;j>0;j--);
}
◣
§2.6 利用C51库函数实现流水灯
★ 移位操作
(1):左移“<>
每执行一次左移指令,被操作的数将最高位移入单片机PSW寄存器的CY位,CY位中原来的数丢弃,最低位补0,其他位一次向左移动一位。
(2):右移“>>”
每执行一次右移指令,被操作的数将最低位移入单片机PSW寄存器的CY位,CY位中原来的数丢弃,最高位补0,其他位一次向右移动一位。
(3):循环左移。
最高位移入最低位,其他位一次向左移一位。C语言中没有专门的指令,通过移位指令与简单逻辑运算可以实现循环左移,或直接利用C51库中自带的函数_crol_实现。
(4):循环右移。
最低位移入最高位,其他位一次向右移一位。C语言中没有专门的指令,通过移位指令与简单逻辑运算可以实现循环右移,或直接利用C51库中自带的函数_cror_实现。
★ PSW寄存器
PSW(Program StatusWord)全称为程序状态字标志寄存器。是一个8为寄存器,位于单片机片内的特殊功能寄存器区,字节地址为D0H,用来存放运算结果的一些特征,如有无进位、借位等。其每位的具体含义如下图所示。

①CY—进位标志位。它表示运算是否有进位(或借位)。如果操作结果在最高位有进位(加法)或者借位(减法),则该位为1,否则为0。
②AC—辅助进位标志,又称半进位标志。它指两个8位运算低4位是否有半进位,即低4位相加(或相减)是否进位(或借位),如有AC为1,否则为0。
③ F0—由用户使用的一个状态标志位。可用软件来使它置1或清0,也可由软件来测试它,以控制程序的流向。
④ RS1,RS0,—4组工作寄存器区选择控制位。在汇编语言中这两位用来选择4组工作寄存器区中的哪一组为当前工作寄存区。
⑤ OV—溢出标志位。反映带符号数的运算结果是否有溢出。有溢出时,此位为1,否则为0。
⑥P—奇偶标志位。反映累加器ACC内容的奇偶性,如果ACC中的运算结果有偶数个1(如11001100B,其中有4个1),则P为0,否则P为1。
例2.6.1 利用C51自带的库函数_crol_(),以间隔500ms,在实验板上实现流水灯程序
◤
#include //52系列单片机头文件
#include //包含_crol_函数所在的头文件
#define uint unsigned int //宏定义
#define uchar unsigned char
void delayms(uint); //声明子函数
uchar aa; //定义一个变量,用来给P1口赋值
void main() //主函数
{
aa=0xfe; //赋初值11111110
while(1) //大循环
{
P1=aa; //先点亮第一个发光管
delayms(500); //延时500毫秒
aa=_crol_(aa,1); //将aa循环左移1位后再赋给aa
}
}
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--) //i=xms即延时约xms毫秒
for(j=110;j>0;j--);
}
◣