郭天祥十天入门单片机学习笔记

电子元件

排阻

有两种:

  • n
  • n+1
二极管

几个概念

  1. 限流电阻:与二极管串联,防止电流过大烧毁二极管
  2. 导通压降:二极管亮起的最小电压

贴片式绿色为阴极,插入式短脚为阴极

数码管

共阴极:对应段选信号置1亮

共阳极:对应段选信号置0亮

在这里插入图片描述

数码管位选一般是低电平有效

段选:数码管的哪一段(节)亮

位选:哪个数码管亮

多个数码管可利用LED余晖和视觉暂留效应,辅以“消影”,实现“同时”显示不同数字

#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;
sbit wela=P2^7;
uchar num;
uchar code number[]=
{
	//0-9   A-F,??????????
	0x3f,0x06,0x5b,0x4f,
	0x66,0x6d,0x7d,0x07,
	0x7f,0x6f,0x77,0x7c,
	0x39,0x5e,0x79,0x71
};
uchar code dig[]=
{   //第1个-第6个
	0xfe,0xfd,0xfb,0xf7,
	0xef,0xdf
};
void delayms(uint);
void main()
{
	while(1)
	{
		for(num=0;num<6;num++)
		{
			dula=1;
			P0=number[num];
			dula=0;
			P0=0xff;
			wela=1;
			P0=dig[num];
			wela=0;
			delayms(50);
		}
	}
}
void delayms(uint xms)
{
	uint i,j;
	for(i=xms;i>0;i--)
	for(j-110;j>0;j--)
	;
}
74HC573锁存器

OE为低电平时工作,否则输出高阻态

LE为高电平时输出Q跟随输入D变化,否则锁定为之前状态

独立按键

一端直接与低电平相连,另一端与单片机引脚相连时可以通过低电平而直接检测按键是否被按下

缺点:一个独立按键需要一个独立IO口,浪费资源

运算放大器

公式(Vp-Vn)*105=Vo,但实际Vo不能超出两端的接入电压,所以极易饱和,通常用来做电压跟随器、同相放大电路、反相放大电路、加减法电路、积分电路、微分电路等数学运算电路。

关键在于虚短和虚断,即电压一致,

矩阵键盘

通常是多个按键以矩阵形式组成键盘,通过逐行扫描的方法来检测按键被按下的情况

矩阵键盘扫描显示代码

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;
sbit wela=P2^7;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71
};
//uchar code segnum[6]={0x00,0x00,0x00,0x00,0x00,0x00};
//uint index=0;
void delayms(uint xms)
{
	uint i,j;
	for(i=xms;i>0;i--)
		for(j=110;j>0;j--);
}
void display(uchar num)
{
	P0=table[num];//data first
	dula=1;//SS followed
	dula=0;
}
void clear()
{
	P0=0x00;
	dula=1;
	dula=0;
}
uchar matrixkeyscan()
{
	uchar tmp,key;
	
	P3=0xfe;//the first row
	tmp=P3;
	tmp=tmp&0xf0;//how and why
	if(tmp!=0xf0)
	{
		delayms(10);
		tmp=P3;
		tmp=tmp&0xf0;
		if(tmp!=0xf0)
		{
			tmp=P3;
			switch(tmp)
			{
				case 0xee:
					key=0;
				break;
				case 0xde:
					key=1;
				break;
				case 0xbe:
					key=2;
				break;
				case 0x7e:
					key=3;
				break;
			}
			display(key);
			while(tmp!=0xf0)
			{
				tmp=P3;
				tmp=tmp&0xf0;
			}
			return key;
			//display(key);
		}
	}
	
	P3=0xfd;//the second row
	tmp=P3;
	tmp=tmp&0xf0;//how and why
	if(tmp!=0xf0)
	{
		delayms(10);
		tmp=P3;
		tmp=tmp&0xf0;
		if(tmp!=0xf0)
		{
			tmp=P3;
			switch(tmp)
			{
				case 0xed:
					key=4;
				break;
				case 0xdd:
					key=5;
				break;
				case 0xbd:
					key=6;
				break;
				case 0x7d:
					key=7;
				break;
			}
			display(key);
			while(tmp!=0xf0)
			{
				tmp=P3;
				tmp=tmp&0xf0;
			}
			return key;
			//display(key);
		}
	}
	
	P3=0xfb;//the third row
	tmp=P3;
	tmp=tmp&0xf0;//how and why
	if(tmp!=0xf0)
	{
		delayms(10);
		tmp=P3;
		tmp=tmp&0xf0;
		if(tmp!=0xf0)
		{
			tmp=P3;
			switch(tmp)
			{
				case 0xeb:
					key=8;
				break;
				case 0xdb:
					key=9;
				break;
				case 0xbb:
					key=10;
				break;
				case 0x7b:
					key=11;
				break;
			}
			display(key);
			while(tmp!=0xf0)
			{
				tmp=P3;
				tmp=tmp&0xf0;
			}
			return key;
			//display(key);
		}
	}
	
	P3=0xf7;//the fourth row
	tmp=P3;
	tmp=tmp&0xf0;//how and why
	if(tmp!=0xf0)
	{
		delayms(10);
		tmp=P3;
		tmp=tmp&0xf0;
		if(tmp!=0xf0)
		{
			tmp=P3;
			switch(tmp)
			{
				case 0xe7:
					key=12;
				break;
				case 0xd7:
					key=13;
				break;
				case 0xb7:
					key=14;
				break;
				case 0x77:
					key=15;
				break;
			}
			display(key);
			while(tmp!=0xf0)
			{
				tmp=P3;
				tmp=tmp&0xf0;
			}
			return key;
		}
	}
	return 0;
}

