基于STC15w单片机系列 自带的AD转换程序

2020-02-17来源: 51hei关键字:STC15w  单片机系列  AD转换

15W系列是目前51单片机里面可用资源较多的处理器。一般的设计都可以用,本次分享下利用单片机自带的AD转换座一个数字电压表。显示用的LCD1602


单片机源程序如下:

#include<15w.H>

#include

#include

#include

#include

#define uchar unsigned char

#define uint unsigned int


typedef unsigned int WORD;


#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个时钟

unsigned char ch = 0;                        //ADC通道号


int time;

int time1;

int time2;

float p;


sbit RS = P5^5;   //定义端口 

sbit RW = P5^4;

sbit EN = P5^3;

sbit pwm=P2^7;

sbit key1 = P2^0;

sbit key2=P2^1;

sbit led=P5^1;

unsigned char ti[]={'0','1',0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};

/*------------------------------------------------

uS延时函数,含有输入参数 unsigned char t,无返回值

unsigned char 是定义无符号字符变量,其值的范围是

0~255 这里使用晶振12M,精确延时请使用汇编,大致延时

长度如下 T=tx2+5 uS 

------------------------------------------------*/

void DelayUs2x(unsigned char t)

{   

while(--t);

}

/*------------------------------------------------

mS延时函数,含有输入参数 unsigned char t,无返回值

unsigned char 是定义无符号字符变量,其值的范围是

0~255 这里使用晶振12M,精确延时请使用汇编

------------------------------------------------*/

void DelayMs(unsigned char t)

{

     

while(t--)

{

     //大致延时1mS

     DelayUs2x(245);

         DelayUs2x(245);

}

}

/*------------------------------------------------

              判忙函数

------------------------------------------------*/

bit LCD_Check_Busy(void) 

P4= 0xFF; 

RS=0; 

RW=1; 

EN=0; 

_nop_(); 

EN=1;

return (bit)(P4 & 0x80);

}

/*------------------------------------------------

              写入命令函数

------------------------------------------------*/

void LCD_Write_Com(unsigned char com) 

{  

while(LCD_Check_Busy()); //忙则等待

RS=0; 

RW=0; 

EN=1; 

P4= com; 

_nop_(); 

EN=0;

}

/*------------------------------------------------

              写入数据函数

------------------------------------------------*/

void LCD_Write_Data(unsigned char Data) 

while(LCD_Check_Busy()); //忙则等待

RS=1; 

RW=0; 

EN=1; 

P4= Data; 

_nop_();

EN=0;

}


/*------------------------------------------------

                清屏函数

------------------------------------------------*/

void LCD_Clear(void) 

LCD_Write_Com(0x01); 

DelayMs(5);

}

/*------------------------------------------------

              写入字符串函数

------------------------------------------------*/

void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) 

{     

if (y == 0) 

        {     

         LCD_Write_Com(0x80 + x);     //表示第一行

        }

else 

        {      

        LCD_Write_Com(0xC0 + x);      //表示第二行

        }        

while (*s) 

        {     

LCD_Write_Data( *s);     

s ++;     

        }

}

/*------------------------------------------------

              写入字符函数

------------------------------------------------*/

void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data) 

{     

if (y == 0) 

        {     

        LCD_Write_Com(0x80 + x);     

        }    

else 

        {     

        LCD_Write_Com(0xC0 + x);     

        }        

LCD_Write_Data( Data);  

}

/*------------------------------------------------

              初始化函数

------------------------------------------------*/

void LCD_Init(void) 

{

   LCD_Write_Com(0x38);    /*显示模式设置*/ 

   DelayMs(5); 

   LCD_Write_Com(0x38); 

   DelayMs(5); 

   LCD_Write_Com(0x38); 

   DelayMs(5); 

   LCD_Write_Com(0x38);  

   LCD_Write_Com(0x08);    /*显示关闭*/ 

   LCD_Write_Com(0x01);    /*显示清屏*/ 

   LCD_Write_Com(0x06);    /*显示光标移动设置*/ 

   DelayMs(5); 

   LCD_Write_Com(0x0C);    /*显示开及光标设置*/

   }









void display(uint temp)                        //显示程序

{

   int A1,A2,A3;

   A1=temp/100;

   A2=temp%100/10;

   A3=temp%100%10/1;

   

            LCD_Write_Char(4,0,ti[A1]);

         LCD_Write_Char(5,0,ti[A2]);

         LCD_Write_Char(6,0,'.');

         LCD_Write_Char(7,0,ti[A3]);

         LCD_Write_Char(8,0,'V');



   }

/*----------------------------

软件延时

----------------------------*/

void Delay(WORD n)

{

    WORD x;


    while (n--)

    {

        x = 5000;

        while (x--);

    }

}

/*----------------------------

初始化ADC

----------------------------*/

void InitADC()

