找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1558|回复: 8
打印 上一主题 下一主题
收起左侧

单片机通过两个开关控制分别发送两串从串口RS485发送,发三遍停止 求指导

[复制链接]
跳转到指定楼层
楼主
ID:761175 发表于 2022-6-15 22:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
字符串(1)39 C0 04 EA B7 58 59 00 00 01 00 04 00 00 00 00 00 00 88 13 E7 03 63 04 AE C7 05 19 26 0C 2D 0C F6 3C 44 CC 01 83 00 FC 38 00 67 50 10 00 20 20 20 20 00 00 50 00 00 05 00 00 00 00 00 46 B5 00 00 00 00 04 AE C7 00 B8
字符串(2)39 C0 04 20 B8 58 59 00 00 01 00 02 00 00 00 00 00 00 88 13 E7 03 63 04 AE C7 05 19 26 0C 2D 0C F6 3C 44 CC 01 83 00 C7 38 00 67 50 12 00 20 20 20 20 00 00 50 00 00 05 00 00 00 00 00 46 B5 00 00 00 00 04 AE C7 00 B6

我要通过两个开关控制分别发送两串。从串口485发送,发三遍停止。程序要怎么写。

单片机型号:STC12C5410AD
晶振22.1184M
串口波特率:9600
校验方式:无校验
数据位:  8
停止位:  2

单片机源程序如下:
#include <STC12C5410AD.h>
#include "string.h"
#define uchar unsigned char
#define uint unsigned  int
sbit S1=P1^0;  //向前
sbit S2=P1^1;  //向后
sbit LED1=P1^2;//向前指示灯
sbit LED2=P1^3;//向后指示灯
sbit LED3=P1^4;//发送数据指示灯
sbit RS485=P3^4; //MAX485收发控制0=发送,1=接收
sbit FM=P3^7; //蜂鸣器
unsigned int i;//MAX485定时器        
unsigned int delay_FM;//蜂鸣器定时器
char table_s1[] = {0xEF, 0x09, 0x66, 0x03, 0x00, 0x00, 0x83};//向前数据组
char table_s2[] = {0xEF, 0x09, 0x73, 0x00, 0x01, 0x02, 0x96};//向后数据组


