您好,欢迎来到99网。
搜索
您的当前位置:首页步进电机检测铁片寻光入库

步进电机检测铁片寻光入库

来源:99网
主程序

#include #include #include

#include \"1602.h\"

#include \"AD_STC12C5A.h\" #include \"delayms.h\"

#define uint8 unsigned char #define uint16 unsigned int

#define motor P2

#define Coil_A1 0x0e // {A1=1;B1=0;C1=0;D1=0;}//A相通电,其他相断电 #define Coil_B1 0x0d// {A1=0;B1=1;C1=0;D1=0;}//B相通电,其他相断电 #define Coil_C1 0x0b// {A1=0;B1=0;C1=1;D1=0;}//C相通电,其他相断电 #define Coil_D1 0x07// {A1=0;B1=0;C1=0;D1=1;}//D相通电,其他相断电

#define Coil_AB1 0x0c// {A1=1;B1=1;C1=0;D1=0;}//AB相通电,其他相断电 #define Coil_BC1 0x09// {A1=0;B1=1;C1=1;D1=0;}//BC相通电,其他相断电 #define Coil_CD1 0x03// {A1=0;B1=0;C1=1;D1=1;}//CD相通电,其他相断电 #define Coil_DA1 0x06// {A1=1;B1=0;C1=0;D1=1;}//D相通电,其他相断电 #define Coil_OFF1 0x0f// {A1=0;B1=0;C1=0;D1=0;}//全部断电

#define Coil_A2 0xe0// {A2=1;B2=0;C1=0;D1=0;}//A相通电,其他相断电 #define Coil_B2 0xd0// {A2=0;B2=1;C1=0;D1=0;}//B相通电,其他相断电 #define Coil_C2 0xb0// {A2=0;B2=0;C1=1;D1=0;}//C相通电,其他相断电 #define Coil_D2 0x70// {A2=0;B2=0;C1=0;D1=1;}//D相通电,其他相断电

#define Coil_AB2 0xc0// {A2=1;B2=1;C1=0;D1=0;}//AB相通电,其他相断电 #define Coil_BC2 0x90// {A2=0;B2=1;C1=1;D1=0;}//BC相通电,其他相断电 #define Coil_CD2 0x30// {A2=0;B2=0;C1=1;D1=1;}//CD相通电,其他相断电 #define Coil_DA2 0x60// {A2=1;B2=0;C1=0;D1=1;}//D相通电,其他相断电 #define Coil_OFF2 0xf0// {A2=0;B2=0;C1=0;D1=0;}//全部断电

uint8 speed,i=0,a,bb=0,w,n,ii,times; uint16 k,ee,rr; //转N周

unsigned char s=0,m=0,h=0; //s=second ,m=minute, h=hour

char ad[16]; int mm[3];

float ad_numb; sbit jiejin=P3^2; sbit fengming=P3^4;

sbit bizhang1=P1^7; sbit bizhang2=P1^6; sbit bizhang3=P1^5;

void delay(uint16 t) {

uint16 x,y; for(x=t;x>0;x--)

for(y=920;y>0;y--); }

void go() //k 指一周 {

if(k>0) {

k--; switch(i) { case 0:motor=(Coil_A1 | Coil_A2);i++;break; case 1:motor=(Coil_AB1 | Coil_AB2);i++;break; case 2:motor=(Coil_B1 | Coil_B2);i++;break; case 3:motor=(Coil_BC1 | Coil_BC2);i++;break; case 4:motor=(Coil_C1 | Coil_C2);i++;break; case 5:motor=(Coil_CD1 | Coil_CD2);i++;break; case 6:motor=(Coil_D1 | Coil_D2);i++;break; case 7:motor=(Coil_DA1 | Coil_DA2);i=0;break; default:break; } } }

void right() //指一周 { if(k>0) { k--;

switch(i)

