本文章实现基于80C51的交通灯程序设计以及使用proteus 8.13软件仿真实现
文章目录
前言
在电子学习过程中,学会使用一些常用的软件进行仿真是必不可少的,在本篇中将介绍proteus软件的安装及通过仿真51程序来演示基本操作。
一、Proteus软件介绍与安装
1.Proteus是什么?
Proteus是英国著名的EDA工具(仿真软件),从原理图布图、代码调试到单片机与外围电路协同仿真,一键切换到PCB设计,真正实现了从概念到产品的完整设计。是世界上唯一将电路仿真软件、PCB设计软件和虚拟模型仿真软件三合一的设计平台,其处理器模型支持8051、HC11、PIC10/12/16/18/24/30/DSPIC33、AVR、ARM、8086和MSP430等,2010年又增加了Cortex和DSP系列处理器,并持续增加其他系列处理器模型。在编译方面,它也支持IAR、Keil和MATLAB等多种编译器。
2.Proteus的特点![请添加图片描述](https://i-blog.csdnimg.cn/blog_migrate/d14ea30157b4ea42b61c81af4ee67833.png)
1.原理布图
2.PCB自动或人工布线
3.SPICE电路仿真
革命性的特点
1.互动的电路仿真
用户甚至可以实时采用诸如RAM,ROM,键盘,马达,LED,LCD,AD/DA,部分SPI器件,部分IIC器件。
2.仿真处理器及其外围电路
可以仿真51系列、AVR、PIC、ARM、等常用主流单片机。还可以直接在基于原理图的虚拟原型上编程,再配合显示及输出,能看到运行后输入输出的效果。配合系统配置的虚拟逻辑分析仪、示波器等,Proteus建立了完备的电子设计开发环境。
3.proteus软件安装
(1)Proteus软件安装包的下载在官网上找
(2)该软件傻瓜式安装,没有什么要说的,一直下一步就行。
4.Proteus软件的基础
(1)新建工程
(2)命名及修改保存路径
(3)选择Default
(4)
(5)
(6)在元件库中选择原件进行原理图创作
(7)本次实验选择的交通灯的电路
5.程序源码片段
main.c
#include "public.h"
unsigned char gsmg_code[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f};
unsigned char gsmg_tim[8]={0};
void main()
{
TIM_init();
while(1)
{
gsmg_tim[0]=gsmg_code[(time[0]-time[0]%10)/10];
gsmg_tim[1]=gsmg_code[time[0]%10];
gsmg_tim[2]=gsmg_code[(time[1]-time[1]%10)/10];
gsmg_tim[3]=gsmg_code[time[1]%10];
gsmg_tim[4]=gsmg_code[(time[2]-time[2]%10)/10];
gsmg_tim[5]=gsmg_code[time[2]%10];
gsmg_tim[6]=gsmg_code[(time[3]-time[3]%10)/10];
gsmg_tim[7]=gsmg_code[time[3]%10];
smg_display(gsmg_tim);
}
}
shumaguan.c
#include "public.h"
/*sbit flag_0=P2^2;
sbit flag_1=P2^3;
sbit flag_2=P2^4;*/
unsigned int time[4]={20,5,20,5};
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
sbit LED0=P3^0;
sbit LED1=P3^1;
sbit LED2=P3^2;
sbit LED3=P3^3;
sbit LED4=P3^4;
sbit LED5=P3^5;
sbit BEEP=P2^5;
void delay_10us(unsigned int ten_us)
{
while(ten_us--);
}
void smg_display(unsigned char gsmg_code[])
{
u8 i=0;
for(i=0;i<8;i++)
{
switch(i)//位选
{
case 0: LSC=1;LSB=1;LSA=1;SMG_A_DP_PORT=gsmg_code[0];//传送段选数据
break;
case 1: LSC=1;LSB=1;LSA=0;SMG_A_DP_PORT=gsmg_code[1];//传送段选数据
break;
case 2: LSC=1;LSB=0;LSA=1;SMG_A_DP_PORT=gsmg_code[2];//传送段选数据
break;
case 3: LSC=1;LSB=0;LSA=0;SMG_A_DP_PORT=gsmg_code[3];//传送段选数据
break;
case 4: LSC=0;LSB=1;LSA=1;SMG_A_DP_PORT=gsmg_code[4];//传送段选数据
break;
case 5: LSC=0;LSB=1;LSA=0;SMG_A_DP_PORT=gsmg_code[5];//传送段选数据
break;
case 6: LSC=0;LSB=0;LSA=1;SMG_A_DP_PORT=gsmg_code[6];//传送段选数据
break;
case 7: LSC=0;LSB=0;LSA=0;SMG_A_DP_PORT=gsmg_code[7];//传送段选数据
break;
}
delay_10us(100);//延时一段时间,等待显示稳定
SMG_A_DP_PORT=0x00;//消音
}
}
void smg_shuzi_decline(void)
{
static short int i=0,flag=0;
if(i%2==0)
{
LED0=0;LED1=LED2=LED3=1;
if(time[0]==0)
{
i=re_init(i);
flag=0;
}
else if(time[1]==0&&flag==0)
{
time[1]=time[3]=5;
flag++;
}
else if(time[1]==0&&flag==1)
{
time[1]=time[3]=10;
flag=0;
}
if(flag==1)
{
LED5=0;
}
else
LED4=0;
}
else
{
LED3=0;LED4=LED5=LED0=1;
if(time[1]==0)
{
i=re_init(i);
flag=0;
}
else if(time[0]==0&&flag==0)
{
time[0]=time[2]=5;
flag++;
}
else if(time[0]==0&&flag==1)
{
time[0]=time[2]=10;
flag=0;
}
if(flag==1)
{
LED2=0;
}
else
LED1=0;
}
time[0]--;
time[1]--;
time[2]--;
time[3]--;
}
short int re_init(short int i)
{
short int k=1000;
while(k--)
{
BEEP=!BEEP;
delay_10us(10);
}
if(i%2==1)
{
time[0]=30;
time[1]=10;
time[2]=30;
time[3]=10;
}
else
{
time[0]=10;
time[1]=30;
time[2]=10;
time[3]=30;
}
return i+1;
}
6.仿真结果演示
总结
通过熟练使用Protues仿真软件可以更好的学习电路设计和单片机原理,更能增强自己解决实际问题的能力。