基于单片机的数控恒流源设计----软件设计._第1页
基于单片机的数控恒流源设计----软件设计._第2页
基于单片机的数控恒流源设计----软件设计._第3页
基于单片机的数控恒流源设计----软件设计._第4页
基于单片机的数控恒流源设计----软件设计._第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

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

文档简介

1、3.系统软件设计本系统的软件设计采用 C51语言和汇编语言混合编程。主体程序采用C51编写,与硬件有关的程序、特别是对时序要求较严格的程序用汇编语言编写,即键盘扫描子程序、写TLC5618子程序、读MC14433?程序、显示缓冲子程序。因 为采用了 C51和汇编语言混合编程的方式,故大大提高了本系统软件设计的效率 和质量。数控电流源的软件开发在 Keil卩Vision4集成开发环境下完成的。Keil 卩Vision4集成开发环境是基于80C51内核的微处理器软件开发平台,内嵌多种 符合当前工业标准的开发流程。可以完成从工程建立、管理、编译连接、目标代 码的生成、软件仿真、硬件仿真等完整的开发流

2、程。尤其是C语言编译工具在产 生代码的准确性和效率方面达到了较高的水平,而且可以附加灵活的控制选项, 在开发大型项目时非常理想。Keil卩Vision4的使用方法是:1启动Keil卩Vision4集成开发环境,创 建一个工程文件,并从器件数据库里选择一款CPU芯片(本课题使用AT89C52芯片);2.根据应用要求,在PC上用文本编辑软件编写 C语言源程序、汇编语 言源程序;利用编译工具软件对源程序进行编译,生成目标文件 (.obj文件);利 用连接工具对目标程序进行连接定位,生成绝对程序,将程序转化为十六进制代码程序(.hex文件),急可以装载到CPU芯片上运行。3.1主程序3.1.1主程序流

3、程框图及程序主程序流程框图如图3-1所示。由主程序流程框图可知,其中的“扫描键盘” 起到了很重要的作用,扫描键盘函数的返回值作为C51主程序中Switch语句的开关变量,根据不同的返回值进行相应的按键处理,因而主程序流程框图相当简单,并且系统软件整体程序的可读性高。主程序是数控电流源软件设计的核心,主要由电流给定值设置功能函数、 电流步进值设置功能函数、菜单选择功能函数、数码管定时刷新功能函数以及中断 设置等构成。设置电流给定值程序流程框图如图3-2所示,设置电流步进值程序流程框图如图3-3所示。为完成数控电流源整体系统设计, 在C51主程序中适时 调用键盘扫描汇编语言子程序、 写5618汇编

4、语言子程序、读MC14433汇编语言 子程序、显示缓冲汇编语言子程序,从而体现了C51语言程序和汇编语言程序相互调用的方便性。v开始基琉袖谢tN扫描魅NY有律按下E已有数犠入?取哨賠向已输人的数宇僦存键入的瑕字/*/*/*/*/*碱昱汞标老 龍示给良吐流值 及实测电说值*砒直略能畐玻 【$址戳固$皿荔覽电戒徴 2罟功能肾数为歩世他戏豐根搭妙敷字 调用揺滋劝能更數1号功能函数为预置电洗憤2普功能函数为涉进值幔置返回“轉救按下#in elude #defi ne uchar un sig ned char #defi ne uint un sig ned int sbit ledbit=P2A0;

5、uchar idata buffer8;uchar idata keycode;uchar idata stepval=1; uchar idata showflag=0;图3-1主程序流程框图疽键按下? 丫-功能指示灯控制位*/ 定义键盘输入缓冲区*/扫描键盘码变量*/步进值变量*/ 当前显示标志,用以决定当前显示内容*/即推孚于标衣亍皓戈电涼他已和1*J 氐消it页匕输入冋軌宇r:“便入Mr彖牛-英单“桂秋按下7 ”餐陂按F”惚被按下进入荣单选掙 初始化弟禾为一横杠给宦电洗值自缽加歩进值 由2号M能函数设置齡定电流值自动城歩进憾 由2号琲能苗数设置“端定“ W.T数字體破按下“撤嗝-林瘙下

6、具唯檢it按下Nuint idata givecur=O;/*uint idata truecur;/*extern uchar readkey(void); /*extern void showbuffer(uchar*); /*extern void write5618(uint); /*extern uint read14433(void); /*/* 函数原型:void de15s(void) */*功能:信息提示延时显示,按任意键返回/* 调用函数:readkey( ) */*入口参数:无 */*出口参数:无 */void de15s(void)电流输出给定值控制变量*/电流实测值变