void main()
{
	P0=0;
	dula=1;
	dula=0;//clear led
	P0=0xc0;//low enable
	wela=1;
	wela=0;
	while(1)
	{
		matrixkeyscan();
		clear();
	}
}
MOS管(Metal Oxide Semiconductor Field Effect Transistor)

有金属,有氧化物,有形成场效应

作用:大概可以理解为一个开关,栅极有电压时导通漏极和源极

在这里插入图片描述

原理:两块N(negative)型半导体(磷原子,内部有多余电子,显负电,正反接都可以导通)和一块P(positive)型半导体(硼原子,内部有空穴,显正电,)

一个P和一个N形成PN结时,电场使得电子能填补空穴就可以导通(二极管的单向导电)

NPN结形成两个方向相反的二极管,所以正反接都不行

导通过程:

在P区加块SiO2绝缘层,上面再加一层金属板,形成栅极,栅极接正电,吸引P区电子过来,在两个N结之间形成N沟道,这三者此时共同形成一整块N半导体,去掉栅极电压,N沟道就会消失。

输入阻抗:

很大很大,因为绝缘层的存在,栅极几乎没有电流

元件作用

上拉电阻

与单片机内部电阻并联,减小工作元件之前的压降,提高工作电压

单片机

周期

脉冲信号之间的时间间隔称为周期

时钟周期

单片机最小的时间单位

状态周期(暂时不懂干嘛的)

时钟周期的两倍

机器周期

单片机一个基本操作的周期,比如取指令、读写寄存器

指令周期

一条指令的完整执行周期,比如mov ax,2

寄存器

PSW(program status word)
CYACF0RS1RS0OVP
进位标志辅助进位标志用户用于测试程序与RS0用来在4组工作寄存器里做选择溢出标志位奇偶标志位
ROM(read only memmory)

ROM的数据在程序运行的时候是不容改变的,除非你再次烧写程序,他就会改变,就像我们的书本,印上去就改不了了,除非再次印刷,这个就是ROM的原理

RAM(random access memory)

RAM就是在程序运行中,数据会随时改变的,就像我们的黑板,写上了可以擦,擦完再写上去,相当于程序运行的时候,调用ROM里面的数据进行各种运算

sfr(special function register)

RAM中有特殊功能的寄存器,比如sfr P1 = 0x90;.sfr是8位,sfr16是16位

[常用sfr]((2条消息) 51单片机之特殊功能寄存器SFR_千寻瀑༄的博客-CSDN博客_51单片机的sfr)

sbit

一个可用于位寻址空间的位地址sbit led=P1^1,与bit相比,sbit代表的是单片机地址,而bit仅仅可以用来当作变量

code
数组名前code关键字表示这个表格会存放在代码区代码区的内容,也就是程序,最后会被烧写到只读存储器中,运行中不可改变如果不写
code,一般放在内部存储区

