STC12C60S2单片机双485通讯开发双485通讯控制程序

2019-11-13来源: 51hei关键字:STC12C60S2  单片机  双485通讯  通讯控制

电路原理图如下:
 

程序说明


接线:MAX485-1 D+ 链接 MAX485-2 D+ ;MAX485-1 D- 链接 MAX485-2 D-

功能:串口一 自动发送一个tab数据,串口二接收,接收后数据显示在P0口的led灯上
          串口二 自动发送一个tab数据,串口一接收,接收后数据显示在p0口的led灯上
                  按key1,P0口显示0xAA
                  按key2,P0口显示0x55
                  按key3,P0口显示0xf0
                  按key4,P0口显示0x0f
*********************************************************************/

#include "STC12C5A60S2.h"  //库文件

#define uchar unsigned char//宏定义无符号字符型

#define uint unsigned int  //宏定义无符号整型

/********************************************************************

                            初始定义

*********************************************************************/

uchar dat1=0,dat2=0;

uchar tab[8]={0xfe,0xfd,0xfB,0xf7,0xef,0xdf,0xBf,0x7f};

sbit key1=P2^0;

sbit key2=P2^1;

sbit key3=P2^2;

sbit key4=P2^3;

/********************************************************************

                            串口初始化

*********************************************************************/

void init ()

{

        TMOD = 0x20;                           //定时器1产生波特率

        SCON = 0x50;                          //方式1,8位数据,波特率可变

        TH1= TL1 = 0xfd;                 //波特率 9600

        S2CON= 0x50;                     //方式1,八位数据,可变波特率

        BRT= 0XFD;                                  //设置波特率9600

        TR1= 1;                                          //启动定时器产生波特率        

        AUXR= 0x10;                                 //启动波特率发生器

        IP= 0x00;                                 //优先级默认

        EA = 1;                                  //开总中断

        ES= 1;                                         //开串口1中断

        IE2=0x01;                                 //开串口2中断

}

/********************************************************************

                            串口一 发送一个字符

*********************************************************************/

void  uart1_txd(uchar x)

{

        SBUF = x;

}

/********************************************************************

                            串口二   发送一个字符

*********************************************************************/

void  uart2_txd(uchar x)

{

        S2BUF = x;

}

/********************************************************************

                             延时函数

*********************************************************************/

void delay ( uint t )

