⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 89s521.c

📁 基于单片机的波形发生器
💻 C
字号:
#include<reg51.h>	        //包含常用头文件
#include<stdio.h>
#include<intrins.h>
#include<absacc.h>
#define uchar unsigned char	   //定义常用数据类型
void scan_key(void);
void treat_with_key(void);
void fun0(void);
void fun1(void);
void fun2(void);
void delay(int t);
void unit(void);
void give_led_data(void);
char data seg[3]={0x7F,0xBF,0xDF};
char data dis[10]={0x05,0xf5,0x13,0x51,0xe1,0x49,0x09,0xd5,0x01,0x41};
                 //  0   1    2    3    4    5    6    7    8    9
unsigned char code sine_data[128]={0x80,0x86,0x8D,0x93,0x99,0x9F,0xA5,0xAB,
                                   0xB1,0xB7,0xBC,0xC2,0xC7,0xCC,0xD1,0xD6,
                                   0xDA,0xDF,0xE3,0xE7,0xEA,0xEE,0xF1,0xF4,
                                   0xF6,0xF8,0xFA,0xFC,0xFD,0xFF,0xFF,0xFF,
                                   0xFF,0xFF,0xFF,0xFE,0xFD,0xFB,0xF9,0xF7,
                                   0xF5,0xF2,0xEF,0xEC,0xE9,0xE5,0xE1,0xDD,
                                   0xD8,0xD4,0xCF,0xCA,0xC5,0xBF,0xBA,0xB4,
                                   0xAE,0xA8,0xA2,0x9C,0x96,0x90,0x89,0x83,
                                   0x80,0x79,0x72,0x6C,0x66,0x60,0x5A,0x55,
                                   0x4E,0x48,0x43,0x3D,0x38,0x33,0x2E,0x29,
                                   0x25,0x20,0x1C,0x18,0x15,0x11,0x0E,0x0B, 
                                   0x09,0x07,0x05,0x03,0x02,0x00,0x00,0x00, 
                                   0x00,0x00,0x00,0x01,0x02,0x04,0x06,0x08,
                                   0x0A,0x0D,0x10,0x13,0x16,0x1A,0x1E,0x22,
                                   0x27,0x2B,0x30,0x35,0x3A,0x40,0x45,0x4C,
                                   0x51,0x57,0x5D,0x63,0x69,0x6F,0x76,0x7C, };
uchar key=0,wave_way=0,add_dec=1,j,n=0,m=0,k=0,l=0,led_data0,led_data1,led_data2;
int i=0;
main()
{
 unit();
 give_led_data();
 while(1)
{
 scan_key();
 if(key!=0)
{
 treat_with_key();
} 
 }
}
/**********************************************/
void unit(void)
{
IP=0xc2;
ET0=0;
TR0=0;
ET1=0;
TR1=0;
TH0=0x7d;
TL0=0x7d;
TH1=0xdc;
TL1=0xd8;
TMOD=0x12;
TR0=1;
ET0=1;
TR1=1;
ET1=1;
EA=1;
}
/**********************************************/
void give_led_data(void)
{
if(wave_way==0)
{
switch(add_dec)
{
 case 1:
       {
       led_data0=dis[0];
       led_data1=dis[0];
       led_data2=dis[8];
       break;
       }
 case 2:
       {
       led_data0=dis[0];
       led_data1=dis[0];
       led_data2=dis[4];
       break;
       }
 case 3:
       {
       led_data0=dis[0];
       led_data1=dis[7];
       led_data2=dis[2];
       break;
       }
 case 4:
       {
       led_data0=dis[0];
       led_data1=dis[0];
       led_data2=dis[2];
       break;
       }
 default:{break;}

}
}
if(wave_way==1)
{
switch(add_dec)
{
 case 1:
       {
       led_data0=dis[0];
       led_data1=dis[6];
       led_data2=dis[1];
       break;
       }
 case 2:
       {
       led_data0=dis[3];
       led_data1=dis[8];
       led_data2=0xff;
       break;
       }
 case 3:
       {
       led_data0=dis[7];
       led_data1=dis[5];
       led_data2=0xff;
       break;
       }
 case 4:
       {
       led_data0=dis[2];
       led_data1=dis[4];
       led_data2=0xff;
       break;
       }
 default:{break;}
}
}
if(wave_way==2)
{
switch(add_dec)
{
 case 1:
       {
       led_data0=dis[1];
       led_data1=dis[7];
       led_data2=0xff;
       break;
       }
 case 2:
       {
       led_data0=dis[7];
       led_data1=dis[3];
       led_data2=0xff;
       break;
       }
 case 3:
       {
       led_data0=dis[5];
       led_data1=dis[2];
       led_data2=0xff;
       break;
       }
 case 4:
       {
       led_data0=dis[8];
       led_data1=dis[1];
       led_data2=0xff;
       break;
       }
 default:{break;}
}
}
}
/**********************************************/
void scan_key(void)
{
key=(~P1)&0x07;
if(key!=0)
{
delay(150);
key=0;
if(((~P1)&0x07)!=0)//while(((~P1)&0x07)!=0)//用while(((~P0)&0x0f)!=0)则每按一下键弹起后加一,而用if(((~P0)&0x0f)!=0)则按下键后就自加
key=(~P1)&0x07;
}
}
/**********************************************/
/***************ms延时函数**********************/
void delay(int t)
{
 int i,j;
 for(i=0;i<t;i++)
 for(j=0;j<120;j++)
 ;
}

