⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 comm_test.c

📁 在单片机中
💻 C
📖 第 1 页 / 共 2 页
字号:
}
void led_write(unsigned int opcode_add, unsigned char data){
	
	led_init();
	
		LED_CS = 0;
		unsigned char  j;
      for (j = 0; j < 16; j++)//发送控制字opcode_add;
      {
			SPISCK = 0;
		    if (opcode_add & 0x8000)//从高位发起;
            	SPISO = 1;
            else
                SPISO = 0;
            DelayNmSec(DELAY);
            SPISCK = 1;//上升沿有效;
            DelayNmSec(DELAY);
            opcode_add <<= 1;
       }
       	for (j = 0; j < 8; j++)//发送字节data;
        {
            SPISCK = 0;

            if (data & 0x80)//从高位发起;
                 SPISO = 1;
            else
                 SPISO = 0;
            DelayNmSec(DELAY);   
            SPISCK = 1;//上升沿有效;
            DelayNmSec(DELAY);
            data <<= 1;
        }
			LED_CS = 1;
        	return;

	}
	

	void led_config(void){
		
		led_write(0x400A, 0xA0);

		/*
			配置芯片MCP23S17为与每个端口关联的寄存器非配到不同的存储区,
		  	禁止硬件顺序操作,地址指针不递增,禁止硬件地址引脚;
		*/
		
		led_write(0x4000, 0x00);
		//配置端口A 的IO方向寄存器为全部输出;
		led_write(0x4010, 0x00); 
		//配置端口B 的IO方向寄存器为全部输出;

	}
	
	void update_to_led(const unsigned char *data){
		
		led_write(0x400A, *data);//将*data写入PORTA中;
		led_write(0x401A, *(data + 1));
		//将*(data + 1)写入PORTB中;
	
	}
void InitUART2(unsigned int baudrate,unsigned char parity_check)              
{

   if(parity_check== PARITY_EVEN) 
          U2MODEbits.PDSEL=1;
   else if(parity_check== PARITY_ODD) 
          U2MODEbits.PDSEL=2;
    else
          U2MODEbits.PDSEL=0x00;

	//U2MODEbits.UARTEN = 1;
    // baud rate
	U2BRG = ((FCY/16)/baudrate) - 1;
	
	    /* clear IF flags */
    IFS1bits.U2RXIF = 0;
    IFS1bits.U2TXIF = 0;

    /* set priority */
    IPC7bits.U2RXIP = 6;
    IPC7bits.U2TXIP = 5;
    
    IEC1bits.U2RXIE = 0;  //enable
	IEC1bits.U2TXIE = 0;  //disable

    U2MODE = 0xC002;
    //U2STA = 0x8550;
  	U2STA = 0x8550;
  	
  //Parity and Data Selection bits
   //  11 = 9-bit data, no parity
   //  10 = 8-bit data, odd parity
   //  01 = 8-bit data, even parity
   //  00 = 8-bit data, no parity
  


}



void ConfigIntUART2(void)
{

}

void __attribute__((__interrupt__)) _U2TXInterrupt(void)
{
	while(U2STAbits.TRMT == 0);//当发送移位寄存器为空时(U2STAbits.TRMT == 1)则数据已经发送完毕;
	IFS1bits.U2TXIF = 0;
}

// interrupt vector for UART2 RX interrupt
//
//  1)使用meterrx_str缓冲区和电表进行通讯,包括内表,
//  2)使用rx_str缓冲区和232以及红外口进行通迅,只接收帧报文,最大MAXTXSIZE字节
//  3)都使用meterrx_ptr为缓冲区指针
//
void __attribute__((__interrupt__)) _U2RXInterrupt(void)
{
	IFS1bits.U2RXIF = 0;	// clear interrupt flag
	
	//rx_str[i++] = (unsigned char)U2RXREG;
	while(U2STAbits.URXDA == 1)//已接收到数据
    	rx_str[i++] = (unsigned char)U2RXREG;
}

void __attribute__((__interrupt__)) _U1RXInterrupt(void)
{
	float i1 = 0;
	float i2 = 0;
	float i3 = 0;
	float i4 = 0;
	float i5 = 0;
	float i6 = 0;
	float i7 = 0;
	float i8 = 0;
	float i9 = 0;
	float i0 = 0;
	
	float i11 = 0;
	float i21 = 0;
	float i31 = 0;
	float i41 = 0;
	float i51 = 0;
	float i61 = 0;
	float i71 = 0;
	float i81 = 0;
	float i91 = 0;
	float i01 = 0;
	float i111 = 0;
	
	i1 = i11;
	i2 = i21;
	i3 = i31;
	i4 = i41;
	i5 = i51;
	i6 = i61;
	i7 = i71;
	i8 = i81;
	i9 = i91;
	i0 = i01;
	i11 = i111;
	IFS0bits.U1RXIF = 0;	// clear interrupt flag
	DMA1_start(16);
	DelayNmSec(5000);
	//rx_str[i++] = (unsigned char)U2RXREG;
	//while(U2STAbits.URXDA == 1)//已接收到数据
    //	rx_str[i++] = (unsigned char)U2RXREG;
}
void sendcharmeter(unsigned char data)
{
     ClrWdt();

     if(U2MODEbits.PDSEL == 3)
        U2TXREG = data;
     else
        U2TXREG = data & 0xFF;
}

