Proteus软件初学笔记
时间:2022-08-17 05:00:00
文章目录
- 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、按键
- 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.晶振电路和复位电路
时钟电路
复位电路:上电复位,按键复位
- 电阻: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、特点
- 公共端直接接地(供阴极)或接电源(供阳极)
- 每个数码的段选线与一组 I/O 接口线相连
- 每个数码管一直显示
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、原理
- 特点
- 从下到上依次为:a,b,c,d,e,f,g,db
- 所有数码管的段选线与一组 I/O 接口线并连在一起
- 每个数码管的公共端由一根 I/O 线控制
- 显示为逐个显示
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概述
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