/*------------------------------------------------------------------*/
/* --- 10位AD转换并把数值显示在LCD1602液晶上并控制蜂鸣器 ---------*/
/* --- STC12C5Axx Series MCU A/D Conversion Demo -------------------*/
/* --- 程序创建时间:2015年11月9日20:47:45 -------------------------*/
/*----液晶显示内容请自行更改----------------------------------------*/
/*-----程序作者:李洋(部分代码STC官网复制)------------------------*/
#include "config.h"
#include "intrins.h"
#include "main.h"
#include "lcd1602.h"
#define FOSC 11059200L
#define BAUD 9600
#define MODE 2 // 模式1为8位AD
// 模式2为10位AD
sbit BUZZ = P1^6; //蜂鸣器
/*Define ADC operation const for ADC_CONTR*/
#define ADC_POWER 0x80 //ADC power control bit
#define ADC_FLAG 0x10 //ADC complete flag
#define ADC_START 0x08 //ADC start control bit
#define ADC_SPEEDLL 0x00 //420 clocks
#define ADC_SPEEDL 0x20 //280 clocks
#define ADC_SPEEDH 0x40 //140 clocks
#define ADC_SPEEDHH 0x60 //70 clocks
bit buzzOn = 0; //蜂鸣器标志
uint8 T0RH;
uint8 T0RL;
/***********************************
主程序
***********************************/
void main()
{
float Value2; //10位ADC值
uint8 Value1; //8位ADC值
uint8 ADCStr[10];
InitADC(); //初始化ADC
Init1602();
EA = 1;
ConfigTimer0(1); //配置定时器0 1MS
while (1)
{
//LcdShowStr(0,1," TSET ");
#if MODE == 1 //8位模式
{
Value1 = GetADCResult(7); //获取通道7的数值
ValToString1(ADCStr, Value1); //数值转换
}
#else if MODE == 2 //10位模式
{
Value2 = GetADCResult(7); //获取通道7的数值
ValToString2(ADCStr, Value2); //数值转换
}
#endif
LcdShowStr(0,0,ADCStr); //显示在液晶上
}
}
/******************************************
8位ADC数值转换
*********************************************/
void ValToString1(uint8 *str, uint8 val) //8位AD转换
{
uint8 value;
value = (val*50)/256; //计算公式:ADC_RES = 256* (val/vin)
str[0] = value/10 + '0'; //显示整数部分
str[1] = '.';
str[2] = value%10 + '0'; //小数部分
str[3] = 'v';
str[4] = '\0';
if(value <= 9) //0.9v开蜂鸣器
{
TR0 = 1;
buzzOn = 1;
}
else if(value >= 13) //1.3关闭蜂鸣器
{
buzzOn = 0;
TR0 = 0;
}
}
/**************************************************
10位ADC数值转换
**********************************************/
void ValToString2(uint8 *str, float val) //10位AD转换
{
float value;
value = (val*5)/1024.0; //计算公式:ADC_RES+ADC_RESL = 1024*(val/vin)
value = value*1000;
str[0] = (int)value/1000 + '0'; //整数部分
str[1] = '.';
str[2] = (int)value/100%10 + '0'; //小数部分1
str[3] = (int)value%10 + '0'; //小数部分2
str[4] = 'v';
str[5] = '\0';
if(value <= 900) //0.9v时开启蜂鸣器
{
buzzOn = 1;
TR0 = 1;
}
else if(value >= 1300) //1.3v关闭蜂鸣器
{
buzzOn = 0;
TR0 = 0;
}
}
/*----------------------------
Get ADC result获取AD结果
----------------------------*/
uint16 GetADCResult(uint8 ch)
{
ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;
_nop_(); //Must wait before inquiry
_nop_();
_nop_();
_nop_();
while (!(ADC_CONTR & ADC_FLAG));//Wait complete flag
ADC_CONTR &= ~ADC_FLAG; //Close ADC
#if MODE == 1 //返回8位ADC数值
{
return ADC_RES;
}
#else if MODE == 2 //返回10ADC数值
{
return (ADC_RES*4 + ADC_RESL);
}
#endif
//Return ADC result
}
/*----------------------------
配置定时器
----------------------------*/
void ConfigTimer0(uint8 ms) //配置定时器0
{
uint32 tmp;
TMOD &= 0xF0;
TMOD |= 0x01;
tmp = 11059200/12;
tmp = 65536 - (tmp * ms)/1000;
T0RH = (uint8)(tmp>>8);
T0RL = (uint8)tmp;
TH0 = T0RH;
TL0 = T0RL;
ET0 = 1;
}
/*----------------------------
Initial ADC sfr初始化ADC寄存器
----------------------------*/
void InitADC()
{
P1M1 = 0x80; //配置P1.7口为高阻输入
P1M0 = 0x00;
P1ASF = 0x80; //只设置P1.7为AD输入端
ADC_RES = 0;
ADC_RESL = 0; //Clear previous result清除以前的结果
ADC_CONTR = ADC_POWER | ADC_SPEEDLL; //开启AD电源
Delay(2); //ADC power-on and delay
}
/*----------------------------
Software delay function 延时
----------------------------*/
void Delay(uint16 n)
{
uint16 x;
while (n--)
{
x = 5000;
while (x--);
}
}
/*********************************
中断服务程序
********************************/
void interruptTimer0() interrupt 1 //定时器0中断服务程序
{
uint8 tmr50ms = 0;
TH0 = T0RH;
TL0 = T0RL;
if(buzzOn)
{
BUZZ = ~BUZZ;
}
else
{
BUZZ = 1;
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
stc单片机AD 8位和10位数值通过1602液晶显示
共23个文件
h:4个
lst:3个
obj:3个
需积分: 15 7 下载量 197 浏览量
2015-11-09
23:11:34
上传
评论 1
收藏 54KB RAR 举报
温馨提示
stc单片机AD 8位和10位数值通过1602液晶显示,并判断电压值来控制蜂鸣器, 程序稍微改改可以用在别的控制系统里面,实测可用
资源推荐
资源详情
资源评论
收起资源包目录
ADC.rar (23个子文件)
ADC
project
main.lst 10KB
adc.m51 20KB
STARTUP.A51 6KB
adc.uvproj 14KB
adc.plg 476B
adc_uvproj.bak 14KB
adc.uvopt 76KB
STARTUP.LST 14KB
lcd1602.lst 3KB
adc_uvopt.bak 76KB
source
lcd1602.c 1013B
config.h 161B
lcd1602.h 262B
main.h 273B
new51.h 13KB
main.c 5KB
output
adc.lnp 130B
main.obj 13KB
adc.plg 17KB
STARTUP.obj 789B
lcd1602.obj 8KB
adc 21KB
adc.hex 6KB
共 23 条
- 1
资源评论
fuxinliyang
- 粉丝: 0
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功