中断

中断步骤

中断请求(中断源提出)

中断响应

中断服务

中断返回

中断嵌套

执行中断服务时遇到新的中断请求

中断允许和中断优先级

中断程序的重要程度,有多个中断请求时,利用中断优先级判断是否响应中断(是否可屏蔽)以及先响应哪个中断,是否响应中断存储于中断允许寄存器IE中,优先级内容存储于优先级寄存器IP

eg.52单片机所有中断源及中断级别

中断源默认中断级别序号(C语言用)入口地址
INT0-外部中断0top003h
T0-计数器0中断20bh
INT1313h
T141Bh
T1/R1-串行口中断523h
T2bottom52bh

IE:

在这里插入图片描述

IP:

在这里插入图片描述

为1是是高优先级,为0时是低优先级,用于中断嵌套执行决策,

若同时有多个同级中断请求,按照默认顺序响应

串口通信

并行通信

成本较高,同时接收有困难

串行通信

发送时:并->串

接收时:串->并

成本低,适合远距离传输

异步串行通信

以字符(帧)的形式传输,字符间间隙不定,但字符内间隙一定,是位间隔的整数倍。

由其定义可知每一帧需要4部分:起始位、数据位、奇偶校验位、停止位

同步串行通信

字符间无间隙,字符内间隙一定,是位间隔的整数倍

串行通信制式
  1. 单工
  2. 半双工:不能同时互传
  3. 全双工

串行通信的错误校验

  1. 奇偶校验
  2. 代码和校验(类似于互联网运输层EDC)
  3. 循环冗余校验

keil使用

include ""与<>的区别

<>:编译器进入软件所在文件夹搜索该头文件,keil是Keil\C51\INC里寻找

“”:编译器先在工程文件夹下找该头文件,找不到在去软件的文件夹寻找

输出hex文件

在这里插入图片描述

该勾选含义是在build时输出能够下载到单片机的hex文件。

仿真(需要计算时间)

震荡频率设置

在这里插入图片描述

仿真操作

在这里插入图片描述

代码练习
液晶滚动显示
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]="I LOVE MCU";
uchar code table1[]="Agentina is the champion!";
sbit lcden=P3^4;//数据使能引脚
sbit lcdrs=P3^5;//指令数据选择引脚
sbit dula=P2^6;//数码管
sbit wela=P2^7;//数码管
uchar num;//下标
void delay(uint z)
{
	uint x,y;
	for(x=z;x>0;x--)
	for(y=110;y>0;y--);
}
//以下两个函数参考1602时序可知
void write_com(uchar com)
{
	lcdrs=0;
	P0=com;
	delay(5);
	lcden=1;
	delay(5);
	lcden=0;
}
void write_data(uchar date)
{
	lcdrs=1;
	P0=date;
	delay(5);
	lcden=1;
	delay(5);
	lcden=0;
}
void init()
{
	dula=0;
	wela=0;//防止数码管显示
	lcden=0;
	write_com(0x38);
	write_com(0x0c);
	write_com(0x06);
	write_com(0x01);
}
void main()
{
	init();
	//write_com(0x80);
	//for(num=0;num<11;num++)
	//{
	//	write_data(table[num]);
	//	delay(5);
	//}
	while(1)
	{
		
		write_com(0x80+0x40);
		for(num=0;num<25;num++)
		{
			write_data(table1[num]);
			delay(5);
			
		}
		for(num=0;num<50;num++)
		{
			write_com(0x18);
			delay(1000);
		}
	}
	while(1);
}
呼吸灯+数码管显示亮度
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;
sbit wela=P2^7;
sbit DAC_CS=P3^2;
sbit WR1=P3^6;
uchar num;
uchar code number[]=
{
	//0-9   A-F,??????????
	0x3f,0x06,0x5b,0x4f,
	0x66,0x6d,0x7d,0x07,
	0x7f,0x6f,0x77,0x7c,
	0x39,0x5e,0x79,0x71
};
uchar code dig[]=
{	//位选
	0xfe,0xfd,0xfb,0xf7,
	0xef,0xdf
};
void delayms(uint);//延时
void seg_dis(int num,int ds);//特定位显示特定数字
void setup();//初始化
void loop();//循环函数
void dis_num(uchar t);//显示数字

