2024年2月4日发(作者:)
/*--------------------------------------------------------------------------------------------------------------------------------------------************该程序为一个完整的温度控制器程序最小系统温控板(后附图)实现功能:1、2X2的矩阵按键:分别实现(温度+,温度-,温度确认,回到初始化状态)2、先按键设定你要的温度值,然后按下确认键,此时,水泥电阻开始加热,数码管动态显示电阻此时的温度。实现控制水泥电阻被加热到你所需要的温度值。并且能够稳定在你所设定的温度下。当实际温度超过你设定的温度,蜂鸣器报警。*************包括各个模块及详细的注释**方便C51单片机入门级别者阅读**--------------------------------------------------------------------------------------*/#include }voiddelay1ms(unsignedinti){unsignedcharj;while(i--){for(j=0;j<115;j++){;}}}voidbuzzeron(void){unsignedintt;P1M1&=~0x10;P1M0|=0X10;for(t=0;t<100;t++){P14=0;smgshow(num,tp);P14=1;smgshow(num,tp);}P14=0;}/*--------------------------------------------------------------------------------------------------------------------------------------------******函数名:描述参数::Init()******//--------------------蜂鸣器响动函数//-------------------1ms基准延时函数各端口初始化无***返回值:无*------------------------------------------------------*/voidInit(){P1M1&=~0X08;P1M0|=0X08;P0M1=0X00;P0M0=0XFF;P1M0&=~0X02;P1M1|=0x02;ADC_CONTR|=0x80;delayus(1);AUXR1&=~0X04;ADC_CONTR=0XE1;}//P1^3口推挽输出//P0口全部推挽输出//P1^1口高阻输入避免各器件及电路对P11口的干扰//启动BIT3=0x08(ADC_STARTAD)开启转换//AD值存储方式//打开AD通道 /*--------------------------------------------------------------------------------------------------------------------------------------------***函数名:keyboardset()**********参数:描述:键盘检测及设置,由两个函数构成先用keyask函数扫描哪个键按下,然后用keyboardset执行相应功能*********无无返回值:------------------------------------------------------------------------------------*/voidkeyboardset(void){uchari;P1M1&=0xef;P1M0|=0x10;P14=0x00;//推挽输出,以驱动蜂鸣器{keyask();//按键扫描if((s60+s61+s62+s63)!=0){if(s60==1){if(num>0)num=num-1;smgshow(num,tp);}if(s61==1){num=num+1;smgshow(num,tp);if(num>=99)num=99;}if(s62==1){if(num>tp)makesure=1;return;}if(s63==1){makesure=0;return;}for(i=0;i<20;i++){P1=0x10;delay1ms(1);P1=0x00;//每按一次,响一次 delay1ms(1);}}else{}}smgshow(num,tp);}voidkeyask(void){s60=0;s61=0;s62=0;s63=0;P3=0xb0;temp=P3&0x30;if(temp!=0x30){//---------------------------------------------------------------------------按键扫描函数//第一行扫描10110000delay1ms(10);if(temp!=0x30)switch(temp){case(0x20):s60=1;while(!(P3&0x10));break;case(0x10):s61=1;while(!(P3&0x20));break;}}P3=0x70;//第二行扫描temp=P3&0x30;if(temp!=0x30){delay1ms(10);if(temp!=0x30)switch(temp){case(0x20):s62=1;while(!(P3&0x10));break;case(0x10):s63=1;while(!(P3&0x20));break;}}}/*--------------------------------------------------------------------------------------------------------------------------------------------****函数名:描述:getAd()****//while消抖//消除抖动AD初始化及采集 **参数:无*****返回值:sum*------------------------------------------------------------------------------*/uchargetAd(void){uchari;uintsum=0;for(i=0;i<8;i++){ADC_CONTR|=0x08;delayus(1);P1ASF=0X02;while((ADC_CONTR&0x10)==0x00);ADC_CONTR&=~0x10;sum+=ADC_RES;}sum>>=3;return(uchar)sum;}ucharcodeadlist[]={0x63,0x63,0x62,0x62,0x61,0x61,0x60,0x60,0x5f,0x5e,0x5e,0x5d,0x5c,0x5c,0x5b,0x5a,0x5a,0x59,0x58,0x57,0x57,0x56,0x55,0x54,0x53,0x52,0x51,0x50,0x4f,0x4e,0x4d,0x4c,0x4b,0x4a,0x49,0x48,0x47,0x46,0x46,0x45,0x44,0x43,0x42,0x42,0x41,0x40,0x3f,0x3f,0x3e,0x3d,0x3d,0x3c,0x3b,0x3b,0x3a,0x39,0x38,0x38,0x37,0x36,0x36,0x36,0x35,0x35,0x34,0x33,0x33,0x32,0x32,0x31,0x31,0x30,0x30,0x2f,0x2f,0x2e,0x2e,0x2d,0x2d,0x2c,0x2c,0x2b,0x2b,0x2a,0x2a,0x29,0x29,0x28,0x28,0x27,0x27,0x26,0x26,0x25,0x25,0x24,0x24,0x24,0x23,0x23,0x22,0x22,0x21,0x21,0x20,0x20,0x20,0x1f,0x1f,0x1e,0x1e,0x1d,0x1d,0x1d,0x1c,0x1c,0x1b,0x1b,0x1a,0x1a,0x1a,0x1a,0x19,0x19,0x18,0x18,0x18,0x17,0x16,0x16,0x15,0x15,0x15,0x14,0x14,0x13,0x13,0x13,0x12,0x12,0x11,0x11,0x10,0x10,0x10,0x0f,0x0f,0x0e,0x0e,0x0e,0x0d,0x0d,0x0c,0x0c,0x0b,0x0b,0x0b,0x0a,0x0a,0x09,0x09,0x08,0x08,0x08,0x07,0x07,0x07,0x06,0x06,0x06,0x05,0x05,0x05,0x04,0x04,0x04,0x04,0x03,0x03,0x03,0x03,0x02,0x02,0x02,0x02,0x01,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00};//AD转换的温度值表//右移3位,除以8,求平均值//强制转换将sum转换为uchar形式//////////启动BIT3=0x08(ADC_STARTAD)开启转换P1口模拟功能控制位00000010开启P11等待转换结束(等ADC_FLAG置1转换结束)ADC_FLAG软件清零SUM存电压值/*--------------------------------------------------------------------------------------------------------------------------------------------********函数名:描述参数::smgshow()******数码管显示(动态)num,tp*返回值:无*------------------------------------------------------------------------------*/voidsmgshow(ucharnum,uchartp){P0=table[num/10];P27=1;//千位 P26=0;P25=0;P24=0;delay1ms(2);P0=table[num%10];P27=0;P26=1;P25=0;P24=0;delay1ms(2);//百位P0=table[tp/10];P27=0;P26=0;P25=1;P24=0;delay1ms(2);//十位P0=table[tp%10];P27=0;P26=0;P25=0;P24=1;delay1ms(2);//个位}/*--------------------------------------------------------------------------------------------------------------------------------------------********主函数先初始化,再进入循环********------------------------------------------------------------------------------*/voidmain(){Init();while(1){keyboardset();ad=getAd();tp=adlist[ad/2];if(makesure==1){//----------键盘检测及设置//----------得到的AD值//----------经查表得到的温度赋给tp//----------等待s62确认键是否按下//各端口初始化//进入死循环 if(num>=tp){heat=1;}if(tp>num){heat=0;}}smgshow(num,tp);}//----------当设定值大于实际温度值时加热//----------电阻加热//-----------当设定值小于实际温度值时停止加热//-----------停止加热buzzeron();//-----------蜂鸣器响//-----------数码管显示}/*---------------------------------------------------------------------------------------------------------------------------------by灏*/原理图:实物图:
发布者:admin,转转请注明出处:http://www.yc00.com/web/1706999473a1472500.html
评论列表(0条)