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

📄 mainloop.c

📁 采用菲利普的USBD12芯片
💻 C
字号:
   /*
   //*************************************************************************
   //
   //                  		信息实验室
   //				
   // File Name:	mainloop.C
   // Revision:		1.2(2004-11-27)
   // Author:		Chen Gen Chao (Lovelorn)
   // Use library:  USB51S.LIB
   // Note:			USB51S.LIB不带DMA控制功能
   //*************************************************************************
   */

   /*
   //*************************************************************************
   //
   //                  		ZLGMCU
   //				www.zlgmcu.com
   // File Name:	mainloop.C
   // Revision:		0.4(2002-07-08)
   // Author:		Liu Ying Bin
   // Use library:  USB51S.LIB
   // Note:			USB51S.LIB不带DMA控制功能
   //*************************************************************************
   */


#include <stdio.h>
#include <string.h>
#include <reg51.h>                /* special function register declarations   */
#include "mainloop.h"
#include "isr.h"
#include "protozlg.h"
#include <rtx51tny.h>

/*
//*************************************************************************
//  Public static data
//*************************************************************************
*/

extern EPPFLAGS bEPPflags;
extern unsigned char idata GenEpBuf[];
extern unsigned char idata EpBuf[];
extern unsigned int data d12_addr;

extern unsigned int data D12_DATA;
extern unsigned int data D12_COMMAND;

unsigned char idata DataBuf[16];
unsigned char idata temp[10];
unsigned int uiADResult=0;//version 1.4


sfr CKCON = 0x8F;//87C52x2用
sbit clksel = P2^0;

//D12中断服务
usb_isr() interrupt 0
{
	DISABLE;
	fn_usb_isr();//调用D12中断服务子程序
	ENABLE;
}



void SysInit(void) _task_ 0
{
	P0 = 0xFF;//初始化I/O口
	P1 = 0xFF;
	P2 = 0xFF;
	P3 = 0xFF;

//	CKCON = 0x00;
	CKCON = 0x00;

//	if(clksel == 1)
//		CKCON = CKCON | 0x01;

	D12_DATA = 0xff02;			//定义数据地址
	D12_COMMAND = 0xff03;		//定义命令地址
	

	MCU_D12CS = 0x0;
	D12SUSPD = 0x0;

	IT0 = 0;//初始化中断
	EX0 = 1;
	PX0 = 0;
	EA = 1;

	MCU_D12CS = 0x1;
	MCU_D12CS = 0x0;
	D12_SetDMA(0x0);
	bEPPflags.value = 0;

	reconnect_USB();//联接USB总线
// start operation system
	MAX1241Init();
	os_create_task(1);
	os_create_task(2);
	os_create_task(3);
	os_send_signal(3);
	os_delete_task(0);

	
}

void UsbServe1(void) _task_ 1
{
	while(1)
	{
		usbserve();//USB服务数据处理
	}
}

