前言:
眼前姐妹们对“基于单片机的步进电机控制实验报告”大体比较注意,姐妹们都想要分析一些“基于单片机的步进电机控制实验报告”的相关内容。那么小编同时在网摘上汇集了一些关于“基于单片机的步进电机控制实验报告””的相关内容,希望朋友们能喜欢,你们快快来了解一下吧!#include<reg51.h>#include<intrins.h>#define uchar unsigned char #define uint unsigned int//IO定义区sbit LCD1602_E =P2^7;sbit LCD1602_RW=P2^5;sbit LCD1602_RS=P2^6;sbit DS18B20_PORT=P3^7;#define GPIO_MOTOR P1#define LCD1602_DATAPINS P0//函数声明区void LcdDisplay(int);void LCDWrite_String(uchar x, uchar y, uchar *s);void LCD_set_xy(uchar x,uchar y);void LcdInit(void);void LcdWriteData(uchar dat);void LcdWriteCom(uchar com);/*在51单片机12MHZ时钟下的延时函数*/void Delay1ms(uint dat);uchar Ds18b20Init(void);void Ds18b20WriteByte(uchar com);uchar Ds18b20ReadByte(void);void Ds18b20ChangTemp(void);void Ds18b20ReadTempCom(void);int Ds18b20ReadTemp(void);//步进电机正反转表uchar code Reverse[8]={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9}; //反转顺序uchar code Forward[8]={0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0xf1}; //正转顺序 //ROM 相序int Direction,Time,Speed=2;uchar state=0;uchar keyvalue=0;uchar keystate=0;void Motor(void){ static uchar i=0; GPIO_MOTOR = Forward[i]&0x1f;//Forward[i] & 0001 1111 //相序 i++; if(i>7) i=0; }void Timer0(void) interrupt 1 using 1{ TH0 = 0xfC; //设置初始值 TL0 = 0x18; Time++; if(Time>=Speed) //在一定范围内,温度越高 Speed值越小 10 80 次 中断800次,才调用MOTOR motor调用8次 转一圈 { Time=0; Motor(); }}int main(void){ int discard;//抛弃 //85度:视为丢弃值 uchar i=0; LcdInit(); Direction=2; Speed=20; Ds18b20Init(); discard=Ds18b20ReadTemp(); //读取第一次温度并弃用 Delay1ms(750); //常量字符串 LCDWrite_String(0, 0, " Current Temp :"); LCDWrite_String(0, 1, " Temp:"); LcdDisplay(Ds18b20ReadTemp()); //显示第二次温度:正确的温度 TMOD |= 0x01; //选择工作方式1 TH0 = 0xfC; //设置初始值,定时1MS TL0 = 0x18; EA = 1; //打开总中断 ET0 = 1; TR0 = 1; //打开定时器0中断//启动定时器0 while(1) { while(1) { if(i>5) { LcdDisplay(Ds18b20ReadTemp()); //采集的间隔时间 i=0; } i++; Delay1ms(10); } } return 0; }//温度显示void LcdDisplay(int temp) { uchar datas[5]; float t_dat; t_dat = temp;//因为数据处理有小数点所以将温度赋给一个浮点型变量 //如果温度是正的那么,那么正数的原码就是补码它本身 // //转换温度 temp = (int)(t_dat*0.0625*100+0.5);//原始温度转换为实际温度,并将实际温度扩大100 //留两个小数点就*100,+0.5是四舍五入 //分离数据的每个位 datas[0] = temp / 10000; datas[1] = temp % 10000 / 1000; datas[2] = temp % 1000 / 100; datas[3] = temp % 100 / 10; datas[4] = temp % 10; Speed=(120-temp/100); // 30 90 90 30 110 10 if(Speed<18) Speed=18;//MAX LcdWriteCom(0xc0+7); LcdWriteData('0'+datas[0]); //百位 LcdWriteData('0'+datas[1]); //十位 LcdWriteData('0'+datas[2]); //个位 LcdWriteData('.'); //显示 ‘.’ LcdWriteData('0'+datas[3]); //显示小数点 LcdWriteData(0xdf); LcdWriteData('C'); }//LCD1602函数区//LCD1602显示字符串void LCDWrite_String(uchar x, uchar y, uchar *s) //x 0~15 , y 0,1{ LCD_set_xy(x,y); while(*s) { LcdWriteData(*s); s++; }}//设置LCD1602坐标void LCD_set_xy(uchar x,uchar y){ if(y==0) { LcdWriteCom(0x80+x); } if(y==1) { LcdWriteCom(0xc0+x); }}//向LCD写入一个字节的命令void LcdWriteCom(uchar com) //写入命令{ LCD1602_E = 0; //使能 LCD1602_RS = 0; //选择发送命令 LCD1602_RW = 0; //选择写入 LCD1602_DATAPINS = com; //放入命令 Delay1ms(1); //等待数据稳定 LCD1602_E = 1; //写入时序 Delay1ms(5); //保持时间 LCD1602_E = 0;} //向LCD写入一个字节的数据 void LcdWriteData(uchar dat) { LCD1602_E = 0; //使能清零 LCD1602_RS = 1; //选择输入数据 LCD1602_RW = 0; //选择写入 LCD1602_DATAPINS = dat; //写入数据 Delay1ms(1); LCD1602_E = 1; //写入时序 Delay1ms(5); //保持时间 LCD1602_E = 0;}//LCD1602初始化void LcdInit(void) { LcdWriteCom(0x38); //开显示 LcdWriteCom(0x0c); //开显示不显示光标 LcdWriteCom(0x06); //写一个指针加1 LcdWriteCom(0x01); //清屏 LcdWriteCom(0x80); //设置数据指针起点}//延时函数,延时基准1msvoid Delay1ms(uint y){ uint i; for(y;y>0;y--) for(i=118;i>0;i--);}//Ds18b20初始化uchar Ds18b20Init(void){ uint i; DS18B20_PORT=0; //将总线拉低480us~960us i=70; while(i--);//延时642us DS18B20_PORT=1; //然后拉高总线,如果DS18B20做出反应会将在15us~60us后总线拉低 i=0; while(DS18B20_PORT) //等待DS18B20拉低总线 { i++; if(i>5000)//等待>5MS return 0;//初始化失败 } return 1;//初始化成功}//向DS18B20写入一个字节void Ds18b20WriteByte(uchar dat){ uint i,j; for(j=0;j<8;j++) { DS18B20_PORT=0; //每写入一位数据之前先把总线拉低1us i++; DS18B20_PORT=dat&0x01; //然后写入一个数据,从最低位开始 i=6; while(i--); //延时68us,持续时间最少60us DS18B20_PORT=1; //然后释放总线,至少1us给总线恢复时间才能接着写入第二个数值 dat>>=1; }}//读取DS18B20中的数据的一个字节uchar Ds18b20ReadByte(void){ uchar byte,bi; uint i,j; for(j=8;j>0;j--) { DS18B20_PORT=0;//先将总线拉低1us i++; DS18B20_PORT=1;//然后释放总线 i++; i++;//延时6us等待数据稳定 bi=DS18B20_PORT; //读取数据,从最低位开始读取 /*将byte左移一位,然后与上右移7位后的bi,注意移动之后移掉那位补0。*/ byte=(byte>>1)|(bi<<7); i=4; //读取完之后等待48us再接着读取下一个数 while(i--); } return byte;}//DS18b20开始转换温度void Ds18b20ChangTemp(void){ Ds18b20Init(); Delay1ms(1); Ds18b20WriteByte(0xcc); //跳过ROM操作命令 Ds18b20WriteByte(0x44); //温度转换命令// Delay1ms(100); //等待转换成功,而如果你是一直刷着的话,就不用这个延时了}//发送读取温度命令void Ds18b20ReadTempCom(void){ Ds18b20Init(); Delay1ms(1); Ds18b20WriteByte(0xcc); //跳过ROM操作命令 Ds18b20WriteByte(0xbe); //发送读取温度命令}//读取DS18B20的温度数据(原始数据)int Ds18b20ReadTemp(void){ int temp=0; uchar tmh,tml; EA=0; Ds18b20ChangTemp(); //先写入转换命令 Ds18b20ReadTempCom(); //然后等待转换完后发送读取温度命令 tml=Ds18b20ReadByte(); //读取温度值共16位,先读低字节 tmh=Ds18b20ReadByte(); //再读高字节 temp=tmh; temp<<=8; temp|=tml; EA=1; return temp;}
视频讲解:
明天发布视频,今天发布视频数量已满
更多内容关注逗比小憨憨
版权声明:
本站文章均来自互联网搜集,如有侵犯您的权益,请联系我们删除,谢谢。