打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
51单片机学习
第二章 流水灯设计
§2.1 点亮第一个发光二极管
例2.1.1

#include //52系列单片机头文件
sbit led1=P1^0; //声明单片机P1口的第一位
void main() //主函数
{
led1=0;
}

例2.1.2

#include
void mian()
{
P1=0xfe;
}

★ reg52.h头文件的作用
在代码中引用头文件,其实际意义就是将这个头文件中的全部内容放到引用头文件的位置处,免去我们每次编写同类程序都要将头文件中的语句重复编写.
#include :编译器先进入到软件安装文件夹处开始搜索这个头文件
#include “reg52.h”:编译器先进入当前工程所在文件夹处开始搜索这个头文件
★ 特殊功能位定义sbit 定义sfr的某一位
§2.2 while语句
★ 格式:while(表达式)
{内部语句(内部可为空)}
特点:先判断表达式,若不是0,即为真,那么执行内部语句。否则跳出while语句,执行后面的语句。
例2.2.1

#include
void main()
{
P1=0xfe;
while(1);
}

§2.3 for语句及简单的延时语句
★ 格式:for(表达式1;表达式2;表达式3)
{语句(内部可为空)}
特点:求解一次表达式1。求解表达式2,若其值为真,则执行for中的语句,然后求解执行表示3,再回到求解表达式2开始一直循环。若不是真直接跳出,不执行表达式3。
例2.3.1 实验板上第一个发光二极管以间隔
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--);
}

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
51单片机驱动无源蜂鸣器
单片机看门狗用发
基于单片机实现声光控灯电路 C
STC12C2052AD单片机AD转换C语言程序(成功)
用51单片机制作一个秒表的详细过程(教程有程序)
来和菜鸟一起用单片机编程显示数字
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服