欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: 單片機通過兩個開關控制分別發送兩串從串口RS485發送,發三遍停止 求指導 [打印本頁]

作者: 稻草人008    時間: 2022-6-15 22:11
標題: 單片機通過兩個開關控制分別發送兩串從串口RS485發送,發三遍停止 求指導
字符串(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;
            }
        }
    }
}

作者: Hephaestus    時間: 2022-6-15 22:46
uart_tx_string(&str1, 50);
作者: lkc8210    時間: 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. }
復制代碼



作者: 大漠落日    時間: 2022-6-16 10:29
很簡單的,只要你的意思表達清楚。
作者: 稻草人008    時間: 2022-6-16 13:55
lkc8210 發表于 2022-6-16 00:04

老師你好,我沒表達清楚,開關是一刀雙切的開關,當打到向前時,開關一直是閉合的,只有打到向后才斷開。所以我就想字符串仿佛發送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 要怎么設
十分感謝老師
作者: 稻草人008    時間: 2022-6-16 13:57
Hephaestus 發表于 2022-6-15 22:46
uart_tx_string(&str1, 50);

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

作者: lkc8210    時間: 2022-6-16 14:43
稻草人008 發表于 2022-6-16 13:55
老師你好,我沒表達清楚,開關是一刀雙切的開關,當打到向前時,開關一直是閉合的,只有打到向后才斷開。 ...

對~
把那兩組各50個數值放進table_s1和table_s2
把uart_tx_string(table_s2,7);的7改50就可以了
作者: lkc8210    時間: 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. }
復制代碼




作者: 稻草人008    時間: 2022-6-16 16:33
lkc8210 發表于 2022-6-16 14:43
對~
把那兩組各50個數值放進table_s1和table_s2
把uart_tx_string(table_s2,7);的7改50就可以了

老師十分感謝




歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1