本帖最后由 fengwenjiong 于 2012-8-10 15:39 编辑
#include <RS485.h>
uchar temp;
void RS485(void)
{
init(); //初始化
while (1)
{
Recv_Data() ; //主机发命令,单片机接收
switch( temp )
{
case( 0x1F ): //空操作:握手,测试通讯是否正常
{
delay ();
Send_Data(READY);
}
break;
case( 0x00 ): //写命令,设置昼模式亮度,00H-FFH
{
Send_Data(DAY_MODE);
Recv_Data();
}
break;
case( 0x0A ): //写命令,设置夜模式亮度,00H-FFH
{
Send_Data(NIGHT_MODE);
Recv_Data();
}
break;
case( 0x0C ): //写命令,伽马控制,0-100
{
Send_Data(GAMMA_CRTL);
Recv_Data();
}
break;
case( 0x30 ): //读命令,读亮度值
{
Send_Data(LIGHT_READ);
// Send_Data();
}
break;
case( 0x55 ): //——,命令自检测
{
Send_Data(CHECK);
// Send_Data();
}
break;
case( 0x36 ): //读命令,读取自检结果
{
Send_Data(CHECK_RESULT);
// Send_Data() ;
}
break;
case( 0x69 ): //——,显示画面镜像
{
Send_Data(MIRROR_DISPLAY);
}
break;
default: break; //发送不合规格指令则无返回
}
}
}
void init(void)
{
// TCON = 0x10;
// TMOD = 0x01;
// TL0 = 0x18;
// TH0 = 0xFC;
P1MDOUT = 0x80;
P2MDOUT = 0xC0;
P3MDOUT = 0x7F;
XBR1 = 0x40;
TMOD = 0x10; //方式2:自动重装载的8 位计数器/ 定时器
SCON0 = 0x50; // SMOD=0,REN=1 UART接收允许 ,方式0 :波特率可编程的 8 位UART0
TH1 = 0x64; //波特率9600bps,osc=48MHz
TL1 = 0x64;
TR1 = 1; //定时器1 允许
REN0= 1; //接收使能
PCON = 0x00; //电源控制寄存器
EA = 1; //开中断
ES0 = 1; // 开串行中断
}
void Recv_Data()
{
/* 禁止发送,允许接收 */
DE = 0;
RE = 0;
RI0 = 0; //接收中断 ,置1中断有效
while (!RI0);
temp = SBUF0;
RI0 = 0;
}
void Send_Data(uchar temp )
{
/* 允许发送,禁止接收 */
DE = 1;
RE = 1;
TI0 = 0;
while(!TI0);
SBUF0 = temp;
TI0 = 0;
}
void delay ()
{
_nop_(); //延时
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
} |