elecfun用STC的工具生产的串口代码,不处理串口接收的数据,没验证过你自己测试下。
P3.1接电平转换电平后到投影仪的RS232,P3.2接开机控制上升沿有效,P3.3接关机控制上升沿有效
/*---------------------------------------------------------------------*//* --- STC MCU Limited ------------------------------------------------*//* --- STC15F4K60S4 系列 定时器1用作串口1的波特率发生器举例------------*//* --- Mobile: (86)13922805190 ----------------------------------------*//* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*//* --- Tel: 86-0513-55012928,55012929,55012966-------------------------*//* --- Web: www.STCMCU.com --------------------------------------------*//* --- Web: www.GXWMCU.com --------------------------------------------*//* 如果要在程序中使用此代码,请在程序中注明使用了STC的资料及程序 *//* 如果要在文章中应用此代码,请在文章中注明使用了STC的资料及程序 *//*---------------------------------------------------------------------*///本示例在Keil开发环境下请选择Intel的8058芯片型号进行编译 //若无特别说明,工作频率一般为11.0592MHz#include "reg51.h"#include "intrins.h"typedef unsigned char BYTE;typedef unsigned int WORD;#define FOSC 11059200L //系统频率#define BAUD 9600 //串口波特率#define NONE_PARITY 0 //无校验#define ODD_PARITY 1 //奇校验#define EVEN_PARITY 2 //偶校验#define MARK_PARITY 3 //标记校验#define SPACE_PARITY 4 //空白校验#define PARITYBIT NONE_PARITY //定义校验位 sfr P0M1 = 0x93; sfr P0M0 = 0x94; sfr P1M1 = 0x91; sfr P1M0 = 0x92; sfr P2M1 = 0x95; sfr P2M0 = 0x96; sfr P3M1 = 0xb1; sfr P3M0 = 0xb2; sfr P4M1 = 0xb3; sfr P4M0 = 0xb4; sfr P5M1 = 0xC9; sfr P5M0 = 0xCA; sfr P6M1 = 0xCB; sfr P6M0 = 0xCC; sfr P7M1 = 0xE1; sfr P7M0 = 0xE2; sfr AUXR = 0x8e; //辅助寄存器 sfr P_SW1 = 0xA2; //外设功能切换寄存器1#define S1_S0 0x40 //P_SW1.6#define S1_S1 0x80 //P_SW1.7//sbit P22 = P2^2;#define PORT_KEY P3#define KEY_ON 0x04 //按键ON#define KEY_OFF 0x08 //按键OFF#define KEY_MASK (PORT_KEY |= (KEY_ON | KEY_OFF))unsigned char KeyShort; //按键触发unsigned char KeyLong; //长按值char code CMD_ON[]={0x50,0x57,0x52,0x20,0x4F,0x4E,0x0D,0x00};char code CMD_OFF[]={0x50,0x57,0x52,0x20,0x4F,0x46,0x46,0x0D,0x00}; bit busy;void SendData(BYTE dat);void SendString(char *s);void Delay(unsigned int t) {unsigned int a,b;for (a=0; a for (b=0; b<500; b++) ; }//读按键值void KeyRead( void ) {unsigned char ReadData = PORT_KEY ^ 0xFF; //读端口值,并取反 ReadData &= (KEY_ON | KEY_OFF); //只取有效按键值 KeyShort = ReadData & (ReadData ^ KeyLong); //只在第一次按下时为按键值,以后为0 KeyLong = ReadData; //长按、短按都为按键值}void main() { P0M0 = 0x00; P0M1 = 0x00; P1M0 = 0x00; P1M1 = 0x00; P2M0 = 0x00; P2M1 = 0x00; P3M0 = 0x00; P3M1 = 0x00; P4M0 = 0x00; P4M1 = 0x00; P5M0 = 0x00; P5M1 = 0x00; P6M0 = 0x00; P6M1 = 0x00; P7M0 = 0x00; P7M1 = 0x00; ACC = P_SW1; ACC &= ~(S1_S0 | S1_S1); //S1_S0=0 S1_S1=0 P_SW1 = ACC; //(P3.0/RxD, P3.1/TxD) // ACC = P_SW1; // ACC &= ~(S1_S0 | S1_S1); //S1_S0=1 S1_S1=0 // ACC |= S1_S0; //(P3.6/RxD_2, P3.7/TxD_2) // P_SW1 = ACC; // // ACC = P_SW1; // ACC &= ~(S1_S0 | S1_S1); //S1_S0=0 S1_S1=1 // ACC |= S1_S1; //(P1.6/RxD_3, P1.7/TxD_3) // P_SW1 = ACC; #if (PARITYBIT == NONE_PARITY) SCON = 0x50; //8位可变波特率#elif (PARITYBIT == ODD_PARITY) || (PARITYBIT == EVEN_PARITY) || (PARITYBIT == MARK_PARITY) SCON = 0xda; //9位可变波特率,校验位初始为1#elif (PARITYBIT == SPACE_PARITY) SCON = 0xd2; //9位可变波特率,校验位初始为0#endif AUXR = 0x40; //定时器1为1T模式 TMOD = 0x20; //定时器1为模式2(8位自动重载) TL1 = (256 - (FOSC/32/BAUD)); //设置波特率重装值 TH1 = (256 - (FOSC/32/BAUD)); TR1 = 1; //定时器1开始工作 ES = 1; //使能串口中断 EA = 1;while(1) { KEY_MASK; KeyRead();if (KeyShort & KEY_ON) //ON { SendString(CMD_ON); }if (KeyShort & KEY_OFF) //OFF { SendString(CMD_OFF); } Delay(100); } }/*---------------------------- UART 中断服务程序 -----------------------------*/void Uart() interrupt 4 using 1 {if (RI) { RI = 0; //清除RI位 //P0 = SBUF; //P0显示串口数据 //P22 = RB8; //P2.2显示校验位 }if (TI) { TI = 0; //清除TI位 busy = 0; //清忙标志 } }/*---------------------------- 发送串口数据 ----------------------------*/void SendData(BYTE dat) {while (busy); //等待前面的数据发送完成 ACC = dat; //获取校验位P (PSW.0) if (P) //根据P来设置校验位 {#if (PARITYBIT == ODD_PARITY) TB8 = 0; //设置校验位为0#elif (PARITYBIT == EVEN_PARITY) TB8 = 1; //设置校验位为1#endif }else {#if (PARITYBIT == ODD_PARITY) TB8 = 1; //设置校验位为1#elif (PARITYBIT == EVEN_PARITY) TB8 = 0; //设置校验位为0#endif } busy = 1; SBUF = ACC; //写数据到UART数据寄存器}/*---------------------------- 发送字符串 ----------------------------*/void SendString(char *s) {while (*s) //检测字符串结束标志 { SendData(*s++); //发送当前字符 } } |