for(m=0;m<250;m++);
}
voidmain()//主程序
{TMOD=0x01;//定时器T0方式1
while
(1)//无限循环
{
t=BitTab[j];//取位值
P1=P1|0x38;//P1.3-P1.5送1
P1=P1&t;//P1.3-P1.5输出取出的位值
t=DispBuf[j];//取出待显示的数
t=DispTab[t];//取字形码
P3=t;//字型码由P3输出显示
Delay1ms(5);
j++;//j作为数码管的计数器,取值0-2,显示程序通过它确认显示哪个数码管
if(j==3)
j=0;
TH0=0;
TL0=0;
P1_2=0;//测试开始
TR0=1;//开定时器T0
for(;P3_6==0;);//判断电阻上的电压上升到参考电压否
TR0=0;//电压达到参考电压,关定时器T0
P1_2=1;
L=TL0|(TH0<<8);//取定时器T0中的数值
L=L-3;
if(L>=200)
{
DispBuf[2]=10;
DispBuf[1]=10;
DispBuf[0]=1;//超量程,百位数显示1,个位、十位不显示(灭)
}
else//不超量程,取各位数值
{
DispBuf[2]=L;//取个位数
L=L/10;
DispBuf[1]=L;//取十位数
DispBuf[0]=L/10;//取百位数
}
}
}
用KeiluVision将上述程序编译生成目标文件DGZS.hex。
电路中所使用的元件见表2。
表2
名称
元件
种类(Category)
子种类(Sub-category)
单片机
AT89C2051
MicroprocessorICs
8051Family
电阻器
RES
Resistors
Generic
可变电阻器
POT-LIN
Resistors
Variable
三极管
2N2905
Transistors
Bipolar
电感器
IND-AIR
Inductors
Generic
4位共阴数码管
7SEG-MPX4-CA
Optoelectronics
7-SegmentDisplays
绘制好的仿真电路图如图9。
图中添加示波器时,先左键选择模型选择工具
栏中的图标,再选择OSCILLOSCOPE,并在原理图编辑窗口中左击,这样示波器就被放置到原理图中了。
由于AT89C2051的P1.0和P1.1是复用端口,除了作I/O口外,还有一个功能是作为电压比较器的输入端,P1.0为同相输入端,P1.1为反相输入端,这里作电压比较器的输入端使用,因此在设置AT89C2051的属性时要将其设置电压比较器的输入端,即EhableComparator选择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单片机的MPLABIDE编译器中输入下列程序:
#INCLUDE"P12F675.INC"
W_TEMPEQU20H
SWEQU21H
TEMPEQU22H
ORG000H
MAINNOP
MOVLW00H
MOVWFSW
MOVLW95H
MOVWFTEMP
BSFSTATUS,RP0
MOVLWB'00001001'
MOVWFTRISIO
MOVLWB'00000001'
MOVWFANSEL
MOVLWB'10000111'
MOVWFOPTION_REG
BCFSTATUS,RP0
MOVLWB'00000111'
MOVWFCMCON
BCFGPIO,GP4
BSFGPIO,GP5
LOOPBTFSCSW,0
GOTOLOOP
MOVLWB'00000001'
MOVWFADCON0
BSFADCON0,GO
ADCBTFSSPIR1,ADIF
GOTOADC
MOVFADRESH,0
SUBWFTEMP,0
BTFSCSTATUS,C
GOTOLOOP
BSFGPIO,GP4
BCFGPIO,GP5
BSFSW,0
GOTOLOOP
END
然后编译生成目标文件charger.hex。
对充电器仿真时有一个难点,就是Proteus元件库中没有可仿真的充电电池,它的电池元件加上充电电流后电压不会上升,为此可在电池上串一只可变电阻,这样改变可变电阻的大小就可以就可以改变充电回路两端的电压,用来模拟电池电压的变化。
电路中所使用的元件见表3。
表3
名称
元件
种类(Category)
子种类(Sub-category)
单片机
PIC16F675
MicroprocessorICs
PIC12Family
电阻器
RES
Resistors
Generic
可变电阻器
POT-LIN
Resistors
Variable
三极管
2N5415
Transistors
Bipolar
按钮开关
BUTTON
Switches&Relays
Switches
发光二极管
LED-RED
Optoelectronics
LEDs
单节电池
CELL
Miscellaneous
绘制仿真电路图时添加直流电压表和上例中选择示波器类似,先左键选择模型选择工具栏中的图标,再选择DCVOLTMETER即可。
将可变电阻器RP1滑动触点调到中点以下的位置单击开始仿真,仿真结果见图12。
RP1的滑动触点向上调节,电压表的读数会逐渐上上升,当读数大于3V时,会停止充电,发光二极管VD1熄灭,电压表的读数恢复为2.5V,这时即使我们把RP1滑动触点调到中点以下也不会重新充电,只有按一下复位键S1才会重新充电。
3.电机调速控制器
直流电机的调速主要调整其工作电流,通常有两种方式:
一种是在电机供电电路中串接一个可变电阻,通过改变可变电阻的阻值调节工作电流,从而调节转速;另一种方法是在直流电机上加直流脉冲电压,通过改变脉冲直流电的占空比来调节转速。
前一种方法因为可变电阻上有压降要损耗功率,所以效率不高,只有用小功率直流电机时使用,后一种工作效率高,如目前的电动自行车都采用这种调速方式。
下面用AVR单片机ATmega8设计一个电机调速控制器,使其定时/计数器T/C1工作在PWM模式,作为PWM脉宽调制器。
在ICCAVR编译器中输入下列程序:
#include
#defineucharunsignedchar
chark;
voidDelayMs(chari)
{
charj;
for(;i!
=0;i--)
{for(j=143;j!
=0;j--);}
}
#pragmainterrupt_handlerINT_0:
2
voidINT_0(void)
{
if(k!
=250)
k=k+5;
OCR1A=k;//设置PWM参数
DelayMs(100);
}
#pragmainterrupt_handlerINT_1:
3
voidINT_1(void)
{
if(k!
=5)
k=k-5;
OCR1A=k;//设置PWM参数
DelayMs(100);
}
voidmain(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
MicroprocessorICs
AVRFamily
电阻器
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秒钟。
在KeiluVision编译器中输入下列程序:
#include
unsignedcharn,i;
unsignedlongintm,t;
sbitS1=P0^0;
sbitS2=P0^1;
sbitS3=P0^2;
sbitS4=P0^3;
sbitS5=P0^4;
sbitS6=P0^5;
sbitS7=P0^6;
sbitS8=P0^7;
sbitVD1=P1^0;
sbitVD2=P1^1;
sbitVD3=P1^2;
sbitVD4=P1^3;
sbitVD5=P1^4;
sbitVD6=P1^5;
sbitVD7=P1^6;
sbitVD8=P1^7;
sbitSOUND=P3^0;
sbitSTART=P3^1;
voiddelay(t)//延时子程序
{
for(;t>0;t--)
{for(i=0;i<250;i++);}
}
voidmain()//主程序
{
while
(1)//无限循环
{
if(START==0)//若开始键按下
{
n=0;
while(n==0)//若n=0,循环执行
{
if(S1==0)//若S1按下
{VD1=0;P2=0x79;n=1;}//发光二极管VD1点亮,数码管显示1
elseif(S2==0)//若S2按下
{VD2=0;P2=0x24;n=1;}//发光二极管VD2点亮,数码管显示2
elseif(S3==0)//若S3按下
{VD3=0;P2=0x30;n=1;}//发光二极管VD3点亮,数码管显示3
elseif(S4==0)//若S4按下
{VD4=0;P2=0x19;n=1;}//发光二极管VD4点亮,数码管显示4
elseif(S5==0)//若S5按下
{VD5=0;P2=0x12;n=1;}//发光二极管VD5点亮,数码管显示5
elseif(S6==0)//若S6按下
{VD6=0;P2=0x02;n=1;}//发光二极管VD6点亮,数码管显示6
elseif(S7==0)//若S7按下
{VD7=0;P2=0x78;n=1;}//发光二极管VD7点亮,数码管显示7
elseif(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
MicroprocessorICs
8051Family
电阻器
RES
Resistors
Generic
三极管
2N2905
Transistors
Bipolar
共阳数码管
7SEG-COM-ANODE
Optoelectronics
7-SegmentDisplays
扬声器
SPEAKER
Speakers&Sounders
绘制好仿真电路图,设置好有关元件的属性,仿真后先按一下开始按钮S9,再按一下S1~S8中的任一个按钮比如S6,仿真结果见图14。
欢迎您的下载,资料仅供参考!