AutoLeaders控制组——51单片机学习笔记(一)

单片机简介

1.内部集成了CPU、RAM、ROM、定时器、中断系统及通讯接口等一系列电脑的常用硬件功能
2.单片机的任务是信息采集(依靠传感器)、处理(依靠CPU)和硬件设备(例如电机,LED等)的控制
3.单片机和计算机相比,单品机算是一个袖珍版计算机,一个芯片就能构成完整的计算机系统。但在性能上,与计算机相差甚远,但单片机成本、体积小、结构简单,在生活和工业控制领域大有所用

这里以STC89C52为例,外观如下图:
在这里插入图片描述

原理图:
请添加图片描述

部分引脚示意图:

在这里插入图片描述

点亮LED

#include <REGX52.H>
void main()
{
	P2=0x55;//0101 0101
	while(1)
	{
		
	}
}

由原理图可知控制各个外设的名称编号,这里通过对P2赋值控制LED灯,这里给低电频的亮,赋16进制转换为2进制即为最终点亮的效果。

延时函数

延时函数的简单应用:

void main()
{
	while(1){
		P2=0x55;
		Delay500ms();
		P2=0xFF;
		Delay500ms();
	}
}

在这里运用delay函数可以实现0.5s闪烁效果。
delay函数可以在stc-isp中直接生成,但为了方便使用,对他进行优化如下:

#include <intrins.h>
void Delay1ms(unsigned int k)
{
	unsigned char i, j;
	while(k--){
		_nop_();   //这里的_nop_的使用需要引入头文件如上
		i = 2;
		j = 199;
		do
		{
			while (--j);
		} while (--i);
	}
}

消抖

当我们按下按键时,金属片会上下抖动,这将会使,电路一下接通,一下不接通,即在0与1间来回跳转,这将导致,当我们检测时,明明只按一次按钮,却出现按下多次按钮的检测结果。
所以我们为了功能实现的稳定,采用delay函数进行消抖。
例:

void main(void)
{   
    while (1) {
        if (P3_1 == 0) {
            Delay(20);
            while(P3_1 == 0);
            Delay(20);
            P2_0 = ~P2_0;
        }
    }
}

移位

unsigned char LEDnum;
void main()
{
	P2=~0x80;
	while (1)
	{
		if(P3_1==0)
		{
			Delay(20);
			while(P3_1==0);
			Delay(20);
		LEDnum++;
		if(LEDnum>=8)
			LEDnum=0;
		P2=~(0x80>>LEDnum);
		}
		
		if(P3_0==0)
		{
			Delay(20);
			while(P3_0==0);
			Delay(20);
		
		if(LEDnum==0)
			LEDnum=7;
		else 
			LEDnum--;
		P2=~(0x80>>LEDnum);
		}
	}
}

移位用到移位运算符<<,>>,分别表示左移右移。代码中是以固定位置为基准点,每次移位用变量LEDnum来控制。

数码管

简介

a.数码管电路图:
在这里插入图片描述
连接方式分为共阳极和共阴极,这里的采用共阴极。
由图可知所有数码管的a都连在一起,其他的bcdefg.也是如此。所以同时如果点亮多个数码管,显示的样式也都是一样的。

b.138译码器:
在这里插入图片描述
数码管的com端连向这里,利用3个P口来控制8个端。
ABC为P口,C为最高位,即排序C的数字排最右;
VCC,GND电源正负极;
Y0~Y7,LED端,上方一横表负极有效;
G1~G2AB,使能端,即芯片自带开关,打开后才能使用。

静态数码管显示

#include <REGX52.H>

unsigned char table[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x00};

void orde(unsigned char location,number)
{
	switch(location)
	{
		case 1:P2_4=1;P2_3=1;P2_2=1;break;
		case 2:P2_4=1;P2_3=1;P2_2=0;break;
		case 3:P2_4=1;P2_3=0;P2_2=1;break;
		case 4:P2_4=1;P2_3=0;P2_2=0;break;
		case 5:P2_4=0;P2_3=1;P2_2=1;break;
		case 6:P2_4=0;P2_3=1;P2_2=0;break;
		case 7:P2_4=0;P2_3=0;P2_2=1;break;
		case 8:P2_4=0;P2_3=0;P2_2=0;break;
	}
	P0=table[number];
}
void main()
{
	orde(5,15);
	while(1);
}

即定义一个数组,存放要显示的数字或字母等字符,再通过定义的函数用switch定位要显示的数码管的位置,在这个位置上用户数组对P0赋值。(这里给高电频亮)

动态数码管显示

void orde(unsigned char location,number)
{
	switch(location)
	{
		case 1:P2_4=1;P2_3=1;P2_2=1;break;
		case 2:P2_4=1;P2_3=1;P2_2=0;break;
		case 3:P2_4=1;P2_3=0;P2_2=1;break;
		case 4:P2_4=1;P2_3=0;P2_2=0;break;
		case 5:P2_4=0;P2_3=1;P2_2=1;break;
		case 6:P2_4=0;P2_3=1;P2_2=0;break;
		case 7:P2_4=0;P2_3=0;P2_2=1;break;
		case 8:P2_4=0;P2_3=0;P2_2=0;break;
	}
	P0=table[number];
	 delay(1);
	 P0=0x00;          //在下一个位选前,将本次段选清除,以达到消影目的
}
void main()
{
	while(1)
	{
		orde(1,1);
		orde(2,2);
		orde(3,3);
		orde(4,4);
		orde(5,10);
		orde(6,11);
		orde(7,12);
		orde(8,13);
	}
}
  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值