7、量*/声明扫描键盘函数为外部函数,此函数使用汇编语言编写*/声明缓冲区显示函数为外部函数,入口参数为全局变量数组buffer的首址*/声明写TLC5618为外部函数,入口参数为要写入的16-bit二进制数据,默认为TLC5618的模拟A通道*/声明读MC14433为外部函数,无入口参数, 出口参数为读出的16-bit二进制数据*/*/uint m,n;for(m=0;m=2000;m+)if(readkey()!=0xff)break; /*按任意键跳出循环 */for(n=0 ;*=500 ;n+) setcur()setsetp()/* 函数原型:void menufun (void) *

8、/*功能:菜单选择功能函数,通过菜单选择功能函数,以进行相应的功能操作*/* 调用函数:readkey( ) */*入口参数:无 */*出口参数:无 */menufun()uchar idata n;uchar nu mco un t=0;showflag=1;ledbit=1;P0=0xfe;ledbit=0;bufferO=OxOa;/*for(n=1; n12)*1000+( n&0x0f00)8)*100+( n&0x00f0)4)*10+( n& OxOOOf);main()/*主函数 */uchar idata n;uint idata m;SP=0x40;/*for(m=0;m1

9、000;m+)/*EA=1;ET0=0;EX0=0;IT0=0;TMOD=0X01;TH0=0XB8;TL0=0X00;TR0=1;while(1)dokeycode=readkey();while(keycode=Oxff);switch(keycode)/*case 0x0a: menufun(); /* break;case 0x0e: m=givecur+stepval; /* if(m=2000)/*修改堆栈指针*/延时*/* CPU/*/*/*/*/*/*/*开中断*/允许定时器0定时中断*/允许外部中断0中断*/外部中断采用负边沿触发方式*/定时器采用16位定时工作方式*/ 设置

10、等时期计数初值 */启动定时器0 */不断扫描按键,直到有键按下*/根据按下键值,进行相应操作*/菜单键按下,进入菜单选择功能*/“ +”键按下,将给定值与步进值相加赋值m*/若m小于等于2000,将累加值赋值给电流给值 变量*/givecur=m;合成TLC5618数据写入格式*/m=(givecur&0x0fff)*2)|0xc000; /*对5618串口器件进行操作需要首先关闭 一切中断源*/将合成数据写入TLC5618 */串口操作结束之后再回复中断操作*/EXO=O;/* TLCETO=O; write5618(m);/*EX0=1;/*ET0=1;break;键按下,将给定值与步进

11、值相减*/合成TLC5618数据写入格式*/TLC对5618串口器件进行操作需要首先关闭一切中断源*/将合成数据写入TLC5618 */串口操作结束之后再回复中断操作*/case OxOf: if(givecur!=O) /*for(n=0;n stepval; n+)givecur-;if(givecur=0) break; m=(givecur&0x0fff)*2)|0xc000; /* EX0=0;/*ET0=0;write5618(m);/*ET0=1;/*EX0=1;default: break;3.1.2设置电流给定值程序框图及程序在菜单选择功能函数中,按下数字键“ 1”后,再按下

12、“确定”键,显示切 换为4个横杠,这是可以通过按数字键,置入电流数值以取代4个横杠,再按下 确定键之后,则可将输入的电流给定值设置为当前的输出电流给定值。但是输入的电流值必须在02000mA以内,并且必须置满4位数值,否则会显示出错信息“ERROR要求重新输入有效的电流值。错误提示显示大约5秒后会自动返回该操作的初始化显示状态,也可以通过按任意键返回该操作的初始化显示状态。如果中途不想再执行该操作,可以按“返回”键返回默认显示状态;如果输入过程 中有错误所输入,可以按“撤销”键撤销前面已输入的电流值数据。设置电流给 定值程序框图如图3-2所示。(入口)1扫描按键r有键按f?“退回键被按下*返回

13、默认显不/*/*/*/*检测输入电流值有效性将当前跆定电流值 修改为输入的数值“撤樹賊按下图3-2设置电流给定值程序框图函数原型:void setcur(void) */ 功能:电流给定值设置功能函数, 调用函数 入口参数出口参数/*setcur()uint n;uchar nu mco un t=0;ledbit=1;P0=0xfd;ledbit=0;通过矩阵式键盘可快速设置2000mA以内的任意电流*/readkey( )、del5s( ) */无*/无*/*for(n=0;n4;n+)buffer n=OxOa;for(n=4;n8;n+)buffer n=OxOd;while(show

14、flag=0x01)/*初始化功能指示灯不亮,表示正在进行的是 设置电流给定值的操作 */初始化8位数码管显示:-灭灭灭灭*/*不断扫描键盘,直到右键按下*/dokeycode=readkey();while(keycode=Oxff);switch(keycode)/*case 0:;case 1:;case 2:;case 3:;case 4:;case 5:;case 6:;case 7:;case 8:;case 9:if( nu mco un t!=4)/*buffer nu mco un t=keycode;/* nu mco un t+;/* break;case 0x0b: s

15、howflag=0x00; /*P0=0xff;ledbit=1;ledbit=0; break; case 0x0c: if(nu mco un t!=0x0) /*nu mco un t-;buffer nu mco un t=0x0a;根据按下的键值,进行相应操作*/缓冲区只接收4位电流给定值数据输入*/置入键盘输入数据至键盘输入缓冲区*/每输入一个数据,缓冲区指针自加1 */返回键按下,则返回默认的显示状态*/撤销键按下,则往前置入一横杠,以撤销前面已输入的一位数据*/ break;case 0x0d: n=(ui nt)buffer0*1000+(ui nt)buffer1*100+

