📄 mi.c
字号:
#include<reg52.h>
#include<stdio.h>
#include<math.h>
#define ucode unsigned char code
#define Status_TRANS 0
#define Status_RCV 1
#define Correct 0
#define Err 1
#define MODE_32 3
#define MODE_16 2
#define MODE_08 1
#define MODE_04 0
#define f576 2
#define f768 1
#define f1152 0
sbit SPI_SDI = P1^3 ; // Interface to MI200, SDI pin
sbit SPI_SDO = P1^2 ; // Interface to MI200, SDO pin
sbit SPI_Clk = P1^1 ; // Interface to MI200, clk pin
sbit SPI_CS = P1^0 ; // Interface to MI200, CS pin
sbit SW_1 = P3^3 ; // press KEY to define user's function
sbit SW_0 = P3^2 ; // press KEY to define user's function
sbit TXD_pin = P3^1 ;
sbit RXD_pin = P3^0 ;
sbit LED_PWR = P2^0; // Power is OK.
sbit LED_TX = P2^1; // Sending Packet Now.
sbit LED_RX = P2^2; // Received Correct Frame Head
sbit LED_PC = P2^3; //
sbit LED_FRM = P2^4; //
sbit LED_CORR = P2^5; // Received Packet CRC OK
sbit LED_ERR = P2^6; // Received Packet CRC Bad
sbit LED_RSV = P2^7;
//sbit IRQn = P1^2 ;
sbit CODE_num2 = P0^7 ;
sbit CODE_num1 = P0^6 ;
sbit CODE_num0 = P0^5 ;
sbit SL_fre1 = P0^4 ; // These two bit to define the Carrier Frequency of MI200
sbit SL_fre0 = P0^3 ; //
sbit CODE_length1 = P0^2 ; // These two bit to define the SS Code length or the Data rate of MI200
sbit CODE_length0 = P0^1 ; //
sbit MCU_Status = P0^0 ; // to define TRANS/REC status
unsigned char bdata rec_byte;
sbit rec_D0 = rec_byte^0;
unsigned char bdata snd_byte;
sbit snd_D0 = snd_byte^0;
sbit snd_D1 = snd_byte^1;
sbit snd_D2 = snd_byte^2;
sbit snd_D3 = snd_byte^3;
sbit snd_D4 = snd_byte^4;
sbit snd_D5 = snd_byte^5;
sbit snd_D6 = snd_byte^6;
sbit snd_D7 = snd_byte^7;
unsigned char bdata status_MI200;
sbit MI200_TI = status_MI200^7;
sbit MI200_RI = status_MI200^6;
sbit MI200_Carr = status_MI200^5;
sbit MI200_Frame = status_MI200^4;
sbit MI200_EPF = status_MI200^3;
sbit MI200_WEL = status_MI200^1;
sbit MI200_WIP = status_MI200^0;
unsigned char bdata mode_configuration;
sbit MI200_RX_TXn= mode_configuration^7;
sbit MI200_Code2 = mode_configuration^6;
sbit MI200_Code1 = mode_configuration^5;
sbit MI200_Code0 = mode_configuration^4;
sbit MI200_SS1 = mode_configuration^3;
sbit MI200_SS0 = mode_configuration^2;
sbit MI200_Fre1 = mode_configuration^1;
sbit MI200_Fre0 = mode_configuration^0;
unsigned char bdata snd_ff;
sbit TX_EN = snd_ff^7;
sbit SND_bit = snd_ff^6;
sbit MCU_Clk_Dl = snd_ff^5;
sbit SND_bit_temp = snd_ff^4;
sbit Ready_DL = snd_ff^3;
sbit rec_err = snd_ff^2;
sbit lcd_busy_flag = snd_ff^0;
unsigned char mode_sel;
unsigned char rec_byte_H;
unsigned char rec_byte_L;
unsigned char package_len;
unsigned char TotalPkg;
unsigned char CurrentPkg;
unsigned char rec_pkgs_num;
unsigned char err_pkgs_num;
unsigned char Str_Buff_cnt;
unsigned char rec_threshold;
unsigned char count=0 ;
ucode info[17] ={"Better PLC World"};
//unsigned char info[17] ={"Better PLC World"};
void delay_1(void)
{ unsigned int a;
for(a=0;a<20000;a++)
{a=a;}
}
void write_SPI(unsigned char ss)
{ unsigned char i;
snd_byte = ss;
for(i=0;i<8;i++)
{ SPI_Clk = 0;
SPI_SDI = snd_D7;
SPI_Clk = 1;
snd_byte <<=1;
}
}
unsigned char read_SPI(void)
{ unsigned char i;
for(i=0;i<8;i++)
{ snd_byte <<=1;
SPI_Clk = 1;
SPI_Clk = 0;
snd_D0 = SPI_SDO;
}
return(snd_byte);
}
unsigned char read_SPI_reg(unsigned char ss)
{ unsigned char ff;
SPI_CS = 0;
write_SPI(ss);
ff=read_SPI();
SPI_CS = 1;
return(ff);
}
void en_MI200_reg(void)
{
SPI_Clk = 0;
SPI_CS = 0;
write_SPI(0x08);
SPI_Clk = 0;
SPI_CS = 1;
}
void dis_MI200_reg(void)
{ SPI_Clk = 0;
SPI_CS = 0;
write_SPI(0x09);
SPI_Clk = 0;
SPI_CS = 1;
}
void write_SPI_register(unsigned char addr,w_data)
{ SPI_CS = 0;
write_SPI(addr);
write_SPI(w_data);
SPI_Clk = 0;
SPI_CS = 1;
}
void set_MI200_mode_send(void)
{ unsigned char sts_byte;
MI200_Code2 = CODE_num2 ;
MI200_Code1 = CODE_num1 ;
MI200_Code0 = CODE_num0 ;
MI200_SS1 = mode_sel & 0x02;
MI200_SS0 = mode_sel & 0x01;
MI200_Fre1 = SL_fre1;
MI200_Fre0 = SL_fre0;
do
{ sts_byte = read_SPI_reg(0x82);
}
while((sts_byte & 0x80)==0x00); //-- TI
en_MI200_reg();
write_SPI_register(0x01,mode_configuration); //-- write mode configuration;
dis_MI200_reg();
}
void send_frame_via_spi(unsigned char snd_byte_h,snd_byte_l)
{ unsigned char sts_byte;
do
{ sts_byte = read_SPI_reg(0x82);
}
while((sts_byte & 0x80)==0x00); //-- wait when TI = 0;
en_MI200_reg();
write_SPI_register(0x02,(sts_byte & 0x7f)); //-- write status configuration, clear TI flag;
SPI_CS = 0;
write_SPI(0x04);
write_SPI(snd_byte_h);
write_SPI(snd_byte_l);
SPI_Clk = 0;
SPI_Clk = 0;
SPI_CS = 1;
dis_MI200_reg();
}
void rec_frame_via_spi(void)
{ unsigned char sts_byte;
do
{ sts_byte = read_SPI_reg(0x82); //-- read status register
if( ( sts_byte&0x30 ) != 0x30 )
{ rec_err = Err ;
return ;
}
}
while((sts_byte & 0x40)==0x00); //-- wait when RI = 0;
en_MI200_reg();
write_SPI_register(0x02,( (sts_byte & 0xbf ) | 0x02 ) ); //clear RI flag
SPI_CS = 0; //--
write_SPI(0x84); //--
rec_byte_H = read_SPI(); //--
rec_byte_L = read_SPI(); //--
SPI_Clk = 0;
SPI_CS = 1;
dis_MI200_reg();
}
unsigned char rec_packet_head(void)
{ unsigned char rvd_byte;
do
{ rvd_byte = read_SPI_reg(0x82); //-- read receiving mode configuration
}
while( (rvd_byte & 0x10) == 0x00 ); //-- until FRM = 1
do { rvd_byte = read_SPI_reg(0x83); } //-- read receiving mode configuration
while(rvd_byte==0x00); //-- wait when receiving mode configuration register==0
en_MI200_reg();
write_SPI_register(0x03,0x00); //-- clear receiving mode configuration byte
dis_MI200_reg();
return(rvd_byte);
}
void send_package(len,s)
unsigned char len;
ucode *s;
{ unsigned char i;
for(i=0;i<len;i=i+2)
{ send_frame_via_spi(s[i],s[i+1]);
}
}
void init_UART(void)
{ TMOD = 0x20; //Counter 1, timer mode, mode 2, 8 bit reloaded.
SCON = 0x40; //8 bit Uart,disable receive
TH1 = 0xfd; //19.2kbps
TH0 = 0xfd; //19.2kbps
PCON = 0x80; //smod = 1
TR1 = 1;
REN = 0;
}
void init_sys(void)
{ P0 = 0xff;
P1 = 0xff;
P2 = 0xff;
P3 = 0xff;
Str_Buff_cnt = 0;
rec_pkgs_num = 0;
err_pkgs_num = 0;
LED_PWR = 0;
rec_threshold = 80;
rec_err = Correct;
init_UART();
SPI_Clk = 0;
SPI_Clk = 0;
SPI_CS = 0;
write_SPI(0x08); //-- WREN
SPI_Clk = 0;
SPI_CS = 1;
en_MI200_reg();
write_SPI_register(0x07,0xff); //-- write analog signal processing configuration register,
write_SPI_register(0x0c,rec_threshold); //-- fixed rec threshold before correct frame head
write_SPI_register(0x0d,0x10); //-- fixed rec threshold after correct frame head
write_SPI_register(0x10,0x66); //-- recommendatory value of Bandpass Filter's setting
write_SPI_register(0x11,0x88);
write_SPI_register(0x12,0x66);
write_SPI_register(0x13,0x88);
write_SPI_register(0x14,0x66);
write_SPI_register(0x15,0x88);
dis_MI200_reg();
}
void send_sbuff(unsigned char charr)
{ SBUF = charr;
while(TI==0);
TI = 0;
}
void put_buff_trans(void)
{ CurrentPkg++ ;
send_sbuff('S');
send_sbuff('e');
send_sbuff('n');
send_sbuff('d');
send_sbuff('i');
send_sbuff('n');
send_sbuff('g');
send_sbuff('.');
send_sbuff('.');
send_sbuff('.');
send_sbuff(0x0d);
send_sbuff(0x0a);
send_sbuff(' ');
send_sbuff(' ');
send_sbuff(' ');
send_sbuff(' ');
send_sbuff((CurrentPkg)/100+0x30);
send_sbuff((CurrentPkg%100)/10+0x30);
send_sbuff((CurrentPkg%10)+0x30);
send_sbuff('P');
send_sbuff('k');
send_sbuff('g');
send_sbuff(0x0d);
send_sbuff(0x0a);
}
void transmitt(void)
{ unsigned char package_ind_byte;
unsigned char CRC_high,CRC_low;
unsigned char CRC_temp;
Str_Buff_cnt = 0;
mode_configuration = 0xff;
MI200_Code2 = CODE_num2 ;
MI200_Code1 = CODE_num1 ;
MI200_Code0 = CODE_num0 ;
MI200_Fre1 = SL_fre1;
MI200_Fre0 = SL_fre0;
MI200_RX_TXn = Status_TRANS;
mode_sel = MODE_32;
set_MI200_mode_send();
mode_sel = 0x00;
if (CODE_length1 == 1) mode_sel = 0x02;
if (CODE_length0 == 1) mode_sel += 0x01;
package_ind_byte = ( mode_sel * 64 ) + 9 ;
LED_TX = 0 ;
send_frame_via_spi( 0xff, 0xff );
CRC_temp = read_SPI_reg( 0x82 );
en_MI200_reg();
write_SPI_register( 0x02,( CRC_temp & 0xfd) );
send_frame_via_spi( 0x1a, package_ind_byte );
set_MI200_mode_send();
dis_MI200_reg();
send_package(16,info);
CRC_high = read_SPI_reg ( 0xa8 );
CRC_low = read_SPI_reg ( 0xa9 );
send_frame_via_spi( CRC_high, CRC_low );
MI200_RX_TXn = Status_RCV;
mode_sel = MODE_32;
set_MI200_mode_send();
LED_TX = 1 ;
put_buff_trans();
delay_1() ;
}
void put_buff_rec(void)
{ send_sbuff(0x0d);
send_sbuff(0x0a);
send_sbuff('R');
send_sbuff('e');
send_sbuff('c');
send_sbuff((rec_pkgs_num)/100+0x30);
send_sbuff((rec_pkgs_num%100)/10+0x30);
send_sbuff((rec_pkgs_num%10)+0x30);
send_sbuff('P');
send_sbuff('k');
send_sbuff('g');
send_sbuff(' ');
send_sbuff((err_pkgs_num)/100+0x30);
send_sbuff((err_pkgs_num%100)/10+0x30);
send_sbuff((err_pkgs_num%10)+0x30);
send_sbuff('E');
send_sbuff('r');
send_sbuff('r');
send_sbuff(0x0d);
send_sbuff(0x0a);
}
void receive(void)
{ unsigned char package_info ;
unsigned char jjj ;
unsigned char CRC_ind ;
rec_err = Correct;
Str_Buff_cnt= 0;
rec_byte = 0;
rec_byte_H = 0;
rec_byte_L = 0;
mode_configuration = 0xff;
MI200_Code2 = CODE_num2 ;
MI200_Code1 = CODE_num1 ;
MI200_Code0 = CODE_num0 ;
MI200_SS1 = mode_sel & 0x02 ;
MI200_SS0 = mode_sel & 0x01 ;
MI200_Fre1 = SL_fre1;
MI200_Fre0 = SL_fre0;
en_MI200_reg();
write_SPI_register(0x01,mode_configuration) ; //-- write mode configuration,
//-- power on, RX, not reset, SS=32, Fre=115.2KHz;
write_SPI_register(0x07,0xff); //-- write analog signal processing configuration register,
dis_MI200_reg();
package_info= rec_packet_head(); //-- receive the package information including package length and SS_Mode
package_len = package_info & 0x3f; //-- package lebgth infomation, low 6 bit
if ( package_len > 32 ) package_len = 32;
LED_RX = 0 ;
LED_ERR = 1;
LED_CORR = 1 ;
for(jjj=1; ((jjj < package_len)&&(rec_err==Correct)) ; jjj=jjj+1 ) //-- receive data field
{ rec_frame_via_spi();
send_sbuff(rec_byte_H);
send_sbuff(rec_byte_L);
}
if(rec_err == Correct)
{ rec_pkgs_num ++;
rec_frame_via_spi(); //-- receive the CRC word
if(rec_err == Correct)
{
CRC_ind = read_SPI_reg(0x82); //-- read Status Register
en_MI200_reg();
write_SPI_register(0x02 , (CRC_ind & 0xf5)); //-- clear EPF flag & CRC_flag;
dis_MI200_reg();
if ((CRC_ind & 0x02) != 0x00)
{ LED_ERR = 1;
}
else
{ LED_ERR = 0;
err_pkgs_num ++ ;
}
if(rec_pkgs_num >200)
{ rec_pkgs_num = 0;
err_pkgs_num = 0;
}
put_buff_rec();
LED_CORR = ~LED_ERR;
LED_RX = 1 ;
}
}
else
{ return;
}
}
void init_31()
{
TMOD=0x11; /*set T/C0 and T/C1 mode 1 mode*/
TCON=0x04;
ET0=1; /*open T/C0 interrupt*/
ET1=1;
EX0=1; /*yun xu wai bu interrupt*/
TH0=-(50000/256); /*delay 10 ms timer0 interrupt*/
TL0=-(50000%256);
TH1=-(50000/256);
TL1=-(50000%256);
EA=1;
TR0=1;
}
void Timer0_count() interrupt 1 using 1
///interrupt [0x0B] void T0_int (void)T0中断进行普通模式的数据显示*/
{
TH0=-(50000/256); //*delay 100ms interrupt one times*/
TL0=-(50000%256);
count++;
if(count>10)
{count=0;
P2 =~P2;
}
}
void main(void)
{ delay_1();
delay_1();
init_sys();
init_31();
send_sbuff(' ');
send_sbuff(' ');
send_sbuff(' ');
send_sbuff(' ');
send_sbuff('M');
send_sbuff('i');
send_sbuff('a');
send_sbuff('r');
send_sbuff('T');
send_sbuff('e');
send_sbuff('c');
send_sbuff('h');
send_sbuff(0x0d);
send_sbuff(0x0a);
send_sbuff(' ');
send_sbuff(' ');
send_sbuff(' ');
send_sbuff(' ');
send_sbuff('P');
send_sbuff('L');
send_sbuff('C');
send_sbuff(' ');
send_sbuff('D');
send_sbuff('e');
send_sbuff('m');
send_sbuff('o');
send_sbuff(0x0d);
send_sbuff(0x0a);
P2=0;
P2=0xFF;
P2=0;
for(;;);
delay_1();
delay_1();
TotalPkg = 200;
CurrentPkg = 0;
package_len = 16;
for(;;)
{
if((MCU_Status == Status_TRANS) && (CurrentPkg < TotalPkg))
{ transmitt();
CurrentPkg ++;
}
else receive();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -