历史上的今天
返回首页

历史上的今天

今天是:2025年02月01日(星期六)

2018年02月01日 | STC12C5A60S2 AD转换示例程序

2018-02-01 来源:eefocus

#include 
#define uint   unsigned int 
#define uchar unsigned char 
sbit CS=P2^0;         //LCD12864串行通信片选 

sbit SID=P2^1;         //LCD12864串行通信数据口 
sbit SCLK=P2^2;         //LCD12864串行通信同步时钟信号 
sbit PSB=P2^5;         //LCD12864并/串选择:H并行 L串行  
unsigned int temp1,sh1,ge1,n1,m1; 
unsigned char ad_result_data[10];   //AD转换高八位 
unsigned char ad_result_low2[10];   //AD转换低八位 
unsigned char ad_result_total[10];   //AD转换总十位 
unsigned char ad_average_result;   //AD转换十次的平均值 
unsigned char Ain,Vin; 
unsigned char b,t,R; 
char tp=0; 
unsigned char code ma1[6]={0xb5,0xe7,0xd1,0xb9,0xa1,0xc3}; //电压: 
unsigned char code ma2[]={"."}; 
uchar code disp1[]={"提示: 按1 键进入"}; 
uchar code disp2[]={"功能选择界面. "}; 
unsigned char code num0[]={0xa3,0xb0}; 
unsigned char code num1[]={0xa3,0xb1}; 
unsigned char code num2[]={0xa3,0xb2}; 
unsigned char code num3[]={0xa3,0xb3}; 
unsigned char code num4[]={0xa3,0xb4}; 
unsigned char code num5[]={0xa3,0xb5}; 
unsigned char code num6[]={0xa3,0xb6}; 
unsigned char code num7[]={0xa3,0xb7}; 
unsigned char code num8[]={0xa3,0xb8}; 
unsigned char code num9[]={0xa3,0xb9}; 
//-------模块延时程序---------------------------- 1ms 
void delay1ms(uint delay1ms) //STC11F60XE,22.1184M,延时1ms 

uint i,j;  
for(;delay1ms>0;delay1ms--) 
   for(i=0;i<7;i++) 
     for(j=0;j<210;j++); 

void delay(uint delay) //STC11F60XE,22.1184M,延时170us 

uint i,j; 
for(;delay>0;delay--) 
   for(i=0;i<124;i++); 
     for(j=0;j<124;j++); 

/******************************************************* 
                  AD转换程序 
*******************************************************/ 
void AD_initiate() //初始化函数 
{  
ES=0; 
TMOD=0x21; //定时计数器方式控制寄存器,"自动重装,16位计数器". 
SCON=0x50; //串行控制寄存器,方便在串口助手那观察 
TH1=0xfa; 
TL1=0xfa; 
TR1=1; 

void ADC_Power_On()      //AD转换电 

ADC_CONTR|=0x80; 
delay(5);     //必要的延时 

void get_ad_result() //取AD结果函数,它是十位AD转换,每十次平均,最后取低八位作为AD采样数据 
{  
uint i,q=0; 
for(i=0;i<10;i++) 
   { 
       tp=0; 
       ADC_RES=0;     //高八位数据清零,STC12C5A60S2 AD数据寄存名与STC12C54××系列不同 
    ADC_RESL=0;    //低两位清零 
       ADC_CONTR|=0x08; //启动AD转换 
       while(!tp)     //判断AD转换是否完成  
         { 
           tp=0x10; 
           tp&=ADC_CONTR; 
         }     
      ADC_CONTR&=0xe7; 
   ad_average_result=ADC_RES; 
   q=q+ad_average_result; 
   } 
   ad_average_result=q/10; 
   //ad_average_result=ad_average_result*4*5000/1024; 

/************************AD转换结束***********************/ 

void send_ad_result() //取AD结果函数发送到串口,方便调试 
{                
   SBUF=n1; 
   while(TI==0) ; 
    TI=0; 
   delay1ms(100); 
   //SBUF=R>>4; 


//---------------------电压采样程序------------------------- 
void caiyangP10()     //测电压 

P1M0|=0x01;         //设P1_0为开漏模式 如: P1_0= #00000000B 
P1M1|=0x01; 
ADC_CONTR=0xe0;   //设置P1.0为输入AD转换口 
delay(2); 
get_ad_result();        //取转换数据 
Vin=ad_average_result; 
R=Vin; 


/*-----------写控制字到LCD12864------------*/ 
void write_cmd(uchar cmd) 

uchar i; 
uchar i_data; 
i_data=0xf8;          //命令控制字:11111000写指令 11111010写数据 11111100读状态 11111110读数据 
CS=1;          //片选置高,才能进行读写操作 
SCLK=0; 
/*----------写命令控制字-----------------*/ 
for(i=0;i<8;i++)       //循环八次,每次读取一位数据 

   SID=(bit)(i_data&0x80);     //bit表示取其最高位 
   SCLK=0; 
   SCLK=1;         //正跳变写入指令 
   i_data=i_data<<1;      //左移一位 
}       
/*---------------------------------------*/ 
/*----------写指令高四位-----------------*/ 
i_data=cmd; 
i_data=i_data&0xf0;       //把低四位置0 
for(i=0;i<8;i++)       //循环八次,每次读取一位数据 

   
   SID=(bit)(i_data&0x80);     //bit表示取其最高位 
   SCLK=0; 
   SCLK=1;         //正跳变写入指令 
   i_data=i_data<<1;      //左移一位 
}                  
/*---------------------------------------*/ 
/*----------写指令低四位-----------------*/ 
i_data=cmd; 
i_data=i_data<<4;       //左移四位,把低四位的数据移到高四位,再把低四位置0 
for(i=0;i<8;i++)       //循环八次,每次读取一位数据 

   
   SID=(bit)(i_data&0x80);     //bit表示取其最高位 
   SCLK=0; 
   SCLK=1;        //正跳变写入指令 
   i_data=i_data<<1;     //左移一位 
}  
/*-----------------------------------------*/    
CS=0;         //把片选置低 
delay1ms(5);       //延时是因为没有进行忙检测,适当的延时可以不进行忙检测 

/*-----------------------------------------*/ 
/*------------写数据到LCD12864-------------*/ 
void write_dat(uchar dat) 

uchar i; 
uchar i_data; 
i_data=0xfa; 
CS=1; 
for(i=0;i<8;i++) 

   SID=(bit)(i_data&0x80); 
   SCLK=0; 
   SCLK=1; 
   i_data=i_data<<1; 

i_data=dat; 
i_data=i_data&0xf0; 
for(i=0;i<8;i++) 

   
   SID=(bit)(i_data&0x80); 
   SCLK=0; 
   SCLK=1; 
   i_data=i_data<<1; 

i_data=dat; 
i_data=i_data<<4; 
for(i=0;i<8;i++) 

   
   SID=(bit)(i_data&0x80); 
   SCLK=0; 
   SCLK=1; 
   i_data=i_data<<1; 

CS=0; 
delay1ms(5); 

/*-----------------------------------------*/ 
/*--------------显示坐标-------------------*/ 
void lcd_pos(uchar x,uchar y)      //汉字显示坐标,x为哪一行,y为哪一列 

uchar pos; 
if(x==0) 
   x=0x80;         //第一行 
else if(x==1) 
   x=0x90;         //第二行 
else if(x==2) 
   x=0x88;         //第三行 
else if(x==3) 
   x=0x98;         //第四行 
pos=x+y;         //显示哪一行(总共有4行)哪一竖(总共有8竖,每16列为1竖) 
write_cmd(pos); 

/*-----------------------------------------*/ 
/*--------------显示8个汉字-------------------*/ 
void disp_hanzi(uchar code *chn) 

   uchar i; 
   write_cmd(0x30);    //基本指令操作方式 
   for(i=0;i<16;i++)   //16列*8个汉字=128(刚好) 
       write_dat(chn[i]); 

/*-----------------------------------------*/ 
/*--------------显示数字-------------------*/ 
void disp_num(uchar code *chn) 

uchar i; 
   write_cmd(0x30);    //基本指令操作方式 
   for(i=0;i<2;i++)      //1个数字 
       write_dat(chn[i]); 