16、(ui nt)buffer2* showflag=0;10+(ui nt)buffer3; /*if(n umcou nt=4)&(*=2000)TLC5618givecur =n;n=(givecur&0x0fff)*2)|0xc000;EX0=0;确定键按下,且输入电流值为小于2000的4位数,则将给定电流值合成要写入的16-bit二进制数据*/ET0=0;write5618( n);/*EX0=1;将合成的数据写入TLC5618 */ET0=1;ledbit=1;P0=0xff;ledbit=0; /*else/*bufferO=OxOb;buffer1=0x0c;buffer2=0x0

17、c;buffer3=0x00;buffer4=0x0c;buffer5=0x0d;buffer6=0x0d;buffer7=0x0d;de15s();for(n=0 ;n 4; n+)/*(buffer+ n)=0x0a;for(n=4;n8;n+)*(buffer+ n)=0x0d;nu mco un t=0x00;/*break;default: break;3.1.3设置电流步进值程序流程框图及程序 在菜单选择功能函数中,按下数字键 以通过按数字键,置入电流步进值以取代恢复默认显示状态 */确定键按下,但输入电流值无效,则显示ERROR勺错误提示*/*延时5s自动返回或按任意键返回*/重

18、新初始化8位数码管显示: 灭灭灭灭*/恢复缓冲区初始指针*/2”后,再按下“确定”键,这时可2个横杠,再按下“确定”键之后,则可以设置的电流步进值范围为3-3所可将输入的电流步进值设置为当前的电流步进值,099mA其他功能按键的操作同上。设置电流步进值程序流程框图如图示。比较图3-2和图3-3所示,二者很相似,这种相似性有利于程序代码的编写C入口)主1团按譴图3-3设置电流步进值程序流程框图/* 函数原型:void setsetp(void) */*功能:步进值设置功能函数,用来设置每次“+”、“一”键按下时的步进值 */* 调用函数:readkey( )、del5s */*入口参数:无 */

19、*出口参数:无 */setstep()uchar idata n;uchar idata nu mco un t=0;ledbit=1;P0=0xfb;ledbit=O;for(n=0;n2;n+)/*初始化8位数码管显示:-灭灭灭灭灭灭*/buffer n=0x0a;for(n=2;n8;n+)buffer n=0x0d;while(showflag=0x01)do/*不断扫描键盘,直到有键按下*/keycode=readkey();while(keycode=Oxff);switch(keycode)/*case 0:;case 1:;case 2:;case 3:;case 4:;cas

20、e 5:;case 6:;case 7:;case 8:;case 9:if( nu mco un t!=2)/*buffer nu mcou nt=keycode;/*nu mco un t+;/*break;case 0x0b: showflag=0x00; /*ledbit=1;P0=0xff;ledbit=0;break;case 0x0c: if(nu mco un t!=0x0) /*nu mco un t-;buffer nu mco un t=0x0a;break;case 0x0d: if(nu mco un t=2) /*stepval=buffer0*10+buffer1

21、; showflag=0;ledbit=1;P0=0xff;ledbit=0;/*else/*buffer0=0x0b;buffer1=0x0c;根据按下的键值,进行相应操作*/缓冲区只接收4位电流给定值数据输入 */置入键盘输入数据至键盘输入缓冲区*/每输入一个数据,缓冲区指针自加1 */返回键按下,则返回默认的显示状态*/撤销键按下,则往前置入一横杠,以撤销前面已输入的一位数据*/确认键按下,且步进电流值为2位,则将设置的2位步进值赋值给步进值变量*/恢复默认显示状态*/确定键按下,但输入步进电流值不是2位,则显示ERRORS错误提示*/buffer2=0x0c; buffer3=0x00

