完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
#include
#include #include #define uint unsigned int #define uchar unsigned char #define delay4us() {_nop_();_nop_();_nop_();_nop_();} #define NOP _nop_() ***it HIGH=P2^3; ***it LOW=P2^4 ; ***it AD_CS =P1^0; ***it SCK=P1^1; ***it DO=P1^2; ***it DI=P1^2; ***it RS=P2^0; ***it RW=P2^1; ***it E =P2^2; //必要的位定义 unsigned char adval; uchar Display_Buffer[] = "000.0KPa"; uchar code Line1[] = "Current Press:"; //初始化所显示的字符 uchar adc0832(uchar channel) //读ADC0832函数,采集并返回 { uchar i=0; uchar j; uint dat2=0; uchar ndat=0; if(channel==0)channel=2; if(channel==1)channel=3; AD_CS=0;NOP; NOP; //拉低CS端,AD片选 DI=1;NOP; NOP; //在第一个脉冲下降之前 DI 必须是高电平,表示启始信号 SCK=1;NOP; NOP; SCK=0;NOP; NOP; SCK=1; DI=channel&0x1;NOP;NOP; //在第二和第三个脉冲下降之前 DI 输入两位表示通道 SCK=0;NOP; NOP; SCK=1; DI=(channel>>1)&0x1;NOP; NOP; SCK=0; //写命令完成,DI失去输入作用 DI=1;NOP;NOP; dat2=0; for(i=0;i<8;i++) //读出8字节数据 { dat2|=DO; SCK=1;NOP; NOP; SCK=0;NOP; NOP; dat2<<=1; if(i==7) dat2|=DO; } for(i=0;i<8;i++) { j=0; j=j|DO; SCK=1;NOP; NOP; SCK=0;NOP; NOP; j=j<<7; ndat=ndat|j; if(i<7)ndat>>=1; } AD_CS=1; SCK=0; DO=1; dat2<<=8; dat2|=ndat; return(dat2); //返回数据 } void DelayMS(uint ms) //延时程序,相应数值为相应毫秒数 { uchar i; while(ms--) { for(i=0;i<120;i++); //1mS延时 } } uchar Read_LCD_State() //检测LCD是否“忙” { uchar state; RS=0;RW=1;E=1;DelayMS(1); state=P0; //返回P0的值 E= 0;DelayMS(1); return state; //返回状态 } void LCD_Busy_Wait() { while((Read_LCD_State()&0x80)==0x80); DelayMS(5); } void LCD_Write_Command(uchar cmd) //写命令函数 { LCD_Busy_Wait(); RS = 0; RW = 0; E = 0; _nop_(); _nop_(); P0 = cmd; //将CMD值写入LCD产生相应的控制 delay4us(); E = 1; delay4us(); E = 0; } void Set_LCD_Pos(uchar pos) { LCD_Write_Command(pos | 0x80); } void LCD_Write_Data(uchar dat) //写数据函数 { LCD_Busy_Wait(); RS = 1; RW = 0; E = 0; P0 = dat; delay4us(); E = 1; delay4us(); E = 0; } void LCD_Initialise() //LCD初始化函数 { LCD_Write_Command(0x38); DelayMS(1); LCD_Write_Command(0x0c); DelayMS(1); LCD_Write_Command(0x06); DelayMS(1); LCD_Write_Command(0x01); DelayMS(1); } void Display_LCD_String(uchar p,uchar *s) //LCD显示函数 { uchar i; Set_LCD_Pos(p); for(i=0;i<16;i++) { LCD_Write_Data(s); //调用写数据函数 DelayMS(1); } } void write_sfm(uchar add,uchar num) //分秒函数 { LCD_Write_Command(0x80+0x40+add); //第行数据指针位置调整 LCD_Write_Data(0x30+num); } void main() { uchar c; uint bai,sh,ge,xiaoshu; long d; //为得到小数部分,使用长整形数 LCD_Initialise(); DelayMS(10); Display_LCD_String(0x00,Line1); Display_LCD_String(0x46,Display_Buffer); HIGH=0; LOW=0; while(1) { c=adc0832(0); d=c; d=d*10; //将数值扩大10倍得到小数 d=((d-100)*1000/2360)+150; //将电压值转换为压力值 bai=d/1000 ; //分离出百位 sh=d%1000/100; //分离出十位 ge=d%100/10; //分离出个位 xiaoshu=d%10 ; //分离出小数位 if(c>246) //判断过压函数 { HIGH=1;LOW=0; //开启过压报警灯 DelayMS(1) ; write_sfm(6,bai); write_sfm(7,sh); write_sfm(8,ge); write_sfm(10,xiaoshu); //写数据 } else if(c<10) //开启欠压报警灯 { { LOW=1; HIGH=0; write_sfm(6,bai); write_sfm(7,sh); write_sfm(8,ge); write_sfm(10,xiaoshu); //写数据 } else { HIGH=0;LOW=0; //正常状态,显示压力值 write_sfm(6,bai); write_sfm(7,sh); write_sfm(8,ge); write_sfm(10,xiaoshu); } } } //程序完
|
|
相关推荐 |
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
157 浏览 0 评论
【每周推荐】采用11代Intel CPU,基于youyeetoo X1开发板搭建少儿AI智能STEAM积木平台
825 浏览 0 评论
2372 浏览 2 评论
【youyeetoo X1 windows 开发板体验】+ 影音处理和AI模型移植
2226 浏览 5 评论
I.MX6ULL-飞凌 ElfBoard ELF1板卡- 移植zbar的方法
1694 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
5730 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-4-24 01:37 , Processed in 0.605104 second(s), Total 69, Slave 49 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号