请大神帮忙编写一个单片机C语言程序,串行通信的。 20
我用AD芯片采集了电压数据保存到uchara[8]字符数组里面,要求串口助手发送一个“DATA?”字符串,然后单片机啊把a[8]里的电压数据发送给串口助手,...
我用AD芯片采集了电压数据保存到uchar a[8]字符数组里面,要求串口助手发送一个“DATA?”字符串,然后单片机啊把a[8]里的电压数据发送给串口助手,
展开
展开全部
这是基于STC12C5A60S2 单片机编写的程序,应该也兼容51单片机。这里只是串口的收发,和数码管显示,由于我的数码可能和你的不一样所以需要更改。
#include<stc.h>
#define uchar unsigned char
#define uint unsigned int
//unsigned char code dofly[16]={0,0x3f,0x79,0x5e,0x07,0x7f,0x6f,0x39,0x66,0x6d,0x7d,0x7c,0x06,0x5b,0x4f,0x77};
unsigned char code dofly[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
sbit LED=P1^2;
sbit duan=P1^0; //数码管端码使能端
sbit wei=P1^1;//数码管位码使能端
uchar flag,a;
void init();
void main()
{
duan=0;
P0=0x55;
duan=1;
wei=0;
init();
while(1)
{
if(flag==1)
{
ES=0; //当进入中断后,把中断关闭
flag=0; //把标记位清零
SBUF=a; //把A的值发送出去
while(!TI); //等待数据发送完,如果没有发送完会一直等待。当收到或发送数据TI会由硬件自动置1。
TI=0; //把TI清零
ES=1; //打开串口
}
}
}
void init() //串口寄存器的设置
{
TMOD=0x20; //设置定时器1的工作模式2
TH1=0xfd; //波特率初值
TL1=0xfd; //波特率初值
TR1=1; //打开定时器
REN=1; //串口允许位
SM0=0; //通过设置SM0和SM1定义串口工作方式1
SM1=1; //通过设置SM0和SM1定义串口工作方式1
EA=1; //打开总定时器
ES=1; //打开串口中断
ET1=0;
}
void ser() interrupt 4 //串口中断
{
RI=0; //关闭中断请求,软件把中断请求清零
a=SBUF; //A接收数据
P0=a; //让数码管显示收到的数据
flag=1; //标记位
}
首先你想法是不正确的,AD的值不能直接给数组(uchar a[8])应该先赋给一个变量AD_ DATA
发送应该是SBUF=AD_DATA ,这条语句是把AD变量的值赋给SBUF串口寄存器。
建议你先把串口调试出来在作其他的。
#include<stc.h>
#define uchar unsigned char
#define uint unsigned int
//unsigned char code dofly[16]={0,0x3f,0x79,0x5e,0x07,0x7f,0x6f,0x39,0x66,0x6d,0x7d,0x7c,0x06,0x5b,0x4f,0x77};
unsigned char code dofly[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
sbit LED=P1^2;
sbit duan=P1^0; //数码管端码使能端
sbit wei=P1^1;//数码管位码使能端
uchar flag,a;
void init();
void main()
{
duan=0;
P0=0x55;
duan=1;
wei=0;
init();
while(1)
{
if(flag==1)
{
ES=0; //当进入中断后,把中断关闭
flag=0; //把标记位清零
SBUF=a; //把A的值发送出去
while(!TI); //等待数据发送完,如果没有发送完会一直等待。当收到或发送数据TI会由硬件自动置1。
TI=0; //把TI清零
ES=1; //打开串口
}
}
}
void init() //串口寄存器的设置
{
TMOD=0x20; //设置定时器1的工作模式2
TH1=0xfd; //波特率初值
TL1=0xfd; //波特率初值
TR1=1; //打开定时器
REN=1; //串口允许位
SM0=0; //通过设置SM0和SM1定义串口工作方式1
SM1=1; //通过设置SM0和SM1定义串口工作方式1
EA=1; //打开总定时器
ES=1; //打开串口中断
ET1=0;
}
void ser() interrupt 4 //串口中断
{
RI=0; //关闭中断请求,软件把中断请求清零
a=SBUF; //A接收数据
P0=a; //让数码管显示收到的数据
flag=1; //标记位
}
首先你想法是不正确的,AD的值不能直接给数组(uchar a[8])应该先赋给一个变量AD_ DATA
发送应该是SBUF=AD_DATA ,这条语句是把AD变量的值赋给SBUF串口寄存器。
建议你先把串口调试出来在作其他的。
追问
我试过了,不是你说的那个缘故,我自己搞了一下可以实现数组的返回了,还是谢谢你哈
展开全部
/*********************************************************************************************************
** 函数名称: void USART_Handler(void)
** 功能描述: 串口中断处理
**
********************************************************************************************************/
void UART_IT_Handler (void) interrupt 4
{
unsigned char ch;
if (RI)
{
// if receiver interrupt
RI=0;
ch=SBUF;
// SBUF=ch; //for debug
G_UART_RX[g_uart_rxidx]=ch; // read character
g_uart_rxidx++;
if( (ch==';')||(g_uart_rxidx==UART_BUFF_LEN) )
{
gb_uart_received=1;
g_uart_rxidx=0;
}
}
if (TI ) //if transmitter interrupt
{
TI = 0; //clear interrupt request flag
gb_uart_busy=0; //uart is ready for transmitting
}
}
/*********************************************************************************************************
** 函数名称: void UART_Putc(unsigned char data)
** 功能描述: write a character to SBUF or transmission buffer
**
********************************************************************************************************/
void UART_Putc(unsigned char tx_data)
{
while(gb_uart_busy);
gb_uart_busy = 1;
SBUF = tx_data;
}
void UART_Puts(unsigned char *buf, unsigned char len)
{
unsigned char i;
for(i=0;i<len;i++)
{
UART_Putc(buf[i]);
// WDTRST=0x1E; // avoid watch dog work
// WDTRST=0xE1;
}
}
** 函数名称: void USART_Handler(void)
** 功能描述: 串口中断处理
**
********************************************************************************************************/
void UART_IT_Handler (void) interrupt 4
{
unsigned char ch;
if (RI)
{
// if receiver interrupt
RI=0;
ch=SBUF;
// SBUF=ch; //for debug
G_UART_RX[g_uart_rxidx]=ch; // read character
g_uart_rxidx++;
if( (ch==';')||(g_uart_rxidx==UART_BUFF_LEN) )
{
gb_uart_received=1;
g_uart_rxidx=0;
}
}
if (TI ) //if transmitter interrupt
{
TI = 0; //clear interrupt request flag
gb_uart_busy=0; //uart is ready for transmitting
}
}
/*********************************************************************************************************
** 函数名称: void UART_Putc(unsigned char data)
** 功能描述: write a character to SBUF or transmission buffer
**
********************************************************************************************************/
void UART_Putc(unsigned char tx_data)
{
while(gb_uart_busy);
gb_uart_busy = 1;
SBUF = tx_data;
}
void UART_Puts(unsigned char *buf, unsigned char len)
{
unsigned char i;
for(i=0;i<len;i++)
{
UART_Putc(buf[i]);
// WDTRST=0x1E; // avoid watch dog work
// WDTRST=0xE1;
}
}
追问
帅哥有QQ吗详聊看不懂这个程序
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询