📄 mainloop.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 + -