USART编程.doc

上传人:asd****56 文档编号:70328231 上传时间:2023-01-19 格式:DOC 页数:17 大小:71KB
返回 下载 相关 举报
USART编程.doc_第1页
第1页 / 共17页
USART编程.doc_第2页
第2页 / 共17页
点击查看更多>>
资源描述

《USART编程.doc》由会员分享,可在线阅读,更多相关《USART编程.doc(17页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、/编程时间:07-4-84-18/作者:WWS/利用串行口实现直流电机的调速程序/基本要求如下:/1./实现直流电机的恒电流控制,也就是说,要控制直流电机的电流恒定,实现这个任务需要/利用板子上的电机驱动模块、AD模块测电流,同时,还需要你看一些直流电机控制方面的资料/2./将测量得到的电机相电流、速度等数据通过串行口发送出去,串行口的参数设置为:57600,/1起始位8数据位1停止位,波特率可以通过拨码开关或按键在57600或112000之间切换;/同时,通过串行口,用户可以设定电流值,以便于电机调节:/3./电机的电流或速度在数码管上显示,可通过按键切换显示内容;/#include/*数据

2、定义部分*/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

3、,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,tim

4、e;/AD采样结果和当前采样值,延时函数循环值,子显示程序显示时间计数值bank1staticunsignedcharUsartallow=0,Savechar=0;/发送串口数据允许位产生时间计数值计数到100即10S,串口发送数据允许时间计数值/*函数定义部分*/voidPortinit();/端口初始化函数voidADinit();/AD初始化函数voidT1inti();/T1初始化函数voidUsartinit();/串口初始化函数voiddis(intdata);/数据拆分函数,服务于四段数码管voidspeaker(chardata);voidkeyscan();/键盘服务voi

5、dyw1641(charz);voidyw1642(charz);voidyw1643(charz);voidyw1644(charz);voidMOTOrun();/电机运行控制程序voidMOTOstop();/电机停止控制程序voidaddspeed();/电机加速控制程序voidmidspeed();/电机减速控制程序voidChangeBAUD();/波特率改变函数voidSaveusart();voiddealad();/AD数据处理函数voiddealV();voidDELAY1();voidDELAY2();voidDELAY3();/*=主函数=*/voidmain()Por

6、tinit();/端口初试化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;/清除串口接收到数据标志

7、位/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;/发送当前电流值/U

8、sartallowFLAG=0;/置允许发送位为零/显示当前电机相电流/dis(elecurt);/keyscan();/键盘扫描程序,扫描键值/yw1641(s3);/数码管显示函数,显示数码管第一段,显示当前电流值/DELAY2();/延时函数,决定数码管显示时间,长短影响主循环和亮度/yw1642(s2);/数码管显示函数,显示数码管第二段/DELAY2();/yw1643(s1);/数码管显示函数,显示数码管第三段/DELAY2();/yw1644(s0);/数码管显示函数,显示数码管第四段/DELAY2();/键盘切换显示内容显示当前速度值/while(key=1)/time+;/d

9、is(speed);/keyscan();/键盘扫描程序,扫描键值/yw1641(s3);/显示数码管第一段,显示当前电流值/DELAY2();/延时函数,决定数码管显示时间,长短影响主循环和亮度/yw1642(s2);/显示数码管第二段/DELAY2();/yw1643(s1);/显示数码管第三段/DELAY2();/yw1644(s0);/显示数码管第四段/DELAY2();/if(key=4|RECEFLAG=1|time2000)break;/当按键4,串口中接收到数据,执行子显示时间到都将跳出子显示循环/*初始化函数:AD初始化voidADinit()端口初始化voidinitpor

10、t()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=0X

11、00;/电机驱动服务口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;/禁止串口发送中断RC

12、IE=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&

13、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%1

14、00/10;middle0=Adresult%100%10+Adresult%3;*/*函数名称:voidChangeBAUD();功能:查找拨码开关是否改变,改变当前串口的波特率57600-115200调用:函数循环查找返回值:波特率的返回值*/voidChangeBAUD()time=0;/子显示程序计数值,与本函数无关,放在本函数中出于美观而言if(BRGH=1&RB0=0)/如果拨码开关打开则设置为115200SPBRG=10;/波特率为115200elseSPBRG=21;/波特率为576000/*函数名称:voidSaveusart()功能:存储串口发来数据调用:当串口发生中断时调

15、用返回值:无*/voidSaveusart()RECE=RCREG;/读取串口数据Savechar+;/存储个数加一SavevalSavechar=RECE;/存储串口数据,以备后用if(Savechar8)/串口数据超过八个则清零Savechar=0;/串口数据计数值清零/*函数名称:voidMOTOrun()电机启动函数voidMOTOstop()电机停止函数voidaddspeed()电机加速函数voidmidspeed()电机加速函数功能:对电机的启动停止加速减速控制调用:通过串口数据来调用这些函数返回值:返回电机启动标志FUNCTION*/voidMOTOrun()FUNCTION=

16、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移位时钟至低

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 其他杂项

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com