完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我们老师布置的一个EDA作业,要求用i2c控制lm75a的温度传感器,来完成一个温度计的设计,要求用数码管显示,并且能够间隔一定时间就可以更新数据,实在是搞不出来了,希望有大神能指点一二
|
|
相关推荐
5个回答
|
|
我前两天高弄出来,很容易啊,就是一个I2C么
|
|
|
|
|
|
|
|
利用LM75测环境温度,设定上限温度27度,下限温度22度。超过范围蜂鸣器会响。将实测温度值利用串口发送到上位机上。将实测温度值*2427,取整后用液晶显示,并将该数转换成16进制且去除A~F后再显示。利用外部按键可以锁定该值,再按后取消锁定。
//LM75温度传感器 程序 #include #include #include #define uint8 unsigned char /*宏定义*/ #define uint16 unsigned int /*宏定义*/ #define qian (16*16*16) #define bai (16*16) #define shi 16 uint8 t0num,flagtime,flag=1,a; uint8 Num[4]; uint8 Num1[5]; uint8 Num2[4]; //定义寄存器指针值 #define TempReg 0x00 #define ConfReg 0x01 #define ThystReg 0x02 //温度下限值 #define TosReg 0x03 //温度上限值 ***it SCL=P3^3; /*模拟I2C 数据传送位*/ ***it SDA=P3^4; /*模拟I2C 时钟控制位*/ ***it EN=P1^0; ***it RS=P1^2; ***it ling=P1^3; ***it judge=P1^4; //***it Seg_Sel=P2^0; //***it Pos_Sel=P2^1; bit ack; /*应答标志位*/ uint8 code SegData[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; uint8 code SegData1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd, 0x87,0xff,0xef}; uint8 code SegData2[]="0123456789 "; void delayms(uint16 z) { uint16 x,y; for(x=z;x>0;x--) for(y=10;y>0;y--); } void write_com(uint8 com) { RS=0; P0=com; delayms(3); EN=1; delayms(3); EN=0; } void write_data(uint8 dat) { RS=1; P0=dat; delayms(3); EN=1; delayms(3); EN=0; } void initlcd() { EN=0; write_com(0x38); write_com(0x0c); write_com(0x06); write_com(0x01); } void Delay5us(void) { _nop_(); } void Delay1ms(uint16 ms) { uint16 i,j; for(i=ms;i>0;i--) for(j=56;j>0;j--); } void init() { TMOD=0x21; TH0=(65536-50000)/256; TL0=(65536-50000)%256; TH1=0xfd; TL1=0xfd; TR1=1; ET1=0; ET0=1; EX0=1; IE0=0; IT0=0; TR0=1; SM0=0; SM1=1; REN=1; EA=1; ES=1; } void timer0() interrupt 1 { TH0=(65536-50000)/256; TL0=(65536-50000)%256; t0num++; if(t0num==20) {t0num=0;flagtime=1;} } void Start_I2c() { SDA=1; /*发送起始条件的数据信号*/ _nop_(); /*起始条件建立时间大于4.7us,延时*/ SCL=1; Delay5us(); SDA=0; /*发送起始信号*/ Delay5us(); SCL=0; /*钳住I2C 总线,准备发送或接收数据*/ _nop_(); _nop_(); } void Stop_I2c() { SDA=0; /*发送结束条件的数据信号*/ _nop_(); /*发送结束条件的时钟信号*/ SCL=1; /*结束条件建立时间大于4μs*/ Delay5us(); SDA=1; /*发送I2C 总线结束信号*/ Delay5us(); } void WriteByte(uint8 Data) { uint8 i; for(i=0;i<8;i++) /*要传送的数据长度为8 位*/ { if((Data< SDA=1; /*判断发送位*/ else SDA=0; _nop_(); SCL=1; /*置时钟线为高,通知被控器开始接收数据位*/ Delay5us(); SCL=0; } _nop_(); _nop_(); SDA=1; /*8 位发送完后释放数据线,准备接收应答位*/ _nop_(); _nop_(); SCL=1; _nop_(); _nop_(); _nop_(); if(SDA==1) ack=0; else ack=1; /*判断是否接收到应答信号*/ SCL=0; _nop_(); _nop_(); } uint8 ReadByte() { uint8 Data; uint8 i; Data=0; SDA=1; /*置数据线为输入方式*/ for(i=0;i<8;i++) { _nop_(); SCL=0; /*置时钟线为低,准备接收数据位*/ Delay5us(); SCL=1; /*置时钟线为高使数据线上数据有效*/ _nop_(); _nop_(); Data<<=1; if(SDA==1) Data+=1; /*读数据位,接收的数据位放入Data 中*/ _nop_(); _nop_(); } SCL=0; _nop_(); _nop_(); return(Data); } void Ack_I2c(bit a) { if(a==0) SDA=0; /*在此发出应答*/ else SDA=1; /*在此发出非应答信号*/ _nop_(); _nop_(); _nop_(); SCL=1; Delay5us(); SCL=0; /*清时钟线,钳住I2C 总线以便继续接收*/ _nop_(); _nop_(); } bit WriteConfData(uint8 Data) { Start_I2c(); /*启动总线*/ WriteByte(0x90); /*发送器件地址*/ if(ack==0) return(0); WriteByte(ConfReg); /*发送指针地址*/ if(ack==0) return(0); WriteByte(Data); /*发送指针地址*/ if(ack==0) return(0); Stop_I2c(); /*结束总线*/ return 1; } bit WriteTos_ThystData(uint8 PAddress,uint8 DataH,uint8 DataL) { Start_I2c(); /*启动总线*/ WriteByte(0x90); /*发送器件地址*/ if(ack==0) return(0); WriteByte(PAddress); /*发送指针地址*/ if(ack==0) return(0); WriteByte(DataH); /*发送高位数据*/ if(ack==0) return(0); WriteByte(DataL); /*发送低位数据*/ if(ack==0) return(0); Stop_I2c(); /*结束总线*/ return 1; } uint16 ReadTemp_Tos_ThystDataP(uint8 PAddress) { uint16 Data[2]; uint16 Data16; Start_I2c(); /*启动总线*/ WriteByte(0x90); /*发送器件地址*/ if(ack==0) return(0); WriteByte(PAddress); /*发送指针地址*/ if(ack==0) return(0); Start_I2c(); /*重启总线*/ WriteByte(0x91); /*发送器件地址*/ if(ack==0) return(0); Data[0]=ReadByte(); /*读取数据高位*/ Ack_I2c(0); /*发送就答位*/ Data[1]=ReadByte(); /*读取数据低位*/ Ack_I2c(1); /*发送非就答位*/ Stop_I2c(); /*结束总线*/ Data16=(Data[0]<<8)|Data[1]; return Data16; } /***********led**************/ void Display(uint16 Data) { uint8 i,PosValue=0x01; uint16 Temp,Temp1,temp; // uint8 Num[4]; //用于存放数位 Temp=Data*5; //0.5℃精度,实际温度值 Num[0]=Temp/1000+0x30; //百位 Num[1]=Temp%1000/100+0x30; //十位 Num[2]=Temp%100/10+0x30; //个位 Num[3]=Temp%10+0x30; //十分位 Temp1=(uint16)(Data*0.5*2621); Num1[0]=Temp1/10000+0x30; //百位 Num1[1]=Temp1%10000/1000+0x30; //十位 Num1[2]=Temp1%1000/100+0x30; //个位 Num1[3]=Temp1%100/10+0x30; //十分位 Num1[4]=Temp1%10+0x30; temp=Temp1; Num2[0]=(temp/qian); Num2[1]=(temp%qian/bai); Num2[2]=(temp%bai/shi); Num2[3]=temp%16; for(i=0;i<20;i++) { P2=0x7f; P0=SegData[Num[i]]; Delay1ms(1); P2=0xbf; P0=SegData[Num[1]]; Delay1ms(1); P2=0xdF; P0=SegData1[Num[2]]; Delay1ms(1); P2=0xeF; P0=SegData[Num[3]]; Delay1ms(1); } } //*************************************** // LM75A.c //功能: 读LM75A 采集的温度值 //*************************************** void main() { if( WriteConfData(0x00)) { if(WriteTos_ThystData(0x02,0x16,0)&&WriteTos_ThystData(0x03,0x1b,0)) { uint16 temp=0,i,num; init(); initlcd(); while(1) { if(flagtime==1) { temp=ReadTemp_Tos_ThystDataP(0x00); temp=temp>>7; Delay1ms(180); Display(temp); flagtime=0; ES=0; for(i=0;i<4;i++) { SBUF=Num[i]; while(!TI); TI=0; if(i==2) {TI=1; printf("."); while(!TI); TI=0; } } ES=1; write_com(0x80+0x00); for(num=0;num<5;num++) { write_data(Num1[num]); delayms(3); } write_com(0x80+0x40); for(num=0;num<4;num++) { write_data(SegData2[Num2[num]]); delayms(3); } while(flag==1); } } } } } void waibu0()interrupt 0 { flag=~flag; ling=~ling; // while(flag) } |
|
|
|
我刚调出来的,绝对正确哦哦
|
|
|
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
1413 浏览 1 评论
1208 浏览 0 评论
矩阵4x4个按键,如何把识别结果按编号01-16(十进制)显示在两个七段数码管上?
1419 浏览 0 评论
913 浏览 0 评论
2223 浏览 0 评论
1424 浏览 34 评论
5610 浏览 113 评论
浏览过的版块 |
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 00:23 , Processed in 0.692481 second(s), Total 78, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号