蓝侨杯单片机编程笔记-胡昶威 联系客服

发布时间 : 星期四 文章蓝侨杯单片机编程笔记-胡昶威更新完毕开始阅读072e6f6cdd3383c4ba4cd20a

while(1){

/** 200毫秒更新一次数据 */ if(s_flag) {

s_flag = 0;

/** 关闭定时器0中断:计算超声波发送到返回的时间 send_wave(); //发送方波信号 TR1 = 1; //启动计时 while((RX == 1) && (TF1 == 0)); //等待收到脉冲 TR1 = 0; //关闭计时 //发生溢出 if(TF1 == 1) { TF1 = 0; distance = 9999; //无返回 } else { /** 计算时间 */ t = TH1; t <<= 8; t |= TL1; distance = (unsigned int)(t*0.017); //计算距离 } TH1 = 0; TL1 = 0; } /** 数据处理 */ dspbuf[5] = distance/100; dspbuf[6] = distance0/10; dspbuf[7] = distance; } }

//定时器0中断服务函数

void isr_timer_0(void) interrupt 1 //默认中断优先级 1 {

TH0 = (65536-2000)/256;

TL0 = (65536-2000)%6; //定时器重载

display(); //2ms执行一次

if(++intr == 200){ s_flag = 1; intr = 0; } }

//显示函数

void display(void){

XBYTE[0xE000] = 0xff; //去除鬼影

XBYTE[0xC000] = (1<

XBYTE[0xE000] = tab[dspbuf[dspcom]];

if(++dspcom == 8){ dspcom = 0; } }

//TX引脚发送40KHz方波信号驱动超声波发送探头 void send_wave(void) {

unsigned char i = 8; //发送8个脉冲 do { TX = 1; somenop; TX = 0; somenop; }

while(i--);

}

必要时还可以加个看门狗: WDT_CONTR=0x34;

十、 步进电机与直流电机的使用(不一定考,预防万一而已)

参考代码如下:

#include

sbit A1=P1^4; //定义步进电机连接端口 sbit B1=P1^3; sbit C1=P1^2; sbit D1=P1^1; void qudong1();

#define Dy_A1 {A1=1;B1=0;C1=0;D1=0;}//A相通电,其他相断电 #define Dy_B1 {A1=0;B1=1;C1=0;D1=0;}//B相通电,其他相断电 #define Dy_C1 {A1=0;B1=0;C1=1;D1=0;}//C相通电,其他相断电 #define Dy_D1 {A1=0;B1=0;C1=0;D1=1;}//D相通电,其他相断电 //采用1相励磁

#define Dy_OFF {A1=0;B1=0;C1=0;D1=0;}//全部断电 unsigned char Speed,Speed1;

/*------------------------------------------------

uS延时函数,含有输入参数 unsigned char t,无返回值 unsigned char 是定义无符号字符变量,其值的范围是

0~255 这里使用晶振12M,精确延时请使用汇编,大致延时 长度如下 T=tx2+5 uS

------------------------------------------------*/ void DelayUs2x(unsigned char t) {

while(--t); }

/*------------------------------------------------

mS延时函数,含有输入参数 unsigned char t,无返回值 unsigned char 是定义无符号字符变量,其值的范围是 0~255

------------------------------------------------*/ void DelayMs(unsigned char t) {

while(t--) {

//大致延时1mS DelayUs2x(245); DelayUs2x(245); } }

/*------------------------------------------------ 主函数

------------------------------------------------*/ main() {

Dy_OFF; for(;;) {

qudong1(); } }

void qudong1() {

unsigned int i=470;//旋转一周时间 Speed=5;

while(i--) //正向

{

Dy_A1

//遇到Coil_A1 用{A1=1;B1=0;C1=0;D1=0;}代替 DelayMs(Speed); //改变这个参数可以调整电机转速 ,

//数字越小,转速越大,力矩越小 Dy_B1 //顺序从A1--D1相通电如果为正转,那么顺序从D1--A1相通电则为反转

DelayMs(Speed); Dy_C1

DelayMs(Speed); Dy_D1

DelayMs(Speed); }

Dy_OFF i=512;

while(i--)//反向 {

Dy_D1 //遇到Coil_A1 用{A1=1;B1=0;C1=0;D1=0;}代替

DelayMs(Speed); //改变这个参数可以调整电机转速 ,

//数字越小,转速越大,力矩越小 Dy_C1

DelayMs(Speed); Dy_B1

DelayMs(Speed); Dy_A1

DelayMs(Speed); } }

直流电机:

#include

#define uint unsigned int void drive(); void delay(uint);

sbit dj1=P1^0; //电机,1引脚 uint set; //set为电机转角标志位

unsigned char angle,angle1; //angle为电机PWM变化打角 void Time0_Init() //中断初始化 {

TMOD=0X01; IE=0X82;