#include<reg52.h> //包含头文件
#include<intrins.h>
#define uchar unsigned char //宏定义
#define uint unsigned int
sbit s1=P3^5; //定义按键的接口
sbit s2=P3^6;
sbit s3=P3^7;
sbit s4=P3^4;
sbit led0=P3^0; //定义四个LED,分别表示不同的波形
sbit led1=P3^1;
sbit led2=P3^2;
sbit led3=P3^3;
sbit Wei=P2^0;
sbit Wei1=P2^1;
sbit Wei2=P2^2;
sbit Wei3=P2^3;
sbit Wei4=P2^4;
sbit Wei5=P2^5;
sbit Wei6=P2^6;
sbit Wei7=P2^7;
char num,boxing,u; //定义全局变量
int pinlv=100,bujin=1,bujin1=1; //频率初始值是100Hz,步进值默认是1,显示步进值变量
unsigned long int m; //定义长整形变量 m
int a,b,h,num1; //定义全局变量
uchar code SEG_Tab1[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳数码管 段码表0-9
uchar ScanTime=1;//数码管位数扫描
uchar code sin[64]={ //此数组内的数据为,da输出对应电压值对应的数字量,0是0V,255是5V
135,145,158,167,176,188,199,209,218,226,234,240,245,249,252,254,254,253,251,247,243,237,230,222,213,204,193,182,170,158,
146,133,121,108,96,84,72,61,50,41,32,24,17,11,7,3,1,0,0,2,5,9,14,20,28,36,45,55,66,78,90,102,114,128
}; //正弦波取码
uchar code juxing[64]={ //一个周期是采样64个点, 所以数组内是64个数据
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
}; //矩形波取码
uchar code sanjiao[64]={
0,8,16,24,32,40,48,56,64,72,80,88,96,104,112,120,128,136,144,152,160,168,176,184,192,200,208,216,224,232,240,248,
248,240,232,224,216,208,200,192,184,176,168,160,152,144,136,128,120,112,104,96,88,80,72,64,56,48,40,32,24,16,8,0
}; //三角波取码
uchar code juchi[64]={
0,4,8,12,16,20,24,28,32,36,40,45,49,53,57,61,65,69,73,77,81,85,89,93,97,101,105,109,113,117,121,125,130,134,138,142,
146,150,154,158,162,166,170,174,178,182,186,190,194,198,202,206,210,215,219,223,227,231,235,239,243,247,251,255
}; //锯齿波取码
void delay(uint xms) //延时函数
{
int a,b;
for(a=xms;a>0;a--)
for(b=110;b>0;b--);
}
void initclock() //定时器初始化函数
{
TMOD=0x01; //定时器的工作方式
TH0=a;
TL0=b; //定时器赋初值
EA=1; //打开中断总开关
ET0=1; //打开定时器允许中断开关
TR0=1; //打开定时器定时开关
}
void display() //显示函数
{
uchar qian,bai,shi,ge; //定义变量用于显示
qian=pinlv/1000; //将频率值拆成一位的数据,将数据除以1000,得到的商是一位数,赋值给qian
bai=pinlv%1000/100; //将频率除以1000的余数再除以100就得到了频率的百位,赋值给bai
shi=pinlv%1000%100/10; //同上,得到频率的十位
ge=pinlv%1000%100%10;
P0=0xFF;
P2=0x00;
switch(ScanTime)
{
//----------数码管第一位--------------
case 1:
P0=SEG_Tab1[qian];
Wei=1;
break;
case 2:
P0=SEG_Tab1[bai];
Wei1=1;
break;
case 3:
P0=SEG_Tab1[shi];
Wei2=1;
break;
case 4:
P0=SEG_Tab1[ge];
Wei3=1;
break;
case 5:
P0=SEG_Tab1[4];
Wei4=0;
break;
case 6:
P0=SEG_Tab1[5];
Wei5=0;
break;
case 7:
P0=SEG_Tab1[6];
Wei6=0;
break;
case 8:
P0=SEG_Tab1[7];
Wei7=0;
break;
//------------------default---------------
default: break;
}
//-----数码管循环------
ScanTime++;
if(ScanTime>=9)
{
ScanTime=1;//循环扫描
}
;
if(boxing==0) //判断波形为正弦波
{
led3=1;
led0=0; //点亮正弦波指示灯
}
if(boxing==1) //注释同上
{
led0=1;
led1=0;
}
if(boxing==2)
{
led1=1;
led2=0;
}
if(boxing==3)
{
led2=1;
led3=0;
}
}
void keyscan() //频率调节键盘检测函数
{
if(s1==0) //加按键是否按下
{
EA=0; //关闭中断
delay(2); //延时去抖
if(s1==0) //再次判断
{
while(!s1); //按键松开
pinlv+=bujin; //频率以步进值加
if(pinlv>1000) //最大加到1000Hz
{
pinlv=100; //1000Hz
}
display(); //显示函数
m=65536-(150000/pinlv);//计算频率
a=m/256; //将定时器的初值赋值给变量
b=m%256;
EA=1; //打开中断总开关
}
}
if(s2==0) //减按键按下
{
delay(5);
if(s2==0)
{
EA=0;
while(!s2);
pinlv-=bujin; //频率以步进值减
if(pinlv<100)
{
pinlv=1000;
}
display();
m=65536-(150000/pinlv);
a=m/256;
b=m%256;
EA=1;
}
}
if(s3==0) //波形切换按键
{
delay(5);
if(s3==0)
{
EA=0;
while(!s3);
boxing++; //波形切换
if(boxing>=4) //4种波形
{
boxing=0;
}
display();
EA=1;
}
}
}
void bujinjiance() //步进值设置键盘程序
{
if(s4==0) //步进设置按键按下
{
delay(5); //延时去抖
if(s4==0) //再次判断按键
{
while(!s4); //按键释放,按键松开才继续向下执行
h++; //变量加
if(h==1) //进入设置状态时
{
bujin1=bujin; //步进值赋值给临时变量
}
if(h==2) //退出设置
{
h=0; //清零
bujin=bujin1; //设置好的临时步进值赋值给步进变量
initclock(); //定时器初始化
display(); //调用显示程序
}
}
}
if(h==1) //设置步进值时
{
if(s1==0) //加按键按下
{
delay(5); //延时去抖
if(s1==0) //再次判断
{
while(!s1); //按键释放
bujin1++; //步进值加1
if(bujin1>=101) //步进值最大100,也就是1000Hz
{
bujin1=1; //超过最大值就恢复到1Hz
}
}
}
if(s2==0) //减按键,注释同上
{
delay(5);
if(s2==0)
{
while(!s2);
bujin1--; //步进减
if(bujin1<=0)
{
bujin1=100;
}
}
}
}
}
void main() //主函数
{
m=65536-(150000/pinlv); //定时器初值
a=m/256;
b=m%256;
initclock(); //定时器初始化
led0=0; //点亮第一个波形指示灯
while(1) //进入while循环,括号内为1,一直成立,所以也叫死循环,程序不会跳出,一直在内执行
{
if(h==0) //正常模式不是步进调节
{
keyscan(); //扫描按键
display();
}
bujinjiance(); //扫描步进调节程序
switch(boxing) //选择波形
{
case 0 : P1=sin[u]; break; //正弦波
case 1 : P1=juxing[u]; break; //矩形波
case 2 : P1=sanjiao[u]; break; //三角波
case 3 : P1=juchi[u]; break; //锯齿波
}
}
}
void T0_time()interrupt 1 //定时器
{
TH0=a;
TL0=b; //根据不同的初值,定时器定时时间不同,达到不同频率的目的
u++; //变量加
if(u>=64) //一个周期采样64个点, 所以加到64就清零
u=0; //u清零
}
- 1
- 2
前往页