📄 wave.c
字号:
#include"at89x52.h"
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
/**************************
定义各个功能端
**************************/
uchar code LED_dig[]={0xef,0xdf,0xbf,0x7f};//位选地址码
uchar code Dis[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴极数码管码表,定赗位?
uchar data led[4]; //显示缓冲区
uchar KEY; //键值
uint DelayKey; //键盘延时变量
bit Still;
uchar ScanIndex;
unsigned char freq=1; //控制频率量
unsigned char bo=0; //波形选择变量
unsigned char freqsect=0; //时间变量
//定时器周期计算联合变量,记录2次外部中断间的时间
/************************
正弦码表
************************/
unsigned char code DisCode[]= {
0x80,0x83,0x86,0x89,0x8D,0x90,0x93,0x96,
0x99,0x9C,0x9F,0xA2,0xA5,0xA8,0xAB,0xAE,
0xB1,0xB4,0xB7,0xBA,0xBC,0xBF,0xC2,0xC5,
0xC7,0xCA,0xCC,0xCF,0xD1,0xD4,0xD6,0xD8,
0xDA,0xDD,0xDF,0xE1,0xE3,0xE5,0xE7,0xE9,
0xEA,0xEC,0xEE,0xEF,0xF1,0xF2,0xF4,0xF5,
0xF5,0xF5,0xF5,0xF5,0xF5,0xF5,0xF5,0xF5,
0xF5,0xF4,0xF2,0xF1,0xEF,0xEE,0xEC,0xEA,
0xE9,0xE7,0xE5,0xE3,0xE1,0xDE,0xDD,0xDA,
0xD8,0xD6,0xD4,0xD1,0xCF,0xCC,0xCA,0xC7,
0xC5,0xC2,0xBF,0xBC,0xBA,0xB7,0xB4,0xB1,
0xAE,0xAB,0xA8,0xA5,0xA2,0x9F,0x9C,0x99,
0x96,0x93,0x90,0x8D,0x89,0x86,0x83,0x80,
0x80,0x7C,0x79,0x78,0x72,0x6F,0x6C,0x69,
0x66,0x63,0x60,0x5D,0x5A,0x57,0x55,0x51,
0x4E,0x4C,0x48,0x45,0x43,0x40,0x3D,0x3B,
0x38,0x35,0x33,0x30,0x2E,0x2B,0x29,0x27,
0x25,0x22,0x20,0x1E,0x1C,0x1A,0x18,0x16,
0x15,0x13,0x11,0x10,0x0E,0x0D,0x0B,0x0A,
0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02,
0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,
0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,
0x0A,0x0B,0x0D,0x0E,0x10,0x11,0x13,0x15,
0x16,0x18,0x1A,0x1C,0x1E,0x20,0x22,0x25,
0x27,0x29,0x2B,0x2E,0x30,0x33,0x35,0x38,
0x3A,0x3D,0x40,0x43,0x45,0x48,0x4C,0x4E,
0x51,0x55,0x57,0x5A,0x5D,0x60,0x63,0x66,
0x69,0x6C,0x6F,0x72,0x76,0x79,0x7C,0x80,
};
void display();
void Disposekey();
/**********************************************
按键检测函数
***********************************************/
//*************************扫描按键程序******************
void Scankey(void)
{
uchar x;
x=P3&0x1c;
if(x!=0x1c)DelayKey=100; //设置延迟时间削颤
if(x&0x08)Still=0; //功能切换键松键
}
void DisposeKEY(void)
{
switch(KEY)
{
case 0x18: // k1
if(freq<99)freq++;
DelayKey=2000; //按住键不动可连续改变设置
break;
case 0x14: //k2
if(Still==0)
{
bo++;
bo&=3;
Still=1;
}
break;
case 0x0c: // k3
if(freq)freq--;
DelayKey=2000; //按住键不动可连续改变设置
break;
default:break;
}
display();
KEY=0x1c;
}
/****************************************
正弦波
*****************************************/
void sine(void)
{
P1=DisCode[freqsect];
}
/****************************************
锯齿波函数
*****************************************/
void saw(void)
{
P1=freqsect;
}
/******************************************
方波
*******************************************/
void square(void)
{
if(freqsect<128) P1=255;
else P1=0;
}
/*******************************************
三角波
*******************************************/
void tria(void)
{
if(freqsect<128) P1=freqsect<<1;
else
{
if(freqsect==128)P1=255;
else P1=(256-freqsect)<<1;
}
}
/***************************
中断函数
****************************/
void T0_SR() interrupt 1
{
if(freq!=0)
{ freq=22118400/12/freq/32; //频率值转换成定时器的定时数
TH0=(-freq)>>8;
TL0=(-freq);
}
else P1=0x00;
if(bo==0)sine(); //输出波形
if(bo==1)square();
if(bo==2)saw();
if(bo==3)tria();
freqsect++;
}
//******************多任务时序控制时钟中断*************************
void T1_SR() interrupt 3 //定时器1中断,完成1秒定时和LED延时
{
P0=0;
P2=LED_dig[ScanIndex];
P0=led[ScanIndex];
ScanIndex++;
ScanIndex &= 3;
if(DelayKey==0)Scankey(); //若没按键则扫描按键
else //有按键利用DelayKey按键消颤
{
DelayKey--;
if(DelayKey==0) //处理按键
{
KEY=P3&0x1c; //取键值P32、P33、P34
}
}
}
/****************************************
显示函数
*****************************************/
void display(void)
{
led[0]=Dis[freq%10];
led[1]=Dis[freq/10];
led[2]=0x40;
led[3]=Dis[bo];
}
/*****************************************
主函数
*****************************************/
void main(void)
{
TMOD=0x21; //T1 T0都工作在定时方式,T1方式2,T0方式1
TR0=1; //T0定时器开始计数
ET0=1; //开T0的中断
TH1=-200; // 8位自动重装定时器约每100uS中断1次,9216次为1秒
TL1=-200;
TR1=1; //T1定时器开始计数
ET1=1; //允许T1溢出中断
// IP=0x02; //规定T0为高级中断
EA=1;
DelayKey=0;
display(); // 显示初始界面
while(1)
{
if(KEY!=0x1c)
Disposekey();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -