您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > 用STC12C5A60S2测试AD转换程序
刚到手一块STC12C5A60S2单片机,看说明文档里有AD转换功能。于是写了这段程序测试学习一下,程序在我的学习板上运行稳定,如里要你只要改下I/O口即可。里面注解挺详细的,愿对看文档的人有所帮助吧。下面是主程序部份:#includestc12c5a60s2.h#includeintrins.h#defineucharunsignedchar#defineuintunsignedint/*-------------函数声明开始---------------*/voiddelay_ms(ucharms);//延时函数voidinit_adc(void);//初始化ADuintget_adc(void);//获取AD结果,返回UINT型值。externwrite1602_3b(ucharpos,uintn);externvoidinit_1602();/*-------------函数声明结束---------------*/voidinit_adc(void){P1ASF=0x01;//AD功能寄存器,设置I/O口作为AD转换实用。使用P1.0口。ADC_RES=0;//清理结果寄存器的值ADC_RESL=0;//清理结果寄存器的值ADC_CONTR=0x80;//开启AD电源并设置转换周期为540个时钟周期转换一次。//ADC_POWER=1;CHS2,1,0为0,用p1.0作为输入。SPEED1,0为0,540个时钟,delay_ms(2);}voiddelay_ms(ucharms){uinti=5000;while(ms--){while(i--);}}uintget_adc(void){uintd=0;ADC_CONTR=0X88;_nop_();_nop_();_nop_();_nop_();while(!(ADC_CONTR&0X10));ADC_CONTR&=~0X10;d|=ADC_RES;d=2;d|=ADC_RESL;returnd;}voidmain(void){uintv=0;uintdat=0;//P2M0=0X00;//P2M1=0XFF;_nop_();_nop_();_nop_();_nop_();_nop_();init_1602();init_adc();while(1){dat=get_adc();v=(uint)((dat*5.0*100)/1024);write1602_3b(0x48,v);delay_ms(10);}}下面是1602显示部分,在编译时要把两个程序都放入KEIL工程里。#includestc12c5a60s2.h#includeintrins.h#ifndefuchar#defineucharunsignedchar#endif#ifndefuint#defineuintunsignedint#endif#ifndefulong#defineulongunsignedlong#endif/*-------------引脚设置开始---------------*/#definedata_portP0sbitrs_1602=P2^6;//复位端sbitrw_1602=P2^5;//写数据端sbite_1602=P2^7;//使能端/*-------------引脚设置结束---------------*/ucharnum[]={0123456789abcdef};/*-------------函数声明开始---------------*///要引用哪个函数,在主调程序里exrern被调函数即可voidDelay_ms_1602(ucharms);//毫秒级延时voiddelay_us(ucharus);//微秒级延时,不太准。bitinspect(void);//测忙程度,在往1602里写命令或是数据前都要检测voidw_dat_1602(uchardat);//写数据voidw_cmd_1602(ucharcmd);//写命令voidpos_1602(ucharpos);//写显示地址,|0X80voidinit_1602();//初始化1602,可以根据自己的显示要求,要程序里改光标滚屏幕等设置voidinit_disp_1602(ucharpos,uchara[]);//1602的初始化显示,把要写的字符串写到数组里,用此函数显示出来。voidwrite1602_2b(ucharpos,ucharn);//在某一位置显示2位数字,POS是要显示数字的个位地址。数字往前显示,N是要显示的数字。voidwrite1602_3b(ucharpos,uintn);//在某一位置显示3位数字,后面同上。voidwrite1602_4b(ucharpos,uintn);//在某一位置显示4位数字,后面同上。voidwrite1602_5b(ucharpos,ulongn);//在某一位置显示5位数字,后面同上。/*-------------函数声明结束---------------*/voidDelay_ms_1602(ucharms)//@12.000MHz{unsignedchari,j;while(--ms){i=12;j=168;do{while(--j);}while(--i);}}voiddelay_us(ucharus)//{while(us--){_nop_();_nop_();}}/*-------------1602驱动部份开始---------------*/bitinspect(void){biti=0;rs_1602=0;_nop_();_nop_();rw_1602=1;_nop_();_nop_();e_1602=1;delay_us(6);i=(bit)(data_port&0x80);_nop_();e_1602=0;returni;}voidw_dat_1602(uchardat){while(inspect());rs_1602=1;_nop_();_nop_();rw_1602=0;_nop_();_nop_();e_1602=0;_nop_();_nop_();_nop_();data_port=dat;delay_us(6);e_1602=1;delay_us(6);e_1602=0;}voidw_cmd_1602(ucharcmd){while(inspect());rs_1602=0;_nop_();_nop_();_nop_();_nop_();rw_1602=0;_nop_();_nop_();_nop_();_nop_();e_1602=0;_nop_();_nop_();_nop_();_nop_();_nop_();data_port=cmd;delay_us(6);e_1602=1;delay_us(6);e_1602=0;}voidpos_1602(ucharpos){w_cmd_1602(pos|0x80);}voidinit_1602(){w_cmd_1602(0x38);Delay_ms_1602(2);w_cmd_1602(0x0c);Delay_ms_1602(2);w_cmd_1602(0x06);Delay_ms_1602(2);w_cmd_1602(0x01);Delay_ms_1602(2);}/*-------------1602驱动部份结束---------------*//*-------------1602多位数字显示开始---------------*/voidinit_disp_1602(ucharpos,uchara[]){uchari=0;pos_1602(pos);while(a[i]!='\0'){w_dat_1602(a[i]);i++;}}voidwrite1602_3b(ucharpos,uintn){pos_1602(pos);w_dat_1602((uchar)num[n%10]);pos_1602(pos-1);w_dat_1602((uchar)num[(n%100)/10]);pos_1602(pos-2);w_dat_1602((uchar)num[n/100]);}voidwrite1602_2b(ucharpos,ucharn){pos_1602(pos);w_dat_1602(num[n%10]);pos_1602(pos-1);w_dat_1602(num[n/10]);}voidwrite1602_4b(ucharpos,uintn){pos_1602(pos);w_dat_1602(num[((uchar)(n%10))]);pos_1602(pos-1);w_dat_1602(num[((uchar)((n%100)/10))]);pos_1602(pos-2);w_dat_1602(num[((uchar)((n%1000)/100))]);pos_1602(pos-3);w_dat_1602(num[((uchar)((n/1000)%10))]);}voidwrite1602_5b(ucharpos,ulongn){pos_1602(pos);w_dat_1602(num[((uchar)(n%10))]);pos_1602(pos-1);w_dat_1602(num[((uchar)((n%100)/10))]);pos_1602(pos-2);w_dat_1602(num[((uchar)((n%1000)/100))]);pos_1602(pos-3);w_dat_1602(num[((uchar)((n/1000)%10))]);pos_1602(pos-4);w_dat_1602(num[((uchar)(n/10000))]);}/*-------------1602多位数字显示结束---------------*//*测试用,用完屏蔽voidmain(void){//123456789uchartab1[]={hello};uchartab2[]={00000};init_1602();init_disp_1602(0x00,tab1);init_disp_1602(0x40,tab2);while(1){uchari;for(i=250;i0;--i){write1602_3b(0x47,i);delay_ms(255);delay_ms(255);}}}*/
本文标题:用STC12C5A60S2测试AD转换程序
链接地址:https://www.777doc.com/doc-4917803 .html