发布时间 : 星期日 文章蓝侨杯单片机编程笔记-胡昶威更新完毕开始阅读
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;