锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

Proteus软件初学笔记

时间:2022-08-17 05:00:00 电容数码表示法309

文章目录

  • Proteus软件初学
  • 一、常用元器件
  • 二、学习视频
  • 三、Project
    • 1.晶振电路和复位电路
    • 2、LED实现流水灯
      • 2.1、LED原理
      • 2.2.阳极接法和阴极接法
      • 2.3.呼吸灯闪烁代码
      • 2.4.呼吸灯实现代码(供阳极和供阴极接法)
      • 2.5.通用流水灯的操作
      • 2.6.实现花式流水灯效果
    • 3、数码管
      • 3.1.数字管的结构和原理
      • 3.2.字母和数字显示在数字管上
      • 3.3、LED静态显示和动态显示数字管
        • 1.静态显示
        • 2、特点
        • 3、实现效果 :电路图从0-9反复变化
        • 4、代码
      • 3.4、LED动态显示数字管
        • 1、原理
        • 2、实现效果
        • 3、代码
    • 4、按键
      • 4.键盘的基本原理
      • 4.消除抖动
      • 4.3.键盘分类
      • 4.4.识别矩阵键盘键位
      • 4.5、实现效果
    • 5、定时器
      • 5.1.定时/计数器和控制寄存器的方式
    • 6、中断
      • 6.1、中断简介
      • 6.中断允许控制
      • 6.三、优先控制
      • 6.4.每个中断服务程序的入口号
      • 6.5、外部中断
      • 6.6、电路图
      • 6.7、代码
    • 七、串行口通信
      • 7.1、串行口 控制寄存器SCON
      • 7.2、电源控制寄存器PCON
      • 7.3.方法1的工作方法
    • 8、模拟89C51与上位机之间的通信
      • 8.1、电路图
      • 8.2、代码
    • 9、LCD1602的应用
      • 9.1、LCD1602概述
      • 9.2.常用指令码
      • 9.读写时序图
      • 9.4、电路图一
      • 9.5、代码一
      • 9.6、电路图二
      • 9.7、代码二
      • 9.实现电子时钟
    • 10、点阵
      • 10.1、电路图
      • 10.2、代码
    • 11、DA转换原理和简单波形发生器的实现
    • 12、外部中断
      • 12.1、电路图
      • 12.2、代码
    • 13.单片机串口

Proteus软件初学

一、常用元器件

在这里插入图片描述

二、学习视频

Proteus使用教程可以查看视频链接,我觉得很好:https://www.bilibili.com/video/BV1Y7411N7YK?p=2

Keil5 结合Proteus 可以看看这个视频:
https://www.bilibili.com/video/BV1H7411n7AY?p=4&spm_id_from=pageDriver

三、Project

1.晶振电路和复位电路

时钟电路

  • 芯片:AYM89C51
  • 晶振:CRY,12M
  • 电容:CAP,22pf
  • 功能:晶体振动电路为单片机提供时钟信号。晶体振动电路产生单片机必须使用的时钟频率。单片机发送的所有指令都是基于此
  • 晶体振动时钟频率越高,单片机运行速度越快。它一个接一个地从ROM获得指令,然后执行。单片机每次访问的存储时间称为机器周期,分为12个时钟周期

复位电路:上电复位,按键复位

  • 电阻:RES
  • 功能:使用它将电路恢复到起始状态,就像计算器的零按钮一样,以恢复到原始状态并重新计算。

2、LED实现流水灯

2.1、LED原理

LED,选带ACTIVE是的,可以看到元器件的可视化,是亮还是灭
电流方向:P ----> N
如果是硅,0.7V,如果是锗,0.3V

2.2.阳极接法和阴极接法

供阳极接法:将所有LED此时N极需要连接低电平、低电平亮、高电平灭绝,低电平有效
供阴极接法:将所有LED此时P极需要连接高电平,高电平有效
单片机可以吸入的电流为20mA,因此,阳极接法需要电阻(电阻值不小于250)才能与单片机连接

2.3.呼吸灯闪烁代码

#include"reg51.h" // sbit 表示控制对位  sbit LED0 = P2^0; /* * 延时函数 * 延时函数`delay()`本质:通过空语句占用程序时间,达到延迟效果 */ void delay(unsigned int n)
{ 
        
	unsigned int i=0,j=0;
	for(i=0;i<n;i++)
	{ 
        
		for(j=0;j<120;j++);
	}
}

void main()
{ 
        
	while(1)
	{ 
        
		LED0 = 0;//亮
		delay(5);//加入延时函数
		LED0 = 1;//灭
		delay(5);//加入延时函数
	}
}

2.4、呼吸灯实现代码(供阳极和供阴极接法)

