微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 串行口通信 单片机在数码管显示AD采集值

串行口通信 单片机在数码管显示AD采集值

时间:11-22 来源:互联网 点击:

//在/RD至少经过tACC时间后,数字输出口上的数据达到稳定状态,此时直接读取数字输出端口

//数据便可得到转换后的数字信号,读走数据后,马上将/RD拉高,

//RD置低tR1时间后,/INTR自动拉高,

adrd = 1;

_nop_();

adrd = 0; //AD读使能

_nop_();

adval = P1; //AD数据读赋给P1

adrd = 1;

return adval;

}

void timer0() interrupt 1

{

TH0 = (65536 - 50000) / 256;

TL0 = (65536 - 50000) % 256;

t0_num++;

if (t0_num == 20)

{

t0_num = 0;

flag_time = 1; //flag_time置1,便于主程序检测是否到1s

}

}

void ser() interrupt 4

{

//RI为接收中断标志位, 在方式0时, 当串行接收第8位数据结束时, 或在其他方式, 串行接收停止位的

//中间时, 由内部硬件使RI置1, 向CPU发出中断申请, 也必须在中断服务程序中, 用软件将其清0,取消

//此中断申请, 以方便下一次中断申请检测, 即这样才能产生下一次中断.

//这里RI清0, 因为程序既然产生了串口中断, 肯定是收到或发送了数据, 在开始时没有发送任何数据

//那必然是收到了数据, 此时RI会被硬件置1, 所以进入串口中断服务程序后必须由软件清0, 这样才能

//产生下一次中断.

RI = 0;

//将SBUF中的数据读走给a, 这是此中断服务程序最重要的目的

a = SBUF;

//将串口中断标志位设置为1,便于主程序检测

flag_uart = 1;

if (a == 1)

flag_on = 0;

else if (a == 2)

flag_on = 1;

else

flag_on = 2;

}

三. 程序小结

1) 串口初始化中先设定串口模式, 再容许串口接收,即顺序是SM0 = 0;SM1 = 1;REN=1;(这三位都在串口控制寄存器SCON里)

这样做的原因是单片机刚上电时SCON被清0,因为串口方式为方式0,串行口为同步移位寄存器的输入输出方式,当执行完REN为1的

语句后,直接从RXD接收数据,不管连接的系统有无发送数据.把REN放在模式设置的后面可以避免串口模式还未设置下就读取数据.

2) 调用printf()或者puts()前需要手动将TI置1, 因为这两个函数需要对TI进行检测, 以代表是否发送完毕.

3) 调用printf()或者puts()前还需要手动关闭串口中断(ES = 0).如不关闭串口中断,每发送一个字节,程序就会申请加入串口中断,从而导致程序出错.

4) ad_val * 5.0/256.0可以得到浮点数表示的AD实际采集到的电压标准值.

5) 如果要程序接受十六进制的01或者字符格式的1, 那么需要将串口中断子程序中的if(a == 1)改成if(a == 1 || a == 1),

02, 03类似.


Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top