標(biāo)題:
基于STC15w單片機(jī)系列 自帶的AD轉(zhuǎn)換程序
[打印本頁]
作者:
蘇海
時間:
2020-2-15 16:53
標(biāo)題:
基于STC15w單片機(jī)系列 自帶的AD轉(zhuǎn)換程序
15W系列是目前51單片機(jī)里面可用資源較多的處理器。一般的設(shè)計都可以用,本次分享下利用單片機(jī)自帶的AD轉(zhuǎn)換座一個數(shù)字電壓表。顯示用的LCD1602
單片機(jī)源程序如下:
#include<15w.H>
#include<math.h>
#include <string.h>
#include <stdio.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
typedef unsigned int WORD;
#define ADC_POWER 0x80 //ADC電源控制位
#define ADC_FLAG 0x10 //ADC完成標(biāo)志
#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延時函數(shù),含有輸入?yún)?shù) unsigned char t,無返回值
unsigned char 是定義無符號字符變量,其值的范圍是
0~255 這里使用晶振12M,精確延時請使用匯編,大致延時
長度如下 T=tx2+5 uS
------------------------------------------------*/
void DelayUs2x(unsigned char t)
{
while(--t);
}
/*------------------------------------------------
mS延時函數(shù),含有輸入?yún)?shù) unsigned char t,無返回值
unsigned char 是定義無符號字符變量,其值的范圍是
0~255 這里使用晶振12M,精確延時請使用匯編
------------------------------------------------*/
void DelayMs(unsigned char t)
{
while(t--)
{
//大致延時1mS
DelayUs2x(245);
DelayUs2x(245);
}
}
/*------------------------------------------------
判忙函數(shù)
------------------------------------------------*/
bit LCD_Check_Busy(void)
{
P4= 0xFF;
RS=0;
RW=1;
EN=0;
_nop_();
EN=1;
return (bit)(P4 & 0x80);
}
/*------------------------------------------------
寫入命令函數(shù)
------------------------------------------------*/
void LCD_Write_Com(unsigned char com)
{
while(LCD_Check_Busy()); //忙則等待
RS=0;
RW=0;
EN=1;
P4= com;
_nop_();
EN=0;
}
/*------------------------------------------------
寫入數(shù)據(jù)函數(shù)
------------------------------------------------*/
void LCD_Write_Data(unsigned char Data)
{
while(LCD_Check_Busy()); //忙則等待
RS=1;
RW=0;
EN=1;
P4= Data;
_nop_();
EN=0;
}
/*------------------------------------------------
清屏函數(shù)
------------------------------------------------*/
void LCD_Clear(void)
{
LCD_Write_Com(0x01);
DelayMs(5);
}
/*------------------------------------------------
寫入字符串函數(shù)
------------------------------------------------*/
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 ++;
}
}
/*------------------------------------------------
寫入字符函數(shù)
------------------------------------------------*/
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);
}
/*------------------------------------------------
初始化函數(shù)
------------------------------------------------*/
void LCD_Init(void)
{
LCD_Write_Com(0x38); /*顯示模式設(shè)置*/
DelayMs(5);
LCD_Write_Com(0x38);
DelayMs(5);
LCD_Write_Com(0x38);
DelayMs(5);
LCD_Write_Com(0x38);
LCD_Write_Com(0x08); /*顯示關(guān)閉*/
LCD_Write_Com(0x01); /*顯示清屏*/
LCD_Write_Com(0x06); /*顯示光標(biāo)移動設(shè)置*/
DelayMs(5);
LCD_Write_Com(0x0C); /*顯示開及光標(biāo)設(shè)置*/
}
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; //設(shè)置P1口為AD口
ADC_RES = 0; //清除結(jié)果寄存器
ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch;
Delay(2); //ADC上電并延時
}
void Timer0Init(void) //200微秒@11.0592MHz
{
AUXR |= 0x80; //定時器時鐘1T模式
TMOD &= 0xF0; //設(shè)置定時器模式
TL0 = 0x5C; //設(shè)置定時初值
TH0 = 0xF7; //設(shè)置定時初值
TF0 = 0; //清除TF0標(biāo)志
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中斷服務(wù)程序
----------------------------*/
void adc_isr() interrupt 5 using 1
{
ADC_CONTR &= !ADC_FLAG; //清除ADC中斷標(biāo)志
p=ADC_RES ; //讀取高8位結(jié)果并發(fā)送到串口
// SendData(ADC_LOW2); //顯示低2位結(jié)果
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 ; }
}
復(fù)制代碼
所有資料51hei提供下載:
15wAD轉(zhuǎn)換.rar
(57.32 KB, 下載次數(shù): 82)
2020-2-15 16:51 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
luoshi133
時間:
2020-2-21 04:23
下載學(xué)習(xí)學(xué)習(xí),感謝樓主分享程序。
作者:
wsh791
時間:
2020-2-21 13:07
謝謝分享
作者:
dwy6122281
時間:
2021-4-29 15:06
具體用的哪款單片機(jī)芯片呢?
作者:
阿飛7812
時間:
2021-4-29 20:48
樓主如果單片電源5V,AD只在5V以內(nèi) ,如要能測量30V以內(nèi)的電壓程序應(yīng)該怎樣改 請指點下
作者:
rambo.hu
時間:
2021-5-1 10:53
電阻分壓,我也想試試
作者:
bsljling
時間:
2021-5-2 20:20
我是小白:電阻分壓,改變TEMP的比率好像就可以改變測量范圍。不知對否。
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1