#include"reg51.h"
// sbit 表示对位进行控制 
sbit LED0 = P2^0;
/* * 延时函数 */
void delay(unsigned int n)
{ 
        
	unsigned int i=0,j=0;
	for(i=0;i<n;i++)
	{ 
        
		for(j=0;j<120;j++);
	}
}

/* * 实现流水灯效果 */
void led()
{ 
        
	int i=0;
	for(i=0;i<8;i++)
	{ 
        
		/* * 因为是低电平亮,所以进行取反操作, * 因为实现流水灯操作,所以进行移位操作 * P2 为供阳极接法 * P1 为供阴极接法 */
		P2=~(0x01<<i);//~0000 0001 ->0000 0010 -> 0000 0100 
		P1=(0x01<<i);//~0000 0001 ->0000 0010 -> 0000 0100 
		delay(50);
	}
}

void main()
{ 
        
	while(1)
	{ 
        
		led();
	}
}

2.5、通用流水灯的操作

将输出的数据用数组进行表示,用 for循环将其遍历出来
代码如下:

#include"reg51.h"
// 轮流滚动的小灯数据
unsigned char leddat[]={ 
        0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};

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

void led()
{ 
        
	int i=0;
	for(i=0;i<8;i++)
	{ 
        
		P2=~leddat[i];
		delay(100);
	}
}

void main()
{ 
        
	// 保证程序能够不断运行
	while(1)
	{ 
        
		led();
	}
}

2.6、实现花式流水灯效果

#include"reg51.h"
unsigned char leddat[50]={ 
        
0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x81,0x82,
0x84,0x88,0x90,0xA0,0xC0,0xC1,0xC2,0xC4,0xC8,0xD0,
0xE0,0xE1,0xE2,0xE4,0xE8,0xF0,0xF1,0xF2,0xF4,0xF8,	
0xF9,0xFA,0xFC,0xFD,0xFE,0xFF,0xFF,0x00,0xFF,0x00
};

/*延迟函数 */
void delay(unsigned int n)
{ 
        
	unsigned int i=0,j=0;
	for(i=0;i<n;i++)
	{ 
        
		for(j=0;j<120;j++);
	}
}

void led()
{ 
        
	int i=0;
	for(i=0;i<50;i++)
	{ 
        
		P2 = ~leddat[i];
		delay(100);
	}
}

void main()
{ 
        
	while(1)
	{ 
        
		led();
	}
}

3、数码管

3.1、数码管的结构和原理

3.2、数码管上显示字母和数字

  • dp:是小数点位置

3.3、LED数码管的静态显示和动态显示

1、静态显示方式

2、特点

  1. 公共端直接接地(供阴极)或接电源(供阳极)
  2. 每个数码的段选线与一组 I/O 接口线相连
  3. 每个数码管一直显示

3、实现效果 :从0–9反复变化的电路图

以阴极接法为例

4、代码

#include"reg51.h"
unsigned char s[]={ 
        0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};// 供阴0--9



/* * 延迟函数 */
void delay(unsigned int n)
{ 
        
	unsigned int i=0,j=0;
	for(i=0;i<n;i++)
	{ 
        
		for(j=0;j<120;j++);
	}
}

/* * 显示函数 */
void seg()
{ 
        
	//P2 = 0x3F;//0011 1111
	int i =0;
	for(i=0;i<10;i++)
	{ 
        
		P2 = s[i];
		delay(300);
	}
}

void main()
{ 
        
	while(1)
	{ 
        
		seg();
	}
}

注意:供阳极接法同上,需要更换的是数码管,接法以及代码中的取反

3.4、LED数码管的动态显示

1、原理

  • 特点
  1. 从下到上依次为:a,b,c,d,e,f,g,db
  2. 所有数码管的段选线与一组 I/O 接口线并连在一起
  3. 每个数码管的公共端由一根 I/O 线控制
  4. 显示为逐个显示

2、实现效果

3、代码

#include"reg51.h"
unsigned char s[]={ 
        0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};// 供阴0--9
unsigned char str[]={ 
        0x76,0x79,0x38,0x38,0x3F};// HELLO
unsigned char wei[]={ 
        0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07};//显示不同的位
// 若将显示器1-8直接与单片机10-17连接,显示不同的位使用以下这种
// unsigned char wei[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};


/* * 延迟函数 */
void delay(unsigned int n)
{ 
        
	unsigned int i=0,j=0;
	for(i=0;i<n;i++)
	{ 
        
		for(j=0;j<120;j++);
	}
}

