基于STC15单片机两路ADC测量串口显示-proteus仿真-源程序

一、系统方案
1、本设计采用STC15单片机作为主控器。
2、两路ADC测量值送到串口显示。
基于STC15单片机两路ADC测量串口显示-proteus仿真-源程序_第1张图片

二、硬件设计
原理图如下:
基于STC15单片机两路ADC测量串口显示-proteus仿真-源程序_第2张图片

三、单片机软件设计
1、首先是系统初始化
/----------------------------
初始化串口
----------------------------
/
void InitUart()
{
// ACC = P_SW1;
// ACC &= ~(S1_S0 | S1_S1); //S1_S0=0 S1_S1=0
// P_SW1 = ACC; //(P3.0/RxD, P3.1/TxD)

// ACC = P_SW1;
// ACC &= ~(S1_S0 | S1_S1); //S1_S0=1 S1_S1=0
// ACC |= S1_S0; //(P3.6/RxD_2, P3.7/TxD_2)
// P_SW1 = ACC;
//
// ACC = P_SW1;
// ACC &= ~(S1_S0 | S1_S1); //S1_S0=0 S1_S1=1
// ACC |= S1_S1; //(P1.6/RxD_3, P1.7/TxD_3)
// P_SW1 = ACC;

#if (PARITYBIT == NONE_PARITY)
SCON = 0x50; //8位可变波特率
#elif (PARITYBIT == ODD_PARITY) || (PARITYBIT == EVEN_PARITY) || (PARITYBIT == MARK_PARITY)
SCON = 0xda; //9位可变波特率,校验位初始为1
#elif (PARITYBIT == SPACE_PARITY)
SCON = 0xd2; //9位可变波特率,校验位初始为0
#endif

AUXR = 0x40;                //定时器1为1T模式
TMOD = 0x00;                //定时器1为模式0(16位自动重载)
TL1 = (65536 - (FOSC/4/BAUD));   //设置波特率重装值
TH1 = (65536 - (FOSC/4/BAUD))>>8;
TR1 = 1;                    //定时器1开始启动
ES = 1;                     //使能串口中断
EA = 1;

// SCON = 0x5a; //设置串口为8位可变波特率
//#if URMD == 0
// T2L = (65536 - (FOSC/4/BAUD));
// T2H = (65536 - (FOSC/4/BAUD)) >> 8;
// AUXR = 0x14; //T2为1T模式, 并启动定时器2
// AUXR |= 0x01; //选择定时器2为串口1的波特率发生器
//#elif URMD == 1
// AUXR = 0x40; //定时器1为1T模式
// TMOD = 0x00; //定时器1为模式0(16位自动重载)
// TL1 = (65536 - (FOSC/4/BAUD));
// TH1 = (65536 - (FOSC/4/BAUD)) >> 8;
// TR1 = 1; //定时器1开始启动
//#else
// TMOD = 0x20; //设置定时器1为8位自动重装载模式
// AUXR = 0x40; //定时器1为1T模式
// TH1 = TL1 = (256 - (FOSC/32/BAUD));
// TR1 = 1;
//#endif
}
2、串口显示程序

/----------------------------
发送串口数据
----------------------------
/
void SendData(BYTE dat)
{
while (busy); //等待前面的数据发送完成
ACC = dat; //获取校验位P (PSW.0)
// if § //根据P来设置校验位
// {
//#if (PARITYBIT == ODD_PARITY)
// TB8 = 0; //设置校验位为0
//#elif (PARITYBIT == EVEN_PARITY)
// TB8 = 1; //设置校验位为1
//#endif
// }
// else
// {
//#if (PARITYBIT == ODD_PARITY)
// TB8 = 1; //设置校验位为1
//#elif (PARITYBIT == EVEN_PARITY)
// TB8 = 0; //设置校验位为0
//#endif
// }
busy = 1;
SBUF = ACC; //写数据到UART数据寄存器
}

/----------------------------
发送字符串
----------------------------
/
void SendString(char *s)
{
// EA = 0 ;
// ES = 0 ;
while (*s) //检测字符串结束标志
{
SendData(*s++); //发送当前字符
}
// EA = 1 ;
// ES = 1 ;
}
void serial_put_uint(unsigned int number)
{
unsigned int i;
unsigned int nTmp;
// *s++ =num/10 +‘0’;
//*s++=num%10 +‘0’;
//*s =0;

 //感觉这写法怪怪的吗?干嘛不for(i=1;i<5;i++) 因为这样不需要使用库函数pow()
 for(i=10000;i>=1;i=i/10)
  {
        nTmp = number/i;
					if(nTmp >=1 ) SendData((unsigned char)(nTmp%10 + 0x30));
  }

}

3、核心算法程序

/----------------------------
初始化ADC
----------------------------
/
void InitADC()
{
P1M0 =1;
P1M1 =0;
P1 = 0Xff;
P1ASF = 0xff; //设置P1口为AD口
ADC_RES = 0; //清除结果寄存器
ADC_RESL = 0; //清除结果寄存器
ADC_CONTR = ADC_POWER | ADC_SPEEDLL;
Delay(2); //ADC上电并延时
}

/----------------------------
读取ADC结果 20210101 注释GetADCResult 用GetADCResultint代替
----------------------------
/

unsigned int GetADCResultint(BYTE ch)
{
unsigned int ret=0;
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
ret = ADC_RES*4 + ADC_RESL;
return ret; //返回ADC结果
}

四、 proteus仿真设计
Proteus软件是一款应用比较广泛的工具,它可以在没有硬件平台的基础上通过自身的软件仿真出硬件平台的运行情况,这样就可以通过软件仿真来验证我们设计的方案有没有问题,如果有问题,可以重新选择器件,连接器件,直到达到我们设定的目的,避免我们搭建实物的时候,如果当初选择的方案有问题,我们器件都已经焊接好了,再去卸载下去,再去焊接新的方案的器件,测试,这样会浪费人力和物力,也给开发者带来一定困惑,Proteus仿真软件就很好的解决这个问题,我们在设计之初,就使用该软件进行模拟仿真,测试,选择满足我们设计的最优方案。最后根据测试没问题的仿真图纸,焊接实物,调试,最终完成本设计的作品。
基于STC15单片机两路ADC测量串口显示-proteus仿真-源程序_第3张图片

你可能感兴趣的:(单片机,proteus,嵌入式硬件)