想利用这个电路图做一个遥控开关,但是不会那三个单片机(ATmega 16L,PT2262/PT2272)的编码,求帮忙编程

如题所述

对于以上遥控台和负荷缸连接原理图,因为在遥控台上由负荷缸供电的低水位回传信号指示灯等可以容易地改为由遥控台端供电,而在负荷缸端只提供开关量信号,于是实际的问题便变成了实现一种对多路遥控开关和返回开关量信号进行编码。刚开始考虑到采用T型电阻网络对这些开关进行采样,用A/D,D/A转换的方法实现,但为了保证信号长距离传输的可靠性,决定用数字信号的方式对这些开关量进行编解码,随着技术的进步使这种设想成为可能,经过综合比较,我们决定选用功能强大,价格便宜的ATMEL Mega8单片机对这些开关信号进行编解码和信号传输控制。
  DIP封装的ATMEL Mega8单片机只有28个管脚,除掉电源和用于单片机之间通信必要的串行端口引脚,实际可用来做信号采集和输出的管脚远远不够,然而ATMEL Mega8单片机的12 MHz的高速运行速度相对于开关动作的速度来说极其快速,通过74SL244缓冲器和74SL273锁存器共用单片机管脚,在程序中控制缓冲器使能端,控制锁存器时钟信号的方法扩展单片机I/O口。2个74SL273锁存器和1个74SL244缓冲器共用单片机PB和Pc端口低四位管脚,单片机通过PB4,PD3,PB5管脚分别控制第一个、第二个锁存器的时钟脉冲输入端和缓冲器和使能端。我们在程序中设置单片机PB和PC端口低四位管脚为输入状态,控制74SL244缓冲器的使能端为低电平,并屏蔽两个74SL273锁存器的时钟输入,从而通过74SL244缓冲器采集负荷缸工作状态开关信号;在程序中设置单片机PB和PC端口低四位管脚为输出状态,控制74SL244缓冲器的使能端为高电平,并让单片机给其中一个74SL273锁存器的加上时钟输人信号,从而通过74SL273锁存器输出一组开关状态控制信号。
  因为在负荷端和遥控台的连接距离接近100 m,超过串口RS 232信号可靠传送到达的距离,我们增加了SN75LBC184 RS 232/RS 485串行通信转换器芯片,SN75LBC184输人和单片机TXD、RXD管脚相连,单片机PD2引脚控制SN75LBC184芯片的收发使能端实现收发功能的转换,用两芯的电缆连接负荷缸端和遥控台端SN75LBC184芯片的输出端口,实现了单片机串口信号的远距离传送和电路的半双工工作

之前也试着做了个无线开关遥控模块,开关数是两路,每路是250v10a,具体的代码也跟你分享一下吧:

源代码

#include<reg51.h>
sbit datout=P2^0;
sbit k1=P2^1;
sbit k2=P2^2;
//sbit k1=P3^3;
//sbit k2=P3^4;
sbit led1=P2^3;
sbit led2=P2^4;
sbit bell=P2^0;
void delay(int t)
{
char i;
while(t--)
{
for(i=0;i<100;i++);
}
}
void timerinit()
{
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
TMOD &= 0x0F; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TL1 = 0xe8; //设定定时初值 //1200
TH1 = 0xe8; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
EA=1;
}
void main()
{
int i;
timerinit();
while(1)
{
if(k1==0)
{
delay(10);
if(k1==0) //按键动作被接受
{
while(k1==0); //等待松手
bell=0;led1=~led1; //按键指示部分
delay(10);
bell=1;
for(i=0;i<5;i++) //发送按键1的编码f0发送5次
{
SBUF=0xf0;
while(TI==0);
TI=0;
}
}
}
if(k2==0)
{
delay(10);
if(k2==0)
{
while(k2==0);
bell=0;led2=~led2;
delay(10);
for(i=0;i<5;i++)//按键2的编码0f,发送5次
{
SBUF=0x0f;
while(TI==0);
TI=0;
}
}
}
}
}

接收端的代码

#include<reg51.h>
sbit jk1=P2^0;
sbit jk2=P2^1;
sbit led1=P2^6;
sbit led2=P2^7;
void delay(int t)
{
char i;
while(t--)
{
for(i=0;i<100;i++);
}
}
void timerinit()
{
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
TMOD &= 0x0F; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TL1 = 0xe8; //设定定时初值 //1200
TH1 = 0xe8; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
ES=1;
EA=1;
}
void main()
{
timerinit();
while(1)
{
}
}
/*串口接收*/
void uart() interrupt 4
{
static unsigned char dat;
if(RI) //接收中断
{
RI=0; //读取接受到的数据
dat=SBUF;
} //如果是按键1的编码
if(dat==0xf0)
{
REN=0; //继电器开关受控做出反应 times=0;
delay(200); //延时确保受控电器不致于频繁开关
jk1=~jk1;
led1=~led1; //开关指示灯状态 ,灯灭断开,灯亮接通
dat=0;
REN=1;
}
if(dat==0x0f)
{
REN=0;
delay(200);
jk2=~jk2;
led2=~led2;
dat=0;

}
}

最后说句,我可把大学时珍藏的干货分享给你了,一定要采纳呀!追问

哦哦,这是发射接收端的代码吧,那个ATmega16L怎么整你还知道吗

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-12-06
案密码忘了,怎么办,没
相似回答