#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar idata trdata[]={'R','I','C','H','M','C','U','R','Z','-','5','1','V','2','.','0',0x0d,0x0a,0x00};
sbit K1=P3^2; //对应开发板K1按键
/*-------------------------------------------------------------*/
//串口初始化
void UART_Init(void)
{
SCON = 0x50; //串口工作方式为1 , 串行允许接收
//SM0=0;
//SM1=1;
//REN=1;
TMOD = 0x20; //定时器1 工作在方式2
//PCON = 0x80; //SMOD = 1; 波特率加倍
TH1 = 0xfd; //波特率 9600bps fosc="11".0592MHz
TL1 = 0xfd;
ES = 1; //开串口中断
TR1 = 1; //允许定时器1工作
EA = 1; //开总中断
}
void delay1ms(uint i)
{
uchar j;
while(i--)
{
for(j=0;j<115;j++) //1ms基准延时程序
{
;
}
}
}
/*-------------------------------------------------------------*/
//串口发送一个字节
void Uart_SendChar(unsigned char dat)
{
SBUF = dat; //待发送的数据写入缓冲区
while(!TI); //等待发送完成
TI = 0; //清零发送标志位
}
/*-------------------------------------------------------------*/
//串口发送一个字符串
void Uart_SendString()
{ uchar
i=0;
while(trdata[i]!=0x00)
{
SBUF=trdata[i];
while(!TI);
TI=0;
i++;
}
}
/*-------------------------------------------------------------*/
//主函数
void main(void)
{
UART_Init(); //初始化串口
while(1)
{
if(K1==0)
{
delay1ms(20);
if(K1==0)
{
Uart_SendString(); //发送数据
while(!K1); //等待按键释放
}
}
}
}
/*-------------------------------------------------------------*/
//串口接收中断函数
void INT_UartRcv(void) interrupt 4
{
unsigned char Rcv = 0;
if(RI) //查询接收标志位(有数据发送过来时置为1)
{
RI = 0; //接收标志位清零
Rcv = SBUF; //存储缓冲区的数据
P1=SBUF;
Uart_SendChar(Rcv); //让从计算机上传到单片机的数据 , 传回的计算机显示
}
}
///////////////////////////////
9600波特率,P1口接LED
用串口大师发送数据,要勾选十六进制发送和接受。
发送:ff (全亮/全灭)
00 (全灭/全亮)
01 (p1.0亮/p1.0灭)
这个方式是最简单的,
其意思就是把你发送的十六进制数据直接赋值到P1端口
追问老师给提出的比较繁琐,例如协议是/ooo;表示3盏灯全点亮,/就表示单片机准备接收控制LED的指令,然后匹配看是不是正确的指令,还有意外的情况就是要使接收的时候上位机操作者不发了怎么办,要求延时等几秒,还有就是;表示指令结束,再比如/xxx;就代表3盏灯全灭,同时还要求校验,比如几个符号的ASCII码等于多少来判定指令是否正确。。。是不是有些复杂
追答的确比较繁琐。
这个只是一个和简单的 协议
这种在工业上用的很多,而且很复杂。
上面的程序是一个简化版的,不过你可以把他当作一个模型。
下面,你可以在中断里面把串口发送的数据接受存下来,
然后在用判断,最后在执行相应的操作就OK。
多试试就出来了,写协议还是很简单的。
不过,你如果把上面的程序发给老是,估计老师也算认可。
但是绝对会有违老师额初衷,你这叫剑走偏锋。哈哈
追问嗯,我再研究下,主要是第一次写单片机的程序,以前也写过不少C,但都是基于操作系统的,在单片机上这种C,不太习惯,感觉有些别扭。请问能不能以刚才你发的模版,帮我修改一个最简单的,能运行的,仅仅让计算机控制单片机上一盏LED灯的亮灭,不需要再次回显到计算机上,点亮为在串口工具上发送3个字母ooo,灭为fff,灯为开发板上的P1^0,谢谢了。上面的程序(K1是按键吧?还有中断程序里的P1是?)
追答K1是按键,
中断程序是,计算机下发数据时候,进行中断。
这个程序就是最简单的啊,
你直接在串口助手上,点击十六进制发送:
01 代表-> 0000 0001 点亮p1.0
02 代表 -> 0000 0010 点亮P1.1
04 代表-> 0000 0100 点亮p1.2
03 -> 0000 0011 点亮p1.0 和p1.1
这很简单的啊