📄 yy1.c
字号:
#define CAY 22118400L
#define LED P07
#define BEEP P06
#define WRITE 0x00
#define READ 0x01
#define MY_ADD 0xfe
#define BUFF_SIZE 196
#define B_S BUFF_SIZE-1
unsigned char word[5];
unsigned char vb;
unsigned char op;
unsigned char COMMAND;
unsigned char add;
unsigned char OP_CODE;
unsigned long time;
xdata unsigned char buff[BUFF_SIZE];
unsigned char pbuff;
unsigned char pc1;
unsigned char pc2;
#include <includes.h>
OS_EVENT *sig;
void TaskStartyya(void *yydata) reentrant;
void TaskStartyyb(void *yydata) reentrant;
void TaskStartyyc(void *yydata) reentrant;
OS_STK TaskStartStkyya[MaxStkSize];//注意:在ASM文件中设置?STACK空间为40H即64。
OS_STK TaskStartStkyyb[MaxStkSize];
OS_STK TaskStartStkyyc[MaxStkSize];
void SLA_SEND(unsigned char out_data);
void SMBUS_ISR (void) interrupt 7
{
unsigned char err;
switch (SMB0STA){
case 0x08:
SMB0DAT =COMMAND; //起始条件已发出,发送地址
vb=0;
STA = 0;
break;
case 0x10: //重复起始条件已发出
SMB0DAT = COMMAND;
STA = 0;
break;
case 0x18:
SMB0DAT = word[vb];
//从地址+W已发出,收到ACK,发送数据第一字节
break;
case 0x20:
STO = 1;
//STA = 1;
//从地址+W已发出,收到NACK
break;
case 0x28:
vb++;
if(vb<OP_CODE) //数据字节已发出, 收到ACK ,发送其余字节
{
SMB0DAT = word[vb];
}else
{
STO = 1;
}
break;
case 0x30:
STO = 1;
//数据字节已发出, 收到NACK
break;
case 0x40:
AA = 0; // 从地址+R已发出,收到ACK
break;
case 0x50:
STO = 1;
//数据字节收到,ACK已发出
P3=0;
break;
case 0x58: STO = 1;
// 数据字节收到,NACK已发出
break;
case 0x60:
break;
//收到自己的从地址+W,ACK已发出
case 0x80: //收到数据字节,ACK已发出
buff[pc1]=SMB0DAT;
pc1++;
pbuff++;
if(pc1 % 7==3)
{
buff[pc1]=time;
pc1++;
buff[pc1]=time>>8;
pc1++;
buff[pc1]=time>>16;
pc1++;
buff[pc1]=time>>24;
pc1++;
pbuff+=4;
err=OSSemPost(sig);
}
if(pc1>B_S)pc1=0;
break;
default:
STO = 1;
break;
}
SI = 0;
}
void UART0(void) interrupt 4
{
OSIntEnter();
if(RI0)
{
switch(SBUF0)
{
// case 55: cc[0]=55;
// cc[1]=temp1;
// SBUF0=cc[0];
// break;
case 66: RSTSRC=2;
break;
}
RI0=0;
}
OSIntExit();
}
/*
void ET3_ISR(void) interrupt 14 // 1/1000s
{
//#pragma asm
//#pragma endasm
WDTCN=0xa5;
TMR3CN=0x06;
// LED=~LED;
}
*/
void main(void)
{
config();
OSInit();
InitTimer();
OSTaskCreate(TaskStartyya, (void *)0, &TaskStartStkyya[0],2);
OSTaskCreate(TaskStartyyb, (void *)0, &TaskStartStkyyb[0],3);
OSTaskCreate(TaskStartyyc, (void *)0, &TaskStartStkyyc[0],4);
sig=OSSemCreate(0);
OSStart();
}
void TaskStartyya(void *yydata) reentrant
{
unsigned char n;
yydata=yydata;
WDTCN = 0x07;
WDTCN = 0xA5;
time=0;
pc1=0;
pc2=0;
pbuff=0;
BEEP=0;
LED=0;
OSTimeDly(OS_TICKS_PER_SEC);
LED=1;
BEEP=1;
OSTimeDly(OS_TICKS_PER_SEC);
LED=0;
word[0]=0;
for(n=0;n<254;n=n+2)
{
add=n;
SLA_SEND(1);
OSTimeDly(1);
}
while(1)
{
OSTimeDly(OS_TICKS_PER_SEC);
}
}
void TaskStartyyb(void *yydata) reentrant
{
yydata=yydata;
while(1)
{
OSTimeDly(3*OS_TICKS_PER_SEC);
}
}
void TaskStartyyc(void *yydata) reentrant
{
unsigned char err;
yydata=yydata;
while(1)
{
OSSemPend(sig,0,&err);
while(pbuff>0)
{
LED=1;
BEEP=0;
SBUF0=buff[pc2];
while(~TI0);
TI0=0;
pc2++;
if((pc2 % 7)==0)OSTimeDly(2);
if(pc2>B_S)pc2=0;
pbuff--;
LED=0;
BEEP=1;
}
}
}
void SLA_SEND(unsigned char out_data)
{
SMB0CN = 0x44;
COMMAND = add | WRITE;
OP_CODE = out_data;
STA = 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -