增加串口传输的简易电压测量装置

在前一篇文章的基础上,增加了串口传输,将电压读数传送到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了,为什么后面还可以接着输出,这是我现在无法理解的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值