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

📄 fun.c

📁 这是单片机实验板比较齐全的程序
💻 C
字号:
/*******************************************************************************
*  标题:  student2000单片机开发系统演示程序                            *
*  文件:  fun.C                                                               *
*  日期:  2007-5-4                                                             *
*  版本:  1.0                                                                  *

  ********************************************************************************
  *  描述:                                                                       *
  *        大部分通用函数集合                                             *     
*        RS232,RS485,延时函数,协议框架演示等                                  */
#include <reg52.h>
#include    <intrins.h>
#include <string.h>
#include <absacc.h>
#include <stdio.h>
#include "sybxt1.h"
xdata unsigned char  ucRxBuf[RXBUFSIZE];
xdata unsigned char  ucRxBuf1[RXBUFSIZE];
xdata sprotocol spro;
sbit P3_6= P3^6;
sbit P3_7= P3^7;
//rs485的方向控制端;
sbit SRSEL=P1^7;
unsigned int uiOffset=0;
unsigned int uiRxCount=0;
uchar i; 
sbit adclk = P1^1;     // 输入输出时钟I/O CLK
sbit addata = P1^0;    // 数据输出DATA OUT
sbit adcs = P1^5;      // 片选信号
sbit SPI_CLK=P1^1;
sbit SPI_DATA=P1^0;
sbit CS_DA=	P1^4;
//IIC,spi片选信号
sbit  pds12302=P1^3;
sbit  px5045=P1^6;
sbit  ptlc549=P1^5;
sbit  ptlc5615=P1^4;

void op_jdq(uchar value)
{
	bit xx;
	xx=value&0x01;
	P3_6=xx;
}
void op_bell(uchar value)
{
	bit xx;
	xx=value&0x01;
	P3_7=xx;
}
void ComInit(void) /*串行口初始化*/
{
	SCON = 0x50; //SCON: serail mode 1, 8-bit UART, enable ucvr 
	TMOD |= 0x20; //TMOD: timer 1, mode 2, 8-bit reload 
	PCON |= 0x00; //SMOD=0; 
	TH1 = 0xFd; //Baud:4800 fosc=11.0592MHz 
	TL1 = 0xFd; //Baud:4800 fosc=11.0592MHz 
	
	IE |= 0x90; //Enable Serial Interrupt 
	TR1 = 1; // timer 1 run 
}
/*********************************
串口 0 中断函数
*********************************/
void serial_0(void) interrupt 4
{
	
	unsigned	char a;
	if(RI)
	{  
		a=SBUF;
		ucRxBuf[uiRxCount]=a;
		RI=0;
		//send_byte(ucRxBuf[uiRxCount]);
		uiRxCount++;
		uiRxCount%=RXBUFSIZE;
		uccmd=a;
		
	}
	
}

void assignprotocol()
{
	//xdata uchar cmdstr[]={0x00,0x05,0x05,0x01 ,0x01 ,0x01 ,0x0d ,0x08 };
	xdata uchar cmdstr[28];
	xdata uchar responsestr[10];
	xdata uchar responselen;
	bit bdo=0;	
	xdata uchar j;	
	//	 uchar xx;
	//memcpy(ucRxBuf,cmdstr,8);	//调试用
	//uiRxCount=8;	
	while(uiOffset!=uiRxCount )
	{
		if(uiOffset<uiRxCount)
		{   if(uiRxCount-uiOffset>=7)
		bdo=1;
        else     bdo=0;
		
		}
		else
		{
			if(uiRxCount+RXBUFSIZE-uiOffset>=7)
				bdo=1;
			else bdo=0;
		}
		if(!bdo)
			return ;
		j=0;
		while(j<6 )
		{
			cmdstr[j]=ucRxBuf[(uiOffset+j)%RXBUFSIZE];
			//send_byte(cmdstr[j]);
			j++;
		}
		memcpy(&spro,cmdstr,6);
		
		if( spro.stx[0]==0x05 && spro.stx[1]==0x05 )
		{
			if(uiOffset<uiRxCount)
			{
				if(uiRxCount-uiOffset>=6+spro.len)
					bdo=1;
				else     bdo=0;
				
			}else
			{
				if(uiRxCount+RXBUFSIZE-uiOffset>=6+spro.len)
					bdo=1;
				else bdo=0;
			}
			if(!bdo)
				return ;
			while(j<(6+spro.len) )
			{
				cmdstr[j]=ucRxBuf[(uiOffset+j)%RXBUFSIZE];
				//send_byte(cmdstr[j]);
				j++;
			}
			
			if(dosprocmd(cmdstr,responsestr,&responselen) )
			{
				//	if(bdatavaild)
				//	send_bytes_len(responsestr,responselen);
				uiOffset+=responselen;
			}
			else uiOffset++;
			
			
			uiOffset%=RXBUFSIZE;
		}else
		{
			uiOffset++;
			uiOffset%=RXBUFSIZE;
		}
	}
}

