The following is the source code of the simple waveform generator of 51 single-chip microcomputer:
#include #include #define ADDR1 0x2c //MAX5820LEUA sbit key_sin=P1^0; sbit key_tran=P1^2; sbit key_tooth=P1^4; sbit SCL = P2 ^ 0; sbit SDA = P2 ^ 1; unsigned char code sin[256]= //sine table { 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, 0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfd, 0xfd,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,0xf6,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,0x76,0x72,0x6f,0x6c,0x69,0x66,0x63,0x60,0x5d,0x5a,0x57,0x55,0x51, 0x4e,0x4c,0x48,0x45,0x43,0x40,0x3d,0x3a,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 }; bit write_addr(unsigned char,bit); //The first parameter indicates the address, the second parameter indicates read: 1 write: 0 bit write_data(unsigned char); //The first parameter indicates the data, the second parameter indicates the command word void stop(); void Delay(unsigned int); I2C_Delay(unsigned int I2C_VALUE) { while ( --I2C_VALUE!= 0 ); } /* Function: I2C_Init() Function: Initialize the I2C bus and put the bus in an idle state Note: This function should usually be executed once at the beginning of the main() function. */ void I2C_Init() { SCL = 1; I2C_Delay(5); SDA = 1; I2C_Delay(5); } /* Function: I2C_Start() Function: Generate the start state of the I2C bus illustrate: When SDA has a falling edge while SCL is at a high level, the I2C bus is started Regardless of the level of SDA and SCL, this function can always correctly generate the start state. This function can also be used to generate repeated start states. After this function is executed, the I2C bus is in a busy state. */ void I2C_Start() { SDA = 1; I2C_Delay(5); SCL = 1; I2C_Delay(5); SDA = 0; I2C_Delay(5); SCL = 0; I2C_Delay(5); } /* Function: I2C_Write() Function: Write 1 byte of data to the I2C bus parameter: dat: data to be written to the bus */ void I2C_Write(char dat) { unsigned char t = 8; do { SDA = (bit)(dat & 0x80); dat <<= 1; SCL = 1; I2C_Delay(5); SCL = 0; I2C_Delay(5); } while ( --t != 0 ); } bit I2C_GetAck() { bit ack; SDA = 1; I2C_Delay(5); SCL = 1; I2C_Delay(5); ack = SDA; SCL = 0; I2C_Delay(5); return ack; } void I2C_Stop() { unsigned int t = 10; SDA = 0; I2C_Delay(5); SCL = 1; I2C_Delay(5); SDA = 1; I2C_Delay(5); while ( --t != 0 ); // Add a certain delay before the next Start is generated } void Delay(unsigned int I2C_Delay_t) { while ( --I2C_Delay_t!= 0 ); } bit write_addr(unsigned char addr,bit mod) { unsigned char address; address=addr<<1; if(mod) address++; I2C_Start(); I2C_Write(address); Delay(10); if(I2C_GetAck()) return 1; return 0; } bit write_data(unsigned char dat) { I2C_Write(dat); if(I2C_GetAck()) return 1; return 0; } void stop() { I2C_Stop(); I2C_Heat(); } void main(void) { unsigned char i; loop: I2C_Heat(); while(1) { if(key_sin==0) //Generate a sine wave { while(1) { for(i=192;i<255;i++) { write_addr(ADDR1,0); write_data(0); write_data(sin[i]); stop(); if(!(key_tran!=0&&key_tooth!=0)) goto loop; } for(i=0;i<192;i++) { write_addr(ADDR1,0); write_data(0); write_data(sin[i]); stop(); if(!(key_tran!=0&&key_tooth!=0)) goto loop; } } } if(key_tran==0) //Generate triangle wave { while(1) { for(i=0;i<255;i++) { write_addr(ADDR1,0); write_data(0); write_data(i); stop(); if(!(key_sin!=0&&key_tooth!=0)) goto loop; } for(;i>0;i--) { write_addr(ADDR1,0); write_data(0); write_data(i); stop(); if(!(key_sin!=0&&key_tooth!=0)) goto loop; } } } if(key_tooth==0) //Generate sawtooth wave { while(1) { for(i=0;i<255;i++) { write_addr(ADDR1,0); write_data(0); write_data(i); stop(); if(!(key_tran!=0&&key_sin!=0)) goto loop; } } } } }
Previous article:STC15W408AS MCU White Light T12 Controller
Next article:Use of 51 single chip microcomputer Keil C51 (C language)
- Popular Resources
- Popular amplifiers
- Learn ARM development(16)
- Learn ARM development(17)
- Learn ARM development(18)
- Embedded system debugging simulation tool
- A small question that has been bothering me recently has finally been solved~~
- Learn ARM development (1)
- Learn ARM development (2)
- Learn ARM development (4)
- Learn ARM development (6)
Professor at Beihang University, dedicated to promoting microcontrollers and embedded systems for over 20 years.
- LED chemical incompatibility test to see which chemicals LEDs can be used with
- Application of ARM9 hardware coprocessor on WinCE embedded motherboard
- What are the key points for selecting rotor flowmeter?
- LM317 high power charger circuit
- A brief analysis of Embest's application and development of embedded medical devices
- Single-phase RC protection circuit
- stm32 PVD programmable voltage monitor
- Introduction and measurement of edge trigger and level trigger of 51 single chip microcomputer
- Improved design of Linux system software shell protection technology
- What to do if the ABB robot protection device stops
- Detailed explanation of intelligent car body perception system
- How to solve the problem that the servo drive is not enabled
- Why does the servo drive not power on?
- What point should I connect to when the servo is turned on?
- How to turn on the internal enable of Panasonic servo drive?
- What is the rigidity setting of Panasonic servo drive?
- How to change the inertia ratio of Panasonic servo drive
- What is the inertia ratio of the servo motor?
- Is it better for the motor to have a large or small moment of inertia?
- What is the difference between low inertia and high inertia of servo motors?
- EEPROM analysis based on single chip microcomputer
- EEWORLD University ---- SPICE teaching video based on Ispice and Hspice (Yuan Ze University)
- Breaking news! Chinese scientists develop the world's largest brain-like computer with the largest number of neurons, with a brain capacity comparable to that of a mouse
- [Homemade] 8A high power adjustable power supply
- Design of an intelligent water quality detector based on Gizwits Cloud
- 【ufun learning】Learning 5: "Basic Example 4 - USB Serial Port and PC Communication"
- [Sold] ST P-NUCLEO-IHM001 Brushless Motor Development Kit for Sale
- Among so many board games articles, which one do you like best?
- Inductor Inductive Reactance Characteristics
- Adding 3D packaging issues