您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > 其它相关文档 > stc89c52很多有用程序
功能:驱动AD0832读取模拟电压数值,将AD转换后的数值,使用串口输出。ADC0832的CHO(通道0)是检测光敏电阻的电压变化。同时,增加数码管显示AD转换数值功能。实现串口输出,串口是单片机程序调试种最常用最重要的工具。在使用前需要主要开发板当前晶振频率是否为11.0592MHz,如不是,请更换晶振,或者自行计算定时器数值。时间:2011-8-23******************************************///头文件#includereg51.h#includeINTRINS.H//宏定义#defineucharunsignedchar#defineuintunsignedint#defineulongunsignedlong//管脚定义sbitADC0832_CLK=P3^5;sbitADC0832_DODI=P2^7;sbitADC0832_CS=P3^4;/*****************************************************///定义引脚(根据硬件改变)sbitBCD6=P1^5;sbitBCD5=P1^4;sbitBCD4=P1^3;sbitBCD3=P1^2;sbitBCD2=P1^1;sbitBCD1=P1^0;#defineBCD_PORTP0/**********************************************************************************************/codeucharBCD[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0x40};//定义数字显示数组为常量,共阴极///*0,1,2,3,4,5,6,7,8,9,0.,1.,2.,3.,4.,5.,6.,7.,8.,9.,-///函数声明/******************************************///延时子函时,//参数d_time控制延时的时间//作用,灯亮和熄灭必须持续一定时间,人眼才能看到voiddelay(unsignedinttime);/******************************************///延时子函数//参数范围0-65536voiddelay(unsignedinttime)//参数time大小{//决定延时时间长短while(time--);}/******************************************///毫秒级延时函数voidmDelay(uchardelay){uchari;for(;delay0;delay--){for(i=123;i0;i--);}}/******************************************************************///数码管显示函数voidDisplayBCD(ulongtemp){BCD_PORT=BCD[temp/1000%10];BCD6=0;mDelay(10);BCD6=1;BCD_PORT=BCD[temp/100%10];BCD5=0;mDelay(10);BCD5=1;BCD_PORT=BCD[temp/10%10];BCD4=0;mDelay(10);BCD4=1;BCD_PORT=BCD[temp%10];BCD3=0;mDelay(10);BCD3=1;BCD_PORT=0x5e;BCD2=0;mDelay(10);BCD2=1;BCD_PORT=0x7c;BCD1=0;mDelay(10);BCD1=1;}//------------------------------------------------ADC0832读取函数------------------------------------------------------/************************************************************///读取ADC0832转换值函数//入口函数:channel选择通道ucharADC0832_Read(ucharchannel){uchari=0;uchartmp=0;//高字节数据uchartmp1=0;//低字节数据//开始标志位ADC0832_DODI=1;_nop_();_nop_();ADC0832_CS=0;//片选信号ADC0832_CLK=1;_nop_();_nop_();ADC0832_CLK=0;_nop_();_nop_();//选择通道switch(channel){case0://通道0ADC0832_DODI=1;//SGL=1;_nop_();_nop_();ADC0832_CLK=1;_nop_();_nop_();ADC0832_CLK=0;_nop_();_nop_();ADC0832_DODI=0;//ODD=0;_nop_();_nop_();ADC0832_CLK=1;_nop_();_nop_();ADC0832_CLK=0;_nop_();_nop_();break;case1://通道1ADC0832_DODI=1;//SGL=1;_nop_();_nop_();ADC0832_CLK=1;_nop_();_nop_();ADC0832_CLK=0;_nop_();_nop_();ADC0832_DODI=1;//ODD=1;_nop_();_nop_();ADC0832_CLK=1;_nop_();_nop_();ADC0832_CLK=0;_nop_();_nop_();break;default:break;}ADC0832_DODI=1;_nop_();_nop_();//读取8位转换数值for(i=0;i8;i++){ADC0832_CLK=1;//产生同步时钟_nop_();_nop_();ADC0832_CLK=0;_nop_();_nop_();if(ADC0832_DODI)//按位获取8位数据{tmp|=0x01;//从低位获取}else{tmp&=0xfe;}if(i7){tmp=1;//移位}}tmp1=tmp&0x01;tmp1=6;for(i=0;i7;i++)//获取7位校验数据{ADC0832_CLK=1;_nop_();_nop_();ADC0832_CLK=0;_nop_();_nop_();if(ADC0832_DODI){tmp1|=0x80;}else{tmp1&=0x7f;}if(i6){tmp1=1;}}ADC0832_CS=1;//禁止ADC0832if(tmp==tmp1)//当高字节与低字节相同时,该值有效{returntmp;//返回数值}}//------------------------------------------------串口初始化------------------------------------------------------voidUart_Init(void){//波特率9600TMOD=0x20;//定时器T1使用工作方式2TL1=0xfa;TH1=0xfa;TR1=1;//开始计时SCON=0x50;//工作方式1,波特率9600bps@11.0592,允许接收PCON|=0x80;//ES=1;//EA=1;//打开所有中断TI=0;//RI=0;//REN=1;}//------------------------------------------------串口显示----------------------------------------------------------voidRS_Byte(ucharR_Byte){SBUF=R_Byte;while(TI==0);//查询法TI=0;}voidRS_String(uchar*p){uchari=0;while(*(p+i)!='\0'){RS_Byte(*(p+i));i++;}}/******************************************///主函数voidmain(void){ucharAD_Value;//LED灯输出变量uchari;Uart_Init();RS_String(UartInitializing......\n);delay(50000);RS_String(UartInitializingFinished!!\n);delay(50000);RS_String(WelcometouseGreenShieldProducts!\n);RS_String(GoingtoMainLoop..\n);while(1)//主程序循环{AD_Value=0xff-ADC0832_Read(0);RS_String(ThevalueofADis:);RS_Byte(AD_Value/100+'0');RS_Byte(AD_Value/10%10+'0');RS_Byte(AD_Value%10+'0');RS_Byte('\n');for(i=0;i20;i++){DisplayBCD(AD_Value);}}}功能:熟悉人体红外热释模块的原理及电路,当检测到有人的时候,模块输出低电平,单片机在接收到红外热释模块输出低电平后,随即驱动蜂鸣器,直至红外热释模块输出返回高电平。注意:开发板SW3拨动开关应处于A档位时间:2011-8-23******************************************///头文件#includereg51.h//宏定义#defineucharunsignedchar#defineuintunsignedint//引脚定义sbitBEEP=P2^2;sbitIR_MOUDLE=P3^2;//全局变量uchari;//函数声明/******************************************///延时子函时,//参数d_time控制延时的时间//作用,灯亮和熄灭必须持续一定时间,人眼才能看到voiddelay(unsignedinttime);/******************************************///延时子函数//参数范围0-65536voiddelay(unsignedinttime)//参数time大小{//决定延时时间长短while(time--);}/******************************************///主函数voidmain(void){IR_MOUDLE=1;while(1){if(IR_MOUDLE==0){BEEP=0;}else{BEEP=1;}delay(1000);}}功能:水银开关相当于一个状态开关,水银传感器默认状态下是导通的,也就是输出高电平。当抖动开发板,水银球将原本导通的两根导线断开,即输出低电平。传感器连接单片机INT1(P33)引脚。水银输出一个低电平,单片机INT1接收后,进入中断服务子程序,数码管开始计数注意:开发板SW4拨动开关应处于D档位时间:2011-8-23******************************************//*****************************************************///包含头文件#includereg52.h#includeINTRINS.H#includelcd1602.h#includestdio.h/******
本文标题:stc89c52很多有用程序
链接地址:https://www.777doc.com/doc-4906995 .html