单片机的课程设计NO.12
程序功能
由甲机测得方波频率,再发送给乙机,乙机产生对应频率的方波
程序代码
甲机
//甲机程序
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define correct 23
uchar TimeH = (65536 - 2000 +correct)/256; //数码管刷新间隔
uchar TimeL = (65536 - 2000 +correct)%256;
uint Frequency=0,Counter=0; //Frequency频率,Counter计数器
uchar code seg[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90}; /*0~9顺序共阳极段码表*/
uchar a[4]={0};
bit flag=0;
void send(uchar *s);
void main( )
{
TMOD = 0X21;
TH0 = TimeH;
TL0 = TimeL;
TH1 = 0XFD; //波特率9600
TL1 = 0XFD;
SCON = 0X50;
PCON = 0X00;
TR1 = 1; //接通T1
EA = 1; //总中断开
ET0 = 1; //T0中断开
EX0 = 1; //外部中断0开
IT0 = 1; //外部中断下降沿触发
ES = 1; //串口中断开
TR0 = 1;
P0 = 0xff; //不显示
while(1)
{
if(flag)
{
a[0]= (Frequency/1000)%10;
a[1]= (Frequency/100)%10;
a[2]= (Frequency/10)%10;
a[3]= Frequency%10;
flag=0;
TI=1;
} //对频率按位分解
}
}
void INT0_Interrupt() interrupt 0
{
Counter++;
}
void T0_Interrupt() interrupt 1
{
static uchar i = 0;
static uint cnt = 0;
TH0 = TimeH; //2ms
TL0 = TimeL;
P1 = 0XFF; //数码管熄灭
P2 = 0X01 << i; //位选信号更新
P1 = seg[a[i]]; //段码信号更新
i++;
cnt++;
if(i == 4)
i = 0;
if(cnt==500) //2ms*500=1s
{
Frequency=Counter;
Counter=0;
flag=1;
cnt=0;
}
}
void TRX_Interrupt() interrupt 4 //串口通信
{
if(RI)
{
RI = 0;
}
if(TI)
{
TI = 0;
send(a);
}
}
void send(uchar *s) //串口发送函数
{
static uchar i=0;
if(i<4)
{
SBUF=*(s+i);
i++;
}
else
{
i=0;
}
}
乙机
//乙机程序
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define correct 9
uchar TimeH = (65536 - 333 )/256;
uchar TimeL = (65536 - 333 )%256;
uint Frequency=0; //Frequency频率
uchar b[4]={0};
sbit SQU = P2^0;
sbit LOCK = P1^0;
bit flag=0;
void main( )
{
TMOD = 0X21;
TH0 = TimeH;
TL0 = TimeL;
TH1 = 0XFD; //波特率9600
TL1 = 0XFD;
SCON = 0X50;
PCON = 0X00;
TR1 = 1; //T1计时器开
EA = 1; //总中断开
ET0 = 1; //T0中断开
ES = 1; //串口中断开
TR0 = 1; //T0计时器开
SQU = 1;
while(1)
{
if(flag)
{
TimeH = (65535 - 12000000/12/Frequency/2+correct)/256;
TimeL = (65535 - 12000000/12/Frequency/2+correct)%256;
flag=0;
}
}
}
void T0_Interrupt() interrupt 1
{
TH0 = TimeH;
TL0 = TimeL;
SQU = !SQU;
}
void TRX_Interrupt() interrupt 4 //串口通信
{
static uint temp;
static uchar i=0;
if(RI)
{
RI = 0;
temp=temp*10+SBUF;
i++;
if(i==4)
{
if(LOCK)
Frequency=temp;
temp=0;
i=0;
flag=1;
}
}
if(TI)
{
TI = 0;
}
}