uchar dosprocmd(uchar *buf,uchar *respone,uchar *packlen)
{	
	uchar rtn,i,j,brtn;
	rtn=0;
	memcpy(&spro,buf,5);
	for(i=0;i<4+spro.len;i++)
	{
		rtn=rtn+buf[i];
	}
	if(rtn==buf[i])
	{
		for(j=0;j<spro.len;j++)
		{
			if(spro.cmd==0x01)
			{
				op_jdq(buf[4+j]);
				send_byte('a');
				send_byte(buf[4+j]);
			}
			if(spro.cmd==0x02)
			{
				op_bell(buf[4+j]);
				send_byte('b');
				send_byte(buf[4+j]);
			}
		}
		*packlen=4+spro.len+2;
		brtn=1;
	}
	else brtn=0;
	memcpy(respone,"abcd",4);
	return brtn;
}
send_byte(unsigned char ucI)
{
	SBUF=ucI;
	do{}while(TI==0);
	TI=0;
}
send_bytes_len(unsigned char *ucI,uchar len)
{
	uchar i;
	for(i=0;i<len;i++)
	{
		SBUF=ucI[i];
		do{}while(TI==0);
		TI=0;
	}
}
send_bytes(unsigned char *ucI)
{
	for(i=0;i<strlen(ucI);i++)
	{
		SBUF=ucI[i];
		do{}while(TI==0);
		TI=0;
	}
}
send_bytes1_485(unsigned char *ucI,uchar len)
{
	SRSEL=1;
	for(i=0;i<10;i++)
		_nop_();
	for(i=0;i<len;i++)
	{
		SBUF=ucI[i];
		do{}while(TI==0);
		TI=0;
	}
	SRSEL=0;
	 	 for(i=0;i<10;i++)
			 _nop_();
}
void DisplayKeyToHex_RS485()
{
	int i;
	while(uiOffset!=uiRxCount)
	{
		memset(str,0,20);
		i=0;
		i =sprintf(str, "Key=[%c][%2bd]",ucRxBuf[uiOffset],ucRxBuf[uiOffset]);
		i+=sprintf(str+i,"[%2bx]",ucRxBuf[uiOffset]&0x0ff);
		send_bytes1_485(str,i);
		//send_bytes1_485(&ucRxBuf[uiOffset],1);
		uiOffset++;
		uiOffset%=RXBUFSIZE;
	}
}

void delay200ms(uchar icount)
{
	unsigned char i,j,k;
	while(icount--)
	{
		for(i=5;i>0;i--)
			for(j=132;j>0;j--)
				for(k=150;k>0;k--);
	}
}
void delay1ms(void)
{
	unsigned char i,j;
    for(i=5;i>0;i--)
		for(j=132;j>0;j--)
			;//for(k=1;k>0;k--);
}
uchar get549data(void)
{
	uchar i,sample_data;
    adclk=0;
    adcs=0;
    _nop_();
    _nop_();
    if(addata==1)
    {
        sample_data=1;
    }
    else
    {
        sample_data=0;
    }
    for(i=0;i<7;i++)
    {
        sample_data=(sample_data<<1);
        adclk=1;
        _nop_();
        _nop_();
        adclk=0;
        if(addata==1)
        {
            sample_data=(sample_data|0x01);
        }
    }
    adclk=1;
    _nop_();
    _nop_();
    adclk=0;
    _nop_();
    _nop_();
    adclk=1;
    adcs=1;
    return sample_data;
}

void da5615(uint da)
{
	uchar i;
	da<<=6;
	CS_DA=0;
	SPI_CLK=0;
	for (i=0;i<12;i++)
	{
		SPI_DATA=(bit)(da&0x8000);
		SPI_CLK=1;
		da<<=1;
		SPI_CLK=0;
	}
	CS_DA=1;
	SPI_CLK=0;
	for (i=0;i<12;i++);
} 


//实验板功能选择命令
//1、DS1302是IIC总线,P13:DS1302的RST脚,当RST=L时候,芯片不传输数据,RST=H,芯片和CPU通讯
//2、X5045是SPI总线,P16:x5045的/CS脚,/CS=L,芯片选中。 同时p17作为SPI总线的SO脚,不用关心。
//3、TLC549是IIC总线,P15:TLC549的/cs脚,低电平有效。
//4、TLC5615是SPI总线,P14:TLC5615的/Cs脚,低电平有效。
void chipcs(uchar ucchip)
{
switch(ucchip)
{

	case DS1302EN:
		pds12302=1;
		px5045=1;
		ptlc549=1;
		ptlc5615=1;
	break;
	case X5045EN:
		pds12302=0;
		px5045=0;
		ptlc549=1;
		ptlc5615=1;
	break;
	case TLC549EN:
		pds12302=0;
		px5045=1;
		ptlc549=0;
		ptlc5615=1;
	break;
	case TLC5615EN:
		pds12302=0;
		px5045=1;
		ptlc549=1;
		ptlc5615=0;
	break;
	default:
		pds12302=0;
		px5045=1;
		ptlc549=1;
		ptlc5615=1;
	 
}
}

⌨️ 快捷键说明

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