{ case 0:motor=(Coil_A1 | Coil_DA2);i++;break; case 1:motor=(Coil_AB1 |Coil_D2 );i++;break; case 2:motor=(Coil_B1 | Coil_CD2);i++;break; case 3:motor=(Coil_BC1 |Coil_C2 );i++;break; case 4:motor=(Coil_C1 | Coil_BC2);i++;break; case 5:motor=(Coil_CD1 |Coil_B2);i++;break; case 6:motor=(Coil_D1 | Coil_AB2);i++;break; case 7:motor=(Coil_DA1 |Coil_A2);i=0;break; default:break; }

} }

void left() //kk 指一周 {

if(k>0) { k--; switch(i) { case 0:motor=(Coil_DA1| Coil_A2);i++;break; case 1:motor=(Coil_D1| Coil_AB2);i++;break; case 2:motor=(Coil_CD1| Coil_B2);i++;break; case 3:motor=(Coil_C1| Coil_BC2);i++;break; case 4:motor=(Coil_BC1| Coil_C2);i++;break; case 5:motor=(Coil_B1| Coil_CD2);i++;break; case 6:motor=(Coil_AB1| Coil_D2);i++;break; case 7:motor=(Coil_A1| Coil_DA2);i=0;break; default:break; }

} }

void houtui() {

if(k>0) { k--;

switch(i) { case 0:motor=(Coil_DA1 | Coil_DA2);i++;break;

case 1:motor=(Coil_D1 | Coil_D2);i++;break; case 2:motor=(Coil_CD1 | Coil_CD2);i++;break; case 3:motor=(Coil_C1 | Coil_C2);i++;break; case 4:motor=(Coil_BC1 | Coil_BC2);i++;break; case 5:motor=(Coil_B1 | Coil_B2);i++;break; case 6:motor=(Coil_AB1 | Coil_AB2);i++;break; case 7:motor=(Coil_A1 | Coil_A2);i=0;break; default:break; } } }

void stop() {

motor=(Coil_OFF1 | Coil_OFF2 ); }

