标题:
stc15单片机AD转换设计并进行串口通信源程序
[打印本页]
作者:
lcx187
时间:
2019-1-2 22:34
标题:
stc15单片机AD转换设计并进行串口通信源程序
基于stc15系列单片机 AD转换设计并进行串口通信源程序
单片机源程序如下:
#include<STC15.h>
#include<intrins.h>
#define BYTE unsigned char
#define WORD unsigned int
#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 delay(WORD i); //数码管延时函数
void lintADC(); //ADC特殊功能寄存器初始化
BYTE GetADCResult(BYTE ch) ; //ADC结果返回函数
void InitUart(); //串口初始化
void SendData(BYTE dat); //串口发送
void Time(); //定时器初始化
float num;
bit p=1,p1=1;
WORD a0,a1,a2,a3,a4,a5,a6,a7,j=0,i,k=0,sum=0,n=0,RESULT,RESULT1;
BYTE code AA[]={0x80,0xE5,0x28,0x24,0x45,0x82}; //0.~4.字形码
BYTE code BB[]={0x82,0xE7,0x2A,0x26,0x47,0x16,0x12,0xA7,0x02,0x06}; //0~9字形码
BYTE code CC[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39}; //0~9 ASCII码
/*~~~~~~~~~~~~~~~主函数~~~~~~~~~~~~~~~*/
void main()
{
lintADC(); //ADC特殊功能寄存器初始化
InitUart(); //串口初始化
//P3=0xff;
Time(); //定时器初始化
while(1)
{
if(n==100)
{
GetADCResult(7);}
switch(j)
{
case 1: // 判断j是否为1
{
P37=0;
P2=AA[a0];
}break;
case 2: // 判断j是否为2
{
P2=0xff;
P37=1;
} break;
case 3: // 判断j是否为3
{
P36=0;
P2=BB[a1];
} break;
case 4: // 判断j是否为4
{ P2=0xff;
P36=1;
} break;
case 5: // 判断j是否为5
{
P35=0;
P2=BB[a2];
/* if(SBUF==2)
{ if(0<i&&i<1000)
{
GetADCResult(7);
if(SBUF==1|SBUF==2)
{
a4=CC[a0];
a5=CC[a1];
a6=CC[a2];
a7=CC[a3];
SendData(a4);
SendData(0x2e);
SendData(a5);
SendData(a6);
SendData(a7);
SendData(0x20);
}
}
} */
} break;
case 6: // 判断j是否为6
{ P2=0xff;
P35=1;
} break;
case 7: // 判断j是否为7
{
P34=0;
P2=BB[a3];
} break;
case 8: // 判断j是否为8
{ P2=0xff;
P34=1;
} break;
case 10: // 判断j是否为10
{/* if(0<i&&i<1000)
{
// GetADCResult(7); //返回通道1 ADC结果
if(SBUF==1|SBUF==2)
{
a4=CC[a0]; //发送电压值
a5=CC[a1];
a6=CC[a2];
a7=CC[a3];
SendData(a4);
SendData(0x2e);
SendData(a5);
SendData(a6);
SendData(a7);
SendData(0x20);
}
} */
} break;
}
}
}
void lintADC()
{
P1ASF=0xff; //选择P1口作为AD转换口
ADC_RES=0;
ADC_RESL=0;
ADC_CONTR = ADC_POWER | ADC_SPEEDLL;
delay(10);
}
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
RESULT=ADC_RES;
RESULT=RESULT<<2;
RESULT1=ADC_RESL;
RESULT=(RESULT|RESULT1);
return RESULT; //返回ADC结果
}
void delay(unsigned int i)
{
unsigned int m,n;
for(m=i;m>0;m--)
for(n=90;n>0;n--);
}
void SendData(BYTE dat)
{ SBUF = dat; //发送当前数据
while (!TI); //等待前一个数据发送完成
TI = 0; //清除发送标志
}
void InitUart()
{
AUXR=(AUXR|0x11); //定时器2作为串口波特率发生器
T2H=0xFF; //波特率为115200
T2L=0xFE;
SCON = 0x50;
}
void Time()
{
AUXR=AUXR&0x3f;
TMOD=0x00; //定时器T0,T1选择方式0
TH0=0xFC; //定时器T0定时1ms
TL0=0x66;
EA=1;
ET0=1;
TR0=1;
}
timer2()interrupt 1
{ n++;
j++;
i++;
if(i==2000)
i=0;
if(j==11)
j=0;
if(n==101)
n=0;
num=RESULT/1024.0*5; //计算电压值
a0=(int)num;
a1=(int)(num*10);
a1=a1%10;
a2=(int)(num*100);
a2=a2%10;
a3=(int)(num*1000);
a3=a3%10;
}
复制代码
所有资料51hei提供下载:
AD转换.zip
(8.72 KB, 下载次数: 42)
2019-1-2 22:33 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
sdsslh
时间:
2019-6-20 16:49
谢谢楼主的分享。。。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1