📄 main.c
字号:
/**********方波发生器*********/
//作者:翰海光舟
//日期:2005年12月26日
/***********宏定义************/
#include<AT89X52.H>
/*******子函数声明************/
void delay10ms(void);
/****全局变量定义************/
unsigned char i,j; //循环变量
unsigned int frequency=0; //从键盘输入的频率
unsigned long pw; //脉冲宽度
unsigned char multiple; //脉宽比65536的倍数
unsigned int rest; //脉宽比65536的余数
unsigned char counter; //计数变量
unsigned char number=0; //数组下标
unsigned char buffer=0; //位选标志
unsigned char disbuf[4]; //缓冲数组
bit flag=0; //第一次按下数字键的标志,0=第一次按下
unsigned char code disp[]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x79}; //0~9、(null)、E
sbit key0=P1^0; //0~9数字键
sbit key1=P1^1;
sbit key2=P1^2;
sbit key3=P1^3;
sbit key4=P1^4;
sbit key5=P1^5;
sbit key6=P1^6;
sbit key7=P1^7;
sbit key8=P3^0;
sbit key9=P3^1;
sbit makesure=P3^2; //确认键
sbit renew=P3^3; //重置键
/**********************************主函数*****************************/
void main(void)
{
TMOD=0x11; //中断初始化
EA=1;
ET0=1;
ET1=1;
TR1=1;
TH1=65036>>8;
TL1=65036;
P2_0=0; //点亮电源指示灯
/**************************按键查询**********************************/
while(1)
{
begin:
if(key0==0)
{
delay10ms(); //软件消抖
if(key0==0)
{
switch(number)
{
case 0:
disbuf[3]=10; //10=无效零消隐
disbuf[2]=10;
disbuf[1]=10;
disbuf[0]=0; //数码管相应位显示的数字
break;
case 1:
disbuf[3]=10;
disbuf[2]=10;
disbuf[1]=disbuf[0];
disbuf[0]=0;
break;
case 2:
disbuf[3]=10;
disbuf[2]=disbuf[1];
disbuf[1]=disbuf[0];
disbuf[0]=0;
break;
case 3:
disbuf[3]=disbuf[2];
disbuf[2]=disbuf[1];
disbuf[1]=disbuf[0];
disbuf[0]=0;
break;
}
number++;
if(number==4)
number=0;
if(flag==0)
flag=1;
else
{
frequency=(int)(frequency*10);
if(frequency>1000) //输入的频率大于1000
{
disbuf[3]=11;
disbuf[2]=disbuf[1]=disbuf[0]=10;
frequency=0;
goto exception; //异常处理
}
}
while(key0==0);
}
}
if(key1==0)
{
delay10ms();
if(key1==0)
{
switch(number)
{
case 0:
disbuf[3]=10;
disbuf[2]=10;
disbuf[1]=10;
disbuf[0]=1;
break;
case 1:
disbuf[3]=10;
disbuf[2]=10;
disbuf[1]=disbuf[0];
disbuf[0]=1;
break;
case 2:
disbuf[3]=10;
disbuf[2]=disbuf[1];
disbuf[1]=disbuf[0];
disbuf[0]=1;
break;
case 3:
disbuf[3]=disbuf[2];
disbuf[2]=disbuf[1];
disbuf[1]=disbuf[0];
disbuf[0]=1;
break;
}
number++;
if(number==4)
number=0;
if(flag==0)
{
flag=1;
frequency=1;
}
else
{
frequency=(int)(frequency*10+1);
if(frequency>1000)
{
disbuf[3]=11;
disbuf[2]=disbuf[1]=disbuf[0]=10;
frequency=0;
goto exception;
}
}
while(key1==0);
}
}
if(key2==0)
{
delay10ms();
if(key2==0)
{
switch(number)
{
case 0:
disbuf[3]=10;
disbuf[2]=10;
disbuf[1]=10;
disbuf[0]=2;
break;
case 1:
disbuf[3]=10;
disbuf[2]=10;
disbuf[1]=disbuf[0];
disbuf[0]=2;
break;
case 2:
disbuf[3]=10;
disbuf[2]=disbuf[1];
disbuf[1]=disbuf[0];
disbuf[0]=2;
break;
case 3:
disbuf[3]=disbuf[2];
disbuf[2]=disbuf[1];
disbuf[1]=disbuf[0];
disbuf[0]=2;
break;
}
number++;
if(number==4)
number=0;
if(flag==0)
{
flag=1;
frequency=2;
}
else
{
frequency=(int)(frequency*10+2);
if(frequency>1000)
{
disbuf[3]=11;
disbuf[2]=disbuf[1]=disbuf[0]=10;
frequency=0;
goto exception;
}
}
while(key2==0);
}
}
if(key3==0)
{
delay10ms();
if(key3==0)
{
switch(number)
{
case 0:
disbuf[3]=10;
disbuf[2]=10;
disbuf[1]=10;
disbuf[0]=3;
break;
case 1:
disbuf[3]=10;
disbuf[2]=10;
disbuf[1]=disbuf[0];
disbuf[0]=3;
break;
case 2:
disbuf[3]=10;
disbuf[2]=disbuf[1];
disbuf[1]=disbuf[0];
disbuf[0]=3;
break;
case 3:
disbuf[3]=disbuf[2];
disbuf[2]=disbuf[1];
disbuf[1]=disbuf[0];
disbuf[0]=3;
break;
}
number++;
if(number==4)
number=0;
if(flag==0)
{
flag=1;
frequency=3;
}
else
{
frequency=(int)(frequency*10+3);
if(frequency>1000)
{
disbuf[3]=11;
disbuf[2]=disbuf[1]=disbuf[0]=10;
frequency=0;
goto exception;
}
}
while(key3==0);
}
}
if(key4==0)
{
delay10ms();
if(key4==0)
{
switch(number)
{
case 0:
disbuf[3]=10;
disbuf[2]=10;
disbuf[1]=10;
disbuf[0]=4;
break;
case 1:
disbuf[3]=10;
disbuf[2]=10;
disbuf[1]=disbuf[0];
disbuf[0]=4;
break;
case 2:
disbuf[3]=10;
disbuf[2]=disbuf[1];
disbuf[1]=disbuf[0];
disbuf[0]=4;
break;
case 3:
disbuf[3]=disbuf[2];
disbuf[2]=disbuf[1];
disbuf[1]=disbuf[0];
disbuf[0]=4;
break;
}
number++;
if(number==4)
number=0;
if(flag==0)
{
flag=1;
frequency=4;
}
else
{
frequency=(int)(frequency*10+4);
if(frequency>1000)
{
disbuf[3]=11;
disbuf[2]=disbuf[1]=disbuf[0]=10;
frequency=0;
goto exception;
}
}
while(key4==0);
}
}
if(key5==0)
{
delay10ms();
if(key5==0)
{
switch(number)
{
case 0:
disbuf[3]=10;
disbuf[2]=10;
disbuf[1]=10;
disbuf[0]=5;
break;
case 1:
disbuf[3]=10;
disbuf[2]=10;
disbuf[1]=disbuf[0];
disbuf[0]=5;
break;
case 2:
disbuf[3]=10;
disbuf[2]=disbuf[1];
disbuf[1]=disbuf[0];
disbuf[0]=5;
break;
case 3:
disbuf[3]=disbuf[2];
disbuf[2]=disbuf[1];
disbuf[1]=disbuf[0];
disbuf[0]=5;
break;
}
number++;
if(number==4)
number=0;
if(flag==0)
{
flag=1;
frequency=5;
}
else
{
frequency=(int)(frequency*10+5);
if(frequency>1000)
{
disbuf[3]=11;
disbuf[2]=disbuf[1]=disbuf[0]=10;
frequency=0;
goto exception;
}
}
while(key5==0);
}
}
if(key6==0)
{
delay10ms();
if(key6==0)
{
switch(number)
{
case 0:
disbuf[3]=10;
disbuf[2]=10;
disbuf[1]=10;
disbuf[0]=6;
break;
case 1:
disbuf[3]=10;
disbuf[2]=10;
disbuf[1]=disbuf[0];
disbuf[0]=6;
break;
case 2:
disbuf[3]=10;
disbuf[2]=disbuf[1];
disbuf[1]=disbuf[0];
disbuf[0]=6;
break;
case 3:
disbuf[3]=disbuf[2];
disbuf[2]=disbuf[1];
disbuf[1]=disbuf[0];
disbuf[0]=6;
break;
}
number++;
if(number==4)
number=0;
if(flag==0)
{
flag=1;
frequency=6;
}
else
{
frequency=(int)(frequency*10+6);
if(frequency>1000)
{
disbuf[3]=11;
disbuf[2]=disbuf[1]=disbuf[0]=10;
frequency=0;
goto exception;
}
}
while(key6==0);
}
}
if(key7==0)
{
delay10ms();
if(key7==0)
{
switch(number)
{
case 0:
disbuf[3]=10;
disbuf[2]=10;
disbuf[1]=10;
disbuf[0]=7;
break;
case 1:
disbuf[3]=10;
disbuf[2]=10;
disbuf[1]=disbuf[0];
disbuf[0]=7;
break;
case 2:
disbuf[3]=10;
disbuf[2]=disbuf[1];
disbuf[1]=disbuf[0];
disbuf[0]=7;
break;
case 3:
disbuf[3]=disbuf[2];
disbuf[2]=disbuf[1];
disbuf[1]=disbuf[0];
disbuf[0]=7;
break;
}
number++;
if(number==4)
number=0;
if(flag==0)
{
flag=1;
frequency=7;
}
else
{
frequency=(int)(frequency*10+7);
if(frequency>1000)
{
disbuf[3]=11;
disbuf[2]=disbuf[1]=disbuf[0]=10;
frequency=0;
goto exception;
}
}
while(key7==0);
}
}
if(key8==0)
{
delay10ms();
if(key8==0)
{
switch(number)
{
case 0:
disbuf[3]=10;
disbuf[2]=10;
disbuf[1]=10;
disbuf[0]=8;
break;
case 1:
disbuf[3]=10;
disbuf[2]=10;
disbuf[1]=disbuf[0];
disbuf[0]=8;
break;
case 2:
disbuf[3]=10;
disbuf[2]=disbuf[1];
disbuf[1]=disbuf[0];
disbuf[0]=8;
break;
case 3:
disbuf[3]=disbuf[2];
disbuf[2]=disbuf[1];
disbuf[1]=disbuf[0];
disbuf[0]=8;
break;
}
number++;
if(number==4)
number=0;
if(flag==0)
{
flag=1;
frequency=8;
}
else
{
frequency=(int)(frequency*10+8);
if(frequency>1000)
{
disbuf[3]=11;
disbuf[2]=disbuf[1]=disbuf[0]=10;
frequency=0;
goto exception;
}
}
while(key8==0);
}
}
if(key9==0)
{
delay10ms();
if(key9==0)
{
switch(number)
{
case 0:
disbuf[3]=10;
disbuf[2]=10;
disbuf[1]=10;
disbuf[0]=9;
break;
case 1:
disbuf[3]=10;
disbuf[2]=10;
disbuf[1]=disbuf[0];
disbuf[0]=9;
break;
case 2:
disbuf[3]=10;
disbuf[2]=disbuf[1];
disbuf[1]=disbuf[0];
disbuf[0]=9;
break;
case 3:
disbuf[3]=disbuf[2];
disbuf[2]=disbuf[1];
disbuf[1]=disbuf[0];
disbuf[0]=9;
break;
}
number++;
if(number==4)
number=0;
if(flag==0)
{
flag=1;
frequency=9;
}
else
{
frequency=(int)(frequency*10+9);
if(frequency>1000)
{
disbuf[3]=11;
disbuf[2]=disbuf[1]=disbuf[0]=10;
frequency=0;
goto exception;
}
}
while(key9==0);
}
}
if(makesure==0) //确认键
{
delay10ms();
if(makesure==0)
{
P2_3=0; //开确认指示灯
pw=500000/frequency; //计算脉冲宽度,单位:uS
multiple=(unsigned char)(pw/65536); //计算pw比65536的倍数
counter=multiple;
rest=(unsigned int)(pw%65536); //计算pw除以65536所得的余数
if(rest>184)
rest-=184; //线性修正,修正中断响应及中断受阻的时间影响
if(multiple==0)
{
TH0=(65536-rest)>>8;
TL0=65536-rest;
}
else
{
TH0=0;
TL0=0;
}
TR0=1;
}
}
if(renew==0)
{
delay10ms();
if(renew==0)
{
frequency=0;
disbuf[0]=disbuf[1]=disbuf[2]=disbuf[3]=0;
P2_3=1; //关确认指示灯
}
}
}
exception:
for(;;)
{
P2_2=0; //预置数超过1000报警灯
if(renew==0) //重置频率键按下
{
delay10ms();
if(renew==0) //重新初始化各变量
{
disbuf[0]=disbuf[1]=disbuf[2]=disbuf[3]=0;
P2_2=1; //关预置数指示灯
flag=0;
buffer=0;
goto begin; //返回按键查询
}
}
}
}
/***************延时10毫秒子程序*******************/
void delay10ms(void)
{
for(i=20;i>0;i--)
for(j=248;j>0;j--);
}
void t0(void) interrupt 1 //T0中断入口,中断服务程序用来产生方波
{
if(counter==0)
{
P2_0=~P2_0; //输出方波
TH0=(65536-rest)>>8;
TL0=65536-rest;
counter=multiple;
}
else
{
TH0=0;
TL0=0;
counter--; //软件定时器
}
}
void t1(void) interrupt 3 //T1中断入口,此程序用于扫描数码管
{
if(buffer==0)
{
P0=disp[disbuf[3]]; //段选
P2_6=0;
P2_7=0;
}
if(buffer==1)
{
P0=disp[disbuf[2]];
P2_6=0;
P2_7=1;
}
if(buffer==2)
{
P0=disp[disbuf[1]];
P2_6=1;
P2_7=0;
}
if(buffer==3)
{
P0=disp[disbuf[0]];
P2_6=1;
P2_7=1;
}
buffer++; //扫描标志
if(buffer==4) //完成一个扫描周期
buffer=0; //开始新的扫描周期
TH1=65036>>8; //定时器重装初值
TL1=65036;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -