附录2:光敏电阻、L298
光敏电阻器是利用半导体的光电效应制成的一种电阻值随入射光的强弱而改变的电阻器;入射光强,电阻减小,入射光弱,电阻增大。
L298N是SGS公司生产的直流电机驱动集成电路。内部包含4通道逻辑驱动电路,可以方便地驱动两个直流电机,或一个两相步进电机。工作电压为46V,输出电压最高可达50V,可以直接通过电源来调节输出电压;输出电流可达2.5A,最大可以达到4A,可驱动电感性负载;可以直接用单片机的IO口提供信号;而且电路简单,使用比较方便。L298N可接受标准TTL逻辑电平信号VSS,9脚VSS可接4.5~7V的电压。4脚VS接电源电压,VS电压范围VIH为+2.5~46V。1脚和15管脚下的发射极分别单独引出以便接入电流采样电阻,形成电流传感信号。L298可驱动2个电动机,此时OUT1,OUT2和OUT3,OUT4之间可分别接电动机。5、7、10、12脚接输入控制电平,控制电机正反转;ENA,ENB脚接控制使能端,控制电机的停转。
IN1 × 0 0 1 1
L298逻辑功能表 IN2 ENA × 0 0 0 1 1 0 1 1 0 电机状态 停止 停止 逆时针 顺时针 停止
11
附录3:原器件清单
元器件名称 元器器件型号 元器件个数 单片机 MSP430G2553 1 电机 1 74HC595 74HC595 2 电机驱动芯片 L298 1 比较器 LM311 1 集成运放 LM358 2 光敏电阻 1 电源 锂电池 1 传感器 霍尔传感器 1 按键 独立按键 1 电容 若干 电阻 若干 导线 若干
附录四: 程序清单
/************************************************* 程序功能:线阵LED图文显示 作者 :许卫 日期 :2013.7.25 All rights reserved!
*************************************************/
#include
#define uchar unsigned char #define uint unsigned int
/**74HC595引脚定义**/ #define L_DATA BIT1 #define L_CLK BIT5 #define L_STR BIT4 #define L_OE BIT3
/**全局变量定义**/
uchar t50ms,ts,tm=32,th=12; uchar count=0,num;
12
uchar Clock_buff[]={\
uchar const disp_buff[64]; uchar const num_buff[];
uchar sort_buff1[64]; uchar sort_buff2[64];
/****延时函数****/ void delay_ms(uint time) { uint i,j; for(i=time;i>0;i--) for(j=250;j>0;j--); }
/****延时函数****/
void delay_320us(uchar time) { uint i,j;
for(i=time;i>0;i--)
for(j=77;j>0;j--); //320us }
/****数组元素重新排序****/ void Re_sort() {
uchar i;
for(i=0;i<64;i++)
sort_buff1[63-i]=disp_buff[i]; for(i=0;i<32;i++) {
sort_buff2[2*i]=sort_buff1[2*i+1]; sort_buff2[2*i+1]=sort_buff1[2*i]; } }
/****单片机初始化函数****/ void mcu_init() {
WDTCTL=WDTPW+WDTHOLD;
BCSCTL1=CALBC1_1MHZ; //DCO设置为1M DCOCTL=CALDCO_1MHZ;
13
BCSCTL3|=LFXT1S_0; IFG1&=~OFIFG;
BCSCTL2 |=SELM_1; //设置主时钟MCLK为DCO,且频率为1MHz,子时钟1M。 }
/****定时器初始化函数****/ void TIMER_init() {
TACTL = TASSEL_2 +TACLR ; // SMCLK, Contmode 使计数模式为增计数 CCTL0 = CCIE; // CCR0 interrupt enabled CCR0 = 50000; //50毫秒 }
/****P1中断端口初始化****/ void P1_port_init() {
P1DIR&=~(BIT1+BIT5); //P1.1为霍尔中断 P1.5按键中断 P1SEL&=~(BIT1+BIT5); //第二功能 P1REN|= BIT1+BIT5; //上拉电阻使能 P1IE|=BIT1+BIT5; //设中断
P1IES|=BIT1+BIT5; //下降沿中断 P1IFG&=~(BIT1+BIT5); //中断标志清零 }
/****74HC595显示函数****/
void display(uchar bit_flag, uint disp_temp) //bit_flag为1,先写高位。为0,先写低位 {
unsigned int temp; unsigned char i;
P2DIR|=L_DATA+L_CLK+L_STR+L_OE; P2OUT&=~L_CLK; P2OUT&=~L_STR; P2OUT|=L_OE;
temp=disp_temp; if(bit_flag) {
for(i=0;i<16;i++) {
if(temp&0x8000) P2OUT|=L_DATA; else
14
P2OUT&=~L_DATA;
P2OUT|=L_CLK; //上升沿数据移位 P2OUT&=~L_CLK; temp<<=1; } } else {
for(i=0;i<16;i++) {
if(temp&0x0001) P2OUT|=L_DATA; else
P2OUT&=~L_DATA;
P2OUT|=L_CLK; //上升沿数据移位 P2OUT&=~L_CLK; temp>>=1; } }
P2OUT|=L_STR; //上升沿数据锁存 P2OUT&=~L_STR;
P2OUT&=~L_OE; //输出使能 }
/****写一个字符串****/ void disp_ascii(uchar *p) {
unsigned int temp; unsigned char i,j; for(j=0;*p!='\\0';j++) {
for(i=0;i<8;i++) //8列 {
temp=num_buff[2*i+(*p-0x30)*16]; temp<<=8;
temp|=num_buff[2*i+1+(*p-0x30)*16]; display(0,temp);
delay_320us(1); //间隔320us } p++; } }
15