void enablePRG_232(void)
{
    enableRxPRG232_LAT=0; //外部编程接口接收1(0--enable  1--disable)
    enableTxPRG232_LAT=1; //外部编程接口发送(1--enable  0--disable)
    DelayNmSec(1);  
}

void enableinfraRed(void)
{
	 //enableTxInfra_dir = OUTPUT;//红外发送控制引脚为输出引脚;
     enableTxInfra_LAT = 1;//0关闭红外发送,1为打开红外发送;
     //enableRxInfra_dir = OUTPUT;//红外接收控制引脚为输出引脚;
     enableRxInfra_LAT = 0;//1为关闭红外接收,0为打开红外接收;

}


//使能RS485通讯 发送
void enable485Send(void)
{
   ch0enablesend = 1;  //高电平可以发送
	Nop();
	Nop();
   ch0enablerec_LAT = 1;   //低电平不可以接收
}

void enable485Recv(void)
{
	
	ch0enablesend = 0;  //低电平不可以发送
	Nop();
	Nop();
  	ch0enablerec = 0;   //低电平可以接收
}

void enablebuttomcomm(void)
{
	 enableTxMeter_LAT = 0;//1为关闭向内置电表发送数据,0为打开向内置电表发送数据;
	Nop();
	Nop();
	 enableRxMeter_LAT = 0;//1为关闭接收内置电表数据,0为打开接收内置电表数据;
}

void DMA0_init(void){

	/****************************
	
		DMA0中断初始化
	
	****************************/
	
	IFS0bits.DMA0IF = 0;//清零DMA0的中断标志;
	IPC1bits.DMA0IP = 7;//设置DMA0的中断优先级为7;
	IEC0bits.DMA0IE = 1;//打开DMA0中断服务;
	
	/****************************
	
		DMA0基本参数设置
	
	****************************/

	
	DMA0REQ = 0x001F;//强制DMA0传输(使能以后才可以置1,但无法清零),使用U2TX为DMA0的中断源;
	//DMA0REQbits.FORCE = 1;
	DMA0STA = (unsigned int)0x0000;//设置DMA0的主数据缓冲区的地址为0x4000,大小为1KB;
	DMA0STB = (unsigned int)0x0400;//设置DMA0的辅数据缓冲区的地址为0x4400,大小为1KB;
	DMA0PAD = (unsigned int)&U2TXREG;//设置与DMA通讯的外设缓存区的地址是寄存器U2TXREG的地址;
	//DMA0CNT = 0x000f;//设置需要传输的数据的个数为2K个数据(字节或则是字);
	
	/***************************************************************
	
		设置DMA0模块为关闭状态,数据传输格式为字节格式,写入外设,
		数据块传输完成中断模式,正常写模式,
		寻址模式为带后递增模式,工作模式为连续数据块非乒乓模式;
	
	***************************************************************/
	
	DMA0CON = 0x6000;

}

void DMA0_start(unsigned int len){

	DMA0CNT = len - 1;
	DMA0CONbits.CHEN = 1;
	//U2TXREG = *DMA_RAM;
	DMA0REQbits.FORCE = 1;
}

void _ISR _DMA0Interrupt(void){
	
	IFS0bits.DMA0IF = 0;//清零DMA0的中断标志;
	DMA0CONbits.CHEN = 0;//关闭DMA0通道;
	
}

void DMA1_init(void){


	/****************************
	
		DMA1中断初始化
	
	****************************/
	
	IFS0bits.DMA1IF = 0;//清零DMA1的中断标志;
	IPC3bits.DMA1IP = 7;//设置DMA1的中断优先级为7;
	IEC0bits.DMA1IE = 1;//打开DMA1中断服务;
	
	/****************************
	
		DMA1基本参数设置
	
	****************************/

	
	DMA1REQ = 0x000c;//使用U1TX为DMA0的中断源;
	DMA1STA = (unsigned int)0x0000;//设置DMA1的主数据缓冲区的地址为0x4000,大小为1KB;
	DMA1STB = (unsigned int)0x0400;//设置DMA1的辅数据缓冲区的地址为0x4400,大小为1KB;
	DMA1PAD = (unsigned int)&U1TXREG;//设置与DMA通讯的外设缓存区的地址是寄存器U1TXREG的地址;
	/***************************************************************
	
		设置DMA1模块为关闭状态,数据传输格式为字节格式,写入外设,
		数据块传输完成中断模式,正常写模式,
		寻址模式为带后递增模式,工作模式为连续数据块非乒乓模式;
	
	***************************************************************/
	
	DMA1CON = 0x6000;

}

