USART编程.doc_第1页
USART编程.doc_第2页
USART编程.doc_第3页
USART编程.doc_第4页
USART编程.doc_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

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

文档简介

/编程时间:07-4-84-18/作者:WWS/利用串行口实现直流电机的调速程序/基本要求如下:/1./实现直流电机的恒电流控制,也就是说,要控制直流电机的电流恒定,实现这个任务需要/利用板子上的电机驱动模块、AD模块测电流,同时,还需要你看一些直流电机控制方面的资料/2./将测量得到的电机相电流、速度等数据通过串行口发送出去,串行口的参数设置为:57600,/1起始位8数据位1停止位,波特率可以通过拨码开关或按键在57600或112000之间切换;/同时,通过串行口,用户可以设定电流值,以便于电机调节:/3./电机的电流或速度在数码管上显示,可通过按键切换显示内容;/#include/*数据定义部分*/bitADFLAG=0,RECEFLAG=0,FUNCTION=0,UsartallowFLAG=0;/AD中断标志位,串口数据标志位,电机在运转中标志位,串口数据存储计数值,模拟串口允许发送位bank1staticcharled10=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;/无小数点的段码bank1staticcharled110=0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10;/有小数点的段码bank1staticchars4=0,0,0,0,Saveval9=0,0,0,0,0,0,0,0,k;/显示数码管服务数组,采集电压转换电流速度中间变量,循环使用值bank1staticintelecurt,speed;/显示函数调用相电流值,速度值bank1constcharx1=0,x2=1,x3=2,x4=3;/串口发送比较值bank1staticunsignedchartab,number=0;/取LED数组中的值用tab,键盘服务程序使用计数值numberbank1staticunsignedcharkey=0,RECE=0,tab;/按键值,串口接收到的数据,数码管段码bank1staticunsignedintAdresult,ADsmp,i,time;/AD采样结果和当前采样值,延时函数循环值,子显示程序显示时间计数值bank1staticunsignedcharUsartallow=0,Savechar=0;/发送串口数据允许位产生时间计数值计数到100即10S,串口发送数据允许时间计数值/*函数定义部分*/voidPortinit();/端口初始化函数voidADinit();/AD初始化函数voidT1inti();/T1初始化函数voidUsartinit();/串口初始化函数voiddis(intdata);/数据拆分函数,服务于四段数码管voidspeaker(chardata);voidkeyscan();/键盘服务voidyw1641(charz);voidyw1642(charz);voidyw1643(charz);voidyw1644(charz);voidMOTOrun();/电机运行控制程序voidMOTOstop();/电机停止控制程序voidaddspeed();/电机加速控制程序voidmidspeed();/电机减速控制程序voidChangeBAUD();/波特率改变函数voidSaveusart();voiddealad();/AD数据处理函数voiddealV();voidDELAY1();voidDELAY2();voidDELAY3();/*=主函数=*/voidmain()Portinit();/端口初试化Usartinit();/串口初试化ADinit();/AD相关寄存器初试化T1inti();/采样周期与发送数据至串口时间控制器T1初始化TMR1IE=1;/打开采样时钟中断标志位ADIE=1;/打开AD采样中断允许位while(1)/ChangeBAUD();/拨码开关改变当前波特率/当有AD采样完成则进行AD数据转化与电压转变电流速度值/if(ADFLAG=1)/dealad();/AD采样结果处理,送显示函数/dealV();/处理电压值,转变为电流与速度值/如果串口有数据发送过来/if(RECEFLAG=1)/RECEFLAG=0;/清除串口接收到数据标志位/switch(SavevalSavechar)/寻找相互匹配的串口命令/case1:MOTOrun();/break;/当串口发来X1时,启动电机/case2:MOTOstop();/break;/当串口发来X2时,停止电机/case3:addspeed();/break;/当串口发来X3时,电机加速/case4:midspeed();/break;/当串口发来X4时,电机减速/每间隔10S钟发送一次当前速度值和电流值/if(UsartallowFLAG=1)/TXREG=speed;/发送当前速度值/while(TRMT);/等待发送完毕/TXREG=elecurt;/发送当前电流值/UsartallowFLAG=0;/置允许发送位为零/显示当前电机相电流/dis(elecurt);/keyscan();/键盘扫描程序,扫描键值/yw1641(s3);/数码管显示函数,显示数码管第一段,显示当前电流值/DELAY2();/延时函数,决定数码管显示时间,长短影响主循环和亮度/yw1642(s2);/数码管显示函数,显示数码管第二段/DELAY2();/yw1643(s1);/数码管显示函数,显示数码管第三段/DELAY2();/yw1644(s0);/数码管显示函数,显示数码管第四段/DELAY2();/键盘切换显示内容显示当前速度值/while(key=1)/time+;/dis(speed);/keyscan();/键盘扫描程序,扫描键值/yw1641(s3);/显示数码管第一段,显示当前电流值/DELAY2();/延时函数,决定数码管显示时间,长短影响主循环和亮度/yw1642(s2);/显示数码管第二段/DELAY2();/yw1643(s1);/显示数码管第三段/DELAY2();/yw1644(s0);/显示数码管第四段/DELAY2();/if(key=4|RECEFLAG=1|time2000)break;/当按键4,串口中接收到数据,执行子显示时间到都将跳出子显示循环/*初始化函数:AD初始化voidADinit()端口初始化voidinitport()T1初始化voidT1inti()*/voidADinit()ADCON1=0x82;/转换结果右移,及ADRESH寄存器的高6位为0ADCON0=0x55;/10010000选择A/D通道为RA2,打开A/D转换器,等待中断打开标志位ADGO/在工作状态,且使AD转换时钟为Fosc/8INTCON=INTCON|0xc0;/ADGO位至1,启动AD转换ADIF=0;/ADON=1;voidPortinit()ADCON1=0x07;/打开AD采集端口TRISA=0x0f;/相应的位作为AD采集位TRISB3=1;/按键服务位RB3TRISD=0x00;/数码管显示服务口TRISE=0X00;/电机驱动服务口PORTD=0x00;/关断显示,防止电平干扰voidT1inti()INTCON=0xc0;/打开总中断与外围中断TMR1H=0xf3;/给T1赋值,32K晶振,计数值为0.1STMR1L=0x34;/给T1赋值T1CON=0x0f;/T1为异步计数器TMR1ON=1;/打开T1进行计数voidUsartinit()TRISC=0X80;/设置C口方向全为输出BRGH=1;/高速SPBRG=21;/设置波特率为2400BPSSYNC=0;/选择异步模式SPEN=1;/设置串口引脚TXEN=1;/允许串口接收CREN=1;/允许串口发送TXIE=0;/禁止串口发送中断RCIE=1;/允许串口接收中断/*中断处理函数INTinterruptINT()功能:处理时钟T1和AD转换*/voidinterruptISR()if(TMR1IF=1&TMR1IE=1)TMR1H=0xf3;/每间隔100MsAD采集一次TMR1L+=0x34;/时钟计数中断则再低八位中采用加赋值,防止冲掉已经记录值TMR1IF=0;/清除中断标志ADON=1;/打开AD转换,次部可有可无ADCON0=ADCON0|0x04;/中断产生后至AD标志位ADGO位为以一再次启动AD转换Usartallow+;if(Usartallow100)UsartallowFLAG=1;if(ADIF=1&ADIE=1)ADIF=0;ADFLAG=1;/AD中断完成后返回标志位,至1if(RCIF&RCIE)RECEFLAG=1;Saveusart();/调用存储串口数据函数/*函数名称:voiddealad()功能:处理AD转换的值,变为标准电压值,同时扩大1000倍调用:当AD采样完毕时,调用此函数返回值:返回AD采样结果intAdresult*/voiddealad()ADFLAG=0;ADsmp=ADRESL+(ADRESH6)*50)4)*2;/标准值Adresult=(ADsmp*50)8)*10)2;/*middle2=Adresult/100;middle1=Adresult%100/10;middle0=Adresult%100%10+Adresult%3;*/*函数名称:voidChangeBAUD();功能:查找拨码开关是否改变,改变当前串口的波特率57600-115200调用:函数循环查找返回值:波特率的返回值*/voidChangeBAUD()time=0;/子显示程序计数值,与本函数无关,放在本函数中出于美观而言if(BRGH=1&RB0=0)/如果拨码开关打开则设置为115200SPBRG=10;/波特率为115200elseSPBRG=21;/波特率为576000/*函数名称:voidSaveusart()功能:存储串口发来数据调用:当串口发生中断时调用返回值:无*/voidSaveusart()RECE=RCREG;/读取串口数据Savechar+;/存储个数加一SavevalSavechar=RECE;/存储串口数据,以备后用if(Savechar8)/串口数据超过八个则清零Savechar=0;/串口数据计数值清零/*函数名称:voidMOTOrun()电机启动函数voidMOTOstop()电机停止函数voidaddspeed()电机加速函数voidmidspeed()电机加速函数功能:对电机的启动停止加速减速控制调用:通过串口数据来调用这些函数返回值:返回电机启动标志FUNCTION*/voidMOTOrun()FUNCTION=1;/当电机运行时,对电机运行标志位置一voidMOTOstop()FUNCTION=0;/当电机停止时,对电机运行标志位清零voidaddspeed()FUNCTION=1;voidmidspeed()FUNCTION=1;/*显示移位164服务程序:voidyw1641(charz)voidyw1642(charz)voidyw1643(charz)voidyw1644(charz)功能:提供数码管的显示返回值:无*/voidyw1641(charz)RD5=0;RD4=0;RD3=0;RD2=0;/显示前关闭每一段的显示tab=led1z;/取数码管显示段码,有小数点for(k=0;k8;k+)/164的8位移位循环RD1=0;/164移位时钟至低tab=tab1;/段码数据移位送入溢出位CARRYRD0=CARRY;/164AB断口取溢出位CARRYRD1=1;/164移位时钟至高,产生时钟RD5=1;/打开显示段voidyw1642(charz)RD5=0;RD4=0;RD3=0;RD2=0;tab=ledz;/取数码管显示段码,无小数点for(k=0;k8;k+)RD1=0;tab=tab1;RD0=CARRY;RD1=1;RD4=1;/打开显示段voidyw1643(charz)RD5=0;RD4=0;RD3=0;RD2=0;tab=ledz;/取数码管显示段码,无小数点的显示for(k=0;k8;k+)RD1=0;tab=tab1;RD0=CARRY;RD1=1;RD3=1;/打开显示段voidyw1644(charz)RD5=0;RD4=0;RD3=0;RD2=0;tab=ledz;/取数码管显示段码,无小数点for(k=0;k8;k+)RD1=0;tab=tab1;RD0=CARRY;RD1=1;RD2=1;/打开显示段/*键盘服务程序:voidkeyscan()功能:键盘扫描返回值:返回一个key值*/voidkeyscan()/按键调整服务程序返回key值RD5=0;RD4=0;RD3=0;RD2=0;tab=0xff;/先送入11111111关断数码管每一位,为按键程序服务.防止误判for(k=0;k8;k+)RD1=0;tab=tab1;RD0=CARRY;RD1=1;tab=0x7f;/送入01111111,送入一位为0,即当有一个按键按下时即有反应for(

温馨提示

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

评论

0/150

提交评论