找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2841|回复: 0
打印 上一主题 下一主题
收起左侧

51单片机学习--第二章 流水灯设计

[复制链接]
跳转到指定楼层
楼主
ID:51090 发表于 2014-9-22 16:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
第二章 流水灯设计
§2.1  点亮第一个发光二极管
例2.1.1

#include             //52系列单片机头文件
sbitled1=P1^0;         //声明单片机P1口的第一位
voidmain()               //主函数
{
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 unsignedint      //宏定义
sbitled1=P1^0;                //声明单片机P1口的第一位
uint i,j;
voidmain()                    //主函数
{
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 不带参数函数的写法及调用
voiddelay1s()                  //子函数体
{
  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口的第一位
voiddelayms(uint);        //声明子函数
voidmain()               //主函数
{
while(1)                //大循环
{
   led1=0;                  
   delayms(200);          //延时200毫秒
   led1=1;                 
   delayms(800);          //延时800毫秒
   }  
}
void delayms(uintxms)            
{
    uinti,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
voiddelayms(uint);            //声明子函数
ucharaa;                      //定义一个变量,用来给P1口赋值
voidmain()                  //主函数
{
aa=0xfe;                   //赋初值11111110
while(1)                   //大循环
{
P1=aa;                     //先点亮第一个发光管
   delayms(500);              //延时500毫秒
   aa=_crol_(aa,1);           //将aa循环左移1位后再赋给aa
}
}
void delayms(uintxms)            
{
uint i,j;
f

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表