上位机界面:
51单片机源码:
- #include<reg52.h>
- #include <intrins.h>
- #include "STC89C51RC_EEPROM.h" //调用STC89C51RC的EEPROM读写头文件
- /************* 本地常量声明 **************/
- #define uchar unsigned char
- #define uint unsigned int
- //------------------------------------------------------------------
- unsigned char code OnOffTab[10] = {0x80, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0xFF, 0x00};
- //------------------------------------------------------------------
- unsigned char HDAddr = 0x01;//模块地址 默认01
- unsigned char HdSerID[7];//模块ID
- //------------------------------------------------------------------
- void SendtoCom(unsigned char CCode, Data1, Data2, Data3, Data4); //向串口发送数据
- //------------------------------------------------------------------
- void ProcessData( void );//处理来自串口接收到的数据
- //------------------------------------------------------------------
- void SaveEEProm( void );//保存系统变量
- //------------------------------------------------------------------
- void ReadEEProm( void );//读取系统变量
- //------------------------------------------------------------------
- //
- uchar tClock = 3;//默认3秒关闭
- uchar vTotal = 0;
- /*********************串口数据通讯 开始******************************/
- #define INBUF_LEN 8 //8位数据长度
- //字节1 字节2 字节3 字节4 字节5 字节6 字节7
- //同步字节 地址码 指令码1 数据码2 数据码3 数据码4 校验码
- //通信协议: 第1字节,恒为AF,为协议同步字标志,第2字节,为地址码00-FF, 第3-6字节为数据码,字节7为校验码,即1-6个字节后7位的异或校验和。
- unsigned char inBuf[INBUF_LEN], outBuf[INBUF_LEN];
- //
- unsigned char Cnum;
- //
- //
- bit B_TX1_Busy = 0; //发送忙标志
- #define BAUD_1200 0xD0 // 波特率为1200
- #define BAUD_2400 0xE8 // 波特率为2400
- #define BAUD_4800 0xF4 // 波特率为4800
- #define BAUD_7200 0xF8 // 波特率为7200
- #define BAUD_9600 0xFA // 波特率为9600
- #define BAUD_14400 0xFC // 波特率为14400
- #define BAUD_19200 0xFD // 波特率为19200
- //11.0592最高所支持的波特率为19200
- //------------------------------------------------------------------
- //串口初始化
- //------------------------------------------------------------------
- //------------------------------------------------------------------
- //向串口发送数据(带校验)
- //------------------------------------------------------------------
- void SendtoCom(unsigned char CCode, Data1, Data2, Data3, Data4)
- {
- unsigned char i = 0;
- {
- //--------------------------------------------
- outBuf[0] = 0xFE; //同步字 恒为FE
- outBuf[1] = HDAddr; //地址码01-FF
- outBuf[2] = CCode; //指令码
- outBuf[3] = Data1; //数据码1
- outBuf[4] = Data2; //数据码2
- outBuf[5] = Data3; //数据码3
- outBuf[6] = Data4; //数据码4
- outBuf[7] = 0x80; //校验码
- //--------------------------------------------
- for (i == 0; i < 7; i++)
- {
- outBuf[7] ^= outBuf[i]; //校验
- }
- //
- if(!B_TX1_Busy) //发送空闲
- {
- i = 0;
- B_TX1_Busy = 1; //标志发送忙
- do
- {
- SBUF = outBuf[i]; //发一个字节
- i++;
- Delay_ms(20); //延时
- }
- while (i < 8);
- }
- B_TX1_Busy = 0; //清除发送忙标志
- //--------------------------------------------
- }
- }
- sbit JDQ00 = P0 ^ 0;
- sbit JDQ01 = P0 ^ 1;
- sbit JDQ02 = P0 ^ 2;
- [b]。。。发贴长度受限,详见附件代码。sbit JDQ26 = P3 ^ 2;[/b]
- sbit JDQ27 = P3 ^ 3;
- sbit JDQ28 = P3 ^ 4;
- sbit JDQ29 = P3 ^ 5;
- sbit JDQ30 = P3 ^ 6;
- sbit JDQ31 = P3 ^ 7;
- //------------------------------------------------------------------
- //串口接收中断函数
- //------------------------------------------------------------------
- void serial () interrupt 4 using 3
- /*********************串口数据通讯 结束******************************/
- //------------------------------------------------------------------
- //定时器中断,用于自动校准称重数据
- //------------------------------------------------------------------
- void DingShi() interrupt 1 using 1 //声明定时器中断处理函数,所以X的值为1
- {
- uchar i; //定义一个临时变量
- //
- if (i >= 20) //因为是50ms发生一次中断,每次中断i的值就加1,当i=20时,50ms*20=1秒时间到了
- {
- i = 0; //i的值清零
- vTotal++;//累加1秒
- if (vTotal >= tClock - 1)
- {
- vTotal = 0;
- P0 = 0xFF;
- P2 = 0xFF;
- P1 = 0xFF;
- P3 = 0xFF | 0x03;
- SendtoCom(0xB0, P0, P2, P1, P3); //返回信息
- TR0 = 0; //TR=1是定时器工作,0是停止工作
- }
- }
- i++; //每发生一次中断,i的值就加1
- TH0 = (65536 - 50000) / 256; //重新给定时器TH0装初始值 50000微秒=50ms
- TL0 = (65536 - 50000) % 256; //重新给定时器TL0装初始值 50000微秒=50ms
- }
- /[b]。。。发贴长度受限,详见附件代码。sbit JDQ26 = P3 ^ 2;[/b]
- /*****************main主函数*****************/
- void main()
- {
- P0 = 0xFF;
- P1 = 0xFF;
- P2 = 0xFF;
- P3 = 0xFF;
- //
- tClock = STC89CXX_EEPROM_Char_Read(0x20, 0x00);
- /*
- uint temp = -100;
- unsigned char i = 0;
- Cnum = 0;
- AutoTrans = 0;*/
- //-----------------------------------------------------------
- //看门狗定时器溢出时间计算公式: (12 * 32768 * PS) / FOSC (秒)
- //设置看门狗定时器分频数为32,溢出时间如下:
- //11.0592M : 1.14s
- //18.432M : 0.68s
- //20M : 0.63s
- //启动看门狗
- //WDT_reset(D_WDT_SCALE_64);//初始化WDT,喂狗1.25s喂一次
- //-----------------------------------------------------------
- Timer0Init();
- Delay_ms(1000);
- init_serialCom(); //初始化串口
- Delay_ms(1000);
- //-----------------------------------------------------------
- //
- while(1)//主函数大循环
- {
- }
- }
复制代码
上位机源码: 无
上位机exe文件和51的Keil工程下载:
STC8952通过串口控制30个继电器模组(带上位机).rar
(242.54 KB, 下载次数: 0)
|