{

    P1ASF = 0x01;                   //设置P1口为AD口

    ADC_RES = 0;                    //清除结果寄存器

    ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch;

    Delay(2);                       //ADC上电并延时

}


void Timer0Init(void)                //200微秒@11.0592MHz

{

        AUXR |= 0x80;                //定时器时钟1T模式

        TMOD &= 0xF0;                //设置定时器模式

        TL0 = 0x5C;                //设置定时初值

        TH0 = 0xF7;                //设置定时初值

        TF0 = 0;                //清除TF0标志

        TR0 = 1;                //定时器0开始计时

        ET0=1;

        EA=1;


}



  


void main()                                        

{

        float i,j;

    P0M0 = 0x00;

    P0M1 = 0x00;

    P1M0 = 0x00;

    P1M1 = 0x00;

    P2M0 = 0x00;

    P2M1 = 0x00;

    P3M0 = 0x00;

    P3M1 = 0x00;

    P4M0 = 0x00;

    P4M1 = 0x00;

    P5M0 = 0x00;

    P5M1 = 0x00;


    LCD_Init(); 

    LCD_Clear();//清屏

    InitADC();                      //初始化ADC

    IE = 0xa0;                      //使能ADC中断

           Timer0Init();

        

        

         

  while(1){


           i=p*5;

         j=((i/256)*10);

    display(j);        

        DelayMs(500);  



  }



}

/*----------------------------

ADC中断服务程序

----------------------------*/

void adc_isr() interrupt 5 using 1

{

    ADC_CONTR &= !ADC_FLAG;         //清除ADC中断标志



     p=ADC_RES  ;       //读取高8位结果并发送到串口


//    SendData(ADC_LOW2);           //显示低2位结果

    

    ch = 0;           //切换到下一个通道

    ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch;

}



void tm0_isr() interrupt 1 

{


    time++;

        time1++;

        time2++;

        if(time1>100)

        time1=0;

[1] [2]
关键字:STC15w  单片机系列  AD转换 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic488501.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:单片机智能温控风扇原理图PCB文件与源程序
下一篇:基于51单片机的步进电机控制以及仿真

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

51单片机(STC15W408AS)映射printf函数 串口收发实现
AUXR1 |= AUXR1 & 0x3F; T2L = (65536 - (FOSC/4/UART1_BAUD));//设置波特率重装值 T2H = (65536 - (FOSC/4/UART1_BAUD)) >> 8; AUXR |= 0x15; //允许定时器2运行 选择定时器2作为串口1的波特率发生器 TI = 1; ES = 1;                      //允许串口中断 EA = 1; //允许CPU中断
发表于 2020-02-29
基于STC15w104单片机的人体红外报警
没什么复杂的功能,分享给大家哈,注意 用的是STC的15w104(8脚的) 用了它的IO高阻和推挽功能偶是初学者  功能正常的,已经调试成功了单片机源程序如下:#include <stc15f2k60s2.h>#include <intrins.h>sbit bfcf=P3^4;                 sbit gbbj=P3^5;                 sbit beep=P3^3;  
发表于 2019-12-02
基于STC15W408AS单片机内部EEPROM读写接口函数
#include "reg51.h"#include "intrins.h"#define uint unsigned int#define uchar unsigned char#define ulong unsigned longtypedef uchar BYTE;typedef uint WORD;sfr P1M1 = 0x91;    //PxM1.n,PxM0.n     =00--->Standard,    01--->push-pullsfr P1M0 = 0x92;    // &n
发表于 2019-11-16
STC15w4k58s4单片机4串口同时收发例程
STC15w4k58s4 芯片的4串口同时收发例程单片机源程序如下:#include "intrins.H"#include "uart.H"#define uchar unsigned  char#define uint  unsigned   intuchar uart1buf[6]={0xa5,0x5a,0x4a,0xf8,0xff,0xff};uchar uart2buf[6]={0xa5,0x5a,0x4a,0xf8,0xff,0xff};uchar uart3buf[6]={0xa5,0x5a,0x4a,0xf8,0xff,0xff};uchar
发表于 2019-11-11
STC15W4K单片机内部ADC温敏电阻测量温度
单片机源程序如下:/************************************************************************************** 实验平台:品诺电子STC15W4K核心板 + 品诺电子"开拓者"扩展板* 时钟选择:内部IRC时钟22.1184M* 功能说明:该实验通过ADC功能,使用扩展板上的温敏电阻测量当前温度,温度值显示在数                               
发表于 2019-11-06
MSP430G2553与MSP430F5336系列单片机总结[3]——看门狗定时器
。现在直接讲几个例程:首先是MSP430G2553单片机的:1.看门狗定时器利用中断控制产生16hz的方波:#include void main(void){  WDTCTL = WDT_MDLY_32;                     // Set Watchdog Timer interval to ~30ms  IE1 |= WDTIE;                   
发表于 2020-03-29
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

更多每日新闻
电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved