|
自己做的一个控制板,上面挂的器件比较多,IO 不够用了,
同时也不想用按键来控志;
直接写了一个的串口控制台,用来PC下发命令字调试其它器件
(相比串口直接字节下发数据, 命令字多了稳定性和杂波干扰的可能, 重启和插拔串口不会导致控制中心不稳
以及避除了数据与命令重复的问题),
单片机再执行命令字各种操作, -------单片机接收时先寻找第一字节=AA,再寻找第二字节55,匹配后才认为是命令字
单片机程序内简单使用了16组CMD, 可以按照自行情况修改,很好用 ,测试了1w次没有问题
| 帧头1 | 帧头2 | CMD(理论可以做254组命令字,0初值) | 帧头 | AA | 55 | 1 | 帧头 | AA | 55 | 2 | 帧头 | AA | 55 | 3 | 帧头 | AA | 55 | 4 | 帧头 | AA | 55 | 5 | 帧头 | AA | 55 | 6 | 帧头 | AA | 55 | 7 | 帧头 | AA | 55 | 8 | 帧头 | AA | 55 | 9 | 帧头 | AA | 55 | 10 | 帧头 | AA | 55 | .. | 帧头 | AA | 55 | .. | 帧头 | AA | 55 | FE | 帧头 | AA | 55 | FF |
单片机用的STC15FW408AS, 数码管:共阳三位5631AS
电路原理图如下:
单片机源程序如下:
- /******************************************/
- /************* 本地常量声明 **************/
- #define MAIN_Fosc 22118400L //定义主时钟
- #include "STC15Fxxxx.H"
- /*****************************************************************************/
- #include<3LED_anode.H>//数码管驱动显示程序
- #include<beep.H> //蜂鸣器驱动
- #include<UART1.H> // UART1, 408AS没有串口2,TIMER1
- #include<led.H> // LED显示灯
- /*****************************************************************************/
- //IO 设置
- //P1 标准双向
- #define P1M0SET 0x00 //设置I/O口工作方式//00000000(左到右,高到低位)
- #define P1M1SET 0x00 //设置I/O口工作方式//00000000
- // P2 标准双向
- #define P2M0SET 0x00 //设置I/O口工作方式//00000000
- #define P2M1SET 0x00 //设置I/O口工作方式//00000000
- //P3.6 (DS18B20---DATA OD门)
- #define P3M0SET 0x40 //设置I/O口工作方式//01000000
- #define P3M1SET 0x40 //设置I/O口工作方式//01000000
- /************* 串口部分 **************/
- u8 idata RX1_Buffer[RX1_Lenth]; //接收缓冲
- u8 TX1_Cnt; //发送计数
- u8 RX1_Cnt; //接收计数
- bit B_TX1_Busy; //发送忙标志
- /**********************************************/
- //串口发送数组,测试数组
- unsigned char code TXtest_data[]={
- 0x88,0x99,0x66,0x77,0x99,
- };//
- /**********************************************/
- unsigned int tmp=0;
- unsigned int tem=0;//
- unsigned char rec_cnt=0;
- unsigned char rec_cmd=0;
- /***********************************************/
- void rec_cmd1(void);
- void CMD_DO(void);
- void trans_tmp(void);
- void Pinit (void);
- /************* 本地函数声明 **************/
- /**********************************************/
- void main()
- {
- /**********************************************/
- unsigned char i;
- unsigned int KK;
- unsigned int sn;
- unsigned char CMD_TYPE;
-
- delay1ms(300); //延时待系统稳定
- /**********************************************/
- beepdi(); //蜂鸣
- /**********************************************/
- UART1_init (); //串口初始化 串口1,timer2
- /**********************************************/
- REN = 1; //允许接收
- ES = 1; //允许中断
- EA = 1; //允许全局中断
- /**********************************************/
- ledoff(1);
- ledoff(2);
- ledoff(3);
- ledoff(4);
- /**********************************************/
- SendString("STC15W408AS Uart Test !\r\n");
- SendString("帧头:");
- SendString("aa:");
- SendString("55:");
- /**********************************************/
-
-
-
- while (1)
- {
-
- rec_cmd1();
- CMD_DO();
-
- }
- /**********************************************/
- /**********************************************/
- }
- /************* 408AS **************/
- void rec_cmd1(void)
- {
-
-
- if (rec_cnt!=RX1_Cnt) // 接收计数有变化
- {
- rec_cnt=RX1_Cnt;
- /**********************************************/
- if(RX1_Cnt == 0) //收到过数据>=3字节,接收计数变化,寻找帧头会有浪费
- {
-
- if(RX1_Buffer[29]==0xaa) //aa 帧头寻找
- {
- if ((RX1_Buffer[29]==0xaa)&(RX1_Buffer[30]==0x55))//AA&55双字节定帧
- {
- rec_cmd=RX1_Buffer[31];
- }
- }
- }
- /**********************************************/
- if(RX1_Cnt == 1) //收到过数据>=3字节,接收计数变化,寻找帧头会有浪费
- {
- if(RX1_Buffer[30]==0xaa) //aa 帧头寻找
- {
- if ((RX1_Buffer[30]==0xaa)&(RX1_Buffer[31]==0x55))//AA&55双字节定帧
- {
- rec_cmd= RX1_Buffer[0];
- }
- }
- }
- /**********************************************/
- if(RX1_Cnt == 2) //收到过数据>=3字节,接收计数变化,寻找帧头会有浪费
- {
-
- if(RX1_Buffer[31]==0xaa) //aa 帧头寻找
- {
- if ((RX1_Buffer[31]==0xaa)&(RX1_Buffer[0]==0x55))//AA&55双字节定帧
- {
- rec_cmd=RX1_Buffer[1];
-
-
- }
- }
-
- }
- /**********************************************/
- if(RX1_Cnt >= 3) //收到过数据>=3字节,接收计数变化,寻找帧头会有浪费
- {
-
- if(RX1_Buffer[RX1_Cnt-3]==0xaa) //aa 帧头寻找
- {
- if ((RX1_Buffer[RX1_Cnt-0x03]==0xaa)&(RX1_Buffer[RX1_Cnt-0x02]==0x55))//AA&55双字节定帧
- {
- rec_cmd=RX1_Buffer[RX1_Cnt-1];
- }
- }
- }
-
- }
- }
- /************* 408AS **************/
- /********************* UART1中断函数************************/
- /************* 408AS **************/
- void CMD_DO(void)
- {
-
- switch(rec_cmd)
- {
- case 0x1://
- ledon(0x01);
- rec_cmd=0;
- break;//
- case 0x02://
- ledon(0x02);
- rec_cmd=0;
- break;//
- case 0x03://
- ledon(0x03);
- rec_cmd=0;
- break;//
- case 0x04://
- ledon(0x04);
- rec_cmd=0;
- break;//
- case 0x5://
- displayHH1(1) ;
- rec_cmd=0;
- break;//
- case 0x06://
- displayHH1(2);
- rec_cmd=0;
- break;//
- case 0x07://
- displayHH1(3);
- rec_cmd=0;
- break;//
- case 0x08://
- displayHH1(4);
- rec_cmd=0;
- break;//
- case 0x9://
- displayHH2(1) ;
- rec_cmd=0;
- break;//
- case 0x0a://
- displayHH2(2);
- rec_cmd=0;
- break;//
- case 0x0b://
- displayHH2(3);
- rec_cmd=0;
- break;//
- case 0x0c://
- displayHH2(4);
- rec_cmd=0;
- break;//
- case 0x0d://
- displayHH3(1) ;
- rec_cmd=0;
- break;//
- case 0x0e://
- displayHH3(2);
- rec_cmd=0;
- break;//
- case 0x0f://
- displayHH3(3);
- rec_cmd=0;
- break;//
- case 0x10://
- displayHH3(4);
- rec_cmd=0;
- break;//
- case 0x11://
- displayHH3(8);
- rec_cmd=0;
- break;//
- default :
- rec_cmd=0;;
- };
-
- }
- /********************* 函数************************/
- //M0,M1 IO口设定模式
- //(0,0) 标准双向
- //(0,1) 推挽输出,强上拉输出
- //(1,0) 高阻,仅输入
- //(1,1) 开漏IO,内部上拉断开
- /***********************************************///P口初始化 DS18B数据要OD设计
- void Pinit (void){
- P3M1=P3M1SET;
- P3M0=P3M0SET;
- P1M0=P1M0SET;
- P1M1=P1M1SET;
- P2M0=P2M0SET;
- P2M1=P2M1SET;
- }
- /*******************************************/
- /**********************************************/
- /*
-
- //串口数据处理
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
|
-
-
串口控制台.zip
63.44 KB, 下载次数: 19, 下载积分: 黑币 -5
源码--调试用-STC15W408AS
-
-
408AS.zip
334.2 KB, 下载次数: 15, 下载积分: 黑币 -5
原理图和数码管以及串口控制台编码文档
评分
-
查看全部评分
|