本文目录一览:
1、如何使用Proteus做单片机仿真
2、基于Proteus的51系列单片机设计与仿真的内容简介
3、proteus仿真电路图,51单片机按键计数
4、求用proteus仿真51单片机控制LCD1602的实例
如何使用Proteus做单片机仿真
1,找到需要的元件,芯片。
2,根据原理图,画出仿真图。
3,写程序,并编译出HEX代码文件。
4,把HEX代码文件加载到单片机中。
5,运行仿真,就看到结果了。
如下图,就是一个仿真的实例。
更详细的操作步骤,可上网下载有关的教程看一下。
基于Proteus的51系列单片机设计与仿真的内容简介
《基于Proteus的51系列单片机设计与仿真》以目前流行的软、硬件仿真软件Proteus为核心,从实验、实践、实用的角度,通过丰富的实例详细叙述了该软件在51单片机课程教学和单片机应用产品开发过程中的应用。全书共9章,主要介绍51单片机系统的设计及相关软件的使用,在Proteus中原理图的绘制与仿真及PCB的制作、Proteus在单片机软件程序设计中的应用,Proteus在单片机硬件系统设计中的应用。书中选择的实例都具有很强的实用性,通过阅读这些实例,读者可以在不花费硬件成本的前提下,学习和开发单片机软、硬件系统。
~第1章80C51单片机应用系统的设计及相关软件的使用
1.180C51单片机应用系统的设计
1.2KeilC51的使用
1.2.1创建项目
1.2.2调试程序
1.3仿真器
1.4编程器
1.5ISP下载
1.6串行调试软件
第2章Proteus7.1入门
2.1ProteusISIS的操作及电路原理图设计
2.1.1ProteusISIS简介
2.1.2ProteusISIS编辑环境及参数设置
2.1.3ProteusISIS原理图设计
2.1.4ProteusISIS元件制作
2.2ProteusVSM虚拟系统模型
2.2.1激励源
2.2.2ProteusVSM虚拟仪器的使用
2.3ProteusARES的PCB设计
2.3.1ProteusARES简介
2.3.2ProteusARES参数设置
2.3.3ProteusARES中的PCB制作实例
第3章51系列软件程序设计与仿真
3.1清零、置位程序的设计与仿真
3.1.1片内清零程序的设计
3.1.2片内清零程序的调试与仿真
3.1.3片外清零程序的设计
3.1.4片外清零程序的调试与仿真
3.1.5置位程序的设计
3.1.6置位程序的调试与仿真
3.2拼字程序的设计与仿真
3.2.1片内拼字程序的设计
3.2.2片内拼字程序的调试与仿真
3.5.1数据排序程序的设计
3.2.3片外拼字程序的设计
3.2.4片外拼字程序的调试与仿真
3.3拆字程序的设计与仿真
3.3.1片内拆字程序的设计
3.3.2片内拆字程序的调试与仿真
3.3.3片外拆字程序的设计
3.3.4片外拆字程序的调试与仿真
3.4数据块传送程序的设计与仿真
3.4.1数据块传送程序的设计
3.4.2数据块传送程序的调试与仿真
3.5数据排序程序的设计与仿真
3.5.2数据排序程序的调试与仿真
第4章51系列通用I/O控制
4.1P1口的应用(一)
4.1.1硬件设计
4.1.2程序设计
4.1.3调试与仿真
4.2P1口的应用(二)
4.2.1硬件设计
4.2.2程序设计
4.2.3调试与仿真
4.3闪烁灯
4.3.1硬件设计
4.3.2程序设计
4.3.3调试与仿真
4.4流水灯
4.4.1硬件设计
4.4.2程序设计
4.4.3调试与仿真
4.5花样灯(一)
4.5.1硬件设计
4.5.2程序设计
4.5.3调试与仿真
4.6花样灯(二)
4.6.1硬件设计
4.6.2程序设计
4.6.3调试与仿真
4.7模拟交通灯
4.7.1硬件设计
4.7.2程序设计
4.7.3调试与仿真
4.8定时/计数器的应用(一)
4.8.1硬件设计
4.8.2程序设计
4.8.3调试与仿真
4.9定时/计数器的应用(二)
4.9.1硬件设计
4.9.2程序设计
4.9.3调试与仿真
4.10中断系统的应用(一)
4.10.1硬件设计
4.10.2程序设计
4.10.3调试与仿真
4.11中断系统的应用(二)
4.11.1硬件设计
4.11.2程序设计
4.11.3调试与仿真
4.12两个单片机串行通信
4.12.1硬件设计
4.12.2程序设计
4.12.3调试与仿真
4.13串行口扩展应用
4.13.1硬件设计
4.13.2程序设计
4.13.3调试与仿真
第5章音乐的应用
5.1单片机唱歌
5.1.1单片机产生音调的基础知识
5.1.2音乐软件的设计
5.1.3歌曲的设计
5.1.4调试与仿真
5.2电子琴
5.2.1电子琴的基础知识
5.2.2电子琴软件的设计
5.2.3调试与仿真
第6章LED数码管与键盘的应用
6.1LED数码管的应用
6.1.1LED数码管的结构及分类
6.1.2LED数码管的显示方式
6.1.3串行口驱动1位LED数码管的设计
6.1.4共阴极LED和共阳极LED的应用
6.1.50~~99计数器的设计
6.1.659s计时器的设计
6.1.7电子钟的设计
6.1.8MAX7219串行驱动LED数码管
6.2键盘的应用
6.2.1键盘的工作原理
6.2.2查询式键盘的设计
6.2.3矩阵式键盘的识别(一)
6.2.4矩阵式键盘的识别(二)
6.2.58255A并行I/O端口扩充键盘
第7章数/模转换器和模/数转换器的应用
7.1数/模转换器的应用
7.1.1TLC5615的基础知识
7.1.2方波发生器
7.1.3锯齿波发生器
7.2模/数转换器的应用
7.2.1ADC0808的基础知识
7.2.2数字电压表的设计
第8章显示器的应用
8.1LED点阵显示器的应用
8.1.1LED点阵显示器的基础知识
8.1.2一个5×7点阵字符显示
8.1.3一个8×8点阵字符串显示
8.1.4两个8×8点阵字符串显示
8.1.5两个8×8点阵滚动显示
8.1.6一个16×16点阵汉字显示
8.1.7两个16×16点阵汉字显示
8.1.8两个16×16点阵汉字分批显示
8.2LCD(液晶显示器)的应用
8.2.1LCD的基础知识
8.2.2字符式LCD的应用
8.2.3汉字式LCD的应用
8.2.4汉字式LCD移位显示
8.2.5汉字式LCD滚动显示
第9章工业控制
9.1SPI总线DS1302实时时钟控制
9.1.1DS1302的基础知识
9.1.2DS1302采用1位LED显示时钟的设计
9.1.3DS1302采用MAX7219控制8位LED显示时钟的设计
9.2I2C总线24C04开启次数统计控制
9.2.124CXX的基础知识
9.2.224C04开启次数统计的设计
9.3RS-485在单片机多机通信中的应用
9.3.1RS-485接口标准简述
9.3.2RS-485在单片机多机通信中的应用设计
9.41-WireBusDS18B20温度测量的设计
9.4.1DS18B20的基础知识
9.4.2DS18B20测量温度的设计
9.5电动机转速控制
9.5.1步进电动机转速控制
9.5.2直流电动机转速控制
9.6电气模拟控制
9.6.1步进电动机的启动、停止控制
9.6.2直流电动机的启动、停止控制
9.6.3步进电动机的正、反转控制
9.6.4直流电动机的正、反转控制
9.6.5电动机的多地控制
附录A单片机指令速查表
附录BProteus的常用快捷键
参考文献~
proteus仿真电路图,51单片机按键计数
按照你题目,用了2个2位显示,实际有4位合一起的。
k3:切换计数模式/预置模式。
计数模式:LED显示计时数字,从0开始计时,直到预置最大值。
预置模式:LED显示当前预置最大值,按k1,k2可对预置值+-操作,长按k1,k2大约2秒,会进入自动加减预置值。直到再次点击k1,k2,k3任意一键停止自动。
k4:在计数模式下使用,每按下一次显示的数字加一(会在正常计时同时额外+1)。
当计数达到预置最大值,会停止计数,LEN闪烁(实际就是交替显示间隔边长),蜂鸣器响。
按键时长、LED动态显示间隔、闪烁间隔、计数速度,均可直接修改常量,需要自己改,我备注写的很详细。
电路基本按照你上图,略有修改。
#include reg52.h
#define uint unsigned int
#define uchar unsigned char
#define duan P0
#define on 0
#define off 1
#define SSSPEED 35 //LED交替闪烁间隔时间
#define JSPEED 5000//计数模式,速度默认数值(5000*200us=1S) 值越小计数越快
#define PREESTIME 500//按钮长按时间判定,预设500(大约2秒),需要自改,值越大,长按时间越长
sbit fm=P3^3;
sbit wei1=P3^4;
sbit wei2=P3^5;
sbit wei3=P3^6;
sbit wei4=P3^7;
sbit k1=P1^4;
sbit k2=P1^5;
sbit k3=P1^6;
sbit k4=P1^7;
uint jsSpd=JSPEED;//计时速度,默认1s一次(5000*200us)
uint ssSpd=SSSPEED;//LED交替闪烁速度
//共阳极
int delay(uint xms);
void init();
void jspause();//计数器开启/停止
void setnumYS();//设置预设数值
void numJsChange();//计数模式数字改变
void showLED();
int pressWait(uint btn);
uint g=0;
uint s=0;
uint b=0;
uint q=0;
uint count=0;
uint ispause=1;
uint numYS=0;//预设数值
uint numJS=0;//实际计时的数字
uint isMaxJs=0;//标识:计时达最大。 达最大1,否0
uint isk3press=0;//标识:k3按钮是否被点击。 点击1,否0
uint ispress1=0;//标识:k1被长按
uint ispress2=0;//标识:k2被长按
uint isbtn4=0;//标识:k4被按下
uint btnName=0;//按钮长按计时
void main()
{
init();
while(1)
{
if(ispause==1 ispress1==1 numYS9999) //预置模式下,k1已长按,自动增
{
numYS++;
setnumYS();
}
if(ispause==1 ispress2==1 numYS0) //预置模式下,k2已长按,自动减
{
numYS--;
setnumYS();
}
if(isMaxJs==0 numJS=numYS ispause==0) //计时模式下达最大值
{
fm=on;
ssSpd=1000;//增加LED交替间隔,实现数字闪烁
isMaxJs=1;
EA=0;
setnumYS();
numJS=0;
}
if(k1==0 ||k2==0|| k3==0) //k1\k2\k3任意一个按钮被按下,停止预置数自动增长
{
ispress1=0;
ispress2=0;
}
if(k1==0 ispause==1)//预置模式下+
{
delay(10);
if(k1==0)
{
btnName=1;
if(pressWait(btnName))//判断连按
{
while(k1==0);
ispress1=1;
}
else if(numYS9999)
{
numYS++;
setnumYS();
}
}
}
if(k2==0 ispause==1)//预置模式下-
{
delay(10);
if(k2==0)
{
btnName=2;
if(pressWait(btnName))//判断连按
{
while(k2==0);
ispress2=1;
}
else if(numYS0)
{
numYS--;
setnumYS();
}
}
}
if(k3==0)
{
delay(10);
if(k3==0)
{
while(k3==0);
fm=off;
jspause();
}
}
if(k4==0 ispause==0)//计数模式下按下k4,k4的防抖写在中断中
{
delay(10);
if(k4==0)
{
while(k4==0);
isbtn4=1;
}
}
showLED();
}
}
void showLED()
{
uchar nums[10]={0xc0,0xf9,0xa4,0xB0,0x99,0x92,0x82,0xf8,0x80,0x98};
if(g=0)
{
duan=nums[g];
wei4=on;
delay(ssSpd);
wei4=off;
}
if(s0 || (s==0 b0))
{
duan=nums[s];
wei3=on;
delay(ssSpd);
wei3=off;
}
if(b0 || (b==0 q0))
{
duan=nums[b];
wei2=on;
delay(ssSpd);
wei2=off;
}
if(q0)
{
duan=nums[q];
wei1=on;
delay(ssSpd);
wei1=off;
}
}
void setnumYS()//设置预设数值
{
q=numYS/1000;
b=(numYS%1000)/100;
s=(numYS%100)/10;
g=numYS%10;
}
void jspause()
{
if(ispause==0 || isMaxJs==1)//关闭计时模式 / 启动预置模式
{
EA=0;
isMaxJs=0;
ispause=1;
ssSpd=SSSPEED;
ispress1=0;
ispress2=0;
setnumYS();
}
else if(ispause==1) //启动计时模式 / 关闭预置模式
{
ispause=0;
q=b=s=g=0;
numJS=0;
ssSpd=SSSPEED;
EA=1;
}
}
void init()
{
TMOD=0x02; //T0 工作模式2 自动装填8位 200us
TH0=0x38;
TL0=0x38;
EA=0;
ET0=1;
TR0=1;
wei1=off;
wei2=off;
wei3=off;
wei4=off;
}
void numJsChange()//计数模式数字改变
{
if(g==9)
{
g=0;
if(s==9)
{
s=0;
if(b==9)
{
b=0;
if(q==9)
{
q=0;
}
else
q++;
}
else
b++;
}
else
s++;
}
else
g++;
}
void ct() interrupt 1 //一次中断200us
{
if(countjsSpd)
count++;
else
{
count=0;
numJsChange();
numJS++;
}
if(isbtn4==1)
{
isbtn4=0;
numJsChange();
numJS++;
}
}
int pressWait(uint btn)
{
uint i,j;
for(i=PREESTIME;i0;i--)
for(j=110;j0;j--)
{
if((k1==1 btn==1)||(k2==1 btn==2))
return 0;
}
return 1;
}
int delay(uint xms)
{
uint i,j;
for(i=xms;i0;i--)
for(j=110;j0;j--)
{
if(k1==0 || k2==0 ||k3==0)
return 1;
}
return 0;
}
求用proteus仿真51单片机控制LCD1602的实例
//实例81:用LCD显示字符'A'
#includereg51.h //包含单片机寄存器的头文件
#includeintrins.h //包含_nop_()函数定义的头文件
sbit RS=P2^0; //寄存器选择位,将RS位定义为P2.0引脚
sbit RW=P2^1; //读写选择位,将RW位定义为P2.1引脚
sbit E=P2^2; //使能信号位,将E位定义为P2.2引脚
sbit BF=P0^7; //忙碌标志位,,将BF位定义为P0.7引脚
/*****************************************************
函数功能:延时1ms
(3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒
***************************************************/
void delay1ms()
{
unsigned char i,j;
for(i=0;i10;i++)
for(j=0;j33;j++);
}
/*****************************************************
函数功能:延时若干毫秒
入口参数:n
***************************************************/
void delay(unsigned char n)
{
unsigned char i;
for(i=0;in;i++)
delay1ms();
}
/*****************************************************
函数功能:判断液晶模块的忙碌状态
返回值:result。result=1,忙碌;result=0,不忙
***************************************************/
unsigned char BusyTest(void)
{
bit result;
RS=0; //根据规定,RS为低电平,RW为高电平时,可以读状态
RW=1;
E=1; //E=1,才允许读写
_nop_(); //空操作
_nop_();
_nop_();
_nop_(); //空操作四个机器周期,给硬件反应时间
result=BF; //将忙碌标志电平赋给result
E=0;
return result;
}
/*****************************************************
函数功能:将模式设置指令或显示地址写入液晶模块
入口参数:dictate
***************************************************/
void WriteInstruction (unsigned char dictate)
{
while(BusyTest()==1); //如果忙就等待
RS=0; //根据规定,RS和R/W同时为低电平时,可以写入指令
RW=0;
E=0; //E置低电平(根据表8-6,写指令时,E为高脉冲,
// 就是让E从0到1发生正跳变,所以应先置"0"
_nop_();
_nop_(); //空操作两个机器周期,给硬件反应时间
P0=dictate; //将数据送入P0口,即写入指令或地址
_nop_();
_nop_();
_nop_();
_nop_(); //空操作四个机器周期,给硬件反应时间
E=1; //E置高电平
_nop_();
_nop_();
_nop_();
_nop_(); //空操作四个机器周期,给硬件反应时间
E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令
}
/*****************************************************
函数功能:指定字符显示的实际地址
入口参数:x
***************************************************/
void WriteAddress(unsigned char x)
{
WriteInstruction(x|0x80); //显示位置的确定方法规定为"80H+地址码x"
}
/*****************************************************
函数功能:将数据(字符的标准ASCII码)写入液晶模块
入口参数:y(为字符常量)
***************************************************/
void WriteData(unsigned char y)
{
while(BusyTest()==1);
RS=1; //RS为高电平,RW为低电平时,可以写入数据
RW=0;
E=0; //E置低电平(根据表8-6,写指令时,E为高脉冲,
// 就是让E从0到1发生正跳变,所以应先置"0"
P0=y; //将数据送入P0口,即将数据写入液晶模块
_nop_();
_nop_();
_nop_();
_nop_(); //空操作四个机器周期,给硬件反应时间
E=1; //E置高电平
_nop_();
_nop_();
_nop_();
_nop_(); //空操作四个机器周期,给硬件反应时间
E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令
}
/*****************************************************
函数功能:对LCD的显示模式进行初始化设置
***************************************************/
void LcdInitiate(void)
{
delay(15); //延时15ms,首次写指令时应给LCD一段较长的反应时间
WriteInstruction(0x38); //显示模式设置:16×2显示,5×7点阵,8位数据接口
delay(5); //延时5ms
WriteInstruction(0x38);
delay(5);
WriteInstruction(0x38);
delay(5);
WriteInstruction(0x0f); //显示模式设置:显示开,有光标,光标闪烁
delay(5);
WriteInstruction(0x06); //显示模式设置:光标右移,字符不移
delay(5);
WriteInstruction(0x01); //清屏幕指令,将以前的显示内容清除
delay(5);
}
void main(void) //主函数
{
LcdInitiate(); //调用LCD初始化函数
WriteAddress(0x07); //将显示地址指定为第1行第8列
WriteData('A'); //将字符常量'A'写入液晶模块
//字符的字形点阵读出和显示由液晶模块自动完成
}
标签: 基于proteus的51单片机仿真实例