㈠ 求51单片机实现AD转换及串口数据发送的程序谢谢了!
#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}; //共阴数码管显示到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; //数码管第四位显示数据
}
}
㈡ 51的ad程序装到15单片机上不能用
单片机,板卡不同型号的产品,对应的是不同的设备引脚,如果想要51程序在
15w201s单片机
上运行,那么你要做的就是把51程序中所在的引脚给修改过来,
㈢ 51单片机与AD转换程序
/*
此程序通过对DAC0832操作,实现D/A转换。按INT1键DAC0832输出电压变高,按s3键DAC0832电压变低。
输出接口是"D/A OUT"
*/
#include<reg51.h>
//////////////////////
sbit le1=P1^0;/*ic1 74hc373使能端*/
sbit dac0832_cs=P3^7;
sbit dac0832_wr=P1^1;
sbit int1_k=P3^3;
sbit s3_k=P3^6;
sbit blight=P0^6;
void s_q00();
void s_q01();
void s_q02();
void s_q03();
void s_q04();
void s_q05();
void s_q06();
void s_q07();
void c_q00();
void c_q01();
void c_q02();
void c_q03();
void c_q04();
void c_q05();
void c_q06();
void c_q07();
//void delay1();
void delayms(unsigned int i);
void delay100us() ;
void initi_lcd();
void initi();
void c_rw();
void s_rw();
void c_e();
void s_e();
void c_rs(void);
void s_rs(void);
void display(unsigned int addr,char a);
void out_74ls164(unsigned char i);
unsigned char q1=0;
unsigned char da_out_74ls164=0,pwm1=0;
void d_to_a(unsigned char dat)//DAC0832写函数。
{
out_74ls164(dat);
//c_q14(); /*片选*/
dac0832_cs=0;
//c_q13(); /*写数据*/
//s_q13();
dac0832_wr=0;
dac0832_wr=1;
// s_q14();/*禁止转换*/
dac0832_cs=1;
}
main()
{
unsigned char dat=0;
initi_lcd();
display(0,'o');
display(1,'u');
display(2,'t');
display(3,'p');
display(4,'u');
display(5,'t');
display(6,':');
display(7,0x30+dat/100);display(8,0x30+dat%100/10);display(9,0x30+dat%10);
while(1)
{
if(int1_k==0) {dat++;display(7,0x30+dat/100);display(8,0x30+dat%100/10);display(9,0x30+dat%10);}
if(s3_k==0) {dat--;display(7,0x30+dat/100);display(8,0x30+dat%100/10);display(9,0x30+dat%10);}
blight=1;
d_to_a(dat);
delayms(60);
}
}
void display(unsigned int addr,char a)
{
s_e();
c_rs();
c_rw();
// P0=0x80+i;
out_74ls164(0x80+addr); /*写地址*/
c_e();
delay100us();
s_e();
s_rs();
//P0=a;
out_74ls164(a);/*写数据*/
c_e();
delay100us();
s_e();
}
void delayms(unsigned int i)
{
unsigned int j;
for(;i>0;i--)
for(j=100;j>0;j--);
}
void initi_lcd()
{
delayms(10);
c_rw();
s_e();
c_rs();
// P0=0x01;
out_74ls164(0x01);
c_e();
delayms(5);
s_e();
c_rs();
// P0=0x38;
out_74ls164(0x38);
c_e();
delayms(5);
s_e();
//P0=0x0f;
out_74ls164(0x0f);
c_e();
delayms(5);
s_e();
// P0=0x04;
out_74ls164(0x04);
c_e();
delayms(5);
s_e();
}
void out_74ls164(unsigned char i)
{
unsigned char j,i_tem;
// s_q27();
for(j=0;j<8;j++)
{
i_tem=i<<j;
if(i_tem&0x80)s_q01();/*74ls164数据*/
else c_q01();
c_q00();/*74ls164时钟*/
s_q00();
}
}
void s_rs(){s_q05();}
void c_rs(){c_q05();}
void s_rw(){s_q06();}
void c_rw(){c_q06();}
void s_e(){s_q07();}
void c_e(){c_q07();}
void delay100us() { unsigned int i=2; for(;i>0;i--); }
///////////////////////////////////////////////////////
//////////////////////////////////////////////////
/*74hc373扩展接口函数:s表示置1,c表示置0,q1表示ic1 74hc373 ,
q2表示ic2 74hc373 ,仅接着的数字表示相应输出Q的序号 */
void s_q00(){q1=q1|0x01; P0=q1; le1=1; le1=0; }
void s_q01(){q1=q1|0x02; P0=q1; le1=1; le1=0; }
void s_q02(){q1=q1|0x04; P0=q1; le1=1; le1=0; }
//void s_q03(){q1=q1|0x08; P0=q1; le1=1; le1=0; }
void s_q04(){q1=q1|0x10; P0=q1; le1=1; le1=0; }
void s_q05(){q1=q1|0x20; P0=q1; le1=1; le1=0; }
void s_q06(){q1=q1|0x40; P0=q1; le1=1; le1=0; }
void s_q07(){q1=q1|0x80; P0=q1; le1=1; le1=0; }
void c_q00(){q1=q1&(~0x01); P0=q1; le1=1; le1=0;}
void c_q01(){q1=q1&(~0x02); P0=q1; le1=1; le1=0;}
void c_q02(){q1=q1&(~0x04); P0=q1; le1=1; le1=0;}
//void c_q03(){q1=q1&(~0x08); P0=q1; le1=1; le1=0;}
void c_q04(){q1=q1&(~0x10); P0=q1; le1=1; le1=0;}
void c_q05(){q1=q1&(~0x20); P0=q1; le1=1; le1=0;}
void c_q06(){q1=q1&(~0x40); P0=q1; le1=1; le1=0;}
void c_q07(){q1=q1&(~0x80); P0=q1; le1=1; le1=0;}
一块实验板的例子,DA转换(DAC0832),自己详细分析一下就可以了
㈣ 求51单片机AD程序
如下程序是在
STC
官方网站
提供的。应该很有用。
////
//本示例在Keil开发环境下请选择Intel的8058芯片型号进行编译
//假定测试芯片的工作频率为18.432MHz
#include
"reg51.h"
#include
"intrins.h"
#define
FOSC
18432000L
#define
BAUD
9600
typedef
unsigned
char
BYTE;
typedef
unsigned
int
WORD;
#define
URMD
0
//0:使用定时器2作为波特率发生器
//1:使用定时器1的模式0(16位自动重载模式)作为波特率发生器
//2:使用定时器1的模式2(8位自动重载模式)作为波特率发生器
sfr
T2H
=
0xd6;
//定时器2高8位
sfr
T2L
=
0xd7;
//定时器2低8位
sfr
AUXR
=
0x8e;
//辅助寄存器
sfr
ADC_CONTR
=
0xBC;
//ADC控制寄存器
sfr
ADC_RES
=
0xBD;
//ADC高8位结果
sfr
ADC_LOW2
=
0xBE;
//ADC低2位结果
sfr
P1ASF
=
0x9D;
//P1口第2功能控制寄存器
#define
ADC_POWER
0x80
//ADC电源控制位
#define
ADC_FLAG
0x10
//ADC完成标志
#define
ADC_START
0x08
//ADC起始控制位
#define
ADC_SPEEDLL
0x00
//540个时钟
#define
ADC_SPEEDL
0x20
//360个时钟
#define
ADC_SPEEDH
0x40
//180个时钟
#define
ADC_SPEEDHH
0x60
//90个时钟
void
InitUart();
void
InitADC();
void
SendData(BYTE
dat);
BYTE
GetADCResult(BYTE
ch);
void
Delay(WORD
n);
void
ShowResult(BYTE
ch);
void
main()
{
InitUart();
//初始化串口
InitADC();
//初始化ADC
while
(1)
{
ShowResult(0);
//显示通道0
ShowResult(1);
//显示通道1
ShowResult(2);
//显示通道2
ShowResult(3);
//显示通道3
ShowResult(4);
//显示通道4
ShowResult(5);
//显示通道5
ShowResult(6);
//显示通道6
ShowResult(7);
//显示通道7
}
}
/*----------------------------
发送ADC结果到PC
----------------------------*/
void
ShowResult(BYTE
ch)
{
SendData(ch);
//显示通道号
SendData(GetADCResult(ch));
//显示ADC高8位结果
//
SendData(ADC_LOW2);
//显示低2位结果
}
/*----------------------------
读取ADC结果
----------------------------*/
BYTE
GetADCResult(BYTE
ch)
{
ADC_CONTR
=
ADC_POWER
|
ADC_SPEEDLL
|
ch
|
ADC_START;
_nop_();
//等待4个NOP
_nop_();
_nop_();
_nop_();
while
(!(ADC_CONTR
&
ADC_FLAG));//等待ADC转换完成
ADC_CONTR
&=
~ADC_FLAG;
//Close
ADC
return
ADC_RES;
//返回ADC结果
}
/*----------------------------
初始化串口
----------------------------*/
void
InitUart()
{
SCON
=
0x5a;
//设置串口为8位可变波特率
#if
URMD
==
0
T2L
=
0xd8;
//设置波特率重装值
T2H
=
0xff;
//115200
bps(65536-18432000/4/115200)
AUXR
=
0x14;
//T2为1T模式,
并启动定时器2
AUXR
|=
0x01;
//选择定时器2为串口1的波特率发生器
#elif
URMD
==
1
AUXR
=
0x40;
//定时器1为1T模式
TMOD
=
0x00;
//定时器1为模式0(16位自动重载)
TL1
=
0xd8;
//设置波特率重装值
TH1
=
0xff;
//115200
bps(65536-18432000/4/115200)
TR1
=
1;
//定时器1开始启动
#else
TMOD
=
0x20;
//设置定时器1为8位自动重装载模式
AUXR
=
0x40;
//定时器1为1T模式
TH1
=
TL1
=
0xfb;
//115200
bps(256
-
18432000/32/115200)
TR1
=
1;
#endif
}
/*----------------------------
初始化ADC
----------------------------*/
void
InitADC()
{
P1ASF
=
0xff;
//设置P1口为AD口
ADC_RES
=
0;
//清除结果寄存器
ADC_CONTR
=
ADC_POWER
|
ADC_SPEEDLL;
Delay(2);
//ADC上电并延时
}
/*----------------------------
发送串口数据
----------------------------*/
void
SendData(BYTE
dat)
{
while
(!TI);
//等待前一个数据发送完成
TI
=
0;
//清除发送标志
SBUF
=
dat;
//发送当前数据
}
/*----------------------------
软件延时
----------------------------*/
void
Delay(WORD
n)
{
WORD
x;
while
(n--)
{
x
=
5000;
while
(x--);
}
}