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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2238|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人精品一区二区 | 欧美日韩国产一区 | 日韩三级在线观看 | 欧美国产日韩在线观看 | 香蕉二区| 夜夜爽99久久国产综合精品女不卡 | 九九久久国产 | 久久国产精品色av免费观看 | 激情综合五月天 | 欧美精品成人 | 91在线视频免费观看 | 成人免费观看网站 | 亚洲 91| 欧美一级www片免费观看 | 亚洲精品一二区 | 国产精品久久久久久久久久久久久 | 欧美a在线 | 中文字幕 亚洲一区 | 日本福利在线 | 国产一区二区三区精品久久久 | 美女久久视频 | 国产女人叫床高潮大片免费 | 在线看中文字幕 | 精品久久精品 | 午夜精品在线 | 男女国产视频 | 美国十次成人欧美色导视频 | 国产xxxx在线 | 国产成人亚洲精品自产在线 | 日韩一二区 | 久久精品久久综合 | 国产精品爱久久久久久久 | 一区免费视频 | www视频在线观看 | 九九精品热| 亚洲午夜av久久乱码 | 视频一二三区 | 日韩欧美一区二区三区免费观看 | 国产91久久精品一区二区 | 亚洲在线一区 | 成人不卡视频 |