|
本帖最后由 金砂紫钰 于 2012-9-29 10:28 编辑
以下程序我是希望达到能发数据包功能.编不过.
STC12C5A60S24.C(258): warning C209: '_send_data': too few actual parameters
#include <reg51.h>
#include <stdio.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define buf
#define MAX_REVBUF 17
#define MAX_TXBUF 8
typedef unsigned char UINT8;
typedef unsigned int UINT116;
typedef char INT8;
typedef int INT16;
typedef long INT32;
typedef bit BOOL;
bit PktRevFlg;
bit PktRdy;
bit RxCharTranFlg;
unsigned char RevBuf[MAX_REVBUF];
unsigned char RevP=0;
unsigned char UserTimer[3]; //byte0溢出(使能)标志 byte1定时值 byte2定时计数器
unsigned char TxBuf[MAX_TXBUF];
unsigned char TxP,TxLen;
bit TxFlg;
bit TxCharTranFlg=0;
/*define eeprom command*/
#define CMD_IDLE 0 // Standby
#define CMD_READ 1 // Byte read
#define CMD_PROGRAM 2 // Byte program
#define CMD_ERASE 3 // Sector erase
#define ENABLE_IAP 0X81 //22.1184
//char Buf;
//char CheckSum
/*
char *PLottery number
char *PEntet Gold number
char *PQuit Gold number */
/*
uint IAP_DAT_ADDRESS=0; //数据存储地址
uint IAP_ADD_ADDRESS=0x0200; //数据存储地址指针
uchar eeprom_flag=0; //第一区数据存储地址标号
uchar IapReadByte(uint addr); */
/*
struct packet{
volatile int DataBuf[]={0xbb,0x32,0x45}; // 起始符(包头起始标志0Xbb)包头:1-2字节
static char len[2]; // 数据] (包长度) 1-2字节
const char content; //数据 内容
int CheckSum[2]; // 奇偶 CheckSum
int tail[20]; //结束符(包尾结束标志0XAA)包头:1-2字节
} Buf={0xbb "DOUN"};
Buf1={0xbb"up"0xaa};
Buf2={0xbb"RIGHT"0xaa};
Buf3={0xbb"LEFT"0xaa};
Buf4={0xbb"exie"0xaa};
Buf5={0xbb"control 1"0xaa};
Buf6={0xbb"control 2"0xaa};
Buf7={0xbb"INTO"0xaa};
Buf8={0xbb &processor 0xaa}; */
//typedef unsigned char uchar;
//typedef unsigned int uint;
// char ch;
// bit read_flag= 0 ;
/*
sfr IAP_DATA =0xC2;
sfr IAP_ADDRH=0xc3;
sfr IAP_ADDRL=0xc4;
sfr IAP_CMD =0XC5;
sfr IAP_TRIG =0xc6;
sfr IAP_CONTR=0xc7; //定义IAP */
sbit s17=P0^7; //定义S17按键控制UP
sbit s18=P0^6; //定义S18按键控制DOWN
sbit s19=P0^5; //定义S19按键控制RIGHT
sbit s20=P0^4; //定义S20按键控制LEFT
sbit s21=P0^3; //定义S21按键控制INTO
sbit s22=P0^2; //定义S22按键控制exie
sbit s23=P0^1; //定义S23按键控制Control 1 (发炮1)
sbit s24=P0^0; //定义S24按键控制Control 2 ( 发炮2 )
sbit s25=P1^5; //片选信号控制脚
//uchar Sbuf[]="1"; //串口助手发主板的数据。
uchar buf0[]="DOUN\n";
uchar buf1[]="up\n"; //从层向PC机的命今
uchar buf2[]="RIGHT\n";
uchar buf3[]="LEFT\n";
uchar buf4[]="exie\n";
uchar buf5[]="control 1\n";
uchar buf6[]="control 2\n";
uchar buf7[]="INTO\n";
uchar buf8[]="processor\n"; //是接收到PC机信息后处理后,发给PC机命令
void choose(void)
{
s25=0;
}
//片选信号
void delay(uint n)
{
while (n--);
}
//////////**************************
//// 中断 波特率
///
//***********************************
void init_com( void )
{
SCON = 0x50;
PCON = 0x00;
IE |= 0x90 ;
TMOD = 0x20;
TH1=0xD0;
TL1=0xD0;
TR1=1;
}
/*
void send_string(uchar *buf)
{
uchar i;
//RI = 0 ;
i=0;
while (buf != 0x00)
{
SBUF = buf;
while (TI == 0);
TI = 0;
i++;
}
}
*/
///////////////////////////////////
uchar keyValue;
void delay2(uint time)
{
uint i,j;
for(i=0;i<time;i++)
for(j=0;j<50;j++);
}
///////////////////////////////////
void keyScan(void)
{
P0=P0|0xff;
if((P0&0xff)!=0xff)
{
delay(50);
keyValue=(P0&0xff);
}
else
{keyValue=0xff;}
}
//*******************************
//
//*********************************
void send_data(uchar *Sbuf,uchar n)
{
uchar i;
for(i=0;i<n;i++)
{
//SBUF=Sbuf;
SBUF=Sbuf;
while (TI==0);
TI =0;
}
}
//***********************************************
// 给数据包不同的命令
//*************************************************
/*
void assembly packet(uchar *buf)
{
uchar j;
j=0;
while (buf[j] != 0x00)
{
&processor= buf[j];
while (TI == 0);
TI = 0;
i++;
} */
/*********彩票机 退币机给PC机数********************/
//**************************************************************************************************
//按键扫描结果处理函数
//**************************************************************************************************
void keyHandle(void)
{
switch(keyValue)
{
case 0x7f: //如果S17按键按下
// delay2(2);
send_data(buf0); // 发送UP
break;
case 0xbf: //如果S18按键按下
// delay2(2);
send_data(buf1); // DOWN
break;
case 0xdf: //如果S19按键按下
// delay2(2);
send_data(buf2); // RIGHT
break;
case 0xef: //如果S20按键按下
// delay2(2);
send_data(buf3); // LEFT
break;
case 0xf7: //如果S21按键按下 // INTO
// delay2(2);
send_data(buf4);
break;
case 0xfb: // exit
// delay2(2);
send_data(buf5);
break;
case 0xfd: // Control 1 (发炮1)
// delay2(2);
send_data(buf6);
break;
case 0xfe: // Control 2 ( 发炮2 )
// delay2(2);
send_data(buf7);
break;
default:
break;
}
}
//***************************************************
//**************************************************************************************************
/*
void serial () interrupt 4 using 3
{
if (RI)
{
RI = 0 ; //此步必不可少,因为硬件不能将其置0
ch=SBUF; //从SBUF中取出数据
read_flag= 1 ; //就置位取数标志
}
}
*/
//***************************************************************************************
//存储程序
//***************************************************************************************
/**************************/
/*****************************************************/
/* void Delay(uchar n);
void IapIdle();
void IapProgramByte(uint addr,uchar dat);
void IapEraseSector(uint addr);
void IapRead_Add(void); */ //存储程序子程序
// send_string(Buf);
// delay(20000);
////////////////////////////////C51串口数据包处理程序/////////////////////////////////////////
/*
void Timer0Int(void) interrupt 1//16位定时器 22.1184M CPU频率下 17.6ms中断一次
{
char SysTick
SysTick++;
if(!UserTimer[0])
{UserTimer[1]++;
if(UserTimer[1]>=UserTimer[2])
{UserTimer[0]=1;}
}
} */
void UartInt(void) interrupt 4
{
unsigned char ch;
if(RI)
{RI=0;
ch=SBUF;
if(PktRdy) return; //上一包未处理直接返回
if(PktRevFlg) //判断接收有无超时
{if(UserTimer[0]) //有超时发生
PktRevFlg=0; //清除包标志
}
if(ch==0x7e) //包标识符
{if(!PktRevFlg) //包头
{PktRevFlg=1;
RevP=0; //初始化接收指针
UserTimer[1]=0; //开启定时器
UserTimer[0]=0;
RevBuf[0]=0xff;
RxCharTranFlg=0;
}
else //包尾(但需做长度对比来最终确认)
{if(RevP==(RevBuf[0]+1)) //收到的长度相符则确认是包尾
{PktRdy=1; PktRevFlg=0;}
else //否则接收错误
PktRevFlg=0;
}
}
else
{if(RevP>=MAX_REVBUF) //超出最大缓冲区长度
PktRevFlg=0;
else
{if(RxCharTranFlg) //转义有效
{switch(ch)
{case 0x5e : ch=0x7e;
break;
case 0x5d : ch=0x7d;
break;
default : PktRevFlg=0;
break;
}
RxCharTranFlg=0;
}
else
{if(ch==0x7d)
RxCharTranFlg=1;
else
RevBuf[RevP++]=ch;
}
}
}
}
if(TI)
{TI=0;
if(!TxFlg) return;
if(TxP==TxLen)
{TxFlg=0; //发送完毕
SBUF=0x7e;
}
else
{if(TxBuf[TxP]==0x7e||TxBuf[TxP]==0x7d)
{if(!TxCharTranFlg)
{TxCharTranFlg=1;
SBUF=0x7d;
}
else
{if(TxBuf[TxP]==0x7e) SBUF=0x5e;
if(TxBuf[TxP]==0x5d) SBUF=0x5d;
else SBUF=0xff;
TxP++;
TxCharTranFlg=0;
}
}
else SBUF=TxBuf[TxP++]; //继续发送
}
}
}
unsigned char GetCheckSum(unsigned char *Sbuf,unsigned char len)
{
unsigned char sum=0;
do{
// sum+=buf[--len];
sum+=Sbuf[--len];
}
while(len);
return sum;
}
#define NATIVE_ADDR (*((unsigned char code *)0x07ff))
void PktProc(void) //数据包解析
{
unsigned char len;
len=RevBuf[0];
if(RevBuf[len]==GetCheckSum(RevBuf,len)) //校验无误
{if(RevBuf[1]!=NATIVE_ADDR) //地址比较
return;
switch (RevBuf[2]) //解析命令
{case 0x01 : //读取设备状态
TxBuf[0]=0x1b; //包头 开始位
TxBuf[1]=0x31; //机器位 固定值
TxBuf[2]=5; //命令字长度(从下标到结束)
TxBuf[3]=0; // 内容 (0-255)
TxBuf[4]=0; // 内容 (0-255)
TxBuf[5]=0xE0; // 内容 命令位
TxBuf[6]=GetCheckSum(TxBuf,6); //校验
TxBuf[7]=0x0d; //包尾
SBUF=0x1b; //开始发送 包头识别
TxLen=8;
TxFlg=1;
TxP=0;
break;
default:
break;
}
}
}
main()
{
char Sbuf[]=20;
char buf
IT0 = 1;
EX0 = 1;
EA = 1; //开中断
init_com();
choose();
while (1)
{
keyScan();
keyHandle();
delay(20000);
//if (read_flag) //如果取数标志已置位,就将读到的数从串口发出
//}
//read_flag= 0 ; //取数标志清0
//send_data(buf,"A"); //将读到的数从串口发出
send_data(Sbuf,8);
}
}
********************************************************************
PC机上格式是这样的
// 查键
void checkkey(){
char Sbuf[]=20;
Sbuf[0]=0x1b;
Sbuf[1]=0x31;
Sbuf[2]=5;
Sbuf[3]=0;
Sbuf[4]=0;
Sbuf[5]=0xe0;
Sbuf[6]=GetCheckSum(Sbuf,5);
Sbuf[7]=0x0d;
send_data(Sbuf,8);
}
退币
void OutGameCoin(uchar tbio){
char Sbuf[]=20;
Sbuf[0]=0x1b;
Sbuf[1]=0x31;
Sbuf[2]=7;
Sbuf[3]=0;
Sbuf[4]=0;
Sbuf[5]=0xe1;
Sbuf[6]=tbio+'0';
Sbuf[7]=0x0d;
Sbuf[8]=GetCheckSum(Sbuf,7);
Sbuf[9]=0x0d;
send_data(Sbuf,10);
}
LED灯
/* void outGameLed(){
int f
char Sbuf[]=100;
uchar i,j;
Sbuf[0]=0x1b;
Sbuf[1]=0x31;
Sbuf[2]=25;
Sbuf[3]=0;
Sbuf[4]=0;
Sbuf[5]=0xe4;
f=6;
for(i=0;i<20;i++;f++){
Sbuf[f]=pledvalue;
}
Sbuf[26]=(char)GetCheckSum(Sbuf,25);
Sbuf[27]=SER_END;
send_data(Sbuf,28);
} */
|
阿莫论坛20周年了!感谢大家的支持与爱护!!
一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
|