| 串口收发框架,带不断电下载功能 单片机:AI8G1K08A
 根据
 https://www.stcaimcu.com/thread-4598-1-1.html
 修改
 新增不断电下载功能、485软件控制收发、串口数据原样返回
 
 复制代码#include <AI8G.H>
#include "define.h"
#include <intrins.h>
#include <absacc.h>
#include <string.h>
#include <stdarg.h>
#include <stdio.h>
#include <math.h>
#define                RXD                        P30
#define                TXD                        P31
#define                FOSC                11059200UL
#define                BAUD                9600UL                                                //波特率
#define                TMRF                200UL                                                //定时器频率
#define                BRT                        (0x10000-(FOSC/BAUD+2)/4)        //波特率发生器值
#define                TMR                        (0x10000-FOSC/TMRF/12)                //定时器值
#define                R_Buf_Len        64                                                        //Uart1接收缓存长度
#define                T_Buf_Len        64                                                        //Uart1发送缓存长度
#define                R                        0                                                        //485接收
#define                T                        1                                                        //485发送
unsigned char                RP;                                        //Uart1接收指针
unsigned char                TP;                                        //Uart1发送指针
unsigned char                Uart_R_Len;                        //Uart1接收长度
unsigned char                Uart_T_Len;                        //Uart1发送长度
unsigned char xdata        R_Buf[R_Buf_Len];        //Uart1接收缓存
unsigned char xdata        T_Buf[T_Buf_Len];        //Uart1发送缓存
char USER_STCISPCMD[]="@STCISP#";        //下载命令(用户自定义,可修改,必须和ISP软件中设置的一致)
///*----------------------------延时10us@STC-Y6@11.0592MHz----------------------------*/
//void Delay_10us(void)
//{
//        unsigned char i;
//        i=35;
//        while(--i);
//}
///*----------------------------延时x10us----------------------------*/
//void Delay_x10us(unsigned char x)
//{
//        while(x--)
//                Delay_10us();
//}
/*----------------------------延时10ms@STC-Y6@11.0592MHz----------------------------*/
void Delay_10ms(void)
{
        unsigned char i,j;
        _nop_();
        _nop_();
        i=144;
        j=157;
        do
        {
                while(--j);
        }while(--i);
}
/*----------------------------延时x10ms----------------------------*/
void Delay_x10ms(unsigned char x)
{
        while(x--)
                Delay_10ms();
}
void UART_Send(unsigned int x)
{
        TP=0;
        Uart_T_Len=x;
        TI=1;
}
void Uart_Printf(unsigned char *v,...)
{
        va_list ap;
        va_start(ap,v);
        while(Uart_T_Len);
        UART_Send(vsprintf(T_Buf,v,ap));
        va_end(ap);
}
void UART_Return(unsigned char temp)
{
        memcpy(T_Buf,R_Buf,temp);
        UART_Send(temp);
}
void Init(void)
{
        P_SW2|=EAXFR;
        
        P0M1=0x00;        P0M0=0x00;        //设置IO模式
        P1M1=0x00;        P1M0=0x00;        //设置IO模式
        P2M1=0x00;        P2M0=0x00;        //设置IO模式
        P3M1=0x00;        P3M0=0x00;        //设置IO模式
        P4M1=0x00;        P4M0=0x00;        //设置IO模式
        P5M1=0x00;        P5M0=0x00;        //设置IO模式
        P6M1=0x00;        P6M0=0x00;        //设置IO模式
        P7M1=0x00;        P7M0=0x00;        //设置IO模式
        
        AUXR=0x40;                //设置定时器0时钟为12T模式,设置定时器1为1T模式,设置定时器1为波特率发生器
        TMOD=0x01;                //设置定时器0为16位不自动重装载模式,设置定时器1为16位自动重装载模式
        TH0=TMR>>8;                //设置定时器0初始值
        TL0=TMR;                //设置定时器0初始值
        TF0=0;                        //清除TF0中断标志位
        ET0=1;                        //启用定时器0中断
        
        SCON=0x50;                //设置UART1模式为8位数据可变波特率
        TH1=BRT>>8;                //设置UART1波特率
        TL1=BRT;                //设置UART1波特率
        TR1=1;                        //打开定时器1
        ES=1;                        //启用UART1中断
        
        EA=1;                        //启用总中断
}
void main(void)
{
        Init();
        Uart_Printf("AI8G1K08A auto download test.\r\n");
        while(1)
        {
                Uart_Printf("AI8G1K08A running.\r\n");
                Delay_x10ms(100);
        }
}
void Uart_Start(void)
{
        TL0=0x00;
        TH0=0xEE;
        TR0=1;
}
void Uart_Stop(void)
{
        TR0=0;
        TL0=0x00;
        TH0=0xEE;
        RP=0;
        memset(R_Buf,0x00,sizeof R_Buf);
}
void Timer0_Isr(void) interrupt 1 
{
        UART_Return(RP);        //超时原样返回
        Uart_Stop();
}
void Uart_Isr(void) interrupt 4
{
        if(RI)
        {
                RI=0;
                Uart_Start();
                R_Buf[RP]=SBUF;
                if((RP==sizeof USER_STCISPCMD-2)&&(memcmp(R_Buf,USER_STCISPCMD,sizeof USER_STCISPCMD-1)==0))        //收到用户命令后复位到ISP区
                {
                        IAP_CONTR=0x60;
                }
                if(RP==R_Buf_Len-1)
                {
                        Uart_Stop();
                }
                else if(TR0)
                {
                        RP++;
                }
        }
        if(TI)
        {
                TI=0;
                if(TP==Uart_T_Len)
                {
//                        TR=R;        //485软件收发控制
                        TP=0;
                        Uart_T_Len=0;
                }
                if(Uart_T_Len!=0)
                {
//                        TR=T;        //485软件收发控制
                        SBUF=(T_Buf[TP]);
                        TP++;
                }
        }
}
   硬件选项的时钟频率11.0592M
 注意下载端口一定要选CDC,不要选HID,否则不能正确发送下载命令
 用户命令按图设置:
 
   
  AI8G1K08A_printf.zip
(12.44 KB, 下载次数: 120) 
 
 |