void bizhang(void) {

if(bizhang2==0 ) { a=2;k=145; //左转 while(k>0); a=0;k=340; //左转 四分之一圈 while(k>0); a=1;k=150; //后退 半圈 while(k>0); } }

/*------------------------------------------- 写入两个字符串函数 (先行后列) -------------------------------------------*/

void lcd_write_two(unsigned char line,unsigned char list,unsigned char Data) figures {

unsigned char unit,decade; // unit=the unit个位 unit单元 decade 十位 decade=0;unit=0;

//two=two decade=Data/10; //十位数 unit=Data-(decade*10); //个位数

lcd_write_char(line,list,decade+48); //十位显示 lcd_write_char(line,list+1,unit+48); // 个位显示 }

/*-------------------------------------------- 时钟函数

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

void lcd_time(unsigned char line,unsigned char list) {

if(s<60) // s=second

lcd_write_two(line,list+6,s); //秒 显示 else {

m++;s=0; }

if(m<60) //m=minute

lcd_write_two(line,list+3,m); //分 显示 else {

h++;m=0; }

if(h>11) //h=hour {

s=0;m=0;h=0; //清零 } else

lcd_write_two(line,list,h); //时 显示 lcd_write_char(line,list+2,58); // \":\" 显示 lcd_write_char(line,list+5,58); }

void lcd_ad(unsigned char line,unsigned char list,unsigned char channel) {

if(bb>2) bb=0; ad_numb=0.00; for(ii=10;ii>0;ii--) {

ad_numb+=adc8_start(channel); }

ad_numb=ad_numb/10.00; sprintf(ad,\"%3.0f\

lcd_write_string(line,list,ad);

mm[bb]=(int)ad_numb; bb++; }

void ad_judge(void) {

int judge; judge=mm[0]-mm[2]; if(judge>6) { a=1;k=2800; } if(judge<-6) { a=2;k=2800; } if(judge<=6 && judge>=-6) {a=0;k=2800;} if(mm[1]>=251) { fengming=0; a=0;k=50; while(k>0) { lcd_ad(0,4,0); lcd_ad(0,8,1); lcd_ad(0,12,2); } a=4; while(mm[1]>=252) { a=4; lcd_ad(0,4,0); lcd_ad(0,8,1); lcd_ad(0,12,2); } } }

void seek(void) {

lcd_ad(0,4,0); lcd_ad(0,8,1); lcd_ad(0,12,2);

ad_judge(); }

void main() {

TMOD |= 0x01; //使用模式1,16位定时器,使用\"|\"符号可以在使用多个定时器时不受影响

TH0=(65535-8000)/256; //给定初值 TL0=(65535-8000)%256;

EA=1; //总中断打开 ET0=1; //定时器中断打开 TR0=1; //定时器开关打开 //-----------定时器1开启与设置----------

TMOD |=0X10; //使用模式1 TH1=(65536-50000)/256; //晶振12m 50ms TL1=(65536-50000)%256; ET1=1; //开启定时器2中断 TR1=1; //启动定时器2 //----------------------------------------- speed=7;times=0;

jiejin=1; //P1口初始值 EX0=1; //外部中断0开 IT0=1; //边沿触发

ad_init(); //ad初始化 lcd_init(); //lcd初始化 delayms(100); lcd_clear();

w=0;n=1; ee=10000;

lcd_write_string(0,0,\"AD\"); lcd_write_char(0,3,'R'); lcd_write_char(0,11,'L');

lcd_write_string(1,0,\"TIME\"); lcd_time(1,5); a=0; while(1) {

16位定时器 while(n==1) { if(w==0) { a=0;k=190*3;w=1; } if(w==2) { a=1;k=146;w=3; } if(w>4) { a=0;w=5;k=2000; } if(k==0) {

w++; } lcd_time(1,5); } while(n==3) { a=2;k=150; while(k>0); lcd_time(1,5); n=4; speed=10; } while(n==4) { seek(); bizhang(); lcd_time(1,5); } } }

void timer0_isr(void) interrupt 1 {

if(times==speed) {

times=0; switch(a) {

case 0:go();break; case 1:right();break; case 2:left();break; case 3:houtui();break; case 4:stop();break; default:break; } }

times++;

TH0=(65536-1000)/256; //给定初值 TL0=(65536-1000)%256; }

void ISR_Key(void) interrupt 0 {

P2=0xff; a=4;

fengming=1; delay(2000); fengming=0; delay(1000);

n=3; for(k=100;k>0;k--) { houtui(); delayms(200); } }

void timer1(void) interrupt 3 {

static unsigned char num1=0; //定义一次 if(num1<20) num1++; //num1小于等于number时 num1自加加 else

{ s++; num1=0; //num1清零 }

TH1=(65536-50000)/256; //晶振12m 50ms TL1=(65536-50000)%256; }

AD寻光子程序

#include\"AD_STC12C5A.h\" #include\"delayms.h\"

#define ADC_OFF() ADC_CONTR = 0 #define ADC_ON (1 << 7) #define ADC_90T (3 << 5) #define ADC_180T (2 << 5) #define ADC_360T (1 << 5) #define ADC_540T 0

#define ADC_FLAG (1 << 4) //软件清0 #define ADC_START (1 << 3) //自动清0 #define ADC_CH0 0 #define ADC_CH1 1 #define ADC_CH2 2 #define ADC_CH3 3 #define ADC_CH4 4 #define ADC_CH5 5 #define ADC_CH6 6 #define ADC_CH7 7

/*---------------------------------------------------- AD初始化

----------------------------------------------------*/ void ad_init(void) {

P1ASF=0X1F; //打开P1八个ADC通道 ADC_RES=0; //清除寄存器(高八位)结果 ADC_RESL=0; //清除寄存器(低两位)结果

ADC_CONTR=0XE0; //1110 0000 开启A/D转换电源,设置最高转换速度 delayms(50); }

/********************* 做一次ADC转换 *******************/

unsigned int adc8_start(unsigned char channel) //channel = 0~7 { unsigned int adc; unsigned char i; ADC_RES = 0; ADC_RESL = 0; ADC_CONTR = (ADC_CONTR & 0xe0) | ADC_START | channel; i = 50; do{ if(ADC_CONTR & ADC_FLAG) { ADC_CONTR &= ~ADC_FLAG; adc = (unsigned int)ADC_RES; //adc = (adc << 2) | (ADC_RESL & 3); return adc; } }while(--i); //超时检测 return 256; }

/*------------------------------------------------- 求100次采集电压的品均值

float ad_av(unsigned char channel) //av=advance 平均值 {

float val_av=0; //定义浮点 unsigned char num;

for(num=10;num>0;num--)

val_av += adc8_start(channel); //100次采集求和 val_av /=10.0; //求平均值

// val_av=val_av*5.0/1024; //单片机电源电压为5V,求的真实电压值 return(val_av); //返回函数 }

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

1602液晶显示子程序

/*------------------------------------------------------- //功能:1602液晶4位数据线 2012-5-11 ---------------------------------------------------------*/

#include \"1602.h\" #include \"delayms.h\"

#define data_port P0

sbit rs=P3^5; //数据、命令选择端口 sbit rw=P3^6; //读写选择端 sbit en=P3^7; //使能信号

/*------------------------------------------------ 判忙函数

------------------------------------------------*/ bit lcd_busy(void) {

data_port= 0xFF; rs=0; rw=1; en=0;

_nop_();_nop_();_nop_(); en=1;

return (bit)(data_port & 0x80); }

/*------------------------------------------------ 写入命令函数

------------------------------------------------*/ void lcd_write_com(unsigned char com) {

while(lcd_busy()); //忙则等待 rs=0; rw=0; en=1; data_port=com; _nop_();_nop_();_nop_(); en=0; }

/*------------------------------------------------ 写入数据函数

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

void lcd_write_data(unsigned char Data) {

while(lcd_busy()); //忙则等待 rs=1; rw=0; en=1; data_port=Data; _nop_();_nop_();_nop_(); en=0; }

/*----------------------------------------------- 清屏函数

-----------------------------------------------*/ void lcd_clear(void) {

lcd_write_com(0x01); delayms(5); }

/*---------------------------------------------- 写入字符串函数 (先行后列) list 列 line 行 ----------------------------------------------*/

void lcd_write_string(unsigned char line,unsigned char list, unsigned char *s) {

if(line==0)

lcd_write_com(0x80+list); else lcd_write_com(0xc0+list); while(*s) { lcd_write_data(*s); s++; } }

/*--------------------------------------------- 写入字符函数 (先行后列) line 行 list 列

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

void lcd_write_char(unsigned char line,unsigned char list,unsigned char Data) {

if(line==0)

lcd_write_com(0x80+list); else

lcd_write_com(0xc0+list); lcd_write_data(Data); }

/*------------------------------------------- LCD初始化

--------------------------------------------*/ void lcd_init(void) {

lcd_write_com(0x38); //显示模式设置 0011 1000 delayms(10);

lcd_write_com(0x38); //显示模式设置 0011 1000

lcd_write_com(0x08); //显示关闭 0000 1000 lcd_write_com(0x01); //显示清屏 0000 0001 lcd_write_com(0x06); //显示光标移动设置 0000 0110 delayms(5);

lcd_write_com(0x0c); //显示开及光标设置 0000 1100 }

延时子程序

#include \"delayms.h\"

void delayms(unsigned int t) //延时t*1ms {

unsigned int k; unsigned char i;

for(k = t; k > 0; k--) for(i = 220; i > 0; i--); }

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- 99spj.com 版权所有 湘ICP备2022005869号-5

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务