电路图,想要通过采集外部电压信号,通过A/D转换PCF8591,传输到单片机,再通过串口连接计算机并显示波形
电路图如上图,想要通过采集外部电压信号,通过A/D转换PCF8591,传输到单片机AT89C52,再通过串口连接计算机,在计算机上显示波形,下位机用keil调试单片机程序...
电路图如上图,想要通过采集外部电压信号,通过A/D转换PCF8591,传输到单片机AT89C52,再通过串口连接计算机,在计算机上显示波形,下位机用keil调试单片机程序,上位机用VB做计算机上显示波形的程序,求大神指导程序怎么编写啊??邮箱1360250493@qq.com,实在不会呀,急急求指导求指导!!!
展开
2个回答
展开全部
上位机的程序我倒是有一个,但我的采集用的是单片机STC12C5A32S2,机内部AD,
我编程序思路:单片机连续采集一批量数据,当然采集周期应该可以调整,然后发往上位机
采集时候不发送,发送时候不采集 上位机也是 接收数据时什么也不作,数据接收完了才画图
这样不会丢失数据
虽然数据是间断的,但波形是连续的 虽然一帧与一帧之间是断续的,但1秒也更新几幅画面,所以也算是实时的
上位机和单片机和程序都比较长,只帖出关键部分
上位机画图程序如下: inbuff是接收到的数据
'画方格网
For i = 0 To 40 Step 1 '画横线
y1 = 100 + i * 200
Picture1.Line (60, y1)-Step(10240, 0), QBColor(6) '黄色
Next i
For i = 1 To 52 Step 1 '画竖线
x1 = 60 + i * 200
Picture1.Line (x1, 100)-Step(0, 8000), QBColor(6) '黄色
Next i
Picture1.Line (60, 4100)-(10500, 4100), QBColor(9) '原点至X轴终点 蓝色
Picture1.Line -Step(-150, -40), QBColor(9) '箭头
Picture1.Line (10500, 8100)-Step(--150, 40), QBColor(9) '箭头
Picture1.Line (60, 8100)-(60, 0), QBColor(9) 'Y轴最下端至最上端终点
Picture1.Line -Step(-40, 100), QBColor(9) '箭头
Picture1.Line (60, 0)-Step(40, 100), QBColor(9) '箭头
'写横坐标
Picture1.PSet (10150, 3900)
Picture1.Print "t "
Picture1.PSet (10120, 4080)
Picture1.Print "(ms)"
'写纵坐标
Picture1.PSet (100, 0)
Picture1.Print "V "
'根据两点连线原理画波形
For i = 0 To (ll - 1)
VV1 = inbuff(i)
X(i) = x0 + i * 100
y(i) = y0 - 4000 * VV1 / 256
X(i + 1) = x0 + (i + 1) * 100
VV2 = inbuff(i + 1)
y(i + 1) = y0 - 4000 * VV2 / 256
Picture1.DrawWidth = 2
Picture1.Line (X(i), y(i))-(X(i + 1), y(i + 1)), QBColor(11) '青色
Next i
TX-1C实验板上单片机主程序如下:其中KEY的值是用来调采集的延时时间的,以适应不同的频率,画图是在12864上的,可以不要
Lcd_inital(); //LCD初始化
initscom(); //串口初始化
diola=1;//关闭数码管
while(key==16){keyscan();}//等待按键按下
switch(key)
{
case 0:m=9;led2=0;break;
case 1:m=27;led3=0;break;
case 2:m=61;led4=0;break;
case 4:m=166;led5=0;break;
default:break;
}
while(1)
{
CollectorDot();//采集256个数据
Clear(); //清屏
drawpicture(); //画图
TR1=1;
for(i=0;i<256;i++)
{
send(tempdate[i]);//发往上位机
}
TR1=0;
Delay_500MS( );//这个时间并非500ms, 在100-500内调整,虽然上位机处理很快,
//但也要一定时间,另外若刷新太快,图形会闪烁
//对于低频,采集256个数据的时间较长,这个时间间隔可短一些
}
我编程序思路:单片机连续采集一批量数据,当然采集周期应该可以调整,然后发往上位机
采集时候不发送,发送时候不采集 上位机也是 接收数据时什么也不作,数据接收完了才画图
这样不会丢失数据
虽然数据是间断的,但波形是连续的 虽然一帧与一帧之间是断续的,但1秒也更新几幅画面,所以也算是实时的
上位机和单片机和程序都比较长,只帖出关键部分
上位机画图程序如下: inbuff是接收到的数据
'画方格网
For i = 0 To 40 Step 1 '画横线
y1 = 100 + i * 200
Picture1.Line (60, y1)-Step(10240, 0), QBColor(6) '黄色
Next i
For i = 1 To 52 Step 1 '画竖线
x1 = 60 + i * 200
Picture1.Line (x1, 100)-Step(0, 8000), QBColor(6) '黄色
Next i
Picture1.Line (60, 4100)-(10500, 4100), QBColor(9) '原点至X轴终点 蓝色
Picture1.Line -Step(-150, -40), QBColor(9) '箭头
Picture1.Line (10500, 8100)-Step(--150, 40), QBColor(9) '箭头
Picture1.Line (60, 8100)-(60, 0), QBColor(9) 'Y轴最下端至最上端终点
Picture1.Line -Step(-40, 100), QBColor(9) '箭头
Picture1.Line (60, 0)-Step(40, 100), QBColor(9) '箭头
'写横坐标
Picture1.PSet (10150, 3900)
Picture1.Print "t "
Picture1.PSet (10120, 4080)
Picture1.Print "(ms)"
'写纵坐标
Picture1.PSet (100, 0)
Picture1.Print "V "
'根据两点连线原理画波形
For i = 0 To (ll - 1)
VV1 = inbuff(i)
X(i) = x0 + i * 100
y(i) = y0 - 4000 * VV1 / 256
X(i + 1) = x0 + (i + 1) * 100
VV2 = inbuff(i + 1)
y(i + 1) = y0 - 4000 * VV2 / 256
Picture1.DrawWidth = 2
Picture1.Line (X(i), y(i))-(X(i + 1), y(i + 1)), QBColor(11) '青色
Next i
TX-1C实验板上单片机主程序如下:其中KEY的值是用来调采集的延时时间的,以适应不同的频率,画图是在12864上的,可以不要
Lcd_inital(); //LCD初始化
initscom(); //串口初始化
diola=1;//关闭数码管
while(key==16){keyscan();}//等待按键按下
switch(key)
{
case 0:m=9;led2=0;break;
case 1:m=27;led3=0;break;
case 2:m=61;led4=0;break;
case 4:m=166;led5=0;break;
default:break;
}
while(1)
{
CollectorDot();//采集256个数据
Clear(); //清屏
drawpicture(); //画图
TR1=1;
for(i=0;i<256;i++)
{
send(tempdate[i]);//发往上位机
}
TR1=0;
Delay_500MS( );//这个时间并非500ms, 在100-500内调整,虽然上位机处理很快,
//但也要一定时间,另外若刷新太快,图形会闪烁
//对于低频,采集256个数据的时间较长,这个时间间隔可短一些
}
追问
恩恩,谢谢你,感觉有点儿眉目了,我再消化消化。还有一点不明白,那个波形是在VB中写完程序,运行后就直接显示的吗?不用再 有别的操作了吧?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询