单片机笔记

目录

 

单片机的发展趋势:

Keil uVision4使用:

标识符

变量

三种基本结果

运算符

 画电流图的原件列表

流水灯的方法

数组


单片机的发展趋势:

1.微型化

2.低功耗

3.高速化

4.集成资源

5.性能更加优异

6.通信及网络功能加强

单片机的特征:

1.体积小,重量轻

2.可靠性高,运行速度快

第一课的程序

// 第一个程序

#include<reg52.h>
sbit LED=p2^0;
void main(){
	LED=0;
}

Keil uVision4使用:

下载方式:

链接:https://pan.baidu.com/s/1PEdXNsUBZp7nlj1z-nN1-g?pwd=gshp 提取码: gshp 

第一步:创建两个文件夹分为电路和程序 ;

第二步:在打开软件Keil uVision4 点击 projec 再点击new prejec 创建工程(工程名为随便就行)然后保存就好。

第三步:打开窗口后选择Atmel 然后找到 AT89C52 后点击ok就可以 出来的提示框点击否就可以。

第四步:在软件里面的File里面new 就可以新建文件啦 然后保存后随便输入名称后面点击点(.c)后保存就可以。

第五步:在工程里面选择我们的工程里面的Source Group1找到点击鼠标右键找到add Files to Group 后选择我们刚才创建的文件(就是后面加.c的文件)后点击ok (是或者确定)就好。

第六步:写程序

#include<reg52.h>      // 包含52系列头文件
sbit LED=P3^0;
void main(){
	while(1)       // 死循环
	{
		LED=0;    //P2.0输出低电平
	}
}

我们在单片机上允许的时候我们使用的是常见的16进制,10紧张和2进制,并且会互相转换的方法;

我们这下来初步看看怎么样转换:

      我们把(AF4.76)十六进制转换成二进制:我们转换的时候分成四个,每一个数组的倒数第一个是1第二个是2第三个是4第四个是8 ,这个方法称为是8421的方法。

1010 1111 0100 . 0111 0110) 我们看看左边的二进制数组

例如:我们看看这个四个数字1010 ,1010的倒数第一个是1第二个是2第三个是4第四个是8。这个是我们现在有的1010数字的倒数第一个是0然后使用8421的方法来解释的话二进制的数字的倒数第一个是0然后8421的数字的倒数第一个是1那就我们这样计算0*1,倒数第二个是1然后8421的数字的倒数第二个是2那就我们这样计算1*2,倒数第三个是0然后8421的数字的倒数第三个是4那就我们这样计算0*4,倒数第四个是1然后8421的数字的倒数第四个是8那就我们这样计算1*8,最后我们总计的时候都加起来就得到最后的16进制(1*8)+(0*4)+(1*2)+(0*1)= A。(我们最后为什么写A呢?是因为16进制的算法中10 设置为A ,11设置为B,12设置为C,13设置为D,14设置为E,15设置为F)。

标识符

标识符是用来表示源程序中某个对象的名字。对象可以是语句,数据类型,常量,变量,数组。

1.有效字符:只能由字母,数字,和下划线组成,且以字母或下划线开头

2.C标识符区域分大小写。

数据类型

名称

长度

取值范围

unsigned char

无符号字符型

8位

0~255

signed char

有符号字符型

8位

-128~+127

unsigned int

无符号整型

16位

0~65532

signed int

有符号整型

16位

-32768~+32767

unsigned long

无符号长整型

32位

0~4294967295

signed long

无符号长整型

32位

-2147483648~2147

float

浮点数

32位

变量

定义:类型标识符,变量名1,[变量名2,变量名3...];

如:

  • int x,y,
  • float x,y;
  • chae c1,c2;或int c1,c2; (输出值)

注意事项:先定义变量在使用值。(先定义,后使用)

类型标识符为定义变量数据类型,数据类型分为整型,实型,字符型等。

三种基本结果

  • 顺序结构
  • 选择结构
  • 循环结构
 // while是循环或者for循环
 /*
   while (循环继续的条件表达式){
  执行语句组
}

for(int a=1; a < 15; a++){
  sum = sum + a;
}

 int i = [1,2,1,5,1,2,5];
for(int a = 1; a< i.lenght; a++){
  sum = sum + a;
}

*/
 int a = 6;
while(a) {
  LED = 0;
}

函数的定义:

按照规定的格式,将一个子任务编写成一个函数。

函数的划分:

注意:

函数从形式上划分,分为无参数函数和有参数的函数

函数定义的格式:

