这段程序功能很简单,就是按一个按键就发送特定命令,收到命令就控制灯的亮灭,但却很有调试价值,曾帮科协的一个同学调通了C8051F410和avr的通信,还有自己的一些项目用到它。故上传上来给大家参考下。
#include #include #define SYSCLK 24500000 // Internal oscillator frequency in Hz #define BAUDRATE 2400 // Baud rate of UART in bps sbit led1 = P2^1; sbit led2 = P2^3; sbit key1 = P1^4; sbit key2 = P1^5; void OSCILLATOR_Init (void); void PORT_Init (void); void UART0_Init (void); void uart_send(unsigned char m); void delay(unsigned int m); void delay_ms(unsigned int n); void main (void) { PCA0MD &= ~0x40; // Disable Watchdog timer OSCILLATOR_Init (); // Initialize oscillator PORT_Init (); // Initialize crossbar and ports UART0_Init(); EA = 1; // Enable global interrupts while(1) { if( key1 != 1) { delay_ms(500); uart_send(0xb0); key1=1; } if( key2 !=1) { delay_ms(500); uart_send(0xb1); key2=1; } } // Wait for interrupt } void OSCILLATOR_Init (void) { OSCICN = 0x87; // Set clock to 24.5 MHz RSTSRC = 0x04; // Enable missing clock detector } void PORT_Init (void) { //P0MDIN = 0xFC; // Configure P0.0 and P0.1 to analog P0MDOUT |= 0x10; // Enable UTX as push-pull output P0SKIP = 0x03; // Skip P0.0 and P0.1 on the crossbar P1MDIN |= 0x30; P1MDOUT &= ~0x30; P1SKIP = 0x30; P2MDIN=0xFF; P2MDOUT = 0x0a; P2SKIP=0x0a; XBR0 = 0x01; // Enable UART on P0.4(TX) and P0.5(RX) XBR1 = 0x40; // Enable crossbar and weak pull-ups } void UART0_Init (void) { SCON0 = 0x10; // SCON0: 8-bit variable bit rate // level of STOP bit is ignored // RX enabled // ninth bits are zeros // clear RI0 and TI0 bits if (SYSCLK/BAUDRATE/2/256 < 1) { TH1 = -(SYSCLK/BAUDRATE/2); CKCON |= 0x08; // T1M = 1; SCA1:0 = xx } else if (SYSCLK/BAUDRATE/2/256 < 4) { TH1 = -(SYSCLK/BAUDRATE/2/4); CKCON &= ~0x0B; // T1M = 0; SCA1:0 = 01 CKCON |= 0x01; } else if (SYSCLK/BAUDRATE/2/256 < 12) { TH1 = -(SYSCLK/BAUDRATE/2/12); CKCON &= ~0x0B; // T1M = 0; SCA1:0 = 00 } else if (SYSCLK/BAUDRATE/2/256 < 48) { TH1 = -(SYSCLK/BAUDRATE/2/48); CKCON &= ~0x0B; // T1M = 0; SCA1:0 = 10 CKCON |= 0x02; } else { while (1); // Error. Unsupported baud rate } TL1 = TH1; // init Timer1 TMOD &= ~0xf0; // TMOD: timer 1 in 8-bit autoreload TMOD |= 0x20; TR1 = 1; // START Timer1 IP |= 0x10; // Make UART high priority ES0 = 1; // Enable UART0 interrupts } void UART0_Interrupt (void) interrupt 4 { unsigned char Byte; if (RI0 == 1) { RI0 = 0; // Clear interrupt flag Byte = SBUF0; // Read a character from UART switch(Byte) { case 0xb0: led1 = 1; led2 = 0; break; case 0xb1: led1 = 0; led2 = 1; break; default: break; } } if (TI0 == 1) // Check if transmit flag is set { TI0 = 0; // Clear interrupt flag } } void uart_send(unsigned char m) { while(TI0==1); SBUF0=m; } void delay_ms(unsigned int m) { while(m--) delay(2046); } void delay(unsigned int m) { while(m--); }
设计资源 培训 开发板 精华推荐
- ADZS-BF526-EZBRD、基于 Blackfin 数字信号处理器 (DSP) 的 ADSP-BF526 EZ-Board 评估系统
- 使用 ROHM Semiconductor 的 BM2P091 的参考设计
- LTC3603IUF 1.2V、2.5A 降压稳压器(750kHz、突发模式操作)的典型应用电路
- 风机和小型电机应用的预测性维护解决方案
- LT3477EFE 演示板,恒流升压,Vin=2.7V-16V Vout= LED + 330mA 36V Max
- LT1172CS8、5V/1.25A 升压转换器的典型应用
- AP2127 300mA 高速、极低噪声 CMOS LDO 稳压器的典型应用可调版本
- 使用 Analog Devices 的 LT3088EM 的参考设计
- LTC1727EMS8-2.5 单电源电压监视器的典型应用,其他功能被禁用
- 使用 Analog Devices 的 LTC3783IDHD 的参考设计
- 双11之单片机狂欢:11.11元包邮拇指板STM32L011,抢完为止
- 我爱 TI Webench 之学课程传设计,赢礼100% !
- 瑞萨电子MCU全国技术研讨会开放报名!覆盖上海、南京、杭州、合肥等10大城市!
- 免费体验业界最快编译速度&最好性能 Quartus II v15.0网页版下载有礼!
- ADI有奖下载活动之6 ADI基于IEC61850的智能电子设备(IED)系统解决方案
- 积分芯币兑换情人节专场
- 好书共读 | 《控制之美(卷2)——最优化控制MPC与卡尔曼滤波器》
- 学《TIVA C Launchpad入门课程》 晒成绩 赢大礼!
- 看视频赢京东卡 | 泰享实测之水哥秘籍第二期
- 有奖直播:使用 NI CompactDAQ 和 LabVIEW构建基于传感器的测试系统