/* * 显示函数 */
void seg()
{ 
        
	//P2 = 0x3F;//0011 1111
	int i =0;
	for(i=0;i<5;i++)
	{ 
        
		P3=wei[i];
		P2 = str[i];//0011 1111
		delay(5);
	}
}

void main()
{ 
        
	while(1)
	{ 
        
		seg();
	}
}

4、按键

4.1、键盘的基本原理

4.2、抖动的消除

抖动大概10ms~20ms

4.3、键盘的分类


4.4、矩阵键盘键位的识别

4.5、实现效果

代码

#include"reg51.h"
sbit key0=P1^0;
unsigned char s[]={ 
        0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};// 供阴0--9
unsigned char num=0,flag=0;

void delay(unsigned int n)
{ 
        
	unsigned int i=0,j=0;
	for(i=0;i<n;i++)
	{ 
        
		for(j=0;j<120;j++);
	}
}
// 按键操作
void key()
{ 
        
// if(key0==0)
// { 
        
// num++;
// }
		if(key0==0&&flag==0)
	{ 
        
		flag=1;
	}
	if(flag==1&&key0==1)
	{ 
        
		num++;
		flag=0;
	}
}

// 数码管操作,利用标志位消除抖动
void seg()
{ 
        
	P2=s[num];
	if(num==10)
	{ 
        
		num=0;
	}

}

void main()
{ 
        
	while(1)
	{ 
        
		key();
		seg();
	}
	
}

5、定时器

5.1、定时/计数器的方式和控制寄存器



6、中断

6.1、中断简介

6.2、中断允许控制

标识中带T的表示与定时器有关

6.3、优先权控制


6.4、各中断服务程序的入口编号

6.5、外部中断

外部中断,低电平,下降沿触发。

6.6、电路图

6.7、代码

实现防抖动操作,按一下键盘num值加一次

#include"reg51.h"
sbit ex=P3^2;
unsigned char s[]={ 
        0x3F,0x06,0x5B,0x4F,0x66,0x7D,0x07,0x7F,0x6F};//供阴极0-9
unsigned char num=0;

void initex()
{ 
        
	IT0=1;//设置边沿触发
	EX0=1;//打开外部中断
	EA=1;//进行使能,开启总中断
	ex=1;设置为下降沿
	
}
void display()
{ 
        
	P2=s[num];
	if(num===10)
	{ 
        
		num=0;
	}
}

void main()
{ 
        
	initex();
	while(1)
	{ 
        
		display();
	}
}

7、串行口通信

以下各位为0时表示可以接受,1表示接收完成

7.1、串行口 控制寄存器SCON

控制串行口的通信方式,串口的区别在于波特率不同,一般方式1用的比较多

7.2、电源控制寄存器PCON

7.3、方式1的工作方式



8、模拟89C51与上位机之间的通信

8.1、电路图

8.2、代码

#include"reg51.h"
unsigned char recdat=0,flag=0;

void initscon()
{ 
        
	// 串行口控制寄存器
	SCON=0x50;// 0101 0000
	// 配置波特率,由定时器T1产生,参数为:(是1否0与外部中断有关系,选择定时器0还是计数器1的模式,模式0-13位,01-16位,10-8位)
	TMOD=0x20;// 0010 0000
	// 配置初值
	TH1=256-3;
	TL1=256-3;
	ES=1;// 串口中断
	EA=1;//开启总中断
	TR1=1;//打开定时器1

}

// 发送数据
void senddat()
{ 
        
	SBUF=recdat;
	while(!T1);
	T1=0;
	
}

void main()
{ 
        
	// 初始化串口
	initscon();
	while(1)
	{ 
        
		//发送数据,通过中断发送 
		//接收数据,接收返回来的数据
		if(flag==1)
		{ 
        
			senddat();
			flag=0;
		}
	}
}

// 串口中断服务函数
// 0是外部中断,1是定时器0的中断,2是外部中断1,3是定时器中断1,4是串口中断
void scon_isr() interrupt 4
{ 
        
	// SBUF表示缓存
	recdat=SBUF;
}

9、LCD1602的应用

9.1、LCD1602概述

LCD1602是2*16字符型液晶显示模块

9.2、常用指令码


9.3、读写时序图



9.4、电路图一

AT89C51和LM016L

9.5、代码一

#include"reg51.h"
sbit RS=P3^0;
sbit RW=P3^1;
sbit E=P3^2;
unsigned char str[]={ 
        "count:"};
void delay(unsigned int n)
{ 
        
	unsigned int i=0,j=0;
	for(i=0;i<n;i++)
	{ 
        
		for(j=0;j<120;j++);
	}
}

void writedat(unsigned char dat)
{ 
        
	RS=1;
	RW=0 

相关文章