函数类型 函数名(类型 形参1,形参2,。。。)

说明部分

语句部分

提醒:

  • 无返回值:void
  • 有返回值:return

运算符

  • 逻辑或 ||
  • 逻辑与 &&
  • 逻辑非 !
#include<reg52.h>
sbit LED = P2^0;
void delay(unsigned int k){
  unsigned int i,k;
  for(i=0;i<k;i++);
  for(j=0;j<124;j++);
}
void main(){
  while(1){
  // 灯亮
    LED=0;
    // 函数调用
    delay(5000);
    // 灯灭
    LED=1;
    delay(5000);
  }
}

我们现在做一个16个灯的亮和灭的案例

#include<reg52.h>
sbit LED1=P2^0;
sbit LED2=P2^1;
sbit LED3=P2^2;
sbit LED4=P2^3;
sbit LED5=P2^4;
sbit LED6=P2^5;
sbit LED7=P2^6;
sbit LED8=P2^7;
// 第二组的灯接口
sbit LED9=P0^0;
sbit LED10=P0^1;
sbit LED11=P0^2;
sbit LED12=P0^3;
sbit LED13=P0^4;
sbit LED14=P0^5;
sbit LED15=P0^6;
sbit LED16=P0^7;

void delay(unsigned int k)
{
	 unsigned int i,j;
  for(i=0;i<k;i++)
   for(j=0;j<124;j++);
}

void main(){
while(1)
{
  LED1=0;
  delay(1000);
  LED1=1;
  LED2=0;
  delay(1000);
  LED2=1;
  LED3=0;
  delay(1000);
  LED3=1;
  LED4=0;
  delay(1000);
  LED4=1;
  LED5=0;
  delay(1000);
  LED5=1;
  LED6=0;
  delay(1000);
  LED6=1;
  LED7=0;
  delay(1000);
  LED7=1;
  LED8=0;
  delay(1000);
  LED8=1;
	// 第二组的灯
  LED9=0;
  delay(1000);
  LED9=1;
  LED10=0;
  delay(1000);
  LED10=1;
  LED11=0;
  delay(1000);
  LED11=1;
  LED12=0;
  delay(1000);
  LED12=1;
  LED13=0;
  delay(1000);
  LED13=1;
  LED14=0;
  delay(1000);
  LED14=1;
  LED15=0;
  delay(1000);
  LED15=1;
  LED16=0;
  delay(1000);
  LED16=1;
  }
}

结果图:

 画电流图的原件列表

AT89C52

LED-RED

POWER

RESPACK_8

 NET=P2# 可以快速标注元件

#include<reg52.h>

void delay(unsigned int k)
{
	 unsigned int i,j;
  for(i=0;i<k;i++)
   for(j=0;j<124;j++);
}

void main(){
while(1)
{
  P2=0XFE;    //1111   1110     第一个灯亮
  delay(1000);
  P2=0XFD;    //1111   1101     第二个灯亮
  delay(1000);
  P2=0XFB;    //1111   1011     第三个灯亮
  delay(1000);
  P2=0XF7;    //1111   0111     第四个灯亮
  delay(1000);
  P2=0XEF;    //1110   1111     第五个灯亮
  delay(1000);
  P2=0XDF;    //1101   1111     第六个灯亮
  delay(1000);
  P2=0XBF;    //1011   1111     第七个灯亮
  delay(1000);
  P2=0X7F;    //0111   1111     第八个灯亮
  delay(1000);

  P2=0XFF;    //0111   1111     第八个灯灭
  delay(0);
  P0=0XFE;    //1111   1110     第一个灯亮
  delay(1000);
  P0=0XFD;    //1111   1101     第二个灯亮
  delay(1000);
  P0=0XFB;    //1111   1011     第三个灯亮
  delay(1000);
  P0=0XF7;    //1111   0111     第四个灯亮
  delay(1000);
  P0=0XEF;    //1110   1111     第五个灯亮
  delay(1000);
  P0=0XDF;    //1101   1111     第六个灯亮
  delay(1000);
  P0=0XBF;    //1011   1111     第七个灯亮
  delay(1000);
  P0=0X7F;    //0111   1111     第八个灯亮
  delay(1000);
  P0=0XFF;    //0111   1111     第八个灯灭
  delay(0);
}
}

流水灯的方法

简单的方法来实现流水灯的方法

#include<reg52.h>

void delay(unsigned int k)
{
	 unsigned int i,j;
  for(i=0;i<k;i++)
   for(j=0;j<124;j++);
}