void disp_number(uchar num) 

    
   switch(num) 
   { 
case 0: disp_num(num0);break; 
case 1: disp_num(num1);break; 
case 2: disp_num(num2);break; 
case 3: disp_num(num3);break; 
case 4: disp_num(num4);break; 
case 5: disp_num(num5);break; 
     case 6: disp_num(num6);break; 
case 7: disp_num(num7);break; 
case 8: disp_num(num8);break; 
case 9: disp_num(num9);break; 
default: break; 
   } 

/*----------- --LCD初始化------------------*/ 
void lcd_init() 

PSB=0; 
write_cmd(0x30);       //基本指令 
write_cmd(0x02);       //地址归位 
write_cmd(0x06);       //游标右移 
write_cmd(0x0c);       //整体显示 
write_cmd(0x01);       //清屏 

/*-----------------------------------------*/ 
void displayP10() 

float ad1; 
//unsigned int temp1,sh1,ge1,n1,m1; 
//uchar code dis2[]={0x01,0x02,0x00}; 

//ad1=x*7.8125;   //电压修正 
uchar i; 
ad1=Vin*3.9608;   //具体线性参数由输入电压值调整,该值的测量范围为0-10.00V,5V左右的测量比较准确, 
                      //两端的最大误差为70mv,其他一般在40mv以内 
temp1=(int)ad1; 
sh1=temp1/1000;    //十位 
ge1=(temp1%1000)/100;   //个位 
n1=((temp1%1000)%100)/10; //小数点后一位 
m1=((temp1%1000)%100)%10; //小数点后二位 
//write_cmd(0x01);  
write_cmd(0x30);    //基本指令操作方式 

lcd_pos(0,0);  
   for(i=0;i<6;i++)        write_dat(ma1[i]); 
        
lcd_pos(0,3); 
disp_number(sh1); 
lcd_pos(0,4); 
disp_number(ge1); 
lcd_pos(0,5); 
for(i=0;i<2;i++)    write_dat(ma2[i]); 
lcd_pos(0,6); 
disp_number(n1); 
lcd_pos(0,7); 
disp_number(m1); 
/*lcd_pos(2,0); 
disp_hanzi(disp1); 
lcd_pos(3,0); 
disp_hanzi(disp2);*/ 

