在前一篇文章的基础上,增加了串口传输,将电压读数传送到PC机。
而且在参考了文章:
添加链接描述
后知道printf函数是调用putchar函数输入的,而putchar应该是先判断ti是否为1,不为1则等待为1。 如果为1则清0,然后送出一个字符。因此 你如果直接使用printf函数,你的程序就会在putchar函数中等待ti为1。
在此基础上,重新修改代码:
#include<reg51.h>
#include<absacc.h>
#include<stdio.h>
#define adr XBYTE[0x7ff8]
#define uchar unsigned char
#define uint unsigned int
uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//数码管0~9
void delay(uchar k)//延时程序
{
uchar l;
while(k>0)
{
for(l=0;l<100;l++);
k--;
}
}
void Init_Serial(void)
{
SCON = 0x50; // 串口工作方式 1
TMOD = (TMOD&0x0F)|0x20; // 选择定时器 1 方式 2
PCON = 0x80; // 波特率倍增
TH1 = 0xFD; // 计数初值, 19200bps
TL1 = 0xFD;
TR1 = 1; // 启动定时器 1
ES = 0;
}
void main()
{
IT1 = 1;//电平跳跃触发
EA = 1;
EX1 = 1;//开中断
adr = 0x00;//启动A/D转换
Init_Serial();//定时器初始化
TI = 1;
while(1);//等待中断
}
extern1 () interrupt 2//外部中断1中断函数
{
uchar i;
uint result;
result = adr;//采样得到数据赋给result
result = result*19.61;//5000/255=19.61,将数字量转化为模拟量电压
printf("电压值 = %.3f",result/1000.0);
for(i=0;i<4;i++)
{
switch(i)
{
case 0:P2 = 0x0e;P1 = table[result/1000]|0x80;break;//取第一位
case 1:P2 = 0x0d;P1 = table[result%1000/100];break;//取第二位
case 2:P2 = 0x0b;P1 = table[result%100/10];break;//取第三位
case 3:P2 = 0x07;P1 = table[result%10];break;//取第四位
}
delay(10);
P2 = 0xff;//熄灭数码管
}
adr = 0x00;
}
效果演示:
但是仍有许多未解决的问题,
比如串口输出时数据的不连续,还有就是既然putchar函数输出一个字符后就将TI置0了,为什么后面还可以接着输出,这是我现在无法理解的。