求51单片机实现AD转换及串口数据发送的程序?谢谢了!
3个回答
展开全部
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar A1,A2,A3,A4;
sbit wr=P3^7;
sbit rd=P3^6;
sbit cs=P3^5;
sbit dian=P0^7;
uchar code tab[]={ 0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共阴数码管显示0到9的代码
void delay(uint z) //延时函数
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void display(uchar A1,uchar A2,uchar A3,uchar A4)//显示函数
{
P0=tab[A1];
P2=0x7f;
delay(1);
P0=tab[A2];
dian=1;
P2=0xbf;
delay(1);
P0=tab[A3];
P2=0xdf;
delay(1);
P0=tab[A4];
P2=0xef;
delay(1);
}
void main()
{ uchar a;
uint temp=0,sum=0;
P3=0xdf;//令AD 片选CS一直为选通状态
P1=0xff;
while(1)
{
for(a=255;a>0;a--)
{
display(A1,A2,A3,A4);
}
wr=1;
_nop_();
wr=0;
_nop_();
wr=1;
_nop_();
rd=1;
_nop_();
rd=0;
_nop_();
temp=P1;
rd=1;
temp=(temp*100*0.01961);//8位的ADC0804的分辨率为1/256,5x1/255=0.01961;
A1=temp/1000; // 数码管第一位显示数据
A2=temp%1000/100; // 数码管第二位显示数据
A3=temp%1000%100/10;//数码管第三位显示数据
A4=temp%1000%100%10; //数码管第四位显示数据
}
}
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar A1,A2,A3,A4;
sbit wr=P3^7;
sbit rd=P3^6;
sbit cs=P3^5;
sbit dian=P0^7;
uchar code tab[]={ 0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共阴数码管显示0到9的代码
void delay(uint z) //延时函数
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void display(uchar A1,uchar A2,uchar A3,uchar A4)//显示函数
{
P0=tab[A1];
P2=0x7f;
delay(1);
P0=tab[A2];
dian=1;
P2=0xbf;
delay(1);
P0=tab[A3];
P2=0xdf;
delay(1);
P0=tab[A4];
P2=0xef;
delay(1);
}
void main()
{ uchar a;
uint temp=0,sum=0;
P3=0xdf;//令AD 片选CS一直为选通状态
P1=0xff;
while(1)
{
for(a=255;a>0;a--)
{
display(A1,A2,A3,A4);
}
wr=1;
_nop_();
wr=0;
_nop_();
wr=1;
_nop_();
rd=1;
_nop_();
rd=0;
_nop_();
temp=P1;
rd=1;
temp=(temp*100*0.01961);//8位的ADC0804的分辨率为1/256,5x1/255=0.01961;
A1=temp/1000; // 数码管第一位显示数据
A2=temp%1000/100; // 数码管第二位显示数据
A3=temp%1000%100/10;//数码管第三位显示数据
A4=temp%1000%100%10; //数码管第四位显示数据
}
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你按照AD的数据手册些时序就好了,AD不难,
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
单片机需要具体的型号吗?
更多追问追答
追问
就51单片机呀
追答
那需要外部加一个AD转换器,我就51的串口程序先给你。等你吧AD的型号定下来了,我在帮你解决。
#include
#include
typedef unsigned char uchar;
typedef unsigned int uint;
//-----串口接收数据
uchar ReData=0;
/***************************************************
** 函数名称: UART_Init
** 功能描述: 串口初始化
** 输 入: 无
** 输 出: 无
** 说 明: N,8,1,9600
****************************************************/
void UART_Init(void)
{
TMOD|=0x20; //定时器T1的工作方式2,8位初值自动重新装入的8位定时器
TH1=0XFA; //定时器重装值
TL1=0XFA; //定时器初值
TR1=1; //启动定时器
SM1=1; //串行口的工作方式1,10位异步收发器(8位数据)
SM0=0; //方式一的波特率=(2SMOD/32)* (T1溢出率)
REN=1; //允许串行接收位
ES=1; //启动串行中断(发送后和接收后都进入interrupt4中断)
EA=1; //总中断打开
}
/***************************************************
** 函数名称: UART_Send_Byte
** 功能描述: 串口发送函数
** 输 入: 发送的数据
** 输 出: 无
** 说 明: 无
****************************************************/
void UART_Send_Byte(uchar R_Byte)
{
SBUF = R_Byte;
while(TI==0); //查询法
TI=0;
}
/***************************************************
** 函数名称: main
** 功能描述: 主函数
** 输 入: 无
** 输 出: 无
** 说 明: 无
****************************************************/
void main(void)
{
uint number;
UART_Init();
for(;;)
{
//串口初始化完成,这里添加你的程序
}
}
/***************************************************
** 函数名称: UART_Interrupt
** 功能描述: 串口中断服务函数
** 输 入: 无
** 输 出: 无
** 说 明: 发送完成和接受数据都要进入中断
****************************************************/
void UART_Interrupt(void) interrupt 4
{
if(RI==1) //RI接受中断标志
{
RI = 0; //清除RI接受中断标志
ReData = SBUF; //SUBF接受/发送缓冲器 '
}
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询