请大神帮忙编写一个单片机C语言程序,串行通信的。 20

我用AD芯片采集了电压数据保存到uchara[8]字符数组里面,要求串口助手发送一个“DATA?”字符串,然后单片机啊把a[8]里的电压数据发送给串口助手,... 我用AD芯片采集了电压数据保存到uchar a[8]字符数组里面,要求串口助手发送一个“DATA?”字符串,然后单片机啊把a[8]里的电压数据发送给串口助手, 展开
 我来答
SHUZILEIDA
2013-11-09 · TA获得超过256个赞
知道小有建树答主
回答量:466
采纳率:0%
帮助的人:254万
展开全部
这是基于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串口寄存器。
建议你先把串口调试出来在作其他的。
追问
我试过了,不是你说的那个缘故,我自己搞了一下可以实现数组的返回了,还是谢谢你哈
常乐常知足
2013-11-09 · TA获得超过1152个赞
知道小有建树答主
回答量:702
采纳率:66%
帮助的人:190万
展开全部
/*********************************************************************************************************
** 函数名称: 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吗详聊看不懂这个程序
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式