{

        uint i,j;

        for( i=0; i

        for( j=0; j<250; j++);

}

/********************************************************************

                              主函数

*********************************************************************/

void main()

{

    uchar i;

        init();


         for(i=0;i<8;i++)

           {

             uart1_txd(tab[i]);//串口一发送数据

             delay(500);          

                 P0=dat2;                  //串口二接收数据在led灯显示

                 delay(500);


                 uart2_txd(tab[7-i]); //串口二发送数据

             delay(500);          

                 P0=dat1;                 //串口一接收数据在led灯显示

                 delay(500);

           }

        while(1)

        {

          if(key1==0){delay(20);while(!key1){P0=0xAA;} }

          if(key2==0){delay(20);while(!key2){P0=0x55;} }

          if(key3==0){delay(20);while(!key3){P0=0xf0;} }

          if(key4==0){delay(20);while(!key4){P0=0x0f;} }


        }

}

/********************************************************************

                            串口二    发送接收中断函数

*********************************************************************/

void uart2_isr()  interrupt 8

{

        if( S2CON & 0x01 )

        {

                S2CON &= ~0x01;

                dat2= S2BUF;

        }

        if( S2CON & 0x02 )

        {

                S2CON &= ~0x02;

        }

}

/********************************************************************

                            串口一 发送接收中断函数

*********************************************************************/

void uart_isr()  interrupt 4 

{

        if( RI )

           RI = 0;

            dat1 = SBUF;

        if( TI ) 

            TI = 0;

}

/********************************************************************

                              结束

*********************************************************************/



关键字:STC12C60S2  单片机  双485通讯  通讯控制 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic479804.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:51单片机数字频率计仿真(可按键切换量程)
下一篇:单片机6位数电子密码锁源码+PCB+仿真原理图设计(可改密码

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

STC12C5A60S2利用PCA时钟溢出做的PWM信号
*//*实现的功能是,控制CR的开通和关断来实现混频效果*//*第二次修改时间2019-10-6*//*作者 Alan*/#include <STC12C5A60S2.H>#include <stdint.h>//#include <intrins.h>#define FOSC 18432000/*分别定义了两个不高低位的变量用于保存 定时器初值,从而初值计算里面带变量计算以后保存到这个变量 这时候就能在中断正常重新装初值了,也不会出错*/uint8_t  TH,TL;      /*上一次的状态*/uint8_t  
发表于 2019-11-12
STC12C5A60S2利用PCA时钟溢出做的PWM信号
stc12c5a60s2 0-30电压测量 有注释
#include <STC12C5A60S2.H>#include "intrins.h"#define uchar unsigned char#define uint  unsigned int#define ulong unsigned long/*Define ADC operation const for ADC_CONTR*/#define ADC_POWER   0x80            //ADC 电源控制位  10000000  0X80  /#define
发表于 2019-11-08
基于STC12C5A60S2的双电源供电智能控制系统设计
摘要:文章介绍了基于STC12C5A60S2单片机的双电源供电智能控制系统,实现对主电源和备用电源的实时监测,保证供电的连续性和可靠性。文中阐述丫系统的整体设计方案、硬件电路设计、软件设计及后台监控的设计。通过理论分析及实践汪明能有效的检测当前主备电路的电压值并实现双电源之间的准确转换,相应状态可以通过GSM模块发送给监控主机和相关操作人员,具有重要的现实意义。0 引言随着国民经济的迅速发展,人们对供电连续性、可靠性的要求越来越高,对于不允许断电的重要场合,如医院手术室、高层建筑安全保障系统、热电站、化工企业、银行等,都要求配备至少两路电源来保证供电的连续性。因此,需要一种能在两路电源之间进行自动转换的系统,以保证正在使用中的电源
发表于 2019-10-24
基于STC12C5A60S2的双电源供电智能控制系统设计
STC12C5A60S2_PWM
#include <reg52.h>#include <intrin.h>#define uint unsigned int #define uchar unsigned charsfr CCON = 0XD8;sbit CCFO = CCON^0;sbit CCF1 = CCON^1;sbit CR = CCON^6;sbit CF = CCON^7;sfr CMOD = 0XD9;sfr CL = 0XE9;sfr CH = 0XF9;sfr CCAPM0 = 0XDA;sfr CCAP0L = 0XEA;sfr CCAP0H = 0XFA;sfr CCAMP1 = 0XDB;sfr CCAP1
发表于 2019-06-01
STC12C5A60S2的PCA模块输出PWM波
,就会去改变PWM的占空比,这也就是所说的脉宽调制。要改变PWM的周期,只能改变CL的取值范围,但是CL的取值范围是不可改变的,因为CL是一个8位寄存器。所以只能是改变CL每次加1的速度(原来CL加1用0.1s,现在要改为0.05s)也就是说我们要时钟源的频率。这种方法并没有被PCA模块所用,PCA模块所改变PWM频率的方法为,时钟源选择T0的溢出率,或者是选择外部时钟晶振源。上述为个人理解,下图为手册中的流程
发表于 2019-05-22
STC12C5A60S2的PCA模块输出PWM波
PIC单片机基础学习之程序设计(一)
1、PIC单片机程序的基本格式先介绍二条伪指令:EQU ——标号赋值伪指令ORG ——地址定义伪指令PIC16C5X单片机在RESET后指令计算器PC被置为全“1”,所以PIC16C5X几种型号芯片的复位地址为:PIC16C54/55:1FFHPIC16C56:3FFHPIC16C57/58:7FFH一般来说,PIC单片机的源程序并没有要求统一的格式,大家可以根据自己的风格来编写。但这里我们推荐一种清晰明了的格式供参考。;--------------------------------------;名称定义和变量定义;--------------------------------------F0    EQU  0RTCC
发表于 2019-12-06
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved