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

发布者:DelightfulWish最新更新时间: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;

        if(time1>50)

        pwm=1;

        else

        pwm=0;







        if(time>5000)

{        time=0;

        led=~led ;  }

}


关键字:STC15w  单片机系列  AD转换 引用地址:基于STC15w单片机系列 自带的AD转换程序

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

推荐阅读最新更新时间:2024-11-05 17:04

STC89C52系列单片机的特殊功能寄存器表
特殊功能寄存器地址表 单片机系统管理特殊功能寄存器 单片机中断管理特殊功能寄存器 单片机I/O口特殊功能寄存器 单片机串行口特殊功能寄存器 单片机定时器特殊功能寄存器 单片机看门狗特殊功能寄存器 单片机ISP/IAP特殊功能寄存器
[单片机]
STC89C52<font color='red'>系列</font><font color='red'>单片机</font>的特殊功能寄存器表
具有I2C总线接口的A/D芯片PCF8591及其应用
1 引言 I2C总线是Philips公司推出的串行总线,整个系统仅靠数据线(SDA)和时钟线(SCL)实现完善的全双工数据传输,即CPU与各个外围器件仅靠这两条线实现信息交换。I2C总线系统与传统的并行总线系统相比具有结构简单、可维护性好、易实现系统扩展、易实现模块化标准化设计、可靠性高等优点。 在一个完整的单片机系统中,A/D转换芯片往往是必不可少的。PCF8591是一种具有I2C总线接口的A/D转换芯片。在与CPU的信息传输过程中仅靠时钟线SCL和数据线SDA就可以实现。 2 芯片介绍 PCF8591是具有I2C总线接口的8位A/D及D/A转换器。有4路A/D转换输入,1路D/A模拟输出。这就是说,它既可以作
[单片机]
具有I2C总线接口的A/D芯片PCF8591及其应用
AT89C 系列单片机解密原理
单片机解密简单就是擦除单片机片内的加密锁定位。由于AT89C系列单片机擦除操作时序设计上的不合理。使在擦除片内程序之前首先擦除加密锁定位成为可能。AT89C系列单片机擦除操作的时序为:擦除开始---- 擦除操作硬件初始化(10微秒)---- 擦除加密锁定位(50----200微秒)--- 擦除片内程序存储器内的数据(10毫秒)----- 擦除结束。如果用程序监控擦除过程,一旦加密锁定位被擦除就终止擦除操作,停止进一步擦除片内程序存储器,加过密的单片机就变成没加密的单片机了。片内程序可通过总线被读出。对于AT89C系列单片机有两种不可破解的加密方法。 一、永久性地破坏单片机的加密位的加密方法。简称OTP加密模式。 二、永久性地
[单片机]
在IAR编译器中使用NEC 78K0系列单片机
最近在IAR编译器下针对NEC的78K0系列单片机作了一些开发。主要原因是IAR的编译器确实编译效果不错啊。最大体现就是编译出的代码空间比较小。毕竟人家是专门做编译器的。 下面是最近学会的一些扩展功能,写出来共享。如果以后会用其它功能的的话,我会及时更新。 1、__disable_interrupt();__enable_interrupt(); 这两个大家一看应该就知道是干什么用的了 禁止中断和使能中断的。 2、#pragma constseg = OPTBYTE __root const CPU_CHAR OptionByte = { 0x00, 0x00, 0x00, 0x00, 0x02
[单片机]
51单片机系列知识1--单片机的内外结构
一、单片机的典型结构 0.(《单片机MCS—51原理及应用开发教程》晁阳。清华大学出版社) 1、 单片机的内部结构 中央处理器 存储器 内部总线 I∕O接口 并行接口 穿行接口 中断系统 特殊功能部件 时钟电路 布尔处理器 定时器∕计数器 A∕D、D∕A转换器 直接存储器访问通道DMA.PWM.WDT ①内部总线:内部总线是CPU连接片内主要部件的纽带,是各类信息传送的公共通道。内部总线主要由3种不同性质的连线组成,分别是地址线、数据线、控制线。地址线主要用来传送存储器所需要的地址码和外部设备的设备号,通常由C
[单片机]
STC12系列单片机C语言的延时程序
本举例所用CPU为STC12C5412系列12倍速的单片机,只要修改一下参数值其它系例单片机也通用,适用范围宽。 共有三条延时函数说明如下: 函数调用分两级:一级是小于10US的延时,二级是大于10US的延时 //====================小于10US的【用1US级延时】==================== //----------微秒级延时--------- for(i=X;i X;i--) 延时时间=(3+5*X)/12 提示(单位us, X不能大于255) //================大于10US 小于21.9955Ms的可用【10US级延时函数】=========== void Delay10
[单片机]
学习51系列单片机经验
本人从事单片机相关工作多年,首先是从51系列单片机开始学习的。自己想把学习经验写下来,与大家共同探讨学习单片机的捷径。 具体如下: 1、学习电子技术 基础 知识,如电路、模拟电路和数字电路。这是学习电类相关专业的基础。 2、学习计算机硬件知识,如计算机的简单组成原理(只需要了解),当然要知道CPU是什么?总线是什么?一些相关概念。 3、程序编写的相关知识,主要是汇编语言和C语言。了解结构化语言的程序设计方法,也就是三种结构(顺序结构、分支结构(或称选择结构)、循环结构),会一些常用的算法。 4、以上是基础,有了这些基础,学习51单片机就只要花几周的时间就能上手。但学习单片机时,主要从单片机的存储器开始,其中特殊功能寄存器是重点,学会
[单片机]
瑞萨发布10个型号32位CISC微控制器H8SX系列
2008 年 6 月 9 日 ,瑞萨科技 正式 推出四个家族总共 10 个型号 ( 15 个型号名称 ) 产品 —— 分别命名为 H8SX/1645 、 H8SX/1635 、 H8SX/1665 和 H8SX/1655 。这些器件均为32位CISC(复杂指令集计算机)微控制器H8SX系列的产品,具有增强的模拟外设功能,包括更快的A/D转换和更高精度的D/A转换。这些新品的样品将从2008年9月开始依次在日本交付。 这四个家族的微控制器是瑞萨目前的H8SX/1648、H8SX/1638、H8SX/1668R和H8SX/1658R产品的后续产品,可以提供增强的模拟外设功能,同时保持了与这类产品的引脚兼容
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved