//AVR作為發送機,控制51的喇叭發聲和2極管發光
//AVR發送方代碼 //采用2400波特率
#include <iom16.h>
#include <intrinsics.h>
#include <intrinsics.h>
#define uchar unsigned char
#define uint unsigned int
#define uint unsigned int
#define k1 PIND_Bit4 //設置為喇叭
#define k3 PIND_Bit6 //設置為發光管
#define k4 PIND_Bit7 //發送控制命令
#define k3 PIND_Bit6 //設置為發光管
#define k4 PIND_Bit7 //發送控制命令
#define UDRE 5
#define RXC 7
#define RXC 7
uchar dat=48;
void delay(uint k)
{
uint i,j;
for(i=0;i<k;i++)
for(j=0;j<1140;j++);
}
{
uint i,j;
for(i=0;i<k;i++)
for(j=0;j<1140;j++);
}
#include "1602.h"
void port_init()
{
PORTA=0xff;
DDRA=0xff;
PORTB=0xff;
DDRB=0xff;
PORTC=0xff;
DDRC=0xff;
PORTD=0xff;
DDRD=0x0f;
}
{
PORTA=0xff;
DDRA=0xff;
PORTB=0xff;
DDRB=0xff;
PORTC=0xff;
DDRC=0xff;
PORTD=0xff;
DDRD=0x0f;
}
void serial_init()
{
UCSRB=0x00;
UCSRA=0x02; //雙倍速
UCSRC=0x06; //8位字符模式
UBRRH=0x01; //2400波特率
UBRRL=0xa0;
UCSRB=0x18;
}
{
UCSRB=0x00;
UCSRA=0x02; //雙倍速
UCSRC=0x06; //8位字符模式
UBRRH=0x01; //2400波特率
UBRRL=0xa0;
UCSRB=0x18;
}
void send(uchar k) //串口發送函數
{
while(!(UCSRA&(1<<UDRE)));
UDR=k;
}
{
while(!(UCSRA&(1<<UDRE)));
UDR=k;
}
void key1()
{
static uint i,j;
if(k1==0)
{
if(i==0)
{
j++;
if(j>10)
{
if(k1==0)
{
i=1;j=0;
dat=49;
}
}
}
}
else
{
i=0;j=0;
}
}
{
static uint i,j;
if(k1==0)
{
if(i==0)
{
j++;
if(j>10)
{
if(k1==0)
{
i=1;j=0;
dat=49;
}
}
}
}
else
{
i=0;j=0;
}
}
void key3()
{
static uint i,j;
if(k3==0)
{
if(i==0)
{
j++;
if(j>10)
{
if(k3==0)
{
i=1;j=0;
dat=50;
}
}
}
}
else
{
i=0;j=0;
}
}
{
static uint i,j;
if(k3==0)
{
if(i==0)
{
j++;
if(j>10)
{
if(k3==0)
{
i=1;j=0;
dat=50;
}
}
}
}
else
{
i=0;j=0;
}
}
void main()
{
port_init();
serial_init();
init1602();
delay(1000);
while(1)
{
displayonechar(1,6,dat);
if(k4==0)
{
send(dat);
}
key1(); //喇叭發聲
key3(); //2極管發光
}
}
}
}
//----------1602庫函數-----------
#define RS PORTB_Bit0
#define RW PORTB_Bit1
#define EN PORTB_Bit2
#define DATA PORTA
#define busy 0x80
#define RW PORTB_Bit1
#define EN PORTB_Bit2
#define DATA PORTA
#define busy 0x80
void wait()
{
uchar val;
DATA=0xff;
RS=0;
RW=1;
__no_operation();
__no_operation();
EN=1;
__no_operation();
__no_operation();
DDRA=0x00;
val=PINA;
while(val&busy)
{
val=PINA;
}
EN=0;
DDRA=0xff;
}
void writecmd(uchar cmd)
{
wait();
RS=0;
RW=0;
__no_operation();
DATA=cmd;
__no_operation();
EN=1;
__no_operation();
__no_operation();
EN=0;
}
void writedata(uchar data)
{
wait();
RS=1;
RW=0;
__no_operation();
DATA=data;
__no_operation();
EN=1;
__no_operation();
__no_operation();
EN=0;
}
{
wait();
RS=1;
RW=0;
__no_operation();
DATA=data;
__no_operation();
EN=1;
__no_operation();
__no_operation();
EN=0;
}
void displayonechar(uchar x,uchar y,uchar dda)
{
y&=0x01;
x&=0x0f;
if(y)x|=0x40;
x|=0x80;
writecmd(x);
writedata(dda);
}
void displaychar(uchar x,uchar y,uchar *p)
{
y&=0x01;
x&=0x0f;
while(*p!='\0')
{
if(x<=0x0f)
{
displayonechar(x,y,*p);
p++;
x++;
}
}
}
{
y&=0x01;
x&=0x0f;
while(*p!='\0')
{
if(x<=0x0f)
{
displayonechar(x,y,*p);
p++;
x++;
}
}
}
void init1602()
{
delay(15);
writecmd(0x38);
delay(5);
writecmd(0x38);
delay(5);
writecmd(0x38);
writecmd(0x80);
writecmd(0x01);
writecmd(0x06);
writecmd(0x0c);
}
//51單片機接收端程序 12MHZ晶振,采用2400波特率
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
#define uint unsigned int
sbit bz=P3^3; //喇叭發聲變量
sbit relay=P3^5; //繼電器吸合變量
sbit relay=P3^5; //繼電器吸合變量
code uchar seg[]={0x28,0x7e,0xa2,0x62,0x74,0x61,0x21,0x7a,0x20,0x60}; // 數碼管碼表
code uchar tab[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; //數碼管位選
code uchar tab[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; //數碼管位選
uchar dat; //接受的數據值
uchar start; //各方式啟動變量
uchar start; //各方式啟動變量
void delay(uint k)
{
while(k--);
}
{
while(k--);
}
void show(uint k) //顯示函數
{
static uchar i,j;
uint ss[4];
i=0;
do
{
ss[i]=k%10;
i++;
}while(k/=10);
for(j=0;j<i;j++)
{
P0=seg[ss[j]];
P2=tab[j];
delay(30);
P0=0xff;
P2=0xff;
}
}
{
static uchar i,j;
uint ss[4];
i=0;
do
{
ss[i]=k%10;
i++;
}while(k/=10);
for(j=0;j<i;j++)
{
P0=seg[ss[j]];
P2=tab[j];
delay(30);
P0=0xff;
P2=0xff;
}
}
void serial_init() //串口初始化
{
TMOD|=0x20;
SM2=0;
SM1=1;
SM0=0;
REN=1;
TH1=0xf3;
TL1=0xf3;
TR1=1;
}
{
TMOD|=0x20;
SM2=0;
SM1=1;
SM0=0;
REN=1;
TH1=0xf3;
TL1=0xf3;
TR1=1;
}
void serial_iit() //串口中斷設置
{
EA=1;
ES=1;
}
{
EA=1;
ES=1;
}
void sss() interrupt 4 //串口中斷子函數
{
if(RI==1)
{
dat=SBUF;
RI=0;
}
}
{
if(RI==1)
{
dat=SBUF;
RI=0;
}
}
void time0_init()
{
TMOD|=0x01;
TH0=0xff;
TL0=0x88;
TR0=1;
}
{
TMOD|=0x01;
TH0=0xff;
TL0=0x88;
TR0=1;
}
void time0_event() interrupt 1
{
TH0=0xff;
TL0=0x88;
if(start==1)
{
bz=~bz;
}
else
bz=1;
}
{
TH0=0xff;
TL0=0x88;
if(start==1)
{
bz=~bz;
}
else
bz=1;
}
void time0_iit() //定時器0中斷開
{
ET0=1;
}
{
ET0=1;
}
void main()
{
serial_init();
serial_iit();
time0_init();
time0_iit();
relay=1;
while(1)
{
show(dat);
if(dat==49)
{
start=1;
}
if(dat==50)
{
start=2;
}
else
start=0;
if(start==2)
{
relay=0;
}
else
{
relay=1;
}
}
{
show(dat);
if(dat==49)
{
start=1;
}
if(dat==50)
{
start=2;
}
else
start=0;
if(start==2)
{
relay=0;
}
else
{
relay=1;
}
}
}