接上电源后,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) |
单片机 | PIC16F675 | Microprocessor ICs | PIC12 Family |
电阻器 | RES | Resistors | Generic |
可变电阻器 | POT-LIN | Resistors | Variable |
三极管 | 2N5415 | Transistors | Bipolar |
按钮开关 | BUTTON | Switches & Relays | Switches |
发光二极管 | LED-RED | Optoelectronics | LEDs |
单节电池 | CELL | Miscellaneous | |
绘制仿真电路图时添加直流电压表和上例中选择示波器类似,先左键选择模型选择工具栏中的 图标,再选择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
名称 | 元件 | 种类(Category) | 子种类(Sub-category) |
单片机 | ATmega8 | Microprocessor ICs | AVR Family |
电阻器 | RES | Resistors | Generic |
三极管 | 2N3054 | Transistors | Bipolar |
按钮开关 | BUTTON | Switches & Relays | Switches |
电池 | BATTERY | Miscellaneous | |
直流电机 | MOTOR | Electromechanical | |
绘制好仿真电路图,仿真结果见图13。

当按下S1时,PB1输出PWM信号占空比减小,电机速度减小;当按下S2时,PB1输出PWM信号占空比增加,电机速度增加。从示波器上可以看到PWM信号占空比在调节时的变化。
4. 智力竞赛抢答器
用单片机AT89C51做一个抢答器,供8组抢答,当主持人按一下开始键后即可开始抢答,当某一组按下抢答键后,其它各组的按键被锁定,主机上的数码管显示相应的组号,同时该组桌上的发光二极管也点亮,并发出1秒钟的报警声,数码管和发光二极管的显示时间为5秒钟。
在Keil uVision编译器中输入下列程序:
#include
unsigned char n,i;
unsigned long int m,t;
sbit S1=P0^0;
sbit S2=P0^1;
sbit S3=P0^2;
sbit S4=P0^3;
sbit S5=P0^4;
sbit S6=P0^5;
sbit S7=P0^6;
sbit S8=P0^7;
sbit VD1=P1^0;
sbit VD2=P1^1;
sbit VD3=P1^2;
sbit VD4=P1^3;
sbit VD5=P1^4;
sbit VD6=P1^5;
sbit VD7=P1^6;
sbit VD8=P1^7;
sbit SOUND=P3^0;
sbit START=P3^1;
void delay(t) //延时子程序
{
for(;t>0;t--)
{ for(i=0;i<250;i++); }
}
void main() //主程序
{
while(1) //无限循环
{
if(START==0)//若开始键按下
{
n=0;
while(n==0)//若n=0,循环执行
{
if(S1==0)//若S1按下
{VD1=0;P2=0x79;n=1;} //发光二极管VD1点亮,数码管显示1
else if(S2==0) //若S2按下
{VD2=0;P2=0x24;n=1;} //发光二极管VD2点亮,数码管显示2
else if(S3==0) //若S3按下
{VD3=0;P2=0x30;n=1;} //发光二极管VD3点亮,数码管显示3
else if(S4==0) //若S4按下
{VD4=0;P2=0x19;n=1;} //发光二极管VD4点亮,数码管显示4
else if(S5==0) //若S5按下
{VD5=0;P2=0x12;n=1;} //发光二极管VD5点亮,数码管显示5
else if(S6==0) //若S6按下
{VD6=0;P2=0x02;n=1;} //发光二极管VD6点亮,数码管显示6
else if(S7==0) //若S7按下
{VD7=0;P2=0x78;n=1;} //发光二极管VD7点亮,数码管显示7
else if(S8==0) //若S8按下
{VD8=0;P2=0x00;n=1;} //发光二极管VD8点亮,数码管显示8
}
for(m=0;m<1000;m++) //发出1秒报警声
{
SOUND=!SOUND;
delay(1);
}
delay(5000); //发光二极管、数码管继续点亮5秒
P1=0xff;
P2=0xff;
}
}
}
将上述源程序编译生成目标文件vie_answer.hex。
电路中所使用的元件见表5。
表5
名称 | 元件 | 种类(Category) | 子种类(Sub-category) |
单片机 | AT89C51 | Microprocessor ICs | 8051 Family |
电阻器 | RES | Resistors | Generic |
三极管 | 2N2905 | Transistors | Bipolar |
共阳数码管 | 7SEG-COM-ANODE | Optoelectronics | 7-Segment Displays |
扬声器 | SPEAKER | Speakers & Sounders | |
绘制好仿真电路图,设置好有关元件的属性,仿真后先按一下开始按钮S9,再按一下S1~S8中的任一个按钮比如S6,仿真结果见图14。

关键词:
PROTEUS单片机仿
加入微信
获取电子行业最新资讯
搜索微信公众号:EEPW
或用微信扫描左侧二维码