当PWM1端输入波形而PWM2端置为低电平时,Q14,Q15导通,此时电机逆时针旋转,当PWM2端输入波形而PWM1端置为低电平时,Q13,Q16导通,此时电机顺时针旋转,此时只要将PWM1和PWM2两端接在单片机的I/O口上,可以很容易的实现控制,硬件整体电路如下:
上图中按键用于调节波形输出的占空比和切换正反转,通过H桥驱动直流电机,二极管用于续流,防止直流电机产生的电势将三极管击穿损坏。
2、温度测量及显示(LCD)
硬件整体电路图如下:
通过DS18B20测量温度,然后经过单片机的处理以后再通过LCD1602显示出来,电路图中的滑动变阻器用于调节LCD显示的对比度,发光二级管用于显示单片机当前处于工作状态,由后面的程序可以看出,发光二级管闪烁的时间间隔正好是读一次温度并且显示的时间,当然显示后有100微秒的延时。
三、软件设计
1、直流电机正反转及调速
直流电机正反转调速,软件设计的思想是利用单片机的外部中断0来变更标志位,从而实现正反转的控制,通过设置基本的定时时间来调节占空比,即首先设置一个单位时间,然后通过计数的方式来确定高电平的时间和低电平的时间,这样,输出波形不但频率可调,而且占空比也可调。具体实现如下:
#include
unsigned char b=5; unsigned char AA=5; unsigned char BB=5; sfr p2=0xa0; sfr p1=0x90; sbit p2_0=p2^0;
sbit p2_1=p2^1; sbit p1_0=p1^0; sbit p1_1=p1^1; sbit p1_2=p1^2; sbit p1_3=p1^3; bit flag1=0;
void saomiao()
{ if(p1_0==0) {a++;} else if(p1_1==0) { b++;} else if(p1_2==0)
{a--; }
else if(p1_3==0) {b--; } AA=a;
BB=b;
}
void int_r() interrupt 0 {flag1=!flag1; } void init(void)
//将地址定义等申明包含进来 //定义变量
//特殊功能寄存器绝对地址定义 //同上
//特殊功能寄存器位定义
//定义位变量为标志位 //按键扫描子程序
//按键按下,则高电平持续时间增加
//按键按下,则低电平持续时间增加
//按键按下,则高电平持续时间减少 //按键按下,则低电平持续时间减少
//外部中断0服务程序,中断号为0 //变更标志位,实现正反转切换
//程序的初始化
{ }
void main() {
init(); while(1) {
while(TF1==0); if(flag1==0) {
if(p2_0==1)
{
AA--; TF1=0;
//标志位清零
//等待定时时间到 //判断标志位
//调用初始化程序
EA=1;
//开总中断 //开外部中断
//中断方式置为边沿触发方式 //定时器1工作方式1 //计数初值高位,计时0.5ms //计数初值低位,计时0.5ms //启动定时器 //端口初始化 //端口初始化
EX0=1; IT0=1;
TMOD=0x10; TH1=0xFE; TL1=0x0C; TR1=1; p2_0=0; p2_1=0;
TH1=0xFE; //重新赋初值 TL1=0x0C; if(AA==0) {
p2_0=0; p2_1=0;
//取反 //其他位为零
//看高电平持续时间有没有到
saomiao(); }
}
else if(p2_0==0) { BB--; TF1=0; TH1=0xFE; TL1=0x0C; if(BB==0) { p2_0=1; p2_1=0; saomiao();
}
}
}
else if(flag1==1)
{
if(p2_1==1) { AA--; TF1=0; TH1=0xFE; TL1=0x0C; if(AA==0) {
p2_0=0;
//扫描看有没有按键按下
//取反 //其他位为零
//扫描看有没有按键按下
//判断标志位
//其他位为零