#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
本站由北京市万商天勤律师事务所王兴未律师提供法律服务