22、; buffer4=0x0c; buffer5=0x0d;buffer6=0x0d; buffer7=0x0d;de15s();/*for(n=0;n 2; n+)/*(buffer+ n)=OxOa;for(n=4;n8;n+) *(buffer+ n)=OxOd;nu mco un t=OxOO;/*break;default: break;延时5s自动返回或按任意键返回*/重新初始化8位数码管显示:灭灭灭灭灭灭*/恢复缓冲区初始指针*/3.2键盘扫描程序流程框图及程序数控电流源主程序中频繁调用键盘扫描子程序,键盘扫描子程序主要完成键入数值、返回、撤销、确认等功能。本设计中,4*4矩阵键盘

23、工作在循环扫描工作方式,主要有判断键盘上是否有键按下、去除键的抖动影响、扫描键盘、判断 闭合的键是否释放等内容,C51语言程序在调用汇编语言程序时,用过工作寄存 器R7完成参数的传递。键盘扫描程序流程框图如图 3-4所示。I tN口N /、4列令籽扫描完? 楠下F |卄佈鉤扫緞?就FF表爲缺挨下图3-4键盘扫描程序流程框图NAME READKEY;汇编语言子程序名称为 READKEY?PR?READKEY?READKEY SEGMENT CODEPUBLIC READKEYRSEG ?PR?READKEY?READKEYREADKEY:PUSH ACC;保护现场PUSH PSWPUSH DPL

24、PUSH DPHPUSH 0PUSH 1PUSH 2PUSH 3MOV R0,#0F7H;设置扫描字MOV R1,#00H;初始化键码LP1: MOV A,R0;将扫描字送入P1 口MOV P1,AMOV A,P1MOV R2,ASETB CMOV R3,#04HLP2: RLC A;JNC KEY;LP3: INC R1;DJNZ R3,LP2MOV A,R0SETB CRRC AMOV R0,AJC LP1MOV R7,#0FFHLJMP ENDCHECKKEYKEY: LCALL DEL10MSMOV A,P1XRL A,R2JNZ LP3LP4: MOV A,P1XRL A,R2JZ

25、LP4MOV A,R1MOV DPTR,#KEYTABMOVC A,A+DPTRMOV R7,AENDCHECKKEY:POP 3POP 2POP 1POP 0POP DPHPOP DPLPOP PSWPOP ACCRET;读出P1 口列状态;列状态暂存R2;判断是否有键按下。有键按下,跳至KEY;无键按下,键码加 1;继续扫描列,至 4列扫描完毕;扫描下一行;判断4行是否全部扫描完毕;返回OxFF表示无键按下;跳至恢复现场,程序结束;延时10ms去抖动;再次扫描原列;A=0,两次扫描相符;AM 0,不符;判断两次扫描值是否相符;两次扫描值相符,再次扫描原列;Am 0,按键释放;A=0,按键未

26、释放;判断按键是否释放;按键释放,根据键码查表求键值;置键盘码表首地址至 DPTR;查表;扫描值通过 R7返回至主程序;恢复现场DEL10MS: MOV R6,#100;延时 10ms 子程序LOP1: MOV R7,#100DJNZ R7,$DJNZ R6,LOP1RETKEYTAB:;键盘码表DB 1H,2H,3H,0AH;“ 1 ”,“ 2 ”,“ 3”,“菜单”DB 4H,5H,6H,0BH;“4”,“5”,“6”,“返回”DB 7H,8H,9H,0CH;“7”,“ 8”,“9”,“撤销”DB 0EH,0H,0FH,0DH;“+”,“ 0 ”,“ - ”,“确认”END3.3显示缓冲器