void DataDeliver(void) _task_ 2
{
	while(1)
	{
		os_wait(K_SIG,0,0);
		if(bEPPflags.bits.configuration)
		{
			DISABLE;//接收到主机发来的LED控制信息
			bEPPflags.bits.ep1_rxdone = 0;
			ENABLE;
		////////////// the following are added by lovelorn/////////////////
			/*switch(memcmp(GenEpBuf,"GetData",7))//判断主机发来的命令是否正确
			{
			case(0):
				memcpy(GenEpBuf,"DataReady",9);//命令正确,回复"正确"应答,并通过Endpoint2发送数据
				D12_WriteEndpoint(3,9,GenEpBuf);
				DataProcess(DataBuf);
				D12_WriteEndpoint(5,16,DataBuf);
				break;
			case(1):
				memcpy(GenEpBuf,"Error",5);//命令错误,回复"错误"应答,不发送数据
				D12_WriteEndpoint(3,5,GenEpBuf);
				break;
			default:
				break;
			}
			*/
			memcpy(temp,GenEpBuf,10);
			if(!memcmp(GenEpBuf,"GetData",7))
			{
				memcpy(GenEpBuf,"DataReady",9);//命令正确,回复"正确"应答,并通过Endpoint2发送数据
				D12_WriteEndpoint(3,9,GenEpBuf);
				DataProcess(DataBuf);
				D12_WriteEndpoint(5,16,DataBuf);
				os_send_signal(3);
				continue;
			}
			memcpy(GenEpBuf,temp,10);
			if(!memcmp(GenEpBuf,"LED1_ON",7))
			{
				memcpy(GenEpBuf,"LEDOK",5);
				D12_WriteEndpoint(3,5,GenEpBuf);
				MCU_LED1=0;
				continue;
			}
			memcpy(GenEpBuf,temp,10);
			if(!memcmp(GenEpBuf,"LED0_ON",7))
			{
				memcpy(GenEpBuf,"LEDOK",5);
				D12_WriteEndpoint(3,5,GenEpBuf);
				MCU_LED0=0;
				continue;
			}
			memcpy(GenEpBuf,temp,10);
			if(!memcmp(GenEpBuf,"LED0_OFF",8))
			{
				memcpy(GenEpBuf,"LEDOK",5);
				D12_WriteEndpoint(3,5,GenEpBuf);
				MCU_LED0=1;
				continue;
			}
			memcpy(GenEpBuf,temp,10);
			if(!memcmp(GenEpBuf,"LED1_OFF",8))
			{
				memcpy(GenEpBuf,"LEDOK",5);
				D12_WriteEndpoint(3,5,GenEpBuf);
				MCU_LED1=1;
				continue;
			}
			memcpy(GenEpBuf,"Error",5);//命令错误,回复"错误"应答,不发送数据
			D12_WriteEndpoint(3,5,GenEpBuf);
		}
	}
}

void ADConvert(void) _task_ 3// A/D转换过程 
{                    //version 1.4
	unsigned char i=0;
	while(1)
	{
		os_wait(K_SIG,0,0);
		MAX1241DOUT=1;
		MAX1241CS=0;
		uiADResult=0;
		MAX1241SCLK=0;
		while(!MAX1241DOUT)
		{
			MCU_LED0=~MCU_LED0;
		}
		MAX1241SCLK=1;
		MAX1241SCLK=0;//第一个肪冲无信号
		for(i=0;i<12;i++)//获取A/D转换的12位串行数据
		{
			MAX1241SCLK=1;
			uiADResult<<=1;
			if(MAX1241DOUT)
				uiADResult++;
			MAX1241SCLK=0;
		}
		for(i=0;i<3;i++)//空脉冲,标准操作,参见datasheet
		{
			MAX1241SCLK=1;
			MAX1241SCLK=0;
		}
		MAX1241CS=1;
		DataBuf[2]=uiADResult%256;//将转换数据放入通道1寄存器
		DataBuf[3]=uiADResult/256;
	}
}
void DataProcess(unsigned char DataBuf[16])//对
{
	unsigned char i;
	unsigned char idata sum=0;
	DataBuf[0]=0x55;//设置数据起始头
	DataBuf[1]=0xAA;
	for(i=1;i<4;i++)        //测试用数据,正式版中该段数据由A/D产生
	{                       //通道2 3 4数据由此产生,为伪数据,通道1由A/D产生
		DataBuf[2*i+3]=0;   //高地址放数据高八位,低地址放数据低八位
		DataBuf[2*i+2]++;
	}
	for(i=2;i<15;i++)//校验和,校验和不包括数据起始头
	{
		sum+=DataBuf[i];
	}
	DataBuf[15]=sum;
}

void MAX1241Init(void) //MAX1241各信号线的初始化,避免错误信号产生
{                      //version 1.4
	MAX1241CS=1;
	MAX1241SCLK=0;
	MAX1241DOUT=1;
	bEPPflags.bits.ADCdone=0;
}

⌨️ 快捷键说明

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