本帖最后由 芯圣电子官方QQ 于 2023-7-25 14:28 编辑
测试:利用配套送的USB虚拟串口适配器跟单片机的串口1进行通信互动。
电脑给单片机发送字符1或者2.发送1后,单片机返回一句话。发送2给单片机后返回另外一句话。
实现单片机的串口发送字符串函数。
- #define ALLOCATE_EXTERN
- #include "HC89S003F4.h"
- /***************************************************************************************
- * @实现效果 收到字符1,返回Hello Word,收到字符2返回Hello 21IC。
- * @操作步骤 接上TXD,RXD短路帽,然后通过上位机软件发送5个8位数据
- * @注意事项 波特率9600,8位数据,无校验位
- ***************************************************************************************/
- unsigned char xx;
- void put_string(char *str)
- {
- while(*str!='\0')
- {
- SBUF = *str++;//发送8位串口数据
- while(!(SCON & 0x02));
- SCON &=~ 0x02; //清除发送中断标志位
- }
- }
- void main()
- {
- /************************************系统初始化****************************************/
- WDTCCR = 0x00; //关闭看门狗
- //本例程为方便测试关闭看门狗,实际使用中,建议客户打开看门狗,详见WDT复位例程
- CLKSWR = 0x51; //选择内部高频RC为系统时钟,内部高频RC 2分频,Fosc=16MHz
- CLKDIV = 0x01; //Fosc 1分频得到Fcpu,Fcpu=16MHz
- /**********************************UART配置初始化**************************************/
- P2M0 = P2M0&0x0F|0x80; //P21设置为推挽输出
- P0M1 = P0M1&0x0F|0x20; //P03设置为上拉输入
- TXD_MAP = 0x21; //TXD映射P21
- RXD_MAP = 0x03; //RXD映射P03
- T4CON = 0x06; //T4工作模式:UART1波特率发生器
-
- //波特率计算
- //波特率 = 1/16 * (T4时钟源频率 / 定时器4预分频比) / (65536 - 0xFF98)
- // = 1/16 * ((16000000 / 1) / 104)
- // = 9615.38(误差0.16%)
- //波特率9600
- //反推初值 = (65536 - ((T4时钟源频率 / 定时器4预分频比) * (1 / 16)) / 波特率)
- // = (65536 - (16000000 * (1 / 16) / 9600))
- // = (65536 - 104.167)
- // = FF98
-
- TH4 = 0xFF;
- TL4 = 0x98; //波特率9600
- SCON2 = 0x02; //8位UART,波特率可变
- SCON = 0x10; //允许串行接收
- IE |= 0X10; //使能串口中断
- EA = 1; //使能总中断
- put_string("==================================================================\n");
- put_string("------------------------===bbs.21ic.com===------------------------\n");
- put_string("==================================================================\n");
- put_string("收到字符1,返回Hello Word,收到字符2返回Hello 21IC,请输入一个字符:\n");
- while(1)
- {
- {
- IE &=~ 0x10; //失能UART1中断
- if(xx=='1')
- put_string("Hello word\n");
- else if(xx=='2')
- put_string("Hello 21IC,good night\n");
- xx=0;
- IE |= 0x10; //UART1中断使能
- SCON |= 0x10; //UART1接收使能
- }
- }
- }
- /***************************************************************************************
- * @说明 UART1中断服务函数
- * @参数 无
- * @返回值 无
- * @注 无
- ***************************************************************************************/
- void UART1_Rpt(void) interrupt UART1_VECTOR
- {
- if(SCON & 0x01) //判断接收中断标志位
- {
- xx=SBUF;//转存8位串口接收数据
- SCON &=~ 0x10; //失能UART1接收
- SCON &=~ 0x01; //清除接收中断标志位
- }
- }
|