久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4342|回復: 1
打印 上一主題 下一主題
收起左側

STC12C5A60S2(ADC查詢法 10位模式)+1602顯示

[復制鏈接]
跳轉到指定樓層
樓主
ID:97529 發表于 2015-11-29 12:15 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式

通道0接單片機電源,通道1接地線。





源程序:一共3個文件:

LCD1602display.h

#ifndef _LCD1602DISPLAY_H_

#define _LCD1602DISPLAY_H_

#define uchar unsigned char

#define uint unsigned int

//************************LCD引腳定義

sbit LCM_RS=P3^5;

sbit LCM_RW=P3^6;

sbit LCM_E=P3^7;

//**************************延時

void delay();

//**************************初始化

void InitLCM();

//****************************讀狀態

uchar ReadStatusLCM();

//******************************讀數據

uchar ResdDataLCM();

//***************************寫指令

void WriteCommandLCM(uchar WCLCM, Busy);

//***************************寫數據

void WriteDataLCM(uchar WDLCM);

//******************************顯示1個字符

void DisplayOneChar(uchar X,uchar Y,uchar DData);

//******************************顯示字符串

void DisplayListChar(uchar X,uchar Y,uchar code  *DData);

#endif


STC12(ADC flag).h

#ifndef _STC12_ADC_FLAG_H_

#define _STC12_ADC_FLAG_H_

#define uchar unsigned char

#define uint unsigned int

#define FOSC    11059200L

#define BAUD    9600

/********************************************************************

                             初始化設置

*********************************************************************/

sfr ADC_CONTR   =   0xBC;           //ADC 控制寄存器

sfr ADC_RES     =   0xBD;           //ADC 轉換結果寄存器

sfr ADC_RESL    =   0xBE;           //ADC 低2位結果寄存器

sfr P1ASF       =   0x9D;           //P1口模擬功能控制寄存器

/********************************************************************

                              ADC 數據轉換函數

*********************************************************************/

#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 Delay1(uint n);

//******************************ADC初始化函數

void Init_ADC();

//***********************************ADC數據轉換函數

uint Get_ADC_Result(uchar ch);

//************************************ADC數據計算函數

float Count(uchar ch);

#endif


LCD1602display.c

#include <reg52.h>

#include <intrins.h>

#include "LCD1602display.h"

//********************延時

void delay(uchar z)

{

uchar i,j;

for(i=z;i>0;i--)

  for(j=110;j>0;j--);

}

//**********************LCM初始化

void InitLCM()

{

WriteCommandLCM(0x38,0);  //三次顯示模式設置,不檢測忙信號

delay(1);

WriteCommandLCM(0x38,0);

delay(1);

WriteCommandLCM(0x38,0);

delay(1);

WriteCommandLCM(0x38,1);  //顯示模式設置:16×2顯示,5×7點陣,8位數據接口

WriteCommandLCM(0x0c,1);  //顯示模式設置:顯示開,無光標

WriteCommandLCM(0x06,1);  //顯示模式設置:光標右移,字符不移

WriteCommandLCM(0x01,1);  //清屏幕指令,將以前的顯示內容清除

}

//*********************讀狀態

uchar ReadStatusLCM()

{

P0 = 0x80;

LCM_RS = 0;

LCM_RW = 1;

LCM_E = 1;

while (P0 & 0x80); //檢測忙信號

return(0);

}

//***********************讀數據

/*uchar ResdDataLCM()

{

LCM_RS=1;

LCM_RW=1;

LCM_E=1;

} */

//**********************寫指令

void WriteCommandLCM(uchar WCLCM, Busy)

{

if(Busy) ReadStatusLCM();

P0=WCLCM;

LCM_RS=0;

LCM_RW=0;

LCM_E=0;

LCM_E=1;

}

//***********************寫數據

void WriteDataLCM(uchar WDLCM)

{

ReadStatusLCM();

P0=WDLCM;

LCM_RS=1;

LCM_RW=0;

LCM_E=0;

LCM_E=1;

}

//*************************顯示字符

void DisplayOneChar(uchar X,uchar Y,uchar DData)

{

if(Y) X|=0X40;   //Y=1顯示第二行,Y=0顯示第一行

X|=0X80;

WriteCommandLCM(X,1); //X用來選擇哪一位,1是用來忙檢測

WriteDataLCM(DData); //DData用來寫數據

}

//**************************顯示字符串

void DisplayListChar(uchar X,uchar Y,uchar code *DData)

{

uchar ListLength;

ListLength=0;

while(DData[ListLength]!='\0')

{

  if(X<=15)

  {

   DisplayOneChar( X,Y,DData[ListLength]);

   ListLength++;

   X++;

  }

}

}