//串口初始化
void uart_init(void)               //9600bps@22.1184MHz
{
    FM = 0;  //蜂鸣器打开
    RS485=0; //MAX485处于接收状态
    PCON &= 0x7F;                //波特率不倍速
    SCON = 0x50;                //8位数据,可变波特率
    AUXR &= 0xBF;                //定时器时钟12T模式
    AUXR &= 0xFE;                //串口1选择定时器1为波特率发生器
    TMOD &= 0x0F;                //设置定时器模式
    TMOD |= 0x20;                //设置定时器模式
    TL1 = 0xFA;                //设置定时初始值
    TH1 = 0xFA;                //设置定时重载值
    ET1 = 0;                //禁止定时器%d中断
    TR1 = 1;                //定时器1开始计时
    ES = 1;
    EA = 1;
}
void uart_tx_byte(uchar dat)
{
    SBUF=dat;
    while(!TI);
    TI=0;
}
void uart_tx_string(uchar *P, uchar len)
{
    RS485=1;//有数据MAX处于发送
        LED3=RS485;        //数据发送指示灯
    while(len)
    {
        uart_tx_byte(*P);
        P++;
        len--;
    }
                for(i=0;i<100;i++);
    RS485=0;                         //MAX485处于接收状态
}
void main()
{
    uart_init();
    while(1)
    {
        static unsigned char delay;
        if(S1==0 || S2==0)//有键按下
        {
            if(delay<0xFF)delay++;//消抖延时
            if(delay == 250)
            {
                if(S1==0)    //向前开关
                {
                    LED1=1;        //向前指示灯
                                        LED2=0;        //向后指示灯
                                        uart_tx_string(table_s1,7);
                }
                if(S2==0)   //向后开关
                {
                    LED2=1;
                                        LED1=0;
                                        uart_tx_string(table_s2,7);
                }

                FM=0;                    //蜂鸣器开器关
            }
        }
        else {
            delay = 0;
        }
        if(FM==0)
        {
            if(++delay_FM >40000)
            {
                FM=1; //蜂鸣器关闭
                delay_FM = 0;
            }
        }
    }
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:883242 发表于 2022-6-15 22:46 | 只看该作者
uart_tx_string(&str1, 50);
回复

使用道具 举报

板凳
ID:161164 发表于 2022-6-16 00:04 | 只看该作者
  1. #include <STC12C5410AD.h>
  2. #include "string.h"
  3. #define uchar unsigned char
  4. #define uint unsigned  int
  5. sbit S1=P1^0;  //向前
  6. sbit S2=P1^1;  //向后
  7. sbit LED1=P1^2;//向前指示灯
  8. sbit LED2=P1^3;//向后指示灯
  9. sbit LED3=P1^4;//发送数据指示灯
  10. sbit RS485=P3^4; //MAX485收发控制0=发送,1=接收
  11. sbit FM=P3^7; //蜂鸣器
  12. unsigned int i;//MAX485定时器
  13. unsigned int delay_FM;//蜂鸣器定时器
  14. char table_s1[] = {0xEF, 0x09, 0x66, 0x03, 0x00, 0x00, 0x83};//向前数据组
  15. char table_s2[] = {0xEF, 0x09, 0x73, 0x00, 0x01, 0x02, 0x96};//向后数据组
  16. char SendCnt = 0;//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  17. //串口初始化
  18. void uart_init(void)               //9600bps@22.1184MHz
  19. {
  20.         FM = 0;  //蜂鸣器打开
  21.         RS485=0; //MAX485处于接收状态
  22.         PCON &= 0x7F;                //波特率不倍速
  23.         SCON = 0x50;                //8位数据,可变波特率
  24.         AUXR &= 0xBF;                //定时器时钟12T模式
  25.         AUXR &= 0xFE;                //串口1选择定时器1为波特率发生器
  26.         TMOD &= 0x0F;                //设置定时器模式
  27.         TMOD |= 0x20;                //设置定时器模式
  28.         TL1 = 0xFA;                //设置定时初始值
  29.         TH1 = 0xFA;                //设置定时重载值
  30.         ET1 = 0;                //禁止定时器%d中断
  31.         TR1 = 1;                //定时器1开始计时
  32.         ES = 1;
  33.         EA = 1;
  34. }
  35. void uart_tx_byte(uchar dat)
  36. {
  37.         SBUF=dat;
  38.         while(!TI);
  39.         TI=0;
  40. }
  41. void uart_tx_string(uchar *P, uchar len)
  42. {
  43.         RS485=1;//有数据MAX处于发送
  44.         LED3=RS485;        //数据发送指示灯
  45.         while(len)
  46.         {
  47.                 uart_tx_byte(*P);
  48.                 P++;
  49.                 len--;
  50.         }
  51.         for(i=0; i<100; i++);
  52.         RS485=0;                         //MAX485处于接收状态
  53. }
  54. void main()
  55. {
  56.         uart_init();
  57.         while(1)
  58.         {
  59.                 static unsigned int delay;//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  60.                 if(S1==0 || S2==0)//有键按下
  61.                 {
  62.                         if(delay<0xFFFF)delay++;//消抖延时
  63.                         if(delay == 2500)//250太短了<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  64.                         {
  65.                                 if(S1==0)    //向前开关
  66.                                 {
  67.                                         LED1=1;        //向前指示灯
  68.                                         LED2=0;        //向后指示灯
  69.                                         SendCnt = 3;//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  70.                                 }
  71.                                 if(S2==0)   //向后开关
  72.                                 {
  73.                                         LED2=1;
  74.                                         LED1=0;
  75.                                         SendCnt = 3;//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  76.                                 }
  77.                                 FM=0;                    //蜂鸣器开器关
  78.                         }
  79.                 }
  80.                 else
  81.                 {
  82.                         delay = 0;
  83.                 }
  84.                 //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  85.                 if(SendCnt>0)
  86.                 {
  87.                         if(LED1)uart_tx_string(table_s1,7);
  88.                         if(LED2)uart_tx_string(table_s2,7);
  89.                         SendCnt--;
  90.                 }
  91.                 //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  92.                 if(FM==0)
  93.                 {
  94.                         if(++delay_FM >40000)
  95.                         {
  96.                                 FM=1; //蜂鸣器关闭
  97.                                 delay_FM = 0;
  98.                         }
  99.                 }
  100.         }
  101. }
复制代码


回复

使用道具 举报

地板
ID:195496 发表于 2022-6-16 10:29 | 只看该作者
很简单的,只要你的意思表达清楚。
回复

使用道具 举报

5#
ID:761175 发表于 2022-6-16 13:55 | 只看该作者

老师你好,我没表达清楚,开关是一刀双切的开关,当打到向前时,开关一直是闭合的,只有打到向后才断开。所以我就想字符串仿佛发送3遍后停止发送,转为接受状态。
还有
char table_s2[] = {0xEF, 0x09, 0x73, 0x00, 0x01, 0x02, 0x96};//向后数据组
这字符串有50个,
  if(LED1)uart_tx_string(table_s1,7);
                        if(LED2)uart_tx_string(table_s2,7);
这里是不是7 要改50
还有就是
单片机型号:STC12C5410AD
晶振22.1184M
串口波特率:9600
校验方式:无校验
数据位:  8
停止位:  2
停止位2,和1 要怎么设
十分感谢老师
回复

使用道具 举报

6#
ID:761175 发表于 2022-6-16 13:57 | 只看该作者
Hephaestus 发表于 2022-6-15 22:46
uart_tx_string(&str1, 50);

谢谢,我是菜鸟,这是不是指定字符数量50个的意思
回复

使用道具 举报

7#
ID:161164 发表于 2022-6-16 14:43 | 只看该作者
稻草人008 发表于 2022-6-16 13:55
老师你好,我没表达清楚,开关是一刀双切的开关,当打到向前时,开关一直是闭合的,只有打到向后才断开。 ...

对~
把那两组各50个数值放进table_s1和table_s2
把uart_tx_string(table_s2,7);的7改50就可以了
回复

使用道具 举报

8#
ID:161164 发表于 2022-6-16 15:06 | 只看该作者
稻草人008 发表于 2022-6-16 13:55
老师你好,我没表达清楚,开关是一刀双切的开关,当打到向前时,开关一直是闭合的,只有打到向后才断开。 ...

原本的串口初始化就是9600/8/1的
如要9600/8/2可试试以下代码
但我没用过,不保证可用
  1. //串口初始化
  2. void uart_init(void)               //9600bps@22.1184MHz
  3. {
  4.     FM = 0;  //蜂鸣器打开
  5.     RS485=0; //MAX485处于接收状态
  6.     PCON &= 0x7F;                //波特率不倍速
  7.     SCON = 0xD8;                //9位数据,可变波特率,TB8=1
  8.     AUXR &= 0xBF;                //定时器时钟12T模式
  9.     AUXR &= 0xFE;                //串口1选择定时器1为波特率发生器
  10.     TMOD &= 0x0F;                //设置定时器模式
  11.     TMOD |= 0x20;                //设置定时器模式
  12.     TL1 = 0xFA;                //设置定时初始值
  13.     TH1 = 0xFA;                //设置定时重载值
  14.     ET1 = 0;                //禁止定时器%d中断
  15.     TR1 = 1;                //定时器1开始计时
  16.     ES = 1;
  17.     EA = 1;
  18. }
复制代码



回复

使用道具 举报

9#
ID:761175 发表于 2022-6-16 16:33 来自手机 | 只看该作者
lkc8210 发表于 2022-6-16 14:43
对~
把那两组各50个数值放进table_s1和table_s2
把uart_tx_string(table_s2,7);的7改50就可以了

老师十分感谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表