|
RS485通信小改装,在AB两线间加一个小LED灯,可实时看到是否在通信,只要一通信就闪烁,接反会常亮,换个方向让LED平时不亮,通信时闪烁就行。总玩不好通信的可参考。
制作出来的实物图如下:
电路原理图如下:
单片机程序源码(主机+丛机都有):
#include<main.h>
#include<1602.h>
#include<ds1302.h>
uchar time[]={40,27,1,9,11,5,18}; //改时间用,初始化时间2012年7月25日 23:59: 40
uchar code tab1[]="20 - - ";
uchar code tab2[]="T: : :";
uchar flag;
uchar wendu;
void delay(uint x)
{
uint m,n;
for(m=x;m>0;m--)
for(n=110;n>0;n--);
}
/****
******* 串口初始化函数
*****/
void uart_init()
{
TMOD=0x20; //9600bps
SCON=0x50;
TH1=0xFD;
TL1=0xFD;
TR1=1;
ES=1;
EA=1;
UART_EN=0; //串口一直处于接收状态
}
void main()
{
lcd_init();
uart_init();
lcd_write_str(0x80,tab1);
lcd_write_str(0xc0,tab2);
//DS1302_set_time(&time); //初始化时间,正常后不要,读1302自己保存的时间
//改好时间后不要这句,再下一次程序以后从1302读时间
while(1)
{
DS1302_read_time(&time);
lcd_write_time(0x82,time[6]); //年
switch(time[5]) //星期
{
case 1: lcd_write_str(0x8c,"MON");break;
case 2: lcd_write_str(0x8c,"TUE");break;
case 3: lcd_write_str(0x8c,"WED");break;
case 4: lcd_write_str(0x8c,"THU");break;
case 5: lcd_write_str(0x8c,"FRI");break;
case 6: lcd_write_str(0x8c,"SAT");break;
case 7: lcd_write_str(0x8c,"SUN");break;
}
lcd_write_time(0x85,time[4]); //月
lcd_write_time(0x88,time[3]); //日
lcd_write_time(0xc8,time[2]); //时
lcd_write_time(0xcb,time[1]); //分
lcd_write_time(0xce,time[0]); //秒
if(flag==1) //显示负温度
{
lcd_write_com(0xc2);
lcd_write_date('-');
lcd_wendu(0xc6,wendu);
}
else //显示正温度
{
lcd_write_com(0xc2);
lcd_write_date('+');
lcd_wendu(0xc3,wendu);
lcd_write_com(0xc6);
lcd_write_date('C');
}
}
}
/****
******* 串口中断服务程序函数
*****/
void ser() interrupt 4
{
static uchar string[2],i;
if(RI)
{
RI=0;
string[i++]=SBUF;
if(i>1)
i=0;
if(string[0]=='-')
{
flag=1; //负温度
}
else
{
flag=0;
}
wendu=string[1];
}
}
|
评分
-
查看全部评分
|