• 【HC89S003F4开发板】 3串口调试


    HC89S003F4开发板串口调试

    使用资料自带的demo

    主程序

    /************************************系统初始化****************************************/
    	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;							              	 //使能总中断
        
    	while(1)
    	{
    		if(guc_Uartflag)
    		{
    			IE &=~ 0x10;				            //失能UART1中断
    			for(guc_i= 0;guc_i<guc_Uartcnt;guc_i++)
    			{
    				SBUF = guc_Uartbuf_a[guc_i];  //发送8位串口数据
    				while(!(SCON & 0x02));
    				SCON &=~ 0x02;			          //清除发送中断标志位
    			}
    			IE |= 0x10;					            //UART1中断使能
    			guc_Uartflag = 0;
    			guc_Uartcnt = 0;
    			SCON |= 0x10;				            //UART1接收使能
    		}	
    	}
    

    中断接收程序

    void UART1_Rpt(void) interrupt UART1_VECTOR
    {
    	if(SCON & 0x01)	//判断接收中断标志位
    	{
    		guc_Uartbuf_a[guc_Uartcnt++] = SBUF;//转存8位串口接收数据
    		if(guc_Uartcnt >= 5)
    		{
    			SCON &=~ 0x10;	//失能UART1接收
    			guc_Uartflag = 1;
    		}
    		  SCON &=~ 0x01; //清除接收中断标志位
    	}									
    }
    

    实际效果

    image
    image

    连续打印

    封装成函数

    void PrintString(char* buf)
    {
    	int sub = 0;
    	while(buf[sub] != 0)
    	{				
    		SBUF = buf[sub];  //·¢ËÍ8λ´®¿ÚÊý¾Ý
    		while(!(SCON & 0x02));
    		SCON &=~ 0x02;			          //Çå³ý·¢ËÍÖжϱê־λ
    		sub++;
    	}
    }
    

    主程序while里改成

        char sendbuf[] = "串口发送
    ";
        PrintString(sendbuf);
    

    实际输出

    image

  • 相关阅读:
    星空雅梦
    星空雅梦
    星空雅梦
    星空雅梦
    深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)请自取
    Map遍历法则
    c.toArray might (incorrectly) not return Object[]
    JavaGuide
    NIO入门
    Docker应用安装
  • 原文地址:https://www.cnblogs.com/yywBlogW/p/11367456.html
Copyright © 2020-2023  润新知