久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2400|回復: 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;
            }
        }
    }
}
回復

使用道具 舉報

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 | 顯示全部樓層
很簡單的,只要你的意思表達清楚。
回復

使用道具 舉報

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 要怎么設
十分感謝老師
回復

使用道具 舉報

ID:761175 發表于 2022-6-16 13:57 | 顯示全部樓層
Hephaestus 發表于 2022-6-15 22:46
uart_tx_string(&str1, 50);

謝謝,我是菜鳥,這是不是指定字符數量50個的意思
回復

使用道具 舉報

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就可以了
回復

使用道具 舉報

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. }
復制代碼



回復

使用道具 舉報

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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久国产视频| 国产精品高潮呻吟久久 | 国产日韩一区二区 | 日一区二区 | 精品久久一区 | 欧美99 | a在线免费观看 | 天堂亚洲网 | 草b视频| 亚洲欧美日韩精品久久亚洲区 | 国产精品福利在线观看 | 一区二区三区影院 | 狠狠狠色丁香婷婷综合久久五月 | 精品久久久久久久久久久久久 | 国产精品久久久久久久久久 | 精品视频免费在线 | 中文字幕亚洲欧美日韩在线不卡 | av免费网| 91精品久久久久久久 | 欧美日韩亚洲视频 | av在线免费观看网址 | 国产精品一区久久久久 | 欧美精品国产一区二区 | 精品国产欧美一区二区 | www.天天操.com | 国产婷婷色综合av蜜臀av | 亚洲一区二区三区视频在线 | 国产精品久久久久久久久久久久 | 亚洲在线一区二区三区 | 伊人久久大香线 | 日韩免费 | 91影片 | 国产精品1区2区 | 久久精品亚洲精品国产欧美 | 国产免费国产 | 一区二区免费高清视频 | 国产永久免费 | 日韩在线| 精品一二三区 | 国产精品二区三区 | 亚洲在线一区二区三区 |