温控直流电机调速软件解决方案.docx_第1页
温控直流电机调速软件解决方案.docx_第2页
温控直流电机调速软件解决方案.docx_第3页
温控直流电机调速软件解决方案.docx_第4页
温控直流电机调速软件解决方案.docx_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于STC89C52单片机的温控电机调速软件解决方案一、编译调试方法经过一学期的工作硬件部分已经调试完成,这学期我们对设计的软件部分进行了一系列调试,通过调试我们发现软件部分才是系统的核心,算法的好坏决定了系统的优劣。在软件的编写过程中,我们用到的编程语言是C语言,C语言的对语法结构的要求并不是很严格,写法多种多样,但逻辑性和构架结构很强,其指针运算和位运算为底层硬件操作提供了强大的支持。函数调用为模块化编程提供了支持,我们就是用模块化编程的这一思想在对每个模块的程序进行设计。这里还必须说一下我们做软件开发用到的几个工具软件,Keil Uvision2,MS Visual C+6.0以及仿真软件Proteus 7 Professional.其中MS Visual C+6.0只是用来编辑程序,因为在以前大一上学C语言的时候对MS Visual C+6.0的使用已经相当熟悉,其自动换行的功能非常方便,编辑出来的程序格式非常整齐标准。Keil Uvision2不用说,强大的单片机软件编译及仿真工具,在上面建立新的工程,选定相对应的芯片,加入相应的程序,生成.HEX文件,下载到单片机中。本来Keil Uvision2具有一点的仿真功能,但也只是数值仿真,所以我们用了更加强大的Proteus 7 Professional来进行仿真,按照硬件的原理图画出仿真图样,在将Keil Uvision2编译好的.HEX文件载入到仿真图当中的单片机中,运行仿真即可。通常在做程序调试的时候我们是将Keil Uvision2和Proteus 7 Professional配合使用。调试程序模块,我们总的来说是按照下列方式调试:调控定时器输出PWM波等待中断开启中断二、程序算法流程图D=10D=7D=3D=020=T3010=T20T=30开始温度范围判断读取温度并显示定时器初始化显示初始化三、模块化程序注解程序主要分三个模块,显示模块,测温模块,主函数,中断函数。、显示模块显示模块分为显示初始化函数,显示延迟函数,写寄存器函数,读寄存器函数,初始化显示函数,显示字符串函数;/*-LCD1602初始化设置-*/void lcd_init()delay1ms(15);/*延时15微秒*/wr_com(0x38);delay1ms(5);/*38H设置显示模式*/wr_com(0x08);delay1ms(5); /*08H关闭显示*/ wr_com(0x01);delay1ms(5); /*01H显示清屏*/ wr_com(0x06);delay1ms(5);/*06H显示光标移动设置*/ wr_com(0x0c);delay1ms(5);/*0cH显示开机光标设置*/*-写数据LCD1602寄存器函数-*/(RS=H;RW=L;EN=)void wr_dat(unsigned char dat) /*dat为入口数据参数*/ delay1ms(1);/*延时1毫秒*/RS=1;RW=0;EN=0;P0=dat;/*数据写入P0口*/delay1ms(1);EN=1;delay1ms(1);EN=0;/*-写指令LCD1602寄存器函数-*/(RS=L;RW=L;EN=)void wr_com(unsigned char com)/*com为入口指令参数*/ delay1ms(1); /*延时1毫秒*/RS=0;RW=0;EN=0;P0=com; /*指令写入P0口*/delay1ms(1);EN=1;delay1ms(1);EN=0;/*-LCD1602显示字符串函数-*/void display(unsigned char *p)/* p待显示字符串首指针*/while(*p!=0)/*当字符串没结束的时候执行*/wr_dat(*p);/*写单字符*/p+;/*指针每次移动1*/delay1ms(1);/*-LCD1602初始化显示设置-*/void init_play() lcd_init();/*显示初始化*/wr_com(0x80);/*在屏幕上80H的位置*/display(str1);/*写字符串str1*/wr_com(0xc0); /*在屏幕上C0H的位置*/display(str2); /*写字符串str2*/DS18B20模块DS18B20模块分为:测温延时函数(单位微秒),ROM读函数,ROM写函数,温度值读取并转换函数,温度值显示函数,DS18B20复位函数。/* -DS18B20复位函数-*/void ds1820rst()/*只是做复位处理,并未检验复位*/ DQ = 1; /*DQ复位*/delay_18B20(4); /*延时*/DQ = 0; /*DQ拉低*/delay_18B20(100); /*精确延时大于480us*/DQ = 1; /*拉高*/delay_18B20(40); /* -写ROM函数-*/void ds1820wr(uchar wdata)/* wdata 为入口指令形参*/unsigned char i;/*循环变量*/ for (i=8; i0; i-)/*一个字节8位,循环8次写入,每次写一个字*/ DQ = 0;/*拉低总线,开始时序*/DQ = (bit)wdata&0x01;/*指令的最后一位与00000001相与,如果指令最后一位是0,则位变量DQ=0写入单片机,若是1,则位变量DQ=1写入单片机*delay_18B20(10);/*延时*/DQ = 1;/*释放总线,为下次循环准备*/wdata=1; /*指令次低位右移到最后一位*/*注:通过8次右移循环,指令字节的每一位与00000001相与得到为变量DQ通过一条总线被串行输出到DS18B20中。/* -读ROM函数-*/uchar ds1820rd()/*最后需要返回读到的数据*/ unsigned char i;/*循环变量*/unsigned char dat = 0;/*数据变量,初值00000000*/for (i=8;i0;i-)/*一个字节8位,8次循环读出,每次读一个字*/ DQ = 0; /*拉低总线,开始时序*/dat=1;/*dat右移1位*/DQ = 1; /*释放总线*/if(DQ)/*如果位变量DQ=1,否则跳过*/dat|=0x80;/*dat或上10000000,并保存在dat上*/delay_18B20(10);/*延时*/return(dat);/返回数据/注:单片机是从DS18B20的ROM中,从低位读到高位,如果DQ=1,通过每次与10000000相或得到数据的相应位,再通过8次右移循环,组成一个字节,最后返回的到的字节,即返回数据。/* -读取温度并转换函数-*/uint read_temp()/*读取温度值并转换*/uchar a,b;ds1820rst();/*复位DS18B20*/ds1820wr(0xcc);/*跳过读序列号*/ds1820wr(0x44);/*启动温度转换*/ds1820rst();/*复位DS18B20*/ds1820wr(0xcc);/*跳过读序列号*/ ds1820wr(0xbe);/*读取温度*/EA=0;/*单片机使能端拉低关中断*/a=ds1820rd();/*读低4位*/b=ds1820rd();/*度高4位*/EA=1;/*使能端释放,开中断*/tvalue=b;tvalue=8;tvalue=tvalue|a;/*以上是将ba组成一个12个字节十六进制的数,付给温度变量*/ if(tvalue= set_temp)/*如果温度大于等于设定温度*/duty = 10;/*占空比变量为10*/warning = 1;/*温度报警变量高电平*/else if(Temp_value = 20 & Temp_value 10 & Temp_value 20)/*如果温度大于等于10小于20*/duty = 3;/*占空比变量为3*/warning = 0;/*温度报警变量低电平*/else if ( Temp_value =10)/*如果加到10后,重新计数*/click=0;return;if (click = duty)/*当小于占空比值时输出低电平,高于时是高电平,从而实现占空比的调整*/ PWM=0;else PWM=1; 四、总程序#include#define uchar unsigned char#define uint unsigned int#define XTAL 12/*晶振频率,单位MHz*/sbit DQ=P33;/*ds18b20与单片机连接口*/sbit RS=P20;sbit RW=P21;sbit EN=P22;sbit GW = P27;sbit SW = P25;sbit OK = P23;sbit PWM = P10;/*PWM输出端口*/sbit warning = P11;/*警告输出端口*/int duty=10;/*占空比变量*/unsigned char code str1= Current Temp : ;unsigned char code str2= TEMP: ;uchar data disdata5;uint tvalue;/温度值uchar tflag;/温度正负标志unsigned char Temp_value=0;uchar setdata2 = 0,0;/*设定温度值显示变量*/uint ge = 0;/*个位变量*/uint shi = 0;/*十位变量*/uint set_ok = 0;/*确定标志*/uint set_temp;/*设定温度值变量*/void delay_1ms(void) /1ms延时函数unsigned int i; for (i=0;i(unsigned int)(XTAL*143-2);i+); void delay_nms(unsigned int n)/N ms延时函数unsigned int i=0;for (i=0;in;i+) delay_1ms(); void delay1ms(unsigned int ms)/延时一毫秒 unsigned int i,j; for(i=0;ims;i+) for(j=0;j0;i-) DQ = 0;dat=1;DQ = 1;if(DQ)dat|=0x80;delay_18B20(10);return(dat);void ds1820wr(uchar wdata)unsigned char i; for (i=8; i0; i-) DQ = 0;DQ = wdata&0x01;delay_18B20(10);DQ = 1;wdata=1;uint read_temp()uchar a,b;ds1820rst(); ds1820wr(0xcc);ds1820wr(0x44);ds1820rst

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论