void main()
{
	setup();
	loop();
}
void timer1() interrupt 3
{
	//TH0=(65536-50000)/256;//TIME reg 
	//TH1=(65536-50000)%256;
	//op
}
void delayms(uint xms)
{
	uint i,j;
	for(i=xms;i>0;i--)
	for(j-110;j>0;j--)
	;
}
void seg_dis(int num,int ds)
{
	uchar x=dig[ds];
	wela=1;
	P0=x;
	wela=0;
	x=number[num];
	dula=1;
	P0=x;
	dula=0;
	delayms(100);
}
void setup()
{
	DAC_CS=0;
	WR1=0;
	num=0;
	TMOD=0x11;//TMOD reg 
	TH0=(65536-50000)/256;//TIME reg 
	TH1=(65536-50000)%256;
	//EA=1;//INTERRUPT reg
	//ET0=1;
	//TR0=1;//TCON reg
}
void loop()
{
	while(1)
	{
		for(num=0;num<255;num++)
		{
			dis_num(num);
			
			P0=num;
			delayms(700);
		}
		for(num=255;num>0;num--)
		{
			dis_num(num);
			
			P0=num;
			delayms(700);
		}
	}
}
void dis_num(uchar t)
{
	int n=t%10;
	seg_dis(n,2);
	t/=10;
	
	n=t%10;
	seg_dis(n,1);
	t/=10;
	
	n=t%10;
	seg_dis(n,0);
	t/=10;
	
	wela=1;
	P0=0x00;
	wela=0;
	
	dula=1;
	P0=0x00;
	dula=0;//fang'zh
}
  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
讲次 内容 细节 第一讲 学单片机预备知识、 如何点亮一个发光管 单片机能做什么,基本电子知识,如何用TX-1C单片机学习学习单片机,C51知识简介,如何申请免费芯片样品。点亮一个发光管, 第二讲 流水灯设计、蜂鸣器发声、继电器控制 简单延时程序、子程序调用、带参数子程序设计、流水灯同时蜂鸣器响、如何驱动蜂鸣器,及如何驱动继电器,集电极开路的概念及应用。 第三讲 数码管显示的原理、 数码管的静态显示 共阳、共阴数码管显示原理、定时器工作方式介绍、重点讲述工作方式2、中断概念及中断函数写法、外部中断试验、定时器中断应用 第四讲 数码管的动态显示原理及应用实现 动态扫描概念、 定时器、中断加深 用单片机的定时器及中断设计一个60秒定时器 第五讲 独立键盘、矩阵键盘 的检测原理及实现 键盘用来做什么、如何键盘检测、消抖、键盘编码、带返回值函数写法及应用 第六讲 AD、DA的工作原理 及实现、运放电路 模拟电压与数字电压的关系、为什么要使用AD及DA、ADC0804的操作方法、DAC0832的操作方法 第七讲 串口通讯原理及操作流程 串口通讯工作方式、 10位数据通讯、波特率概念、如何根据波特率计算定时器初值、串口打印在调试程序中的应用。 第八讲 1602液晶、12864液晶显示原理及实现 最简单液晶工作原理、如何开始对一个没有任何概念的芯片开始单片机的操作 第九讲 IIC总线AT24C02芯片工作原理 IIC总线工作原理、 目前非常通用的一种通信机制 第十讲 利用51单片机的定时器设计一个时钟 综合运用51单片机知识设计一个可以随意调节时间、带整点闹铃的时钟。(其中用到定时器、中断、按键、蜂鸣器、数码管或串口通信) 第十一讲 用DS12C887时钟芯片设计一个高精度时钟 DS12C887内部带有锂电池,系统掉电情况下可自行精确走10年,并带有闹钟功能、年、月、日、时、分、秒等。(本节由学生自己设计电路) 第十二讲 使用Protel99绘制电路图全过程 Protell99软件使用、元件库、封装库设计、绘制原理图、错误检查、生成PCB、手动、自动布线、送去加工 第十三讲 Altium designer 6.5绘制电路图全过程 最顶级电路板设计软件Altium Designer使用、元件库、封装库设计、绘制原理图、错误检查、生成PCB、手动、自动布线、送去加工

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

ㄨㄛˇㄞˋㄋㄧˇ

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值