void DMA1_start(unsigned int length){

	DMA1CNT = length - 1;//设置传输数据块长度;
	DMA1CONbits.CHEN = 1;//打开DMA1通道;
	DMA1REQbits.FORCE = 1;//触发DMA1传输;
}

void _ISR _DMA1Interrupt(void){
	
	IFS0bits.DMA1IF = 0;//清零DMA1的中断标志;
	//DelayNmSec(2);
	DMA1CONbits.CHEN = 0;//关闭DMA1通道;
	
}

int main(void){
unsigned int i = 0;
		ClrWdt();	
	cpu_init();		
	LcmInit();
		ClrWdt();
	LcmClearTXT();
		ClrWdt();
	PutStr(0, 0, "************");
	WriteCommand(0x0c);
		ClrWdt();
	led_init();
	led_config();
	led_control_word.port[0] = 0x06;
	led_control_word.port[1] = 0x00;
	update_to_led(led_control_word.port);
	//ConfigIntUART2();
	UART1_Init(9600, PARITY_NONE);
	enablePRG_232();
	for(i = 0;i < 1024; i++)
		DMA_RAM[i] = i;
		
	for(i = 1024;i < 2048; i++)
		DMA_RAM[i] = 0xbb;
	//DMA0_init();
	DMA1_init();
	//enableinfraRed();
	//enable485Recv();

	//enable485Send();
	//enablebuttomcomm();
	//sendcharmeter(0x68);
	
		//DelayNmSec(5000);
	
//	sendcharmeter(0x68);
	//DMA0_start(16);
	//DelayNmSec(3000);
	//DMA1_start(16);
	
	while(1);
	DelayNmSec(3000);
	
	unsigned char cs = (unsigned char)((unsigned char)0x68 + (unsigned char)0x99 + (unsigned char)0x99 + (unsigned char)0x99 + (unsigned char)0x99 + (unsigned char)0x99 + (unsigned char)0x68 + (unsigned char)0x01 + (unsigned char)0x02 + (unsigned char)0xff + (unsigned char)0xff);
	    /* enable/disable interrupt */
	while(1)
	{
	    sendcharmeter(0x68);
        for(i=0;i<6;i++) sendcharmeter(0x99);
        sendcharmeter(0x68);
        sendcharmeter(0x01);
        sendcharmeter(0x02);
        sendcharmeter(0xFF);
        sendcharmeter(0xFF);
        sendcharmeter(cs);
        sendcharmeter(0x16);
		DelayNmSec(2000);
	
	}
	
	
	//U2STAbits.UTXEN = 0;
	/*led_control_word.port[0] = 0xff;
	led_control_word.port[1] = 0xff;
	update_to_led(led_control_word.port);
	*/

	while(1);
	return 0;	

}


void UART1_Init(unsigned int baudrate, unsigned char parity_check)
{
	U1MODEbits.UARTEN = 0;	//禁止UART1

	//中断允许控制寄存器0 :0--禁止中断请求;  1--允许中断请求
	IEC0bits.U1RXIE = 0;	
    IEC0bits.U1TXIE = 0;

	//中断标志状态寄存器0 :0--未产生中断请求;1--产生中断请求
    IFS0bits.U1RXIF = 0;	
    IFS0bits.U1TXIF = 0;
	
	//中断优先级控制寄存器2 :0~7 -- UART1接收优先级位数
    IPC2bits.U1RXIP = 6;

	//中断优先级控制寄存器3 :0~7 -- UART1发送优先级位数
    IPC3bits.U1TXIP = 5;

    /* enable/disable interrupt */
    IEC0bits.U1RXIE = 1;  //enable
    IEC0bits.U1TXIE = 0;  //disable

    //波特率的设置
	U1BRG = ((FCY/16)/baudrate) - 1;

	//UART1模式寄存器
    U1MODE = 0xC000;   	//使能UART1

	//UART1状态控制寄存器
    U1STA = 0x8550;

   	if(parity_check== PARITY_EVEN) 
		U1MODEbits.PDSEL=1;
   	else if(parity_check== PARITY_ODD) 
     	U1MODEbits.PDSEL=2;
   	else
      	U1MODEbits.PDSEL=0x00;

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -