再次整理流水灯
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.特殊功能寄存器工作,我们要使用延时程序和循环左/右移的子程序,肯定会用到特殊功能寄存器
原文所在: