- #include "reg51.h"
- #include "LCD1602.h"
- #include "i2c.h"
- sbit S1 =P2^1;
- sbit S4 =P2^2;
- /**********************************
- 參數聲明
- **********************************/
- uint F=0; //頻率
- uint S=0,Pwm=0,Tra=0,AA=0; //正弦波 方波 三角波 鋸齒波信號
- uchar zkb=30,bx=1; //頻率加/減 PWM占空比 波形選擇
- uchar t1=0,flagPwm=0,flag1=0; //標志位
- uchar T=0; //周期
- uchar code num[]={ 0x7F,0x82,0x85,0x88,0x8B,0x8F,0x92,0x95,0x98,0x9B,0x9E,0xA1,0xA4,0xA7,0xAA,0xAD
- ,0xB0,0xB3,0xB6,0xB8,0xBB,0xBE,0xC1,0xC3,0xC6,0xC8,0xCB,0xCD,0xD0,0xD2,0xD5,0xD7
- ,0xD9,0xDB,0xDD,0xE0,0xE2,0xE4,0xE5,0xE7,0xE9,0xEB,0xEC,0xEE,0xEF,0xF1,0xF2,0xF4
- ,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFB,0xFC,0xFD,0xFD,0xFE,0xFE,0xFE,0xFE,0xFE
- ,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFD,0xFD,0xFC,0xFB,0xFB,0xFA,0xF9,0xF8,0xF7,0xF6
- ,0xF5,0xF4,0xF2,0xF1,0xEF,0xEE,0xEC,0xEB,0xE9,0xE7,0xE5,0xE4,0xE2,0xE0,0xDD,0xDB
- ,0xD9,0xD7,0xD5,0xD2,0xD0,0xCD,0xCB,0xC8,0xC6,0xC3,0xC1,0xBE,0xBB,0xB8,0xB6,0xB3
- ,0xB0,0xAD,0xAA,0xA7,0xA4,0xA1,0x9E,0x9B,0x98,0x95,0x92,0x8F,0x8B,0x88,0x85,0x82
- ,0x7F,0x7C,0x79,0x76,0x73,0x6F,0x6C,0x69,0x66,0x63,0x60,0x5D,0x5A,0x57,0x54,0x51
- ,0x4E,0x4B,0x48,0x46,0x43,0x40,0x3D,0x3B,0x38,0x36,0x33,0x31,0x2E,0x2C,0x29,0x27
- ,0x25,0x23,0x21,0x1E,0x1C,0x1A,0x19,0x17,0x15,0x13,0x12,0x10,0x0F,0x0D,0x0C,0x0A
- ,0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x03,0x02,0x01,0x01,0x00,0x00,0x00,0x00,0x00
- ,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x05,0x06,0x07,0x08
- ,0x09,0x0A,0x0C,0x0D,0x0F,0x10,0x12,0x13,0x15,0x17,0x19,0x1A,0x1C,0x1E,0x21,0x23
- ,0x25,0x27,0x29,0x2C,0x2E,0x31,0x33,0x36,0x38,0x3B,0x3D,0x40,0x43,0x46,0x48,0x4B
- ,0x4E,0x51,0x54,0x57,0x5A,0x5D,0x60,0x63,0x66,0x69,0x6C,0x6F,0x73,0x76,0x79,0x7C
- };
- /*********************************
- 函數聲明
- **********************************/
- void Fun_Sin();
- void Fun_Triangle();
- void Fun_Pwm();
- void Fun_AA();
- void TimerInit();
- void KEY();
- void Delay10ms();
- /*******************************************
- 主函數
- *******************************************/
- void main() //主程序
- {
- S1 = 1;
- S4 = 1;
- LcdInit(); //屏幕初始化
- TimerInit(); //定時器初始化
-
- while(1)
- {
- KEY(); //按鍵檢測
- switch(bx)
- {
- case 1:Fun_Sin(); break; //正弦波
- case 2:Fun_Triangle(); break; //三角波
- case 3:Fun_Pwm(); break; //方波
- case 4:Fun_AA(); break; //鋸齒波
- }
- if(flag1==1)
- {
- T=1*t1;
- F=((1*100000)/T);
-
- LcdWriteCom(0x89);
- LcdWriteData(T%1000/100+'0');
- LcdWriteData(T%100/10+'0');
- LcdWriteData(T%10+'0');
-
- LcdWriteCom(0x82+0x40);
- LcdWriteData(F%10000/1000+'0');
- LcdWriteData(F%1000/100+'0'); //個位
- LcdWriteData('.');
- LcdWriteData(F%100/10+'0'); //小數后一位
- LcdWriteData(F%10+'0'); //小數后兩位
- }
- flag1=0;
- }
- }
- /**********************************
- 延遲10ms函數
- **********************************/
- void Delay10ms()
- {
- uchar a,b,c;
- for(c=1;c>0;c--)
- for(b=38;b>0;b--)
- for(a=130;a>0;a--);
- }
- /**********************************
- 按鍵檢測函數
- **********************************/
- void KEY()
- {
- if(S1==0)
- {
- Delay10ms();
- if(S1==0)
- {
- bx=bx+1;
- flag1=1; //周期顯示標志位
- case_1:
- switch(bx)
- {
- case 1: LcdWriteCom(0x83);
- LcdWriteData('S');
- LcdWriteData('i');
- LcdWriteData('n');break;
- case 2: LcdWriteCom(0x83);
- LcdWriteData('T');
- LcdWriteData('r');
- LcdWriteData('a');break;
- case 3: LcdWriteCom(0x83);
- LcdWriteData('P');
- LcdWriteData('w');
- LcdWriteData('m');break;
- case 4: LcdWriteCom(0x83);
- LcdWriteData('A');
- LcdWriteData('A');
- LcdWriteData(' ');break;
- default:bx=1;
- goto case_1;
- }
-
- }
- while(!S1); //檢測按鍵是否松開
- }
-
- if(S4==0)
- {
- Delay10ms();
- if(S4==0)
- {
- zkb=zkb+10;
- if(zkb>90)
- {
- zkb=10;
- }
-
- LcdWriteCom(0x8c+0x40);
- LcdWriteData(zkb%100/10+'0');
- LcdWriteData(zkb%10+'0');
- }
- while(!S4); //檢測按鍵是否松開
- }
- }
- /**********************************
- 正弦波1函數
- **********************************/
- void Fun_Sin()
- {
- uchar i;
- t1=0; //重置計數標志位
- TR0=1; //開定時
- for(i=0;i<255;i++)
- {
- S=num[i]; //打點賦值
-
- I2cStart();
- I2c_write_char(0x90);
- I2cAck();
- I2c_write_char(0x40); //控制字 允許模擬輸出 不自增單端 0100 0000
- I2cAck();
- I2c_write_char(S); //放置需要轉換的量
- I2cAck();
- I2cStop();
- }
- TR0=0; //關定時
- }
- /*******************************
- 三角波2函數
- ********************************/
- void Fun_Triangle()
- {
- uchar i;
- t1=0; //重置計數標志位
- TR0=1; //開定時器
- for(i=0;i<255;i++)
- {
- Tra =i;
- I2cStart();
- I2c_write_char(0x90);
- I2cAck();
- I2c_write_char(0x40); //控制字 允許模擬輸出 不自增單端 0100 0000
- I2cAck();
- I2c_write_char(Tra);
- I2cAck();
- I2cStop();
- }
- for(i=255;i>0;i--)
- {
- Tra =i;
- I2cStart();
- I2c_write_char(0x90);
- I2cAck();
- I2c_write_char(0x40); //控制字 允許模擬輸出 不自增單端 0100 0000
- I2cAck();
- I2c_write_char(Tra);
- I2cAck();
- I2cStop();
- }
- TR0=0; //關定時器
- }
- /********************************
- 方波3函數
- ********************************/
- void Fun_Pwm()
- {
- t1=0; //重置計數標志位
- TR0=1; //開定時器
- for(flagPwm=0;flagPwm<100;flagPwm++)
- {
- if(flagPwm<zkb) //占空比為%30
- {
- Pwm=0;
- }
- else
- {
- Pwm=255;
- }
- I2cStart(); //DA轉換程序
- I2c_write_char(0x90);
- I2cAck();
- I2c_write_char(0x40);//控制字 允許模擬輸出 不自增單端 0100 0000
- I2cAck();
- I2c_write_char(Pwm);
- I2cAck();
- I2cStop();
- }
- TR0=0; //關定時器
- }
- /***********************************
- 鋸齒波4函數
- ***********************************/
- void Fun_AA()
- {
- uchar i;
- t1=0; //重置計數標志位
- TR0=1; //開定時器
- for(i=255;i>0;i--)
- {
- AA =i;
- I2cStart();
- I2c_write_char(0x90);
- I2cAck();
- I2c_write_char(0x40); //控制字 允許模擬輸出 不自增單端 0100 0000
- I2cAck();
- I2c_write_char(AA);
- I2cAck();
- I2cStop();
- }
- TR0=0; //關定時器
- }
- /*********************************
- 定時器初始化函數
- **********************************/
- void TimerInit()
- {
- TMOD|=0x01; //定時器0工作方式1
-
- TH0=0xFC; // 65536-1000+1
- TL0=0x18;
-
- ET0=1;
- EA=1; //定時器總開關
- TR0=0; //中斷開關
- }
- /**********************************
- 定時器中斷函數
- **********************************/
- void Timer(void) interrupt 1 //中斷
- {
- // TR0=0; //賦初值,定時器需在關閉狀態
- TH0=0xfc;// 65536-1000+1
- TL0=0x18;//
- // TR0=1;
-
- t1=t1+1; //計數中斷個數 每個中斷 1ms
- }
復制代碼
全部代碼下載:
函數信號發生器代碼.zip
(63.39 KB, 下載次數: 22)
2021-6-26 10:03 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|