再次整理流水灯

本文详细介绍了如何在C51中使用while语句实现流水灯的闪烁,包括延时程序的优化、子程序的调用(带参数和无参数)、C51函数库的应用,以及硬件资源的使用。通过实例演示了如何通过定时和参数传递控制灯光的亮灭周期。
摘要由CSDN通过智能技术生成

再次整理流水灯

1.学习了简单延时程序

  1. while语句的使用
#include<REG52.H>
sbit D1=P1^0;//P要大写
void main()
{
	D1=0;//这里不可以直接写P1^0=0,会编译出错,在对单片机某一个口进行操作时必须用sbit将口定义成某个变量
	while(1);//程序就停在这一句,不会再向下执行了
}  

对应笔记:
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

让灯光闪烁,程序改进

#include<reg52.h>
sbit p1_1=P1^0;//要定义口
unsigned int a;//范围要注意0-65535
void main()
{
	while(1)//大循环用这个包住
	{	
		a=51000;//第一次赋值
		p1_1=0;//低电平会亮
		while(a--);//亮,并且延时
		p1_1=1;//高电平会灭
		a=51000;//再次赋值
		while(a--);//再延时,让灯再亮久一点,这个是比较简单低级,也不好控制延时时间的延时间的写法

	}
}

2.调试程序
在这里插入图片描述
在这里插入图片描述
全速执行程序时会在断点停下来,断点的语句不会执行,黄色箭头对应的语句要再点一次才会执行

3.仿真
在这里插入图片描述
模拟时XTAL的设置和软件仿真用时有关系,但是硬件不影响,程序对就行
在这里插入图片描述
单片机运行速度由内部晶振决定
在这里插入图片描述

2.子程序的调用

1.例子程序(下面是郭天祥的例子,作用结果是让灯光闪烁1s,我while语句的使用在上一个流水灯的CSDN中链接

#include<reg52.h>
sbit p1_1=P1^0;//要定义口
unsigned int a;//范围要注意0-65535
void main()
{
	while(1)//大循环用这个包住
	{	
		a=51000;//第一次赋值
		p1_1=0;//低电平会亮
		while(a--);//亮,并且延时
		a=51000;//再次赋值
		while(a--);//再延时,让灯再亮久一点,这个是比较简单低级,也不好控制延时时间的延时间的写法

		p1_1=1;//给高电平,灭掉
		a=51000;//第一次赋值
		while(a--);//灭,并且延时
		a=51000;//再次赋值
		while(a--);//再延时,其实这里已经可以写成循环了
	}
}

2.调用不带参数子程序

  • 宏定义
    在这里插入图片描述
  • 调用子程序(无参数,无返回值) 在这里插入图片描述
  • 子程序,记得嵌套里面的分号,在主函数前面前面要声明子函数
void delay()//无参数(空阔号),无返回值(void)的子程序
{
	unit x,y;//x,y在子函数里面定义的变量叫局部变量,只是在子函数里面有用,主函数不认
	for(x=100;x>0;x--)
		for(y=2000;y>0;y--);//for里面嵌套for不要忘记分号 
}

完整程序

#include <REGX52.H>
#define uint unsigned int//宏定义
#define uchar unsigned char
sbit D1=P1^0; 
void delay();//声明,把函数名字、参数类型、返回值类型写上 
void main()
{
	while(1)
	{
		D1=0;
		delay();//调用子程序
		D1=1;
		delay();//调用子程序
	}
}
void delay()//无参数(空阔号),无返回值(void)的子程序
{
	uint x,y;
	for(x=100;x>0;x--)
	for(y=2000;y>0;y--);//for里面嵌套for不要忘记分号 
}

注意:更改了程序后,要先编译再调试,要不然会报错

3.带参数子程序的设计

#include <REGX52.H>
#define uint unsigned int
#define uchar unsigned char
sbit D1=P1^0; 
void delay(uint z);/*声明,把函数名字、参数类型(参数名可写可不写)、返回值类型写上 ,
                       有多个参数,参数之间逗号隔开,只需要写参数类型*/
void main()
{
	while(1)
	{
		D1=0;
		delay(200);//调用子程序,要给参数赋值,改的很方便
  		D1=1;
		delay(400);//亮暗时间不一样
	}
}
void delay(uint z)//带参数(空括号里面有参数类型及参数名),无返回值(void)的子程序
{
	uint x,y;
	for(x=200;x>0;x--)
	for(y=z;y>0;y--);//for里面嵌套for不要忘记分号 
}

4.C51函数库的方便调用

#include <REGX52.H>
#include <INTRINS.H>//使用的头文件
#define uint unsigned int
#define uchar unsigned char
uchar temp;//全局变量,赋值时变量的类型要和被赋值的值类型一样,P1口是八位寄存器,uchar也是八位
void delay(uint z);/*声明,把函数名字、参数类型(参数名可写可不写)、返回值类型写上 ,
                       有多个参数,参数之间逗号隔开,只需要写参数类型*/
void main()
{
		temp=0xfe;//11111110
		P1=temp;
	while(1)
	{
		temp=_crol_(temp,1);//unsigned char _crol_(unsigned char a,unsigned char b),返回值(unsigned char型变量)给temp 
		P1=temp;
		delay(600);//最开始第一个灯不亮,换一下二三句就会亮了
	}
}
void delay(uint z)//带参数(空括号里面有参数类型及参数),无返回值(void)的子程序
{
	uint x,y;
	for(x=100;x>0;x--)
	for(y=z;y>0;y--);//for里面嵌套for不要忘记分号 
}

蜂鸣器,p2^3=0时会响

下面这个也可以延时

#include <reg52.h>

void delay(unsigned int x)    
{ unsigned char y;
   for(x;x>0;x--)
   for(y=240;y>0;y--); //延时x毫秒
}

void main()
{
unsigned char code lsd[16]={
0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0x7f,0xbf,
0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
   unsigned char i;
 for(i=0;i<16;i++)
	 {
	   P1=lsd[i];
	   delay(1000);
	 }
}

5.使用的硬件资源

1.I/O口工作,其连接了二极管
2.CPU工作,因为在调试程序的时候用了复位的功能
3.RAM,ROM工作,程序烧录到里面
4.特殊功能寄存器工作,我们要使用延时程序和循环左/右移的子程序,肯定会用到特殊功能寄存器

原文所在:在这里插入图片描述

原文所在:布尔青年

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值