27、汇编语言子程序显示子程序的功能,是把显示缓冲区中的十六进制数据取出, 查表后转换成 相应的字形码,然后送到数码管中,驱动LED数码管进行显示。所以需要执行显 示或更新显示时,必须先向显示缓冲区中送待显示数据,然后在调用显示子程序。NAME SHOWBUFFER;汇编语言子程序名为 SHOWBUFFER?PR?SHOWBUFFER?SHOWBUFFER SEGMENT CODEPUBLIC _SHOWBUFFERRSEG ?PR?SHOWBUFFER?SHOWBUFFER_SHOWBUFFER:PUSH ACC;保护现场PUSH PSWPUSH DPLPUSH DPHPUSH 2PUSH 3MO

28、V DPTR,#BLEDTABMOV R3,#8;字型码表的入口;显示8个数据BLOOP2: MOV A,R1;取待显示数据首地址MOVC A,A+DPTR;查表获得字型码MOV R2,#8;每个字型码有8位BLOOP1: RLC A;向串行数据口 TXD发送数据CLR P3.4MOV P3.1,CSETB P3.4DJNZ R2,BLOOP1;直到每个数据的 8位全发送完DEC R1;指针指向下一位,准备取下一个待显示数据DJNZ R3,BLOOP2;直到8个数据全显示完CLR P3.3;触发外部中断1SETB P3.3POP 3;恢复现场POP 2POP DPHPOP DPLPOP PSW

29、POP ACCRETBLEDTAB:;字形码表DB 0fcH,60H,0daH,0f2H;“ 0”,“1”,“2”,“3”DB 66H,0b6H,0beH,0e0H4”,“5”,“6”,“7”DB 0feH,0f6H,2H,9eH;“ 8”,“9”,“ - ”,“ E”DB 0eeH,00H,0ecH,8eH;R,n,FDB 7cH,7aH,1cH,3eH“ i pa |a | va .;U, d, L, bEND3.4写TLC5618汇编语言子程序由键盘输入的给定电流值经MCU空制器处理后为数字量,而外电路只能接受 模拟量输入,TLC5618在数控电流源系统中完成 DA转换。TLC5618的

30、工作方式及 时序为:当片选信号CS为低电平时,输入数据由时钟定时,以最高有效位在前 的方式读入16-bit移位寄存器。串行时钟输入SCLK俞入的下降沿把数据移入输 入寄存器,然后CS的上升沿把数据送到DAC寄存器。所有CS的跳变应当发生在 SCLK俞入为高电平时。TLC5618的操作时序图如图3-5所示。图3-5 TLC5618操作时序图NAME WRITE5618;汇编语言子程序名称为WRITE5618?PR?_WRITE5618?WRITE5618 SEGMENT CODEPUBLIC WRITE5618RSEG ?PR?_WRITE5618?WRITE5618DADAT BIT P2.1

31、DACLK BIT P2.2DACS BIT P2.3_WRITE5618:PUSH ACCPUSH PSWPUSH 2EXDA1: SETB DACLKCLR DACS;DADAT定义为 P2.1 位,即 5618 的 DIN;DACLK定义为 P2.2 位,即 5618 的 SCLK;DACS定义为P2.3位,即5618的CS;保护现场;时钟信号变高;TLC5618时钟信号低电平有效MOV R2,#08H;设置循环次数 8次MOV A,R6 ;将R6中8位数据写入 TLC5618, R6中存放一帧数据的高 8位EXDA2: RLC AMOV DADAT,CCLR DACLK ; SCLK下

32、降沿作用,一位数据送入16位移位寄存器SETB DACLK;恢复时钟信号高电平DJNZ R2,EXDA2MOV A,R7 ;将R7中8位数据写入 TLC5618, R6中存放一帧数据的低 8位MOV R2,#08H;设置循环次数 8次EXDA3: RLC AMOV DADAT,CCLR DACLK ; SCLK下降沿作用,一位数据送入16位移位寄存器SETB DACLK;恢复时钟信号高电平DJNZ R2,EXDA3SETB DACLKSETB DACS; CS的上升沿把数据送到 DAC寄存器POP 2POP PSWPOP ACCRET END3.5读MC14433匚编语言子程序本数控电流源系统中,实际电流值模拟量需通过 MC14433转换为MCU空

温馨提示

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

评论

0/150

提交评论