龙空技术网

第300期基于单片机的温度控制步进电机转速设计

逗比小憨憨 114

前言:

眼前姐妹们对“基于单片机的步进电机控制实验报告”大体比较注意,姐妹们都想要分析一些“基于单片机的步进电机控制实验报告”的相关内容。那么小编同时在网摘上汇集了一些关于“基于单片机的步进电机控制实验报告””的相关内容,希望朋友们能喜欢,你们快快来了解一下吧!

#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;}

视频讲解:

明天发布视频,今天发布视频数量已满

更多内容关注逗比小憨憨

标签: #基于单片机的步进电机控制实验报告 #单片机步进电机控制实验报告总结