完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
![]() display(); } } /*********延时K*1ms,12.000mhz**********/ void delay(uint k) { uint i,j; for(i=0;i for(j=0;j<60;j++) {;} } } /**********写指令到ICM子函数************/ void WriteCommandLCM(uchar WCLCM,uchar BusyC) { if(BusyC) lcd_wait(); DATAPORT=WCLCM; LCM_RS=0; // 选中指令寄存器 LCM_RW=0; // 写模式 LCM_EN=1; _nop_(); _nop_(); _nop_(); LCM_EN=0; } /**********写数据到LCM子函数************/ void WriteDataLCM(uchar WDLCM) { lcd_wait( ); //检测忙信号 DATAPORT=WDLCM; LCM_RS=1; // 选中数据寄存器 LCM_RW=0; // 写模式 LCM_EN=1; _nop_(); _nop_(); _nop_(); LCM_EN=0; } /***********lcm内部等待函数*************/ void lcd_wait(void) { DATAPORT=0xff; //读LCD前若单片机输出低电平,而读出LCD为高电平,则冲突,proteus仿真会有显示逻辑黄色 LCM_EN=1; LCM_RS=0; LCM_RW=1; _nop_(); _nop_(); _nop_(); while(DATAPORT&BUSY) { LCM_EN=0; _nop_(); _nop_(); LCM_EN=1; _nop_(); _nop_(); } LCM_EN=0; } /**********LCM初始化子函数***********/ void initLCM( ) { DATAPORT=0; delay(15); WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号 delay(5); WriteCommandLCM(0x38,0); delay(5); WriteCommandLCM(0x38,0); delay(5); WriteCommandLCM(0x38,1); //8bit数据传送,2行显示,5*7字型,检测忙信号 WriteCommandLCM(0x08,1); //关闭显示,检测忙信号 WriteCommandLCM(0x01,1); //清屏,检测忙信号 WriteCommandLCM(0x06,1); //显示光标右移设置,检测忙信号 WriteCommandLCM(0x0c,1); //显示屏打开,光标不显示,不闪烁,检测忙信号 } /****显示指定坐标的一个字符子函数****/ void DisplayOneChar(uchar X,uchar Y,uchar DData) { Y&=1; X&=15; if(Y)X|=0x40; //若y为1(显示第二行),地址码+0X40 X|=0x80; //指令码为地址码+0X80 WriteCommandLCM(X,0); WriteDataLCM(DData); } /*******显示指定坐标的一串字符子函数*****/ void DisplayListChar(uchar X,uchar Y,uchar code *DData) { uchar ListLength=0; Y&=0x01; X&=0x0f; while(X<16) { DisplayOneChar(X,Y,DData[ListLength]); ListLength++; X++; } } /*****************系统显示子函数*****************/ void display(void) { uchar flagdat; WriteCommandLCM(0x0c,1); //显示屏打开,光标不显示,不闪烁,检测忙信号 DisplayListChar(0,0,str0); DisplayListChar(0,1,str1); DisplayOneChar(7,0,press_bai+0x30); DisplayOneChar(8,0,press_shi+0x30); DisplayOneChar(9,0,press_ge +0x30); DisplayOneChar(11,0,press_dot+0x30); disdata[0]=tvalue/1000+0x30;//百位数 disdata[1]=tvalue%1000/100+0x30;//十位数 disdata[2]=tvalue%100/10+0x30;//个位数 disdata[3]=tvalue%10+0x30;//小数位 if(tflag==0) flagdat=0x20;//正温度不显示符号 else flagdat=0x2d;//负温度显示负号:- if(disdata[0]==0x30) { disdata[0]=0x20;//如果百位为0,不显示 if(disdata[1]==0x30) { disdata[1]=0x20;//如果百位为0,十位为0也不显示 } } WriteCommandLCM(0xc3,0xc3); WriteDataLCM(flagdat);//显示符号? WriteCommandLCM(0xc4,0xc4); WriteDataLCM(disdata[0]);//显示百位 WriteCommandLCM(0xc5,0xc5); WriteDataLCM(disdata[1]);//显示十位 WriteCommandLCM(0xc6,0xc6); WriteDataLCM(disdata[2]);//显示个位 WriteCommandLCM(0xc7,0xc7); WriteDataLCM(0x2e);//显示小数点 WriteCommandLCM(0xc8,0xc8); WriteDataLCM(disdata[3]);//显示小数位 delay(1000); //稳定显示 } /************读ADC0832函数************/ uchar Adc0832(unsigned char channel) //AD转换,返回结果 { uchar i=0; uchar j; uint 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 data_pro(void) { unsigned int temp; float press; if(14 int vary=ad_data; //y=(115-15)/(243-13)*X+15kpa press=((10.0/23.0)*vary)+9.3; //测试时补偿值为9.3 temp=(int)(press*10); //放大10倍,便于后面的计算press_bai=temp/1000; //取压力值百位 press_shi=(temp%1000)/100; //取压力值十位 press_ge=((temp%1000)%100)/10; //取压力值个位 press_dot=((temp%1000)%100)%10; //取压力值十分位 } } /*****************报警子函数*******************/ unsigned int a; void alarm(void) { if(ad_data>=243) //如果当前压力值大于115kpa, { Alarm_led_red=0; a=10000; while(a--); { } Alarm_led_red=1; a=10000; while(a--); { } } else //则启动red led报警 { Alarm_led_red=1; } //关闭red led 报警 if(ad_data<=14) //如果当前压力值小于16kpa { Alarm_led_green=0; a=10000; while(a--); { } Alarm_led_green=1; //则启动green led报警 a=10000; while(a--); { } } else { Alarm_led_green=1; //关闭green led 报警 } //关闭green led 报警 } /****************************ds1820程序**********************************/ void delay_18B20(unsigned int i) //延时1微秒 { while(i--); } void ds1820rst() /*ds1820复位*/ { unsigned char x=0; DQ = 1; //DQ复位 delay_18B20(4); //延时 DQ = 0; //DQ拉低 delay_18B20(100); //精确延时大于480us DQ = 1; //拉高 delay_18B20(40); } uchar ds1820rd() /*读数据*/ { unsigned char i=0; unsigned char dat = 0; for (i=8;i>0;i--) { DQ = 0; //给脉冲信号 dat>>=1; DQ = 1; //给脉冲信号 if(DQ) dat|=0x80; delay_18B20(10); } return(dat); } void ds1820wr(uchar wdata) /*写数据*/ { unsigned char i=0; for (i=8; i>0; i--) { DQ = 0; DQ = wdata&0x01; delay_18B20(10); DQ = 1; wdata>>=1; } } void read_temp() /*读取温度值并转换*/ { uchar a,b; ds1820rst(); ds1820wr(0xcc); //*跳过读序列号*/ ds1820wr(0x44); //*启动温度转换*/ ds1820rst(); ds1820wr(0xcc); //*跳过读序列号*/ ds1820wr(0xbe); //*读取温度*/ a=ds1820rd(); b=ds1820rd(); tvalue=b; tvalue<<=8; tvalue=tvalue|a; if(tvalue<0x0fff) tflag=0; else { tvalue=~tvalue+1; tflag=1; } tvalue=tvalue*(0.625); //温度值扩大10倍,精确到1位小? //return(tvalue); } |
|
相关推荐
2个回答
|
|
#include
#include #include #include #define uchar unsigned char #define uint unsigned int #define BUSY 0x80 //常量定义 #define DATAPORT P0 //ADC0832的引脚 ***it ADCS =P1^2; //ADC0832 chip seclect ***it ADDI =P1^1; //ADC0832 k in ***it ADDO =P1^1; //ADC0832 k out ***it ADCLK =P1^0; //ADC0832 clock signal ***it LCM_RS=P2^0; ***it LCM_RW=P2^1; ***it LCM_EN=P2^2; ***it DQ=P3^7; uchar ad_data; //采样值存储 ***it Alarm_led_red =P1^5; //超过压力表量程最大值红色led报警定义 ***it Alarm_led_green=P1^6; //低于压力表量程最小值绿色led报警定义 //adc采样值存储单元 char press_data; //标度变换存储单元 unsigned char ad_alarm; //报警值存储单元 unsigned char press_bai=0; //显示值百位 unsigned char press_shi=0; //显示值十位 unsigned char press_ge=0; //显示值个位 unsigned char press_dot=0; //显示值十分位 uchar data disdata[5]; uint tvalue;//温度值 uchar tflag;//温度正负标志 uchar code str0[]={"Press: . kpa. "}; uchar code str1[]={"tp "}; void delay(uint); void lcd_wait(void); void delay_LCM(uint); //LCD延时子程序 void initLCM( void); //LCD初始化子程序 void lcd_wait(void); //LCD检测忙子程序 void WriteCommandLCM(uchar WDLCM,uchar BusyC); //写指令到ICM子函数 void WriteDataLCM(uchar WDLCM); //写数据到LCM子函数 void DisplayOneChar(uchar X,uchar Y,uchar DData); void DisplayListChar(uchar X,uchar Y,uchar code*DData); //显示指定坐标的一串字符子函数 void display(void); //系统显示子函数 uchar Adc0832(unsigned char channel); void alarm(void); void data_pro(void); void delay_18B20(unsigned int i); void ds1820rst(); /*ds1820复位*/ uchar ds1820rd(); /*读数据*/ void ds1820wr(uchar wdata); /*写数据*/ void ds1820disp(); //温度值显示 void read_temp(); /**********main funcation************/ void main(void) { delay(500); //系统延时500ms启动 ad_data=0; //采样值存储单元初始化为0 initLCM( ); WriteCommandLCM(0x01,1); //清显示屏 DisplayListChar(0,0,str0); DisplayListChar(0,1,str1); while(1) { ad_data =Adc0832(0); //采样值存储单元初始化为0 alarm(); read_temp();//读取温度 data_pro(); |
|
|
|
取消电阻R1(短路掉)
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
1920 浏览 2 评论
9306 浏览 3 评论
10536 浏览 1 评论
10743 浏览 0 评论
Protues中自己封装的芯片元件无Program File、Clock Frequency选项怎么解决,求求大神了!
12683 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-2-25 01:35 , Processed in 0.355890 second(s), Total 44, Slave 36 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191