📄 main.c
字号:
#include <reg51.h>
#include <intrins.h>
sbit CS_A = P3^3;
sbit CS_B = P3^4;
sbit CS_C = P3^5;
sbit S_SCK = P1^7;
sbit S_SDO = P1^6;
sbit S_SDI = P1^5;
sbit S_LOAD = P3^6;
unsigned char read_data[2]=0;
unsigned char bdata comdata[2]=0;
unsigned char bdata valve[3]=0;
#define INBUF_LEN 4 //数据长度
unsigned char inbuf1[INBUF_LEN];
unsigned char checksum,count3;
bit read_flag=0;
sbit tx_enable=P3^2;
sbit v1=valve[0]^0;
sbit v2=valve[0]^1;
sbit v3=valve[0]^2;
sbit v4=valve[0]^3;
sbit v5=valve[0]^4;
sbit v6=valve[0]^5;
sbit v7= valve[1]^0;
sbit v8= valve[1]^1;
sbit v9= valve[1]^2;
sbit v10=valve[1]^3;
sbit v11=valve[1]^4;
sbit v12=valve[1]^5;
sbit v13=valve[2]^0;
sbit v14=valve[2]^1;
sbit v15=valve[2]^2;
sbit v16=valve[2]^3;
sbit led_red=valve[2]^4;
sbit led_gre=valve[2]^5;
sbit v1_1=comdata[0]^0;
sbit v2_2=comdata[0]^1;
sbit v3_3=comdata[0]^2;
sbit v4_4=comdata[0]^3;
sbit v5_5=comdata[0]^4;
sbit v6_6=comdata[0]^5;
sbit v7_7=comdata[0]^6;
sbit v8_8=comdata[0]^7;
sbit v9_9= comdata[1]^0;
sbit v10_10=comdata[1]^1;
sbit v11_11=comdata[1]^2;
sbit v12_12=comdata[1]^3;
sbit v13_13=comdata[1]^4;
sbit v14_14=comdata[1]^5;
sbit v15_15=comdata[1]^6;
sbit v16_16=comdata[1]^7;
/*******************************************************************/
/* */
/* 延时函数 */
/* */
/*******************************************************************/
void delay(int ms)
{
while(ms--)
{
unsigned char i;
for(i=0;i<250;i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
void write(unsigned char dd)
{
unsigned char i;
for (i=0;i<8;i++)
{
S_SDI=dd&0x80;
S_SCK=1;
dd<<=1;
_nop_();
_nop_();
S_SCK=0;
_nop_();
_nop_();
}
}
void output__tip2603(unsigned char writedata[3])
{
CS_C=0;
CS_B=0;
CS_A=1;
write(writedata[0]);
CS_C=0;
CS_B=1;
CS_A=0;
write(writedata[1]);
CS_C=0;
CS_B=1;
CS_A=1;
write(writedata[2]);
}
void read_74hc589(unsigned char readdata[2])
{
unsigned char i,j,d_dat=0;
S_LOAD=0;
S_LOAD=1;
for(j=0;j<2;j++)
{
for (i=0;i<8;i++)
{
S_SCK=0;
d_dat<<=1;
d_dat|=S_SDO;
S_SCK=1;
}
readdata[j]=d_dat;
}
}
void init_serialcomm(void)
{
SCON = 0x50; //SCON: serail mode 1, 8-bit UART, enable ucvr
TMOD |= 0x20; //TMOD: timer 1, mode 2, 8-bit reload
PCON |= 0x80; //SMOD=1;
TH1 = 0xFA; //Baud:9600 fosc=11.0592MHz
IE |= 0x90; //Enable Serial Interrupt
TR1 = 1; // timer 1 run
// TI=1;
}
//向串口发送一个字符
void send_char_com(unsigned char ch)
{
SBUF=ch;
while(TI==0);
TI=0;
}
//向串口发送一个字符串,strlen为该字符串长度
void send_string_com(unsigned char *str,unsigned int strlen)
{
unsigned int k=0;
tx_enable=1;
do
{
send_char_com(*(str + k));
k++;
} while(k < strlen);
tx_enable=0;
}
//串口接收中断函数
void serial () interrupt 4 using 3
{
if(RI)
{
unsigned char ch;
RI = 0;
ch=SBUF;
if(ch>127)
{
count3=0;
inbuf1[count3]=ch;
checksum= ch-128;
}
else
{
count3++;
inbuf1[count3]=ch;
checksum ^= ch;
if (count3==(INBUF_LEN-1))// && (!checksum) )
{
read_flag=1; //如果串口接收的数据达到INBUF_LEN个,且校验没错,
//就置位取数标志
}
}
}
}
void main()
{
init_serialcomm();
while(1)
{
v1=v1_1;
v2=v2_2;
v3=v3_3;
v4=v4_4;
v5=v5_5;
v6=v6_6;
v7=v7_7;
v8=v8_8;
v9=v9_9;
v10=v10_10;
v11=v11_11;
v12=v12_12;
v13=v13_13;
v14=v14_14;
v15=v15_15;
v16=v16_16;
output__tip2603(valve);
CS_C=1;
CS_B=0;
CS_A=0;
read_74hc589(read_data);
delay(50);
if(read_flag) //如果取数标志已置位,就将读到的数从串口发出
{
read_flag=0; //取数标志清0
comdata[0]=inbuf1[2];
comdata[1]=inbuf1[3];
send_string_com(read_data,2);
led_gre=~led_gre;//正在通讯
led_red=0;
}
else
{
led_gre=0;
led_red=1;//通讯停止
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -