【简要说明】 一、 尺寸:长170mmX宽72mmX高18mm
二、 主要芯片:单片机,MAX485,MAX232
三、 工作电压:6V至40V,功耗小于1W
四、 特点:1、具有稳压电路,输入电压广,具有电源指示灯。
2、具有485通信和232通信及TTL通信。
3、具有数码管数据显示,蜂鸣器提示音
4、波特率可调分别是 2400 4800 9600 19200
5、采用大按键,机械寿命长。
6、单片机编程,客户可以自己更改,提供源代码
7、可发送20组数据
8、具有系统复位按键
9、端子采用螺旋压接端子
10、工作温度-40度至 +70度 11、工作湿度 40% ~ 80%RH 12、板子静态功耗小于1W
13、具有续流保护 14、具有电磁抗干扰能力 15、板子稳定工作可靠
16、板子可安装在DIN导轨上面
工控设备串口及485调试模块的电路原理图:
pcb:
GYJ-0023_工控设备串口及485调试模块波特率设置:
1上2下 2400
1下2上 4800
1上2上 9600
1下2下 19200
01 2400
10 4800
00 9600
11 19200
模块的元件清单:
GYJ-0023_工控设备串口及485调试模程序:
rs485.c单片机源程序如下:
手持通讯板 - 发送字符:
- #include <STC12C5A60S2.H>
- #include <intrins.h>
- #define uchar unsigned char//宏定义无符号字符型
- #define uint unsigned int //宏定义无符号整型
- sbit RS485_DIR = P1^4; //RS485方向选择引脚
- sbit boma1 = P1^1;
- sbit boma2 = P1^0;
- bit flagFrame = 0; //帧接收完成标志,即接收到一帧新数据
- bit flagTxd = 0; //单字节发送完成标志,用来替代TXD中断标志位
- unsigned char cntRxd = 0; //接收字节计数器
- unsigned char pdata bufRxd[64]; //接收字节缓冲区
- void UartRxMonitor(unsigned char ms);
- void UartWrite(unsigned char *buf, unsigned char len);
- void DelayX10us(unsigned int t);
- void ConfigUART1(unsigned int baud);
- void ConfigUART(unsigned int baud);
- sbit ka=P2^4;//按键矩阵
- sbit kb=P2^5;
- sbit kc=P2^6;
- sbit kd=P2^7;
- sbit k1=P2^0;
- sbit k2=P2^1;
- sbit k3=P2^2;
- sbit k4=P2^3;
- xdata uint k4val,k4num,keyval=0,keyval1=0,keyval2=0;
- void kabcd();//矩阵按键公共
- void Getch();//矩阵按键
- void Delay_us(uint i); //us延时
- code uchar seg7code[17]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf};
- sbit display=P3^6;
- void BaudRate();//波特率选择
- uint keynum=0;
- static uchar presstime=0;//时间值按键用到的
- bit kf0=1,kf1=1,kf2=1;
- bit kt0=0,kt1=0,kt2=0;
- sbit key1=P1^5;
- sbit key2=P1^6;
- uchar sendval[20]={'0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0'};
- uint empty=0;//清空
- sbit buzzer=P3^7;
- bit buzzerf=0;
- void main(){
- TMOD = 0x01;
- TH0 = 0xfc;
- TL0 = 0x67;
- TR0 = 1;
- EA = 1;
- ET0 = 1;
- display=0;
- keyval=16;
- keyval2=16;
- while(1){
- Getch();//矩阵按键
- BaudRate();//波特率选择
- if(keyval!=16){
- if(kf0){kf0=0;kt0=1;
- buzzerf=1;
- keyval2=keyval;
- sendval[keynum]=keyval1;
- keynum++;
- }
- keyval=16;
- }else{if(kt0){kf0=1;kt0=0;}}
- P0=seg7code[keyval2];//传到数码管显示
- if(keynum>20){
- buzzerf=1;
- }
- if(key1==0){if(kf1){if(presstime>100){kf1=0;kt1=1;presstime=0;//当按键1按下 清空数据
- keynum=0;keyval2=16;buzzerf=1;
- for(empty=0;empty<20;empty++){sendval[empty]='0';}
- }}}else{if(kt1){if(presstime>100){kf1=1;kt1=0;presstime=0;//当按键1松开
- }}}//按键1结束
- if(key2==0){if(kf2){if(presstime>100){kf2=0;kt2=1;presstime=0;//当按键2按下 发送数据
- if(keynum<21){
- buzzerf=1;
- UartWrite(sendval,keynum);
- }
- }}}else{if(kt2){if(presstime>100){kf2=1;kt2=0;presstime=0;//当按键2松开
- }}}//按键2结束
- if(buzzerf){
- buzzer=0;//蜂鸣器响
- Delay_us(20000);
- Delay_us(20000);
- Delay_us(20000);
- buzzer=1;
- buzzerf=0;
- }
- }
- }
- void InterruptTimer0() interrupt 1{//T0中断服务函数,执行串口接收监控
- TH0 = 0xfc;
- TL0 = 0x67;
- presstime++;
- UartRxMonitor(1); //串口接收监控
- }
- /* 串口配置函数,baud-通信波特率 */
- void ConfigUART(unsigned int baud){
- RS485_DIR = 0; //RS485设置为接收方向
- SCON = 0x50; //配置串口为模式1
- TMOD &= 0x0F; //清零T1的控制位
- TMOD |= 0x20; //配置T1为模式2
- TH1 = 256 - (11059200/12/32)/baud; //计算T1重载值
- PCON = 0x00; //注意 每次变化都要更改,他会保存
- TL1 = TH1; //初值等于重载值
- ET1 = 0; //禁止T1中断
- ES = 1; //使能串口中断
- TR1 = 1; //启动T1
- }
- /* 串口配置函数,19200baud-通信波特率 */
- void ConfigUART1(unsigned int baud){
- RS485_DIR = 0; //RS485设置为接收方向
- SCON = 0x50; //配置串口为模式1
- TMOD &= 0x0F; //清零T1的控制位
- TMOD |= 0x20; //配置T1为模式
- PCON = 0x80;
- TH1 = 0xFD;
- TL1 = 0xFD;
- ET1 = 0; //禁止T1中断
- ES = 1; //使能串口中断
- TR1 = 1; //启动T1
- }
- /* 软件延时函数,延时时间(t*10)us */
- void DelayX10us(unsigned int t){
- do {
- _nop_();_nop_();_nop_();_nop_();
- _nop_();_nop_();_nop_();_nop_();
- _nop_();_nop_();_nop_();_nop_();
- _nop_();_nop_();_nop_();_nop_();
- _nop_();_nop_();_nop_();_nop_();
- } while (--t);
- }
- // 串口数据写入,即串口发送函数,buf-待发送数据的指针,len-指定的发送长度
- void UartWrite(unsigned char *buf, unsigned char len){
- RS485_DIR = 1; //RS485设置为发送
- while (len--){ //循环发送所有字节
- flagTxd = 0; //清零发送标志
- SBUF = *buf++; //发送一个字节数据
- while (!flagTxd); //等待该字节发送完成
- }
- DelayX10us(5); //等待最后的停止位完成,延时时间由波特率决定
- RS485_DIR = 0; //RS485设置为接收
- }
- /* 串口接收监控,由空闲时间判定帧结束,需在定时中断中调用,ms-定时间隔 */
- void UartRxMonitor(unsigned char ms){
- static unsigned char cntbkp = 0;
- static unsigned char idletmr = 0;
- if (cntRxd > 0){ //接收计数器大于零时,监控总线空闲时间
- if (cntbkp != cntRxd){ //接收计数器改变,即刚接收到数据时,清零空闲计时
- cntbkp = cntRxd;
- idletmr = 0;
- }else{ //接收计数器未改变,即总线空闲时,累积空闲时间
- if (idletmr < 30){ //空闲计时小于30ms时,持续累加
- idletmr += ms;
- if (idletmr >= 30){ //空闲时间达到30ms时,即判定为一帧接收完毕 注意这是485协议规定的
- flagFrame = 1; //设置帧接收完成标志
- }
- }
- }
- }else{
- cntbkp = 0;
- }
- }
- /* 串口中断服务函数 */
- void InterruptUART() interrupt 4{
- if (RI){ //接收到新字节 当字节发送到结束位的一半的时候RI接收标志变为1 进入窜口中断
- RI = 0; //清零接收中断标志位
- if (cntRxd < sizeof(bufRxd)){ //接收缓冲区尚未用完时,保存接收字节,并递增计数器
- bufRxd[cntRxd++] = SBUF; // cntRxd++这个很重要,一开始 cntRxd < sizeof(bufRxd)当进入函数的次数增加,cntRxd慢慢变大,当传入的数据不满的时候就 用时间检测,判断是否是传输完成
- }
- }
- if (TI){ //字节发送完毕
- TI = 0; //清零发送中断标志位
- flagTxd = 1; //设置字节发送完成标志
- }
- }
- void BaudRate(){//波特率选择
- if((boma1 == 0)&&(boma2 != 0)){ConfigUART(2400);} //配置波特率为1200
- if((boma2 == 0)&&(boma1 != 0)){ConfigUART(4800);} //配置波特率为4800
- if((boma1 == 0)&&(boma2 == 0)){ConfigUART(9600);} //配置波特率为9600
- if((boma1 != 0)&&(boma2 != 0)){ConfigUART1(19200);}//配置波特率为19200
- }
- void Delay_us(uint i){ //us延时
- for(;i>0;i--){
- _nop_();
- }
- }
- void kabcd(){
- Delay_us(10000);
- if(ka==1){k4val|=0x80;}else{k4val&=0x7f;}
- if(kb==1){k4val|=0x40;}else{k4val&=0xbf;}
- if(kc==1){k4val|=0x20;}else{k4val&=0xdf;}
- if(kd==1){k4val|=0x10;}else{k4val&=0xef;}
- k4num=k4val;
- k4num&=0xf0;
- }
- void Getch(){//矩阵按键
- k1=0;//矩阵1开始
- ka=kb=kc=kd=k2=k3=k4=1;
- kabcd();
- if(k4num!=0xf0){
- kabcd();
- if(k4num!=0xf0){
- switch(k4num){
- case(0x70):keyval=1;keyval1=49;break;//s1
- case(0xb0):keyval=2;keyval1=50;break;//s2
- case(0xd0):keyval=3;keyval1=51;break;//s3
- case(0xe0):keyval=4;keyval1=52;break;//s4
- }
- }
- }//矩阵1结束
- k2=0;//矩阵2开始
- ka=kb=kc=kd=k1=k3=k4=1;
- kabcd();
- if(k4num!=0xf0){
- kabcd();
- if(k4num!=0xf0){
- switch(k4num){
- case(0x70):keyval=5;keyval1=53;break;//s5
- case(0xb0):keyval=6;keyval1=54;break;//s6
- case(0xd0):keyval=7;keyval1=55;break;//s7
- case(0xe0):keyval=8;keyval1=56;break;//s8
- }
- }
- }//矩阵2结束
- k3=0;//矩阵3开始
- ka=kb=kc=kd=k2=k1=k4=1;
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
GYJ-0023_工控设备串口及485调试模块发货资料.rar
(4.35 MB, 下载次数: 68)
|