void main() 
{  
     EA=1; 
AD_initiate();   //初始化  
ADC_Power_On();     //开AD电源 
//init(); 
lcd_init(); 
delay(10); 
while(1) 
{  
      
     caiyangP10();    //测电压 
     send_ad_result(); 
   //Vin=Vin*4007; 
   displayP10(); 
   delay(10); 


推荐阅读

史海拾趣

AVG [AVG Semiconductors(HITEK)]公司的发展小趣事

AVG Semiconductors自创立之初,就始终坚持以技术创新为核心竞争力。公司不断投入研发资源,推出了一系列具有划时代意义的半导体产品。其中,AVG的某款高效能低功耗芯片在市场上引起了广泛关注,其独特的节能设计和卓越的性能使得AVG在激烈的市场竞争中脱颖而出。这款芯片的成功不仅提升了AVG的品牌形象,也为公司带来了可观的收益,进一步推动了公司的研发创新步伐。

广州盛炬(GZSJ)公司的发展小趣事

AVG Semiconductors自创立之初,就始终坚持以技术创新为核心竞争力。公司不断投入研发资源,推出了一系列具有划时代意义的半导体产品。其中,AVG的某款高效能低功耗芯片在市场上引起了广泛关注,其独特的节能设计和卓越的性能使得AVG在激烈的市场竞争中脱颖而出。这款芯片的成功不仅提升了AVG的品牌形象,也为公司带来了可观的收益,进一步推动了公司的研发创新步伐。

上海晶岳(AFSEMI)公司的发展小趣事

上海晶岳电子有限公司自2010年成立以来,就将目标锁定在60V以下MOSFET产品线及锂电池保护IC系列产品。在公司创始人的领导下,晶岳电子团队凭借对技术的深入理解和市场的敏锐洞察,迅速在行业中崭露头角。他们不仅注重产品的研发和设计,还积极与上下游企业合作,优化供应链,确保产品质量和交货期的稳定。经过几年的努力,晶岳电子在MOSFET领域建立了良好的口碑,为后续的发展奠定了坚实的基础。

FOX [Fox Electronics]公司的发展小趣事

随着全球对环保和可持续发展的重视,Fox Electronics积极响应行业趋势,将绿色生产理念融入企业运营中。公司投资引进先进的环保设备和生产工艺,减少生产过程中的废弃物排放和能源消耗。同时,Fox Electronics还推出了一系列符合RoHS(限制有害物质)指令的产品,满足市场对环保产品的需求。这些举措不仅提升了公司的社会责任感,也为其在绿色电子市场赢得了良好的声誉。

广州奥松公司的发展小趣事

奥松电子拥有一支近200名工程师组成的专职研发团队,并配备了超过7000㎡的研发实验室。实验室中配置了步进式投影光刻机、双面光刻机等先进设备,为公司的产品研发提供了有力的支持。这些设备不仅满足了产品研发、小试以及中试各个阶段的试验条件,也为公司的技术创新提供了坚实的基础。

东通电子公司的发展小趣事

深圳市东通电子有限公司(以下简称“东通电子”)成立于1998年5月,最初主要涉足电子元器件的生产和销售。随着市场的不断变化和技术的飞速发展,公司意识到仅仅依靠传统业务已无法满足市场需求。于是,在2002年,东通电子决定将重心转向有机薄膜电容器的研发和生产。这一转型为公司的后续发展奠定了坚实的基础。

问答坊 | AI 解惑

音乐集成FD9300是什么样的芯片?

请教音乐集成FD9300是什么样的芯片?有谁知道管脚排列及功能?…

查看全部问答>

你有意念移物能力吗

恐怖电影里经常出现这样的场面:物体咯咯作响、好像长腿似的移动起来,甚至在空中呼啸而过。一些人能够用思维影响物质的说法已存在了几百年,从移动家具到把勺子“看”弯,但是对这种现象的调查却一直存在争议。在普林斯顿大学从事全球意识研究计 ...…

查看全部问答>

DSP C语言入门谈

年初到现在,接触DSP已经半年了,由于公司没有人指导,做了这么久都没出什么大的成果,也走了不少的弯路。以前做单片机用C编过一些程序,个人觉得还可以。现在看来也只是在吃以前在学校里面一些C语言皮毛的老本,加上一些网上说的所谓的技巧什么的 ...…

查看全部问答>

请问ROM/bin文件的格式是什么如何被执行处理的?

请问ROM/bin文件的格式是什么如何执行处理的? 例如在【显示设置】中的 1234512345,在手机/MP4的ROM中发现是DF5FBBB9BA的,请问做了那些处理?变换的方式是什么? 二进制的: 1234512345 0001 0010 0011 0100 0101 0001 0010 0011 0100 01 ...…

查看全部问答>

想找个兼职,VC、单片机、arm嵌入式开发

想找个兼职,VC、单片机、arm嵌入式开发 作过基于microchip系列、msp430系列、S3C44B0、AT91RM9200、ST710等mcu的项目, 包括电力系统监控、税控等行业. 可承担四层板电路设计,底层嵌入式程序设计及上位机配套程序编写。 13816950690 msn:xh_du ...…

查看全部问答>

安捷伦武汉招聘销售工程师!

安捷伦武汉招聘销售工程师! Job Title                         Sales Engineer Type                &n ...…

查看全部问答>

初学者请教个中断的问题,谢谢!

电平触发方式的中断不是应该保持中断状态么?咋我这个接地之后只是变化的慢了而不是完全不动呢? #include void delay(unsigned int z); //延迟子程序声明 sbit dula=P1^0; //段锁位 sbit A1=P2^2; sbit B1=P2^3; sbit C1=P2^4; ...…

查看全部问答>

有没有做过1G采样系统的PCB

有没有做过1G采样系统的PCB啊?不知道现在做的这样高频的人多不多?技术怎么样啊?…

查看全部问答>

MSP430开发板用途

我学习这款单片机主要的用途是用了调试CC2500模块,学会怎么调试和配置那个模块,主要用来传输DMX512信号数据;…

查看全部问答>