微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 用PROTEUS对单片机进行仿真的方法与实例

用PROTEUS对单片机进行仿真的方法与实例

时间:11-25 来源:互联网 点击:
名称元件种类(Category)子种类(Sub-category)
单片机AT89C2051Microprocessor ICs8051 Family
电阻器RESResistorsGeneric
可变电阻器POT-LINResistorsVariable
三极管2N2905TransistorsBipolar
电感器IND-AIRInductorsGeneric
4位共阴数码管7SEG-MPX4-CAOptoelectronics7-Segment Displays

绘制好的仿真电路图如图9。图中添加示波器时,先左键选择模型选择工具



栏中的 图标,再选择OSCILLOSCOPE,并在原理图编辑窗口中左击,这样示波器就被放置到原理图中了。
由于AT89C2051的P1.0和P1.1是复用端口,除了作I/O口外,还有一个功能是作为电压比较器的输入端,P1.0为同相输入端,P1.1为反相输入端,这里作电压比较器的输入端使用,因此在设置AT89C2051的属性时要将其设置电压比较器的输入端,即Ehable Comparator选择Yes,如图10。



被测电感器的电感量定为1H。单击开始仿真,可变电阻RP1是用来校准测量值的,按动RP1的+或-按钮,调节RP1使数码管显示100。仿真结果见图10。电阻R2为换挡电阻,改变它的值即可改变挡位。
2. 充电器
这是用PIC12F675单片机做的充电器,能对两节镍镉或镍氢电池充电,充电器采用电压监测的方法判断充电是否结束,充电结束后能自动停止充电。
图11是电路图,图中PIC12F675的7脚作模拟信号输入端AN0使用。单片


机使用内部时钟振荡器,引脚3作充电控制电压输出端GP4使用。S为复位开关,复位开关主要在重新放上电池后使用。
接上电源后,PIC12F675的GP4输出低电平,三极管VT1饱和导通,两节电池开始充电。随着电池电压的上升,输入到单片机的模拟电压也不断升高,当电压大于预定的设定值3V时,GP4输出高电平使VT1截止,电池停止充电,并自锁在这一工作状态,即使电池在停止充电后电压略有下降也不会重新进行充电。
在PIC单片机的MPLAB IDE编译器中输入下列程序:
#INCLUDE "P12F675.INC"
W_TEMP EQU 20H
SW EQU 21H
TEMP EQU 22H
ORG 000H
MAIN NOP
MOVLW 00H
MOVWF SW
MOVLW 95H
MOVWF TEMP
BSF STATUS,RP0
MOVLW B00001001
MOVWF TRISIO
MOVLW B00000001
MOVWF ANSEL
MOVLW B10000111
MOVWF OPTION_REG
BCF STATUS,RP0
MOVLW B00000111
MOVWF CMCON
BCF GPIO,GP4
BSF GPIO,GP5
LOOP BTFSC SW,0
GOTO LOOP
MOVLW B00000001
MOVWF ADCON0
BSF ADCON0,GO
ADC BTFSS PIR1,ADIF
GOTO ADC
MOVF ADRESH,0
SUBWF TEMP,0
BTFSC STATUS,C
GOTO LOOP
BSF GPIO,GP4
BCF GPIO,GP5
BSF SW,0
GOTO LOOP
END
然后编译生成目标文件charger.hex。
对充电器仿真时有一个难点,就是Proteus元件库中没有可仿真的充电电池,它的电池元件加上充电电流后电压不会上升,为此可在电池上串一只可变电阻,这样改变可变电阻的大小就可以就可以改变充电回路两端的电压,用来模拟电池电压的变化。
电路中所使用的元件见表3。



表3

名称元件种类(Category)子种类(Sub-category)
单片机PIC16F675Microprocessor ICsPIC12 Family
电阻器RESResistorsGeneric
可变电阻器POT-LINResistorsVariable
三极管2N5415TransistorsBipolar
按钮开关BUTTONSwitches & RelaysSwitches
发光二极管LED-REDOptoelectronicsLEDs
单节电池CELLMiscellaneous

绘制仿真电路图时添加直流电压表和上例中选择示波器类似,先左键选择模型选择工具栏中的 图标,再选择DC VOLTMETER即可。
将可变电阻器RP1滑动触点调到中点以下的位置单击 开始仿真,仿真结果见图12。





RP1的滑动触点向上调节,电压表的读数会逐渐上上升,当读数大于3V时,会停止充电,发光二极管VD1熄灭,电压表的读数恢复为2.5V,这时即使我们把RP1 滑动触点调到中点以下也不会重新充电,只有按一下复位键S1才会重新充电。
3. 电机调速控制器
直流电机的调速主要调整其工作电流,通常有两种方式:一种是在电机供电电路中串接一个可变电阻,通过改变可变电阻的阻值调节工作电流,从而调节转速;另一种方法是在直流电机上加直流脉冲电压,通过改变脉冲直流电的占空比来调节转速。前一种方法因为可变电阻上有压降要损耗功率,所以效率不高,只有用小功率直流电机时使用,后一种工作效率高,如目前的电动自行车都采用这种调速方式。
下面用AVR单片机ATmega8设计一个电机调速控制器,使其定时/计数器T/C1工作在PWM模式,作为PWM脉宽调制器。
在ICCAVR编译器中输入下列程序:
#include
#define uchar unsigned char
char k;

void DelayMs(char i)
{
char j;
for(;i!=0;i--)
{for(j=143;j!=0;j--);}
}

#pragma interrupt_handler INT_0:2
void INT_0(void)
{
if(k!=250)
k=k+5;
OCR1A=k; //设置PWM参数
DelayMs(100);
}

#pragma interrupt_handler INT_1:3
void INT_1(void)
{
if(k!=5)
k=k-5;
OCR1A=k; //设置PWM参数
DelayMs(100);
}

void main(void)
{
DDRD=0X00;
PORTD=0xff; //设置PD口为带上拉电阻的输入口
DDRB=0xff; //设置PB口为推挽1输出
PORTB=0xff;
SREG=0x80; //开全局中断
GICR=0xc0; //开外部中断
TCCR1A=0xc1; //8位PWM,向上计数置位OC1A,向下计数清零OC1A
TCCR1B=0x01; //时钟1分频,PWM信号频率为1M/512=2KHz
k=125;
OCR1A=k; //设置PWM参数
while(1);
}
编译生成目标文件djts.hex。
电路中所使用的元件见表4。
表4

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top