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

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

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

shi = num % 100 / 10;

ge = num % 10;

dula = 1;

P0 = table[bai];

dula = 0;

P0 = 0xff;

wela = 1;

//为了节省IO端口,ADC0804的片选端CS连接U2锁存器的Q7输出端

//即位选时,P0的最高位需要为0

P0 = 0x7e;

wela = 0;

delayms(5);

dula = 1;

P0 = table[shi];

dula = 0;

P0 = 0xff;

wela = 1;

P0 = 0x7d;

wela = 0;

delayms(5);

dula = 1;

P0 = table[ge];

dula = 0;

P0 = 0xff;

wela = 1;

P0 = 0x7b;

wela = 0;

delayms(5);

}

uchar get_ad()

{

uchar adval;

adwr = 1;

_nop_();

adwr = 0; //启动AD转换

_nop_();

adwr = 1;

P1 = 0xff;

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;

}

2)法2

#include

#include

//中断允许寄存器IE,字节地址位0xA8

//单片机复位时, IE中所有位被清0

sfr IE = 0xA8;

//EA为全局中断允许位

//EA = 1时打开全局中断控制,在这样条件下,由各个中断控制位打开或关闭相应的中断

//EA = 0时关闭所有中断

sbit EA = IE^7;

//ET2为定时器/计数器2中断允许位

//ET2 = 1时打开T2中断, ET2 = 0时关闭T2中断

sbit ET2 = IE^5; //8052 only

//ES为串行口中断允许位

//ES = 1时打开串行口中断, ES = 0时关闭串行口中断

sbit ES = IE^4;

//ET1为定时器/计数器1中断允许位

//ET1 = 1时打开T1中断, ET1 = 0时关闭T1中断

sbit ET1 = IE^3;

//EX1为外部中断1中断允许位

//EX1 = 1时打开外部中断1中断, EX1 = 0时关闭外部中断1中断

sbit EX1 = IE^2;

//ET0为定时器/计数器0中断允许位

//ET0 = 1时打开T0中断, ET0 = 1时关闭T0中断

sbit ET0 = IE^1;

//EX0为外部中断0中断允许位

//EX0 = 1时打开外部中断0中断, EX0 = 0时关闭外部中断0中断

sbit EX0 = IE^0;

//SBUF为串行数据缓冲寄存器

//51单片机中含有两个SBUF,其中一个为发送缓冲寄存器,另一个为接收缓冲寄存器

//这两个寄存器共有一个地址0x99, 但物理上是两个独立的寄存器,有指令操作决定访问哪个寄存器

//执行写指令时, 访问串行发送寄存器, 执行读指令时, 访问串行接收寄存器

//接收器具有双缓冲结构, 即在从接收寄存器中读出前一个已收到的字节之前, 便能接受第二个字节

//如果第二个字节已经接收完毕,第一个字节还没有读出,则丢失其中一个字节

//对于发送器,数据由CPU控制和发送,所以不需要考虑

sfr SBUF = 0x99;

//SCON为串行口控制寄存器

//SCON可位寻址, 即可以访问它的具体某一位

//SCON用以设定串行口的工作方式, 接收/发送控制以及设置状态标志

//单片机复位时SCON全部被清0

sfr SCON = 0x98;

//SM0,SM1为工作方式选择位, 串行口有4中工作方式, 由SM0,SM1设定

//SM0=0,SM1=0为方式0,即同步移位寄存器方式,用于扩展I/O口

//SM0=0,SM1=1为方式1,即10位异步收发,含8位数据,波特率可变,且由定时器1的溢出率控制

//SM0=1,SM1=0为方式2,即11位异步收发,含9位数据,波特率固定

//SM0=1,SM1=1为方式3,即11位异步收发,含9位数据,波特率可变,且由定时器1的溢出率控制

sbit SM0 = SCON^7;

sbit SM1 = SCON^6;

//SM2为多机通信控制位,主要用于方式2和方式3

//当接收机的SM2=1时,可以利用收到的RB8来控制是否激活RI,即RB8=0时不激活RI,收到的信息丢弃

//RB8=1时收到的数据进入SBUF,并激活RI,进而在中断服务中将数据从SBUF读走

//当SM0=0时,不论收到的RB8是0还是1,均可以使收到

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

网站地图

Top