好的 给你我写的C51的单片机和USART HMI串口屏通讯的程序。
单片机建议用STC89C52 P0口可以不用加上拉电阻。
程序是串口屏上建按钮,按一下,发送指令给单片机。单片机接收后提取指令后再判断。
判断后再驱动相应的IO为高电平或低电平。可以直接接LED发光管观察输出结果。
至于串口屏的程序,建议参照串口屏的编程要求输出定义的指令。
例如:
if(照明1.val==1) //开启
{
printh ED 02 00 01
}
if(照明1.val==0) //关灯
{
printh ED 02 00 00
}
其中:ED 02 00 01 和 ED 02 00 00 就是我自己定义的通讯指令。 这个可以和单片机配套使用。
#include <Reg52.h>
sbit LED0=P0^0;//指示灯
sbit LED1=P0^1;//指示灯
sbit LED2=P0^2;//指示灯
sbit LED3=P0^3;//指示灯
sbit LED4=P0^4;//指示灯
sbit LED5=P0^5;//指示灯
sbit LED6=P0^6;//指示灯
sbit LED7=P0^7;//指示灯
sbit LED8=P1^0;//指示灯
sbit LED9=P1^1;//指示灯
sbit LED10=P1^2;//指示灯
sbit LED11=P1^3;//指示灯
sbit LED12=P1^4;//指示灯
sbit LED13=P1^5;//指示灯
sbit LED14=P1^6;//指示灯
sbit LED15=P1^7;//指示灯
sbit LED16=P2^0;//指示灯
sbit LED17=P2^1;//指示灯
sbit LED18=P2^2;//指示灯
sbit LED19=P2^3;//指示灯
sbit LED20=P2^4;//指示灯
sbit LED21=P2^5;//指示灯
sbit LED22=P2^6;//指示灯
sbit LED23=P2^7;//指示灯
sbit K1=P3^2;
unsigned char CT;
unsigned char UT;
unsigned char CN[4];
void delayms(unsigned int i)
{
unsigned int j;
while(i--)
{
for(j = 0; j < 125; j++);
}
}
//向串口输出一个字符(非中断方式)
void ComOutChar(unsigned char OutData)
{
ES = 0;
TI = 0;
SBUF = OutData; //输出字符
while(!TI); //空语句判断字符是否发完
TI = 0; //清TI
ES = 1;
}
void UART_Send_Str(char *s)
{
int i=0;
while(s!=0)
{
ComOutChar(s);
i++;
}
}
void UART_Send_END(void)
{
ComOutChar(0xFF);
ComOutChar(0xFF);
ComOutChar(0xFF);
}
void UART_Send_APP(void)
{
ComOutChar(CN[0]);
ComOutChar(CN[1]);
ComOutChar(CN[2]);
ComOutChar(CN[3]);
}
void UART_Send_start(void)
{
delayms(10);
UART_Send_END();
delayms(10);
}
void CSToOut(void)
{
if (CN[0]==0xED && CN[1]==0x01 && CN[2]==0x00 && CN[3]==0x01) {LED0=1;UART_Send_APP();}
if (CN[0]==0xED && CN[1]==0x01 && CN[2]==0x00 && CN[3]==0x00) {LED0=0;UART_Send_APP();}
if (CN[0]==0xED && CN[1]==0x01 && CN[2]==0x01 && CN[3]==0x01) {LED1=1;UART_Send_APP();}
if (CN[0]==0xED && CN[1]==0x01 && CN[2]==0x01 && CN[3]==0x00) {LED1=0;UART_Send_APP();}
if (CN[0]==0xED && CN[1]==0x01 && CN[2]==0x02 && CN[3]==0x01) {LED2=1;UART_Send_APP();}
if (CN[0]==0xED && CN[1]==0x01 && CN[2]==0x02 && CN[3]==0x00) {LED2=0;UART_Send_APP();}
if (CN[0]==0xED && CN[1]==0x01 && CN[2]==0x03 && CN[3]==0x01) {LED3=1;UART_Send_APP();}
if (CN[0]==0xED && CN[1]==0x01 && CN[2]==0x03 && CN[3]==0x00) {LED3=0;UART_Send_APP();}
if (CN[0]==0xED && CN[1]==0x01 && CN[2]==0x04 && CN[3]==0x01) {LED4=1;UART_Send_APP();}
if (CN[0]==0xED && CN[1]==0x01 && CN[2]==0x04 && CN[3]==0x00) {LED4=0;UART_Send_APP();}
if (CN[0]==0xED && CN[1]==0x01 && CN[2]==0x05 && CN[3]==0x01) {LED5=1;UART_Send_APP();}
if (CN[0]==0xED && CN[1]==0x01 && CN[2]==0x05 && CN[3]==0x00) {LED5=0;UART_Send_APP();}
if (CN[0]==0xED && CN[1]==0x01 && CN[2]==0x06 && CN[3]==0x01) {LED6=1;UART_Send_APP();}
if (CN[0]==0xED && CN[1]==0x01 && CN[2]==0x06 && CN[3]==0x00) {LED6=0;UART_Send_APP();}
if (CN[0]==0xED && CN[1]==0x01 && CN[2]==0x07 && CN[3]==0x01) {LED7=1;UART_Send_APP();}
if (CN[0]==0xED && CN[1]==0x01 && CN[2]==0x07 && CN[3]==0x00) {LED7=0;UART_Send_APP();}
if (CN[0]==0xED && CN[1]==0x02 && CN[2]==0x00 && CN[3]==0x01) {LED8=1;UART_Send_APP();}
if (CN[0]==0xED && CN[1]==0x02 && CN[2]==0x00 && CN[3]==0x00) {LED8=0;UART_Send_APP();}
if (CN[0]==0xED && CN[1]==0x02 && CN[2]==0x01 && CN[3]==0x01) {LED9=1;UART_Send_APP();}
if (CN[0]==0xED && CN[1]==0x02 && CN[2]==0x01 && CN[3]==0x00) {LED9=0;UART_Send_APP();}
if (CN[0]==0xED && CN[1]==0x02 && CN[2]==0x02 && CN[3]==0x01) {LED10=1;UART_Send_APP();}
if (CN[0]==0xED && CN[1]==0x02 && CN[2]==0x02 && CN[3]==0x00) {LED10=0;UART_Send_APP();}
if (CN[0]==0xED && CN[1]==0x02 && CN[2]==0x03 && CN[3]==0x01) {LED11=1;UART_Send_APP();}
if (CN[0]==0xED && CN[1]==0x02 && CN[2]==0x03 && CN[3]==0x00) {LED11=0;UART_Send_APP();}
if (CN[0]==0xED && CN[1]==0x02 && CN[2]==0x04 && CN[3]==0x01) {LED12=1;UART_Send_APP();}
if (CN[0]==0xED && CN[1]==0x02 && CN[2]==0x04 && CN[3]==0x00) {LED12=0;UART_Send_APP();}
if (CN[0]==0xED && CN[1]==0x02 && CN[2]==0x05 && CN[3]==0x01) {LED13=1;UART_Send_APP();}
if (CN[0]==0xED && CN[1]==0x02 && CN[2]==0x05 && CN[3]==0x00) {LED13=0;UART_Send_APP();}
if (CN[0]==0xED && CN[1]==0x02 && CN[2]==0x06 && CN[3]==0x01) {LED14=1;UART_Send_APP();}
if (CN[0]==0xED && CN[1]==0x02 && CN[2]==0x06 && CN[3]==0x00) {LED14=0;UART_Send_APP();}
if (CN[0]==0xED && CN[1]==0x02 && CN[2]==0x07 && CN[3]==0x01) {LED15=1;UART_Send_APP();}
if (CN[0]==0xED && CN[1]==0x02 && CN[2]==0x07 && CN[3]==0x00) {LED15=0;UART_Send_APP();}
if (CN[0]==0xED && CN[1]==0x03 && CN[2]==0x00 && CN[3]==0x01) {LED16=1;UART_Send_APP();}
if (CN[0]==0xED && CN[1]==0x03 && CN[2]==0x00 && CN[3]==0x00) {LED16=0;UART_Send_APP();}
if (CN[0]==0xED && CN[1]==0x03 && CN[2]==0x01 && CN[3]==0x01) {LED17=1;UART_Send_APP();}
if (CN[0]==0xED && CN[1]==0x03 && CN[2]==0x01 && CN[3]==0x00) {LED17=0;UART_Send_APP();}
if (CN[0]==0xED && CN[1]==0x03 && CN[2]==0x02 && CN[3]==0x01) {LED18=1;UART_Send_APP();}
if (CN[0]==0xED && CN[1]==0x03 && CN[2]==0x02 && CN[3]==0x00) {LED18=0;UART_Send_APP();}
if (CN[0]==0xED && CN[1]==0x03 && CN[2]==0x03 && CN[3]==0x01) {LED19=1;UART_Send_APP();}
if (CN[0]==0xED && CN[1]==0x03 && CN[2]==0x03 && CN[3]==0x00) {LED19=0;UART_Send_APP();}
if (CN[0]==0xED && CN[1]==0x03 && CN[2]==0x04 && CN[3]==0x01) {LED20=1;UART_Send_APP();}
if (CN[0]==0xED && CN[1]==0x03 && CN[2]==0x04 && CN[3]==0x00) {LED20=0;UART_Send_APP();}
if (CN[0]==0xED && CN[1]==0x03 && CN[2]==0x05 && CN[3]==0x01) {LED21=1;UART_Send_APP();}
if (CN[0]==0xED && CN[1]==0x03 && CN[2]==0x05 && CN[3]==0x00) {LED21=0;UART_Send_APP();}
if (CN[0]==0xED && CN[1]==0x03 && CN[2]==0x06 && CN[3]==0x01) {LED22=1;UART_Send_APP();}
if (CN[0]==0xED && CN[1]==0x03 && CN[2]==0x06 && CN[3]==0x00) {LED22=0;UART_Send_APP();}
if (CN[0]==0xED && CN[1]==0x03 && CN[2]==0x07 && CN[3]==0x01) {LED23=1;UART_Send_APP();}
if (CN[0]==0xED && CN[1]==0x03 && CN[2]==0x07 && CN[3]==0x00) {LED23=0;UART_Send_APP();}
}
//串口初始化 晶振为11.0592M 方式1 波特率9600
void InitCom(void)
{
SCON = 0x50; //串口方式1,允许接收
TMOD = 0x20; //定时器1定时方式2
TCON = 0x40; //设定时器1开始计数
TH1 = 0xFD;
TL1 = 0xFD;
RI = 0; //清收发标志
TI = 1;
TR1 = 1; //启动定时器
}
//串口接收中断
void ComInINT(void) interrupt 4 using 1
{
if (RI == 1)
{
RI = 0;
UT = SBUF;
if(UT==0xED)
{
CN[0] = SBUF;
}
else if(CN[0]==0xED)
{
CT++;
CN[CT] = SBUF;
if (CT == 3)
{
CSToOut();
CT = 0;
CN[0] = 0;
CN[1] = 0;
CN[2] = 0;
CN[3] = 0;
}
}
}
}
void main(void)
{
P0 = 0;
P1 = 0;
P2 = 0;
InitCom(); //设置波特率为9600
EA = 1;
ES = 1; //开串口中断
while(1)
{
if (K1==0) //按下按钮 用于测试发给串口屏
{
//UART_Send_start();
//UART_Send_Str("page 卧室");
//UART_Send_END();
}
}
}
|