void main(){
unsigned temp,i;
while(1)
{
  temp=0X01;          // 0000 0000 0000 0001   第一个灯开始亮,只有一个灯亮
  for(i=0;i<16;i++)
  {
   P2=~temp;          // 1111 1111 1111 1110
   P0=~(temp>>8);
   delay(1000);
   temp=temp<<1;
  }
}
}

数组

数组是把相同数据类型的变量,按照顺序组织起来的一个集合。

数组中的单个变量称为数组元素。

数组只是一个集合,数组中的元素才是我们真正操作的对象。

数组名  [数组长度]

流水灯的左右移动亮的代码:

#include<reg52.h>
unsigned char tab[8]={0XFE,0XFD,0XFB,0XF7,0XEF,0XDF,0XBF,0X7F};
void delay(unsigned int k)
{
	 unsigned int i,j;
  for(i=0;i<k;i++)
   for(j=0;j<124;j++);
}

void main(){
while(1)
{
	int i;
	for(i=0;i<8;i++)
	{
		P2=tab[i];
		delay(500);
	}
	  P2= 0XFF;
	 for(i=0;i<8;i++)
	{
		P0=tab[i];
		delay(500);
	}
	P0= 0XFF;
	 for(i=6;i>=0;i--)
	{
		P0=tab[i];
		delay(500);
	}
	P0= 0XFF;

	 for(i=7;i>0;i--)
	{
		P2=tab[i];
		delay(500);
	}
	  P2= 0XFF;
	}
}

函数的表达方法:

#include<reg52.h>
unsigned char tab[8]={0XFE,0XFD,0XFB,0XF7,0XEF,0XDF,0XBF,0X7F};
void delay(unsigned int k)
{
	 unsigned int i,j;
  for(i=0;i<k;i++)
   for(j=0;j<124;j++);
}
	int i;
void joggle()
{
	   for(i=0;i<8;i++)
	{
		P2=tab[i];
		delay(500);
	}
	  P2= 0XFF;
	 for(i=0;i<8;i++)
	{
		P0=tab[i];
		delay(500);
	}
	P0= 0XFF;
}

void change()
{
  for(i=6;i>=0;i--)
	{
		P0=tab[i];
		delay(500);
	}
	P0= 0XFF;

	 for(i=7;i>0;i--)
	{
		P2=tab[i];
		delay(500);
	}
	  P2= 0XFF;
}

void main(){
while(1)
{
	joggle();
	change();
}	 
}

函数的方法中使用自定义变量的使用:

#include<reg52.h>
unsigned char tab[8]={0XFE,0XFD,0XFB,0XF7,0XEF,0XDF,0XBF,0X7F};
void delay(unsigned int k)
{
	 unsigned int i,j;
  for(i=0;i<k;i++)
   for(j=0;j<124;j++);
}
	int i;
void joggle(unsigned int B)
{	  
	   for(i=0;i<8;i++)
	{
		P2=tab[i];
		delay(B);
	}
	  P2= 0XFF;
	 for(i=0;i<8;i++)
	{
		P0=tab[i];
		delay(B);
	}
	P0= 0XFF;
}

void change(unsigned int G)
{
  for(i=6;i>=0;i--)
	{
		P0=tab[i];
		delay(G);
	}
	P0= 0XFF;

	 for(i=7;i>0;i--)
	{
		P2=tab[i];
		delay(G);
	}
	  P2= 0XFF;
}

void main(){
while(1)
{
	joggle(500);
	change(100);
}	 
}

案例:按钮来控制灯亮的独立按钮控制四个灯:

#include<reg52.h>
sbit key1 = P3^2;
sbit key2 = P3^3;
char id;
void delay(unsigned int k)
{
	unsigned i,j;
	for(i=0;i<k;i++)
		for(j=0;j<124;j++);
}

void main()
{
 while(1)
 	{
	 	if(key1==0)
		{
			P2=0XFE;
			delay(500);
			P2=0XFF;
			delay(500);
		}
		if(key2==0)
		{
			id=id +1;
			delay(500);
		}
		if(id>4)
		{
			id=1;
		}
		if(id==1)
		{
			P2=0XFE;
		}
		if(id==2)
		{
			P2=0XFC;
		}
		if(id==3)
		{
			P2=0XF8;
		}
		if(id==4)
		{
			P2=0XF0;
		}
	}
}

我们的这次的笔记到此为止啦,喜欢的关注,后续有更精彩的内容分享!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

520独花

谢谢你支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值