/**************************************************************************************** * * 文 件 名: main.c * 项 目 名: 11_Usart * 版 本: v1.0 * 日 期: 11_Usart-Full Duplex Asynchronous * 作 者: Administrator * 程序说明:通用全双工/半双工收发器例程 * ——全双工异步操作模式 * 适用芯片:KF8FXXX系列——KF8F212、KF8F214、KF8F212、KF8F222、KF8F232、KF8F233、KF8F304、 * KF8F312、KF8F321、KF8F323、KF8F324、KF8F334、KF8F335、KF8F336 * KF8FXXXX系列——KF8F2156、KF8F3156、KF8F4156、KF8F3155、KF8F4155 * KF8SXXXX系列——KF8S1005、KF8S1006、KF8S1010、KF8S1011 * KF8TS27XX系列——KF8TS2702、KF8TS2708、KF8TS2710、KF8TS2714、KF8TS2716 * KF8VXXX系列——KF8V427、KF8V429 ****************************************************************************************/ #include<KF8S1011.h> #define uchar unsigned char #define uint unsigned int #define Sent_Vaule_To_UART(key_buf) {TXSDR=key_buf; while(TXSRS==0);}// 调试时串口输出 unsigned char Timer_Count; unsigned char Send_Date; unsigned char Send_Flag; unsigned char Rev_Temp = 0; unsigned char Rev_Flag; /**************************************************************************************** * 函数名 :Delay_ms * 函数功能:长时间延时 * 入口参数:延时基数 uchar ms_data * 返回 :无 ****************************************************************************************/ void Delay_ms(uint ms_data) { uchar i; while(ms_data--) { i = 124; while(i--); } } /**************************************************************************************** * 函数名 :init_mcu * 函数功能:mcu初始化函数 * 入口参数:无 * 返回 :无 ****************************************************************************************/ void init_mcu() { /***时钟初始化****/ OSCCTL = 0x60; //设置为8M /***端口初始化****/ TR0 = 0x08; //设置P03端口为输入,P0其他I/O口为输出 TR1 = 0x00; //设置P1端口为输出 TR2 = 0x00; //设置P2端口为输出 TR3 = 0x00; //设置P3端口为输出 TR4 = 0x00; //设置P4端口为输出 P0 = 0; //P0口输出低电平 P1 = 0; //P1口输出低电平 P2 = 0; //P2口输出低电平 P3 = 0; //P3口输出低电平 P4 = 0; //P4口输出低电平 OPTR = 0x05; //定时器0,定时发送数据到端口 计时64分频 T0 = 0x64; // 可计时156个周期,结合分频64和时钟8M实现时间间隔定时 约 5ms } /**************************************************************************************** * 函数名 :init_usart * 函数功能:Usart初始化函数 * 入口参数:无 * 返回 :无 ****************************************************************************************/ void init_usart() { /***Usart相关寄存器初始化****/ BRCTL=0x40; // 接收空闲 使用8位计数器,不考虑唤醒是使能和自动波特率检测 EUBRGH=0x00; // 波特率公式=SCLK/(m*y+1),其中SCLK系统时钟,如这里8M,m为倍频数,见手册,y为8位或16位波特率计数值 EUBRGL=0x0C; // SYNC=0(全双工异步模式),BRG16=0(使用8位波特率发生器),HBRG=0(低速),Baud=8000000/(64*(12+1))=9615 TSCTL=0x22; // 8位 发送,使能发送,全双工异步模式SYNC=0,低速模式HBRG=0,发送移位空,不发送同步间隔符 RSCTL=0x90; // 串口使能(配置引脚为串行口引脚),8位接收,接收使能,无帧错误,溢出错误,不考虑地址识别和第9位 TXIF=0; TXIE=0; RXIF=0; RXIE=1; // 开启接收中断,发送不中断 INTCTL = 0XE0; // 使能外部中断 PUIE 使能总中断 AIE T0IE } /**************************************************************************************** * 函数名 :usart_function * 函数功能:Usart功能函数 * 入口参数:无 * 返回 :无 ****************************************************************************************/ void usart_function() { if(Send_Flag) { Send_Flag=0; Sent_Vaule_To_UART(Send_Date); } if(Rev_Flag) { Rev_Flag=0; switch(Rev_Temp) { case 1:P37=!P37;break; case 2:P36=!P36;break; case 3:P35=!P35;break; case 4:P34=!P34;break; case 5:P33=!P33;break; case 6:P30=!P30;break; default:P37=1;P36=1;P35=1;P34=1;P33=1;P30=1;break; } } } /**************************************************************************************** * 函数名 :main * 函数功能:程序入口主函数 * 入口参数:无 * 返回 :无 ****************************************************************************************/ void main() { init_mcu(); init_usart(); Delay_ms(10); while(1) { usart_function(); } } //中断函数 void int_fun() __interrupt { if(RXIF) { if(OVFER || FRER) { Rev_Flag=0; } else { Rev_Flag=1; } Rev_Temp=RXSDR; // 清零 RXIF } if(T0IF) { T0IF = 0; T0 = 0x64; Timer_Count++; if(Timer_Count>100) { Timer_Count=0; Send_Date++; Send_Flag=1; } } }
举报
ahhsyf 发表于 2017-6-20 22:01 看上去和标准51的没什么区别,寄存器名字不一样而已。
dongbaohui 发表于 2017-6-23 19:07 中断看上去还是有点不一样的。
本版积分规则 发表回复 回帖后跳转到最后一页
29
218
0
扫码关注 21ic 官方微信
扫码关注嵌入式微处理器
扫码关注电源系统设计
扫码关注21ic项目外包
扫码浏览21ic手机版
本站介绍 | 申请友情链接 | 欢迎投稿 | 隐私声明 | 广告业务 | 网站地图 | 联系我们 | 诚聘英才
京公网安备 11010802024343号