/**********************************************/
/**********************************************/
void treat_with_key(void)
{
switch(key)
{
case 1:{fun0();give_led_data();break;}
case 2:{fun1();give_led_data();l=add_dec;break;}
case 4:{fun2();give_led_data();l=add_dec;break;}
default:{break;}
}
}
/**********************************************/
/**********************************************/
void fun0(void)
{
wave_way++;
if(wave_way==3)
{
wave_way=0;
}
}
/**********************************************/
void fun1(void)
{
add_dec++;
if(add_dec==5)
{
add_dec=1;
}
}
/**********************************************/
void fun2(void)
{
add_dec--;
if(add_dec==0)
{
add_dec=5;
}
}
/**********************************************/
/**********************************************/
void timer1(void) interrupt 1
{
if(wave_way==0)
{
ET0=0;
TR0=0;
TH0=0x00;
TL0=0x00;
TMOD=0x12;
TR0=1;
m++;
if(m==2*add_dec)
{
P0=0x00;
}
if(m==4*add_dec)
{
m=0;
P0=0xff;
}
ET0=1;
EA=1;
}
if(wave_way==1)
{
ET0=0;
TR0=0;
TH0=0x13;
TL0=0x13;
TMOD=0x12;
TR0=1;
k++;
if(k<=10*add_dec)
{
j=j+4;
P0=j;
}
if(k>=10*add_dec)
{
j=j-4;
P0=j;
}
if(k==20*add_dec){P0=0x00;j=0;k=0;}
ET0=1;
EA=1;
}
if(wave_way==2)
{
ET0=0;
TR0=0;
TH0=0xc8;
TL0=0xc8;
TMOD=0x12;
TR0=1;
l--;
if(l==0)
{
P0=sine_data[i];
i++;
l=add_dec;
if(i==128){i=0;}
}
ET0=1;
EA=1;
}
}
/**********************************************/
void timer3(void) interrupt 3
{
ET1=0;
TR1=0;
TH1=0xdc;
TL1=0xd8;
TMOD=0x12;
TR1=1;
n++;
switch(n)
 {
  case 1:
        { 
         P3=seg[0];
         P2=led_data0;
         break;
        }
  case 2:
        {  
         P3=seg[1];
         P2=led_data1;
         break;
        }
  case 3:
        {  
         P3=seg[2];
         P2=led_data2;
         n=0;
         break;
        }
  default:{break;}
 }
ET1=1;
EA=1;
}
/******************************************/





⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -