====== 8051 Codes ====== Example codes (in C) for the classical Intel-8051 (mcu51) microcontroller core. Using my1code51 library. Tested using sdcc open source compiler and stc12 device. ===== Codes for NMK322 ===== ++++ Testing IR module and HC-SR04 ultrasonic sensor module. | /*----------------------------------------------------------------------------*/ #include "uart.h" #include "timer.h" #define FPSIZE 2 #include "utils_float.h" #define _LCD_4BIT_INTERFACE_ /** DB4-DB7 => P0 (UPPER NIBBLE) */ /** E => P0.2 : NEEDS -ve EDGE */ /** R/W => P0.1 : 0=WR 1=RD */ /** RS => P0.0 : 0=CMD 1=DAT */ #include "textlcd.h" /*----------------------------------------------------------------------------*/ /** * Testing IR module and HC-SR04 ultrasonic sensor module * - display on both uart and lcd **/ /*----------------------------------------------------------------------------*/ MY1SBIT(IRMOD,PIN10); MY1SBIT(TRIG,PIN16); MY1SBIT(ECHO,PIN17); /*----------------------------------------------------------------------------*/ MY1SBIT(TEST_IR,PIN14); MY1SBIT(TEST_HC,PIN15); /*----------------------------------------------------------------------------*/ #define FLAG_IR 0x01 #define FLAG_HC 0x02 /*----------------------------------------------------------------------------*/ void main(void) { unsigned char wait; unsigned int tval,loop, flag; float fval, dist; char buff[16]; uart_init(); uart_puts("\r\nTESTING NMK322 STUFFS\r\n"); lcd_init(); lcd_goto_line1(); lcd_puts("TESTKIT 4 NMK322"); timer_init(); flag = 0; while (1) { if (TEST_IR==0) { if ((flag&FLAG_IR)==0) { lcd_goto_line1(); lcd_puts("TEST 4 IR MODULE"); uart_puts("\r\nTESTING IR MODULE\r\n"); flag = FLAG_IR; } lcd_goto_line2(); lcd_puts(" "); lcd_goto_line2(); lcd_puts("Waiting... "); uart_puts("\r\nWaiting... "); while (IRMOD); // outputs logic low when obstacle detected lcd_puts("|*"); uart_puts("|*"); while (!IRMOD); lcd_puts("|"); uart_puts("|\r\n"); for (loop=65000;loop;loop--); } if (TEST_HC==0) { if ((flag&FLAG_HC)==0) { lcd_goto_line1(); lcd_puts("TEST HC-SR04 MOD"); uart_puts("\r\nTESTING HC-SR04 MODULE\r\n"); flag = FLAG_HC; } lcd_goto_line2(); lcd_puts(" "); lcd_goto_line2(); timer_prep(0); TRIG = 1; for (wait=10;wait;wait--); // arounf 10us? TRIG = 0; while (!ECHO); timer_exec(); while (ECHO); timer_stop(); tval = ((unsigned int)TH0<<8)|TL0; fval = (float)tval * 1.085; // in us dist = fval / 58.0; // in cm lcd_puts("Dist:"); uart_puts("-- Distance="); float2str(buff,dist); lcd_puts(buff); lcd_puts("cm"); uart_puts(buff); uart_puts(" cm\r\n"); for (loop=65000;loop;loop--); } } } /*----------------------------------------------------------------------------*/ ++++ ++++ Testing HC06 bluetooth module , TowerPro MG996R servo & Text LCD. | /*----------------------------------------------------------------------------*/ /** * Testing HC06 bluetooth module , TowerPro MG996R servo & Text LCD * - note: servo pin (1|orange:PWM)(2|red:vcc)(3|brown:ground) **/ /*----------------------------------------------------------------------------*/ #define BTNAME "nmk322bt" #define BTPASS "0000" #include "hc06.h" #include "uart.h" #include "timer.h" #include "utils.h" /*----------------------------------------------------------------------------*/ /** interface as defined in nmk322 lab module */ #define _LCD_8BIT_INTERFACE_ #define _LCD_PINS_DEFINED_ MY1SFR(LCD_DATA,0xA0); MY1SBIT(LCD_BUSY,0xA7); MY1SBIT(LCD_DNC,0x87); MY1SBIT(LCD_RNW,0x86); MY1SBIT(LCD_ENB,0x85); /*----------------------------------------------------------------------------*/ #include "textlcd.h" /*----------------------------------------------------------------------------*/ #define SERVO_PIN P1_0 #include "servo.h" /*----------------------------------------------------------------------------*/ MY1SBIT(GO000,PIN15); MY1SBIT(GO1MS,PIN16); MY1SBIT(GO2MS,PIN17); /*----------------------------------------------------------------------------*/ #define BUFFSIZE 128 /*----------------------------------------------------------------------------*/ __xdata char buff[BUFFSIZE]; /*----------------------------------------------------------------------------*/ void main(void) { unsigned char curr, test; GO000 = 1; GO1MS = 1; GO2MS = 1; timer_init(); servo_init(); lcd_init(); lcd_goto_line1(); lcd_puts("NMK322 SV/LCD/BT"); uart_init(); uart_puts("NMK322 SV/LCD/BT\r\n\r\n"); hc06_init(); curr = 3; do { uart_puts("-- Sending AT... "); hc06_find(); if (hc06_wait_ok()==HC06_OK) { uart_puts("OK.\r\n"); uart_puts("\r\nSet default name & pin\r\n"); uart_puts("-- Set Name ("); uart_puts(BTNAME); uart_puts("): "); hc06_setname(buff,BUFFSIZE); uart_puts(buff); uart_puts("\r\n"); timer_delay1s(test,1); /* set pass */ uart_puts("-- Set Pin ("); uart_puts(BTPASS); uart_puts("): "); hc06_setpin(buff,BUFFSIZE); uart_puts(buff); uart_puts("\r\n"); timer_delay1s(test,1); break; } uart_puts("timeout.\n"); timer_delay1s(test,1); } while (--curr); while (1) { if (hc06_peek()) { if (hc06_wait(buff,BUFFSIZE)>1) { if (buff[0]=='#') { curr = (unsigned char) str2uint(&buff[1]); if (curr>=5&&curr<=25) { uart_puts("## Turning to ("); uart_puts(&buff[1]); uart_puts(")\r\n"); servo_turn(curr); } else { uart_puts("** Invalid angle ("); uart_puts(&buff[1]); uart_puts(")\r\n"); } } else { uart_puts(">> "); uart_puts(buff); uart_puts("\r\n"); } } } if (GO000==0) { lcd_goto_line2(); lcd_puts("ServoTurn CENTER"); servo_turn(15); while (!GO000); lcd_goto_line2(); lcd_puts(" "); } if (GO1MS==0) { lcd_goto_line2(); lcd_puts("ServoTurn PWM1ms"); servo_turn(10); // 1ms pwm while (!GO1MS); lcd_goto_line2(); lcd_puts(" "); } if (GO2MS==0) { lcd_goto_line2(); lcd_puts("ServoTurn PWM2ms"); servo_turn(20); // 2ms pwm while (!GO2MS); lcd_goto_line2(); lcd_puts(" "); } } } /*----------------------------------------------------------------------------*/ ++++ ===== Code: relay ===== ++++ Testing basic relay. | /*----------------------------------------------------------------------------*/ #include "timer.h" #include "uart.h" /*----------------------------------------------------------------------------*/ MY1SBIT(DRIVE,PIN20); MY1SBIT(INPUT,PIN10); /*----------------------------------------------------------------------------*/ void main(void) { unsigned char wait; timer_init(); uart_init(); uart_puts("\nTESTING RELAY\n"); DRIVE = 1; /* active low */ INPUT = 1; while(1) { if (INPUT==0) { uart_puts("-- Switch ON... "); DRIVE = 0; wait = 3*TIMER_LOOP_1S; do { timer_wait(TIMER_VAL50MS); } while (--wait); uart_puts("OFF.\n"); DRIVE = 1; while (!INPUT); } } } /*----------------------------------------------------------------------------*/ ++++ ===== Code: gtuc51 ===== ++++ Test code for the old GTUC51B001 development board. | /*----------------------------------------------------------------------------*/ /** * Demo program for gtuc51 (with io board) **/ /*----------------------------------------------------------------------------*/ #include "adc0831.h" #include "keypad_922.h" #include "textlcd.h" #include "utils_float.h" /*----------------------------------------------------------------------------*/ /** * Switch & LED Interface for gtuc51 i/o board * - multiplexed (dual/purpose) * - require jumper link settings! **/ /** SW0, SW1 => P3.3, P3.2 - LAYOUT ERROR */ __sbit __at (0xB3) SW0; __sbit __at (0xB2) SW1; /** LED{0-3} => P3.4-P3.7 */ __sbit __at (0xB4) LED0; __sbit __at (0xB5) LED1; __sbit __at (0xB6) LED2; __sbit __at (0xB7) LED3; /** LED{RX,TX} => P3.1, P3.0 - LAYOUT ERROR */ __sbit __at (0xB1) LEDRX; __sbit __at (0xB0) LEDTX; /** alias LEDX=-2 and LEDY=-1 (LEFT OF LED0) **/ __sbit __at (0xB1) LEDX; __sbit __at (0xB0) LEDY; /*----------------------------------------------------------------------------*/ char display[LCD_MAX_CHAR]; unsigned char lcdi, loop; float value; keybyte_t keyin; adcbyte_t check; __bit adc, adcgo, left, demo; /*----------------------------------------------------------------------------*/ #define DEMO_IO 1 #define DEMO_ADC 0 /*----------------------------------------------------------------------------*/ #define LOOP_COUNT 20 /*----------------------------------------------------------------------------*/ /* interrupt service routine for timer0 */ void timer_blink(void) __interrupt TF0_VECTOR { TR0 = 0; loop--; P1 = ~P1; if (loop==0) { if (!left) { loop = LED0; LED0 = LED1; LED1 = LED2; LED2 = LED3; LED3 = LEDX; LEDX = LEDY; LEDY = loop; } else { loop = LED3; LED3 = LED2; LED2 = LED1; LED1 = LED0; LED0 = LEDY; LEDY = LEDX; LEDX = loop; } loop = LOOP_COUNT; } TH0 = 0x4B; TL0 = 0xFD; TR0 = 1; /** 50ms */ } /*----------------------------------------------------------------------------*/ /* interrupt service routine for timer1 */ void timer_goadc(void) __interrupt TF1_VECTOR { TR1 = 0; TH1 = 0x4B; TL1 = 0xFD; if (loop>0) { TR1 = 1; /** 50ms */ loop--; } else { loop = LOOP_COUNT; adcgo = adc; } } /*----------------------------------------------------------------------------*/ /* interrupt service routine for int1 */ void check_switch0(void) __interrupt IE1_VECTOR { left = 0; if (lcdi ++++