初识单片机

使用keil

1.创建项目工程文件夹,可以当作模板template

2.创建文件,取名main.c(要打开拓展名,在文件夹窗口上赵“查看”,勾选“文件拓展名”)

3.进入keil主页面,工具栏project->new uVision project->选择第一步的工程文件夹位置->输入工程名字 ->选择芯片类型AT89c52->会提示是否拷贝STARTUP.A51,选择是->生成了工程目录->在工程目录Source Group1上右键鼠标->add Exiting file to Source Group1...->选择代码文件main.c

1.编程,新手如果看不懂以下代码,可以忽略,这次实验只是强调开发流程

2.编译,选择输出文件有hex

初始单片机

1.什么是单片机

是一种集成电路芯片

把具有数据处理能力的中央处理器CPU,随机存储器RAM,只读存储器ROM

多种I/O口和中断系统,定时器,计数器等功能(可能还包括驱动电路,脉宽调制电路,模拟多路转换器,A/D转换器等电路)

集成到一块硅芯片上构成一个小而完善的计算机系统,在工业控制领域广泛应用

STC89系列单片机

命名规则,封装LQFQ44,特性定时器,计数器,串口,看门狗,I/O口

单片机有外接电路,他会把单片机里面的针脚引出来变成一个插针,想要让一个蜂鸣器连接到单片机上的某个I/O口,查到插针上就可以了

上面有四组I/O口,有p0,p1,p2,p3,一般不推荐用p0口,因为p0口是开漏电路,可能会导致模块的使用产生问题,其他三个口都可以用

单片机编程是什么:人类要求单片机干具体的活,有点像提前写个小纸条,把它贴在冰箱上,告诉npy应该干什么

单片机程序怎么理解:看到纸条之后照做

单片机能做什么事:I/O口供电,数据的传输等等

肉眼可见的引脚是什么:方便人类对I/O口,串口接东西

单片机CPU怎么找到I/O口:通过寻址,说白了有一些地址数据,头文件帮你做很多了

sfr“指令”:用来直接描述硬件地址,小白先理解成“一组I/O口”,的起始地址中数据 

sfr  P0 =0x80 ;

一号89C52有5组这样的输入输出口,分别为P0,P1,P2,P3,每组对应8个针脚,P4是RC系列才有的,7个针脚

怎么才能找到IO口的具体的一个引脚呢?

sbit“指令”:对应可位寻址空间的一个位,可以先理解成“一个IO/针脚”

C语言一个字节,char型就是8位

对于单片机来说
输入(把外面的东西拿回来)输出(把东西给外面) 

给变量赋值就是

sbit IFfire = P1^0;
int main()
{
int io_data;

什么情况就是输入

io_data = IFfire;给变量赋值,就是输入 --或者理解为,这个针脚有数据了,拿个变量来保存

if(io_data == 0){
    
}

什么情况就是输出

IFfire = 1;
被赋予一个数值,引起IO口电压变化(一般1输出高电平,0输出低电平),此时为输出,来影响外接的电路

return 0;
}

点亮一个LED灯,并闪烁

#include "reg52.h"

sbit LEDone = P3^7;

void Delay400ms()		//@11.0592MHz
{
	unsigned char i, j, k;

	i = 3;
	j = 206;
	k = 43;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}


void main()
{
	//µãÁÁ
	LEDone = 0;
	//ÊýÊý£¬ÆÚ¼äά³ÖµÍµçƽ
	Delay400ms();
	//µÆÃð
	LEDone = 1;
	//ÊýÊý,ÆÚ¼äά³Ö¸ßµçƽ
	Delay400ms();
	
}

查询法按键控制灯

怎么知道sw1按键被按下

KEY1位置和GND接通,表现为低电平,值为0

怎么知道sw1按键没有被按下

KEY1位置和GND未被接通,通过上拉电阻到5v,表现为高电平,值为1.

接下来,不断检测STC89C52RC的P2.1的值(0-按下,1-松开),即可知道按键是否被按下

KEY的作用是通过读这个位置来判断sw1

I/O口状态翻转

!符号

如:if(key1 == 0)    --->    if(!key1 == 0)

#include "reg52.h"
#include <intrins.h>

sbit key1 = P2^1;
sbit key2 = P2^0;
sbit ledOne = P3^7;

//消除抖动
void Delay500ms()		//@11.0592MHz
{
	unsigned char i, j, k;

	_nop_();
	i = 4;
	j = 129;
	k = 119;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}



void main()
{
	ledOne = 1;
	//查询法检测,是否被按下
	while (1)
	{
		if(key1 == 0)//key1位置和GND位置接通,表现为低电平,值为0.
			{
				//感觉按键被按下,不知道是抖动还是人为
				//增加一个延时
				
				//灯亮,给P3.7一个低电平
				Delay500ms();
				if(key1 == 0){
				ledOne = !ledOne;
				}
			}
		
		if(key2 == 0)
		{
			ledOne = 1;
		
		}
	}
}

当软件的逻辑比较复杂,不希望在判断里面去控制外设,这个时候就需要用到标志位,

定义一个变量,这个变量的值可能是0可能是1,用0和1来表示我记住了某个I/O口的状态,然后再需要修改I/O口的位置去改,

#include "reg52.h"
#include <intrins.h>

#define ON_STATUS 0
#define OFF_STATUS 1

sbit key1 = P2^1;
sbit key2 = P2^0;
sbit ledOne = P3^7;

//消除抖动
void Delay500ms()		//@11.0592MHz
{
	unsigned char i, j, k;

	_nop_();
	i = 4;
	j = 129;
	k = 119;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}



void main()
{
	//首先为关的状态 而且定义变量必须在开头
	int ledmark = OFF_STATUS;
	ledOne = 1;
	
	//查询法检测,是否被按下
	while (1)
	{
		if(key1 == 0)//key1位置和GND位置接通,表现为低电平,值为0.
			{
				//感觉按键被按下,不知道是抖动还是人为
				//增加一个延时
				
				//灯亮,给P3.7一个低电平
				Delay500ms();
				//通过外部改变
				if(key1 == 0){
					//记住key1被按下,在其他地方点灯
				ledmark = ON_STATUS;
				}
			}
		
		if(key2 == 0)//key2位置和GND位置接通,表现为低电平,值为0.
		{
			ledmark = OFF_STATUS;
		
		}
		//在这里电灯或者关闭
		//进行判断,电灯或者关闭
		if(ledmark == OFF_STATUS){
			ledOne = 1;//维持高电平,无电流流通,熄灭
		}else{
			ledOne = 0;//维持低电平,有电流流通,点亮
		}
	}
}

key == 0表明和GND接通,维持低电平,值为0

ledOne = 0,表明维持低电平,有电流流通,灯会被点亮

要让灯被点亮,只需给它一个低电平

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值