/*温感器
此为自已写的,已修正时序,自测过延时时间
采用天祥温度转换模块算法
*/
#include __CONFIG(0X3B31); #define uint unsigned int #define uchar unsigned char #define DQ RC1 #define DQ_DIR TRISC1 #define DQ_HIGH() TRISC1=1 #define DQ_LOW() DQ=0;TRISC1=0 unsigned char shi; //整数十位 unsigned char ge; //整数个位 unsigned char shifen; //十分位 unsigned char baifen; //百分位 unsigned char qianfen; //千分位 unsigned char wanfen; //万分位 const uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//显示数组0 void delayus(char x,char y) //慧净提供的us级的延时 { char z; //定义Z do { //先执行一次do z=y; //把Y的值给Z do{;}while(--z); //do空语句,等待--z,直到z=0结束,do--while语句,延时在这产生 } while (--x); //同理x在--,再产生延时 } void delay(uint x) { uint a,b; for(a=x;a>0;a--) for(b=110;b>0;b--); } void display(char shi,char ge,char shifen,char baifen,char qianfen) { PORTD=table[shi]; PORTA=0x02; delay(2); PORTD=table[ge]|0x80; //或上0x80显示出小数点 PORTA=0x04; delay(2); PORTD=table[shifen]; PORTA=0x06; delay(2); PORTD=table[baifen]; PORTA=0x08; delay(2); PORTD=table[qianfen]; PORTA=0x0a; delay(2); } void init(void) { TRISA=0;PORTA=0x00; TRISC=0xf0;PORTC=1; TRISD=0; } void reset(void) { char pe=1; while(pe) { DQ_LOW(); delayus(2,81); //延时502us DQ_HIGH(); delayus(4,4); //延时71us if(DQ==1)pe=1; //判断是否响应(响应时拉至低电平),没响应时置1循环重发 else pe=0; //否则就是响应了,置0以退出循环 delayus(2,81); //延时502us } } void write_byte(char val) { uchar i,temp; for(i=8;i>0;i--) //循环8次构成一个字节 { temp=val&0x01; //取出,最低位,相与取出1 DQ_LOW(); delayus(1,1); //延时15us if(temp==1)DQ_HIGH(); //判断如果取出的是1时拉至高电平,发出去 delayus(3,3); //延时45us,如果取出的是0时,也发送去 DQ_HIGH(); //拉高至高电平 NOP();NOP(); //延时2us val=val>>1; //右移一次以便下次取出 } } uchar read_byte(void) { uchar i,val=0; static bit j; //静态位变量,一个状态位,不能是一个字节 for(i=8;i>0;i--) { val=val>>1; //先移一个位 DQ_LOW(); //拉至低电平 NOP();NOP();NOP();NOP();NOP();NOP(); //延时6us DQ_HIGH(); NOP();NOP();NOP();NOP(); //延时4us j=DQ; //读取数据线的状态以得到一个状态位,进行数据处理 //所以要定义static bit j; if(j==1)val=val|0x80; //数据处理:如果读到是1先放在最高位第1位,再利用逐个后移就构与一个字节了 delayus(1,6); //延时30us,以重复以上步骤 } return(val); //构成1个字节后返回走 } void get_temp(void) //01:40:26 //获取温度,器件匹配(多个温感) { uchar TLV,THV,num; //tem1/tem2;还有2个字节温度指令 float aaa; uint temper; reset(); //复位 write_byte(0xCC); //跳过ROM write_byte(0x44); //温度转换,需延时 for(num=100;num>0;num--) //原本这里是delay(1000)延时1秒的。可效果却是晃一下就没了, display(shi,ge,shifen,baifen,qianfen); //所以用显示的来代替延时,显100次算得差不多就是750ms以上 reset(); //每次操作RAM之前,需复位下18B20,再匹配下 write_byte(0xCC); //跳过ROM write_byte(0xBE); //告诉它,接下来我就要读你的温度了,读暂存器 TLV=read_byte(); //RAM有9个字节(我们只需要2个字节LSB和MSB这两个字节),它读的时候都是从最低位开始读 THV=read_byte(); //01:45:10处+锐志在58:52分处 DQ_HIGH(); //释放总线 aaa=(THV*256+TLV)*0.0625*1000; //(16位的温度数据)*0.0625就是实际的温度(十进制数) temper=(int)aaa; //因为编译时警告;有小数点是浮点类到整形转换;我们用强制转换成整形 要把小数点的值取出来(小数点不好取,用乘以100来取) shi=temper/10000; //几十点几几分配到五个数码管上,四个数码显示的感觉怪怪的所以用五个数码管;在1:51:00处讲 ge=temper%10000/1000; //我是要用五个数码管来显示所以就是10000五位数 shifen=temper%1000/100; // baifen=temper%100/10; // qianfen=temper%10; // } void main() { init (); while(1) { get_temp(); display(shi,ge,shifen,baifen,qianfen); //没带形参编译器过不了,带类形的形参也过不了 } }
上一篇:PIC单片机开发板之独立键盘扫描C语言代码
下一篇:PIC单片机开发板独立键盘扫描+蜂鸣器响+数码管 C程序代码
推荐阅读
史海拾趣
Econais的超低功耗Wi-Fi模块在医疗保健领域取得了广泛的应用。通过连接医疗设备,如监护仪、血糖仪等,这些模块实现了患者数据的实时传输和监控,提高了医疗服务的效率和质量。同时,Econais还针对医疗保健领域的特点,提供了定制化的软件开发工具包(SDK),帮助客户快速开发符合行业标准的物联网应用。
国博电子的前身可以追溯到2000年成立的上海华信集成电路有限公司,起初专注于射频芯片的研发与生产。随着技术的积累和市场的拓展,公司逐步从单一的射频芯片企业成长为覆盖射频芯片、模块、组件的完整产业平台。这一跨越不仅体现了公司在技术上的深厚积累,也反映了其对市场需求的敏锐洞察和快速响应能力。通过不断的技术创新和产品研发,国博电子成功在无线通信、移动通信等领域占据了一席之地。
在电子行业这个竞争激烈的领域里,技术的更新换代速度非常快。为了保持领先地位,Exclara高度重视研发投入,不断引进高端人才和先进设备,加强研发团队建设。通过持续的研发投入,公司不仅保持了技术的领先地位,还成功开发出了一系列具有自主知识产权的核心技术。
在Exclara看来,质量是企业的生命线。公司始终坚持质量至上的原则,从原材料采购到生产过程的每一个环节都严格把关,确保产品质量的稳定性和可靠性。同时,公司还建立了完善的客户服务体系,为客户提供全方位、个性化的服务支持。这种以客户为先的经营理念不仅赢得了客户的信任和支持,也为公司赢得了良好的口碑和声誉。
大家在用的RVDS版本是多少?我用RVDSV4.0怎么打不开*.mcp的工程文件啊?必须用RVDSV2.0? 大家在用的RVDS版本是多少?我用RVDSV4.0怎么打不开*.mcp的工程文件啊?必须用RVDSV2.0?… 查看全部问答∨ |
|
怎样读取RSSI才能使RSSI的读取正确而又不影响正常的数据接收呢? 我现在在用CC1020做一个数传模块,接收数据时需要读取RSSI的值,接收数据是在外部中断中进行的. 问题是:我在接收数据的时候读取的RSSI的值是不对的,不符合数据手册上的正常值;有时由于读取RSSI的值正常的接收数据也发生了错误. 请教我该怎样读取RSS ...… 查看全部问答∨ |
如题,sd卡读写问题,有的文件能写进去,有的文件不能写进去。。。 高手指点一下,文件系统用的是EFSL ARM7---EasyArm2200… 查看全部问答∨ |
dsp的中断优先级的修改可以由头文件DSP281x_SWPrioritizedIsrLevels.h定义PIE组的优先级和组内的优先级,源文件.c文件中的中断程序对IER和PIEIERx进行了赋值,以此屏蔽优先级低的中断。 & ...… 查看全部问答∨ |
|
一般智能的机器人都是用单片机芯片(MCU微处理器)做控制,简单一点的也需要由一些电阻、电容之类的电子元件组成的电子电路做控制。这里将介绍一个电路最简单的机器人,其不仅不需要单片机芯片,就连最普通的电阻、电容等电子元件也不用,完全 ...… 查看全部问答∨ |
IO_Read_Byte(0x00000000); SendSPIByte(((Dst_Addr & 0xFFFFFF) >> 16)); /* send 3 address bytes */ SendSPIByte(((Dst_Addr & 0xFFFF) >> 8)); SendSPIByte(Dst_Addr & 0xFF); 这几句该怎么理解呢 ...… 查看全部问答∨ |
设计资源 培训 开发板 精华推荐
- 新突破!超高速内存,为英特尔至强6性能核处理器加速
- 将vRAN站点整合至单服务器,助力运营商降低总体拥有成本
- Allegro MicroSystems 在 2024 年德国慕尼黑电子展上推出先进的磁性和电感式位置感测解决方案
- 左手车钥匙,右手活体检测雷达,UWB上车势在必行!
- 狂飙十年,国产CIS挤上牌桌
- 神盾短刀电池+雷神EM-i超级电混,吉利新能源甩出了两张“王炸”
- 浅谈功能安全之故障(fault),错误(error),失效(failure)
- 智能汽车2.0周期,这几大核心产业链迎来重大机会!
- 美日研发新型电池,宁德时代面临挑战?中国新能源电池产业如何应对?
- Rambus推出业界首款HBM 4控制器IP:背后有哪些技术细节?