#include<STC_NEW_8051.H>
#include <INTRINS.H>
#include <stdio.h>
#define uchar unsigned char
#define uint unsigned int
/*#define Fosc 11059200
#define BAUD 115200 //波特率
#define RELOAD_115200 (256 - (Fosc/16*10/BAUD+5)/10 ) //1T模式, 波特率加倍
#define BRTx12_enable() AUXR |= 0x04 //BRT 独立波特率发生器的溢出率快 12 倍
#define BRT_start() AUXR |= 0x10 */ //启动独立波特率发生器 BRT 计数。
#define AD_SPEED 0x60
// CPU工作频率11.0592MHz时 A/D转换速度约157KHz
//#define AD_SPEED 0x40 //0100,0000 1 0 140 个时钟周期转换一次
//#define AD_SPEED 0x20 //0010,0000 0 1 280 个时钟周期转换一次
//#define AD_SPEED 0x00 //0000,0000 0 0 420 个时钟周期转换一次
sbit beep=P3^7;
sbit key=P1^7;
unsigned char code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
void Init_Com(void)//串行口初始化程序
{
TMOD = 0x20;
PCON = 0x00;
SCON = 0x50;
TH1 = 0xFd; //波特率9600
TL1 = 0xFd;
TR1 = 1;
}
/*void Send_Byte(uchar one_byte) //发送一个字节
{
TI = 0; //清零串口发送中断标志
SBUF = one_byte;
while (TI == 0);
TI = 0; //清零串口发送中断标志
}*/
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--);
for(j=110;j>0;j--);
}
/*void didi(uchar di_num)
{
uchar a;
for(a=di_num;a>0;a--)
{
beep=0;
delayms(8000);
beep=1;
//delayms(8000);
}
}*/
void AD_Init()
{
// P1M0=0x0f; //0000 1111 设置P1口低四位为开漏模式,用来A/D采集
// P1M1=0x0f; //0000 1111
P1ASF = 0x0F; //1111,1111, 将 P1 置成模A
ADC_CONTR=0x60;// 0110 0000 设置最高转换速度
delayms(1);
}
int GetAD(uchar channel) //channel 为要取的通道号(0-7),此处只能取到0-3
{
uchar AD_finished=0;
int result;
ADC_RES = 0;
ADC_RESL = 0;
channel &= 0x07; //0000,0111 清0高5位 ,0000,0000为0通道P1_0,0000,0111为第8通道P1_7
ADC_CONTR = AD_SPEED;
_nop_();
ADC_CONTR |= (channel-1); //选择 A/D 当前通道
_nop_();
ADC_CONTR |= 0x80; //启动 A/D 电源 开启A/D转换器电源
delayms(1); //使输入电压达到稳定
ADC_CONTR |= 0x08; //0000,1000 令 ADCS = 1, 启动A/D转换,
AD_finished = 0;
while (AD_finished ==0 ) //等待A/D转换结束
{
AD_finished = (ADC_CONTR & 0x10); //0001,0000 测试A/D转换结束否
}
ADC_CONTR &= 0xE7; //1111,0111 清 ADC_FLAG 位, 关闭A/D转换,
result=ADC_RES*4+ADC_RESL; /* //读走A/D转换结果,由于ADC_DATA中存储12位中的高8位,当要转换成十进制时,需要将ADC_DATA中的数左移2位,即相当于*4 */
return(result);
}
float Ad_Av(uchar channel) //求10次采集电压的平均值
{
float Val_Av=0;
uchar num;
for(num=10;num>0;num--)
{
Val_Av+=GetAD(channel); //10次采集求和
}
Val_Av/=10.0;//求平均值
Val_Av=Val_Av*5/1024; //单片机电源为5V,求得真实电压值
return(Val_Av); //返回给函数
}
void delay1(void)
{
int k;
for(k=0;k<300;k++);
}
void display(float k)
{ uint dis;
dis=k*1000;
P2=0xfe;
P0=tab[dis/1000];
delay1();P0=0xff;
P0=0x7f;
delay1();P0=0xff;
P2=0xfd;
P0=tab[dis%1000/100];
delay1();P0=0xff;
P2=0xfb;
P0=tab[dis%100/10];
delay1();P0=0xff;
P2=0xf7;
P0=tab[dis%10];
delay1();P0=0xff;
P2=0xff;
}
void display1(float k)
{ uint dis;
dis=k*1000;
P2=0xef;
P0=tab[dis/1000];
delay1();P0=0xff;
P0=0x7f;
delay1();P0=0xff;
P2=0xdf;
P0=tab[dis%1000/100];
delay1();P0=0xff;
P2=0xbf;
P0=tab[dis%100/10];
delay1();P0=0xff;
P2=0x7f;
P0=tab[dis%10];
delay1();P0=0xff;
P2=0xff;
}
void comm(char*parr)
{
do
{
SBUF=*parr++;
while(!TI);
TI=0;
} while(*parr);
}
void main()
{ uchar buff[5],i;
float ad1,ad2,ad3;
AD_Init();
Init_Com();
while(1)
{
ad1=Ad_Av(1);
ad2=Ad_Av(2);
ad3=Ad_Av(3);
sprintf(buff,"%.3f",ad1);
comm(buff);
sprintf(buff,"%.3f",ad2);
comm(buff);
sprintf(buff,"%.3f",ad3);
comm(buff);
for(i=30;i>0;i--)
{
display(ad1);
display1(ad2);
}
}
}
STC12C5A16S2+AD采集及串口显示.rar
5星 · 超过95%的资源 需积分: 50 46 浏览量
2012-11-08
11:40:44
上传
评论 2
收藏 33KB RAR 举报
ghos_sco
- 粉丝: 0
- 资源: 5
最新资源
- 基于python的高性能爬虫程序,使用了多线程+缓存+xpath实现的,这里以彼-岸图库为例,实现,仅用于学习交流
- 中分辨率成像光谱仪(MODIS)烧毁面积产品信息MODIS-C6-BA-User-Guide-1.2.pdf
- Screenshot_20240427_172613_com.huawei.browser.jpg
- 关于学习Python的相关资源网站链接及相关介绍.docx
- (HAL库)基于STM32F103C8T6的温控PID系统[Dht11、ESP8266、无线透传、L298N……]
- VoLTE高丢包优化指导书.xlsx
- Rust资源文件.zip
- 前后端分离实践:使用 React 和 Express 搭建完整登录注册流程
- gradle-publish-to-MavenLocal.zip
- 10份网络优化创新案例.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
- 1
- 2
前往页