📄 波形发生器.c
字号:
/*********************************************************/
/** 数字时钟 **/
/** 作者:曹锐于关老师基础上 **/
/** 时间:2007/10/18级 **/
/** National University of Defence Technology **/
/** 指示3548635994 **/
/*********************************************************/
#include <absacc.h>
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint8 unsigned char
#define uint16 unsigned int
sbit LED1=P1^1; //数码管
sbit LED2=P1^2;
sbit LED3=P1^3;
sbit LED4=P1^4;
sbit key1=P1^5;//键盘
sbit key2=P1^6;
sbit key3=P1^7;
uint8 step=1;//步进,随频率变化
uint16 temp=0;//相位
uchar aaa=0;//波的种类
uint16 fre;//波的频率
#define sendwave P2//波形送出口
#define display P0//显示内容输出端口
#define sltld P1//选通LED所用变量
uchar code sin[]={127,126,124,123,121,119,118,116,115,113,111,110,108,
107,105,104,102,100,99,97,96, 94, 93,91, 90, 88, 87, 85,
83, 82, 80, 79, 78, 76, 75, 73, 72, 70, 69, 67, 66, 65, 63,
62, 60, 59, 58, 56, 55, 54, 52, 51, 50, 49, 47, 46, 45, 44,
42, 41, 40, 39, 38, 37, 36, 34, 33, 32, 31, 30, 29, 28, 27,
26, 25, 24, 23, 22, 21, 21, 20, 19, 18, 17, 16, 16, 15, 14,
13, 13, 12, 11, 11, 10, 9, 9, 8, 8, 7, 7, 6, 6, 5,
5, 4, 4, 4, 3, 3, 2, 2, 2, 2, 1, 1, 1, 1, 1,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5,
5, 6, 6, 7, 7, 8, 9, 9, 10, 10, 11, 12, 12, 13, 14,
15, 15, 16, 17, 18, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27,
28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 41, 42, 43,
44, 45, 47, 48, 49, 50, 52, 53, 54, 56, 57, 58, 60, 61, 62,
64, 65, 67, 68, 70, 71, 72, 74, 75, 77, 78, 80, 81, 83, 84,
86, 87, 89, 90, 92, 93, 95, 97, 98, 100,101,103,104,106,108 ,
109 ,111,112,114,115,117,119,121,122,123,125,127,128,130,132 ,
133,135,136,138,140,141,143,144,146,147,149,151,152,154,155,
157,158,160,162,163,165,166,168,169,171,172,174,175,177,178,
180,181,183,184,185,187,188,190,191,193,194,195,197,198,199,
201,202,203,205,206,207,208,210,211,212,213,214,216,217,218,
219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,
234,235,236,237,237,238,239,240,240,241,242,243,243,244,245,
245,246,246,247,248,248,249,249,250,250,250,251,251,252,252,
252,253,253,253,253,254,254,254,254,254,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,254,254,254,254,254,253,
253,253,253,252,252,251,251,251,250,250,249,249,248,248,247,
247,246,246,245,244,244,243,242,242,241,240,239,239,238,237,
236,235,234,234,233,232,231,230,229,228,227,226,225,224,223,
222,221,219,218,217,216,215,214,213,211,210,209,208,206,205,
204,203,201,200,199,197,196,195,193,192,190,189,188,186,185,
183,182,180,179,177,176,175,173,172,170,168,167,165,164,162,
161,159,158,156,155,153,151,150,148,147,145,144,142,140,139,
137,136,134,132,131,129,128};
uchar code tri[]={250,249,248,247,246,245,244,243,242,241,240,239,
238,237,236,235,234,233,232,231,230,229,228,227,226,225,224,223,
222,221,220,219,218,217,216,215,214,213,212,211,210,209,208,
207,206,205,204,203,202,201,200,199,198,197,196,195,194,193,
192,191,190,189,188,187,186,185,184,183,182,181,180,179,178,
177,176,175,174,173,172,171,170,169,168,167,166,165,164,163,
162,161,160,159,158,157,156,155,154,153,152,151,150,149,148,
147,146,145,144,143,142,141,140,139,138,137,136,135,134,133,
132,131,130,129,128,127,126,125,124,123,122,121,120,119,118,
117,116,115,114,113,112,111,110,109,108,107,106,105,104,103,
102,101,100,99,98,97,96,95,94,93,92,91,90,89,88,
87,86,85,84,83,82,81,80,79,78,77,76,75,74,73,
72,71,70,69,68,67,66,65,64,63,62,61,60,59,58,
57,56,55,54,53,52,51,50,49,48,47,46,45,44,43,
42,41,40,39,38,37,36,35,34,33,32,31,30,29,28 ,
27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,
12,11,10,9,8,7,6,5,4,3,2,1,0, 1, 2,
3,4,5,6,7,8,9,10,11,12,13,14,15,16,
17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,
32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,
47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,
62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,
77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,
92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,
107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,
122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,
137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,
152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,
167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,
182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,
197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,
212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,
227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,
242,243,244,245,246,247,248,249 };
/*扫描键盘使用的变量 */
uint16 counter=1;
uint16 counter1=1; //读键盘计数器,每16ms刷新读一次
bit getkey = 0; //获得有效键值标志位 等于1时代表得到一个有效键值
bit keyon = 0; //防止按键冲突标志位
uchar keynum =0; //获得的有效按键值寄存器
uchar key;
/*数码管显示使用的变量和常量*/
uchar lednum = 3; //数码管显示位控制寄存器
uchar led[4] = {0,0,0,0}; //数码管显示内容寄存器
uchar code segtab[18] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71,0x73,0x00}; //七段码段码表
// "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "P" ,"black"
void leddisp(void); //数码管显示函数
void readkey(void); //读键盘函数
void init_condition(void);//初始化函数
void intT0() interrupt 1 //T0 定时中断处理函数
{
TH0 = 0xff; //定时器中断时间间隔 0.1ms
TL0 = 0x38;
counter1=counter1+1;
counter=counter+1;
temp=temp+step;
if(temp>=500)
temp=temp-500;
switch(aaa)
{
case 0:
sendwave=sin[temp];
break;
case 1:
sendwave=tri[temp];
break;
case 2:
if(temp>=250)
sendwave=0xff;
else
sendwave=0x00;
break;
}
if(counter==81)
counter=1;
if(counter==40||counter==80)
{
fre=20*step;
led[0]=aaa;
led[1]=fre/100;
led[2]=(fre%100)/10;
led[3]=fre%10;
leddisp();
}
if(counter1==1001)
counter1=1;
if(counter1==1000)
readkey();
//counter=counter+1;
}
void main(void)
{
TMOD = 0x01; //
TH0 = 0xff; //定时器中断时间间隔 0.1ms
TL0 = 0x38;
TCON = 0x10;
ET0 = 1;
EA = 1;
while(1)
{
if(getkey==1)
{
getkey=0;
switch(keynum)
{ case 0:
init_condition();
break;
case 1:
{
aaa=aaa+1;
if(aaa==3)
aaa=0;
}
break;
case 2:
{
step=step+1;
if(step==51)
step=1;
}
break;
}
}
}
}
/***************************************************
键盘扫描函数
原型: void readkey(void);
功能: 当获得有效按键时,令getkey=1,keynum为按键值
****************************************************/
void readkey(void)
{
if(!(key1==1&&key2==1&&key3==1))
{
if(key1==0)
keynum=0;
else if(key2==0)
keynum=1;
else
keynum=2;
getkey=1;
}
}
/***************************************************
数码管显示函数
原型: void leddisp(void);
功能: 每次调用轮流显示一位数码管
****************************************************/
void leddisp(void)
{
switch(lednum) //选择需要显示的数码位
{
case 0:
sltld=0xfd; //11111101b
display=segtab[led[0]]+128;
break;
case 1:
sltld=0xfb; //11111011b
display=segtab[led[1]];
break;
case 2:
sltld=0xf7;//11110111b
display=segtab[led[2]];
break;
case 3:
sltld=0xef; //11101111b
display=segtab[led[3]] ;
break;
}
if(lednum == 0) //更新需要现实的数码位
{
lednum = 3;
}
else
{
lednum = lednum-1;
}
}
void init_condition(void)
{
aaa=0;
step=1;
temp=0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -