想做一个简易数据收集卡。包括一个TLC1543(10位串行AD转化),一个51单片机以及其他一些小零件。关键是运用串行通讯发送给核算机。由于我没有根底,是通过做这个规划来学习单片机的,所以对成果的意料缺乏。在我花费了很长时刻做,到现在挨近结尾时发现,要走自定协议的话51串行通讯的速度跟不上!!
以下是我做过的两个通讯测验试验:
(1)不运用协议
我正确地把AD转化器与单片机相连,收集一个电压(例如3.2V)。我的程序大约如下:
while(1)
{
TLC1543();
sent();
}
TLC1543是10位转化器,所以要用2个字节来保存。但我只发送高8位给核算机。
通过LabVIEW做的小程序把转化的十六进制通过必定算法转化为相应电压值后发现底子坚持一条直线(如收集3.2V时,在3.0~3.4间动摇)。
这个成果让我适当满足,心想只要把协议加上就功德圆满。
(2)运用协议。
我自己界说了一些握手信号,规划了一个不太谨慎的协议。
假定:
发A,回来数据a
发B,回来数据b
发C,回来数据c
这次试验就连AD转化也没用,直接界说单片机接纳一个值(A),回来对应值(a)。
但是我在运用串口帮手调试时却发现这样一个问题:我运用“主动发送”给单片机发A,单片机底子无法及时回来(没有AD转化,我的程序已满足精简)。举个比如,串口帮手提示发送500个数据时,或许只收到300个数据。我测验把发送周期改大,丢掉的数据少了,但仍然无法做到一发一收!何况,在50ms的发送周期仍然有数据丢掉的情况下,即便能正确收发,如此低的采样频率实用价值也不大。
这样的成果导致我无法增加通讯协议,只能用while循环不断给核算机发送数据。尽管必定情况下也可以显示出大约的波形,但这样一来,底子无从得知,也无从设置采样频率。而过低的采样频率就只能测一些与时刻关系不大的目标。
由于根底差,我不很自傲,我置疑是不是有哪一个过程出错了,所以上来发帖讨教各位教师,望点拨。以下贴出我第2个试验的代码:
#include
unsigned char flag;
unsigned char RX;
uint i,j;
void preset();
void sent(uint TX);
void main()
{
preset();
flag=0;
while(1)
{
}
}
//串口通讯预设
void preset()
{
//设置计时器
TMOD=0x20;
TR1=1;
TH1=0xfd;
TL1=0xfd;
EA=1;
//设置通讯形式
SM0=0;
SM1=1;
REN=1;
ES=1;
}
//发送串口值
void sent(uint TX)
{
{
}
}
//串口接纳
void receive() interrupt 4
{
flag=1;
RX=SBUF;
RI=0;
}