字符串(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;
}
}
}
}
|