有仿真图吗 |
这个原理图不清晰呀,还有beep的端口是干啥用的呀 |
gagalonghun 发表于 2019-6-18 15:18 楼主负责又细心 |
是这个,这个是正确的 #include <reg51.h> #include <intrins.h> #include <stdio.h> #define uint unsigned int #define uchar unsigned char /**********************定义全局变量***************/ //unsigned char dat=0x00 ; //AD值 unsigned char count = 0x00; //定时器计数 unsigned char channel; //通道变量 //ADC0832的引脚 sbit ADCS =P1^2; //ADC0832 chip seclect sbit ADDI =P1^1; //ADC0832 k in sbit ADDO =P1^1; //ADC0832 k out sbit ADCLK =P1^0; //ADC0832 clock signal unsigned char dispbuf[3]; uint temp; uint alc;//酒精浓度 uchar dat; //获取ADC转换回来的值 uchar *aa="M=T.TTmg/L"; uchar *cc="alarm"; uchar *dd=" "; uint sheding=60; uchar bb[16]={'A','l','c','o','h','o','l','=',' ','.',' ',' ','m','g','/','L'}; sbit RS = P2^0; //定义端口 sbit RW = P2^1; sbit EN = P2^2; sbit beep=P3^7; sbit k1=P1^3;//+键 sbit k2=P1^4;//-键 #define RS_CLR RS=0 #define RS_SET RS=1 #define RW_CLR RW=0 #define RW_SET RW=1 #define EN_CLR EN=0 #define EN_SET EN=1 void DelayUs2x(unsigned char t); void DelayMs(unsigned char t); void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s); void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data); void init(); void write_com(unsigned char com); void write_data(unsigned char date); void DelayUs2x(unsigned char t) { while(--t); } void DelayMs(unsigned char t) { while(t--) { //大致延时1mS DelayUs2x(245); DelayUs2x(245); } } /*********************************lcd1602各子函数**************************************/ void write_com(unsigned char com) //写命令 { RS_CLR; RW_CLR; P0=com; DelayMs(5); EN_SET; DelayMs(5); EN_CLR; } void write_data(unsigned char date) //写一个字符 { RS_SET; RW_CLR; P0=date; DelayMs(5); EN_SET; DelayMs(5); EN_CLR; } void initlcd() //初始化 { write_com(0x38); write_com(0x0c); write_com(0x06); write_com(0x01); } /*------------------------------------------------ 写入字符串函数 ------------------------------------------------*/ void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) { if (y == 0) { write_com(0x80 + x); } else { write_com(0xC0 + x); } while (*s) { write_data( *s); s ++; } } /*------------------------------------------------ 写入字符函数 ------------------------------------------------*/ void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data) { if (y == 0) { write_com(0x80 + x); } else { write_com(0xC0 + x); } write_data(Data); } /**************************************************************************** 函数功能:AD转换子程序 入口参数:CH 出口参数:dat ****************************************************************************/ //采集并返回 unsigned char Adc0832(unsigned char channel) //AD转换,返回结果 { uchar i=0; uchar j; uchar dat=0; uchar ndat=0; if(channel==0)channel=2; if(channel==1)channel=3; ADDI=1; _nop_(); _nop_(); ADCS=0;//拉低CS端 _nop_(); _nop_(); ADCLK=1;//拉高CLK端 _nop_(); _nop_(); ADCLK=0;//拉低CLK端,形成下降沿1 _nop_(); _nop_(); ADCLK=1;//拉高CLK端 ADDI=channel&0x1; _nop_(); _nop_(); ADCLK=0;//拉低CLK端,形成下降沿2 _nop_(); _nop_(); ADCLK=1;//拉高CLK端 ADDI=(channel>>1)&0x1; _nop_(); _nop_(); ADCLK=0;//拉低CLK端,形成下降沿3 ADDI=1;//控制命令结束 _nop_(); _nop_(); dat=0; for(i=0;i<8;i++) { dat|=ADDO;//收数据 ADCLK=1; _nop_(); _nop_(); ADCLK=0;//形成一次时钟脉冲 _nop_(); _nop_(); dat<<=1; if(i==7)dat|=ADDO; } for(i=0;i<8;i++) { j=0; j=j|ADDO;//收数据 ADCLK=1; _nop_(); _nop_(); ADCLK=0;//形成一次时钟脉冲 _nop_(); _nop_(); j=j<<7; ndat=ndat|j; if(i<7)ndat>>=1; } ADCS=1;//拉低CS端 ADCLK=0;//拉低CLK端 ADDO=1;//拉高数据端,回到初始状态 dat<<=8; dat|=ndat; return(dat);//return ad k } /**************************************************************************** 函数功能:定时器中断延时程序 这一段的作用时隔一段时间抽样一次 否侧显示的最后一位会不稳定 入口参数: 出口参数: ****************************************************************************/ void timer0(void) interrupt 1 { TMOD = 0x01; TH0 = 0x00; TL0 = 0x00; IE = 0x82; TR0 = 01; count++; if (count == 0x0A) { count = 0x00; dat= Adc0832(channel); } } /*void format_data(uint dat) { uint change_dat=dat; uchar ptr[3]; change_dat=(change_dat<<8)+(change_dat<<7)+(change_dat<<6)+(change_dat<<5)+(change_dat<<4)+(change_dat<<2);//乘500 change_dat=change_dat>>8;//除以256 ptr[0]=change_dat/100; //得到个位数字 ptr[1]=(change_dat-(100*ptr[0]))/10; //得到十分位数字 ptr[2]=change_dat-(100*ptr[0])-(10*ptr[1]); //得到百分位数字 }*/ void keyscan() { if(!k1) { DelayMs(5); if(!k1) { while(!k1); sheding+=5; LCD_Write_Char(2,1,sheding/100+'0'); LCD_Write_Char(4,1,sheding%100/10+'0'); LCD_Write_Char(5,1,sheding%10+'0'); } } if(!k2) { DelayMs(5); if(!k2) { while(!k2); sheding-=5; LCD_Write_Char(2,1,sheding/100+'0'); LCD_Write_Char(4,1,sheding%100/10+'0'); LCD_Write_Char(5,1,sheding%10+'0'); } } } /**************************************** 函数功能:主程序 入口参数: 出口参数: ****************************************/ void main(void) { uchar i; P2=0xff; //端口初始化 P0=0xff; P3=0xff; channel=0x00; //channel=0 TMOD = 0x01; TH0 = 0x00; TL0 = 0x00; IE = 0x82; TR0 = 01; initlcd(); LCD_Write_String(0,0,bb); LCD_Write_String(0,1,aa); //LCD_Write_String(11,1,cc); LCD_Write_Char(2,1,sheding/100+'0'); LCD_Write_Char(4,1,sheding%100/10+'0'); LCD_Write_Char(5,1,sheding%10+'0'); while(1) { temp=dat*1.0/255*500; //电压值转换,5V做为参考电压,分成256份。 if(temp<187) { alc=100*(temp-8)/895; } else { alc=100*(temp-133)/272; } dispbuf[0]=alc%10+'0'; //个位 dispbuf[1]=alc/10%10+'0'; //十位 dispbuf[2]=alc/100%10+'0'; //百位 //dispbuf[0]=temp%10+'0'; //个位 //dispbuf[1]=temp/10%10+'0'; //十位 //dispbuf[2]=temp/100%10+'0'; //百位 LCD_Write_Char(8,0,dispbuf[2]); LCD_Write_Char(10,0,dispbuf[1]); LCD_Write_Char(11,0,dispbuf[0]); keyscan(); if(alc>sheding) { //beep=0; for(i=0;i<10;i--) { beep=0; DelayMs(1); beep=1; } LCD_Write_String(11,1,cc); } else { LCD_Write_String(11,1,dd); } } } |
错误较多,我发源码给你 #include<reg51.h> #include"delay.h" #include"lcd602.h" #include"ds18b20.h" //**************端口定义******************* sbit LED = P1^0; sbit k1 = P1^4; sbit k2 = P1^5; sbit k3 = P1^6; //**************数组定义******************* uchar code tab2[]={"Temp: "}; //5 uchar code tab3[]={" H "}; //3 uchar code tab4[]={"L "}; //8 //**************变量定义******************* int temp1 = 400; //上限 int temp3 = 100; //下限 bit flag = 0; //上下限选择标志 int temp4; //当上限减到负数时 uchar temp5 = 0; /*******************按键********************/ void key() { if(flag == 0) //上限 { write_zifu(2,0,'*'); write_zifu(2,8,' '); if(k1 == 0) { delayxms(5); while(k1 == 0); temp1 += 10; } if(k2 == 0) { delayxms(5); while(k2 == 0); temp1 -= 10; } } if(flag == 1) //下限 { write_zifu(2,0,' '); write_zifu(2,8,'*'); if(k1 == 0) { delayxms(5); while(k1 == 0); temp3 += 10; } if(k2 == 0) { delayxms(5); while(k2 == 0); temp3 -= 10; } } if(k3 == 0) //上下限选择标志 { delayxms(5); while(k3 == 0); flag = ~flag; } } /*******************定时器T1初始化********************/ void T1_init() { TMOD = TMOD | 0x10; //设T1为方式1 TH1 = (65535-20000)/256; //计数20000个 TL1 = (65535-20000)%256; EA = 1; //开启总中断 ET1 = 1; //允许T1中断 TR1 = 1; //启动 } /*******************主函数********************/ void main() { chushihua();//lcd1602初始化 write_string(1,0,tab2); write_string(2,0,tab3); write_string(2,9,tab4); T1_init(); while(1) { key(); ds1820disp(); /*温度上限*/ if(temp1 < 0) { write_zifu(2,2,'-'); temp4 = temp1; temp4 = ~temp4; temp4 += 1; write_num3(2,3,temp4); write_zifu(2,7,' '); } else { write_zifu(2,2,'+'); if(temp1>=1000) { write_num4(2,3,temp1); } else { write_num3(2,3,temp1); } } /*温度下限*/ if(temp3 < 0) { write_zifu(2,10,'-'); write_num3(2,11,-(temp3)); write_zifu(2,15,' '); } else { write_zifu(2,10,'+'); if(temp3>=1000) {write_num4(2,11,temp3);} else {write_num3(2,11,temp3);} } /*报警*/ if(flag_temp == 1) //温度小于零 { if((-t)>temp1 || (-t)<temp3) {LED = 0;} else {LED = 1;} } else //温度大于零 { if(t>temp1 || t<temp3) {LED = 0;} else {LED = 1;} } } } /**************************定时器T1中断服务函数************************************/ void T1_time() interrupt 3 { TH1 = (65535-20000)/256; //计数20000个 TL1 = (65535-20000)%256; temp5 += 1; if(temp5 >= 25) { temp5 = 0; TR1 = 0; ReadTemperature(); TR1 = 1; } } |
第15行的unsigned chardispbuf[3];改为unsigned char dispbuf[3];//char后打一个空格就行了 |
怎么改呢 |
MAIN.C(16): error C129: missing ';' before 'temp' |