STC12(ADC flag).c

#include <reg52.h>

#include "intrins.h"

#include "STC12(ADC flag).h"

float temp;


//**********************************延時函數(n=1: 1T 8.65ms,12T 59.9ms)

void Delay1(uint n)

{

    uint x;

    while (n--)

    {

        x = 5000;

        while (x--);

    }

}

//******************************ADC初始化函數

void Init_ADC()

{

    P1ASF = 0xff;                      //設置P1口為開漏模式,使用AD功能

    ADC_RES = 0;                       //AD數據寄存器高8位清空

ADC_RESL= 0;        //AD數據寄存器低2位清空

    ADC_CONTR = ADC_POWER | ADC_SPEEDLL;  //打開AD電源,轉換周期540

    Delay1(2);                        //延時

}

//***********************************ADC數據轉換函數

uint Get_ADC_Result(uchar ch)

{

    ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch ;//開始轉換

    _nop_();                          //延時一個機器周期

    _nop_();        //延時一個機器周期

    _nop_();        //延時一個機器周期

    _nop_();        //延時一個機器周期

    while (!(ADC_CONTR & ADC_FLAG));  //等待轉換結束(ADC_FLAG=0時一直等待,直到變為1跳出)

    ADC_CONTR &= ~ADC_FLAG;           //關閉AD轉換

    return (ADC_RES*4+ADC_RESL);            //返回數據(10位AD值,ADC_RES高8位+ADC_RESL低2位)

}

//************************************ADC數據計算函數

float Count(uchar ch)

{

temp=(float)Get_ADC_Result(ch)*4.60/1024; //4.85為參考電壓,1024個“門”,10位AD

return temp;

}


main.c

//***********************(ma)STC12C5A60S2(ADC查詢法 10位模式)+1602顯示*************************************************************

//馬熔

//2012-12-17

//***************************************************************************************************

#include <reg52.h>

#include "intrins.h"

#include "STC12(ADC flag).h"

#include "LCD1602display.h"

#define uchar unsigned char

#define uint unsigned int

extern float temp;

uchar code string1[]={"The voltage is :"};

uchar ge,shifen;

//*****************************顯示函數

void show()

{

DisplayListChar(0,0,string1);

DisplayOneChar(1,1,(int)Count(0)+0x30);     //個位

DisplayOneChar(2,1,'.');

DisplayOneChar(3,1,(int)(Count(0)*100)%100/10+0x30); //十分位

DisplayOneChar(4,1,(int)(Count(0)*100)%100%10+0x30); //百分位

DisplayOneChar(5,1,'V');

DisplayOneChar(8,1,(int)Count(1)+0x30);     //個位

DisplayOneChar(9,1,'.');

DisplayOneChar(10,1,(int)(Count(1)*100)%100/10+0x30); //十分位

DisplayOneChar(11,1,(int)(Count(1)*100)%100%10+0x30); //百分位

DisplayOneChar(12,1,'V');

}

//*******************************主函數

void main()

{

InitLCM();  //液晶初始化

    Init_ADC();  //AD轉換初始化

    while (1)

    {

  show();

    }

}


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的積分獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:306141 發表于 2018-4-19 17:28 | 只看該作者
謝謝分享,正在做這個,程序寫得很清晰,贊
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 粉嫩国产精品一区二区在线观看 | 日本免费在线观看视频 | av黄色在线观看 | 成人av电影在线 | 中文字幕蜜臀av | 羞羞视频在线网站观看 | 91网站在线播放 | 麻豆av网站 | 视频三区 | 亚洲性在线 | 国产欧美一区二区三区国产幕精品 | 91在线观看视频 | 精品美女在线观看 | 999免费网站 | 久久久久久久一区二区三区 | 91在线看视频 | 日韩精品一区二区三区中文字幕 | 狠狠狠色丁香婷婷综合久久五月 | 欧美 日韩 国产 成人 在线 91 | 久久久婷| 日本成人区 | 中文字幕在线免费视频 | 婷婷99| 午夜精品一区二区三区在线视频 | 一区二区三区在线免费观看 | 男人天堂99 | 久久小视频 | 国产精品视频www | 日韩视频一区 | 欧美日韩在线一区二区 | 亚洲高清在线 | 日韩在线不卡视频 | 98久久| 在线看av网址 | 最新高清无码专区 | 天天操天天天干 | 亚洲欧美中文日韩在线v日本 | 婷婷五月色综合 | 久久青| 一二三四在线视频观看社区 | 黄色成人免费在线观看 |