完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
本帖最后由 fanm66 于 2015-5-1 16:09 编辑
仿真电路图如下 已有程序并能正确运行,但小弟实在做不出串口发送(只要能发送)部分,l恳求各位大大帮忙,谢谢 #include #include #include #define uchar unsigned char #define uint unsigned int /******************************************************************/ /* 定义端口 */ /******************************************************************/ ***it buzzer=P1^3;//蜂鸣器端口 ***it DQ=P1^4; //ds18b20 端口 /******************************************************************/ /* 全局变量 */ /******************************************************************/ uint temp;//当前温度值 uchar TempH=0,TempL=0; int temp_max,temp_min;//设定温度的最大值和最小值 uchar flag_get,count,num; uchar tab[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //0~~9段码 uchar str[4];//四位数码管显示字符 uchar display_mod;//数码管显示模式 /******************************************************************/ /* 函数声明 */ /******************************************************************/ unsigned int ReadTemperature(void);//读取温度函数 void Init_DS18B20(void);//18b20初始化函数 unsigned char ReadOneChar(void);//18B20读一个字节 void WriteOneChar(unsigned char dat);//18B20写一个字节 void delay(unsigned int i);//短延时 void alarm();//报警 /******************************************************************/ /* 主函数 */ /******************************************************************/ main() { display_mod=0;//显示当前温度 temp_min=10;//设置最低温 temp_max=40;//设置最高温 TMOD|=0x01;//定时器设置 TH0=0xef; //定时器初值 TL0=0xf0; IE=0x82;//EA=1,ET0=1 TR0=1; //开定时器 P2=0xff; count=0; while(1) { if(flag_get==1) { flag_get=0;// 获取温度标志清零 temp=ReadTemperature();//读温度值 } if(temp&0x8000) { str[0]=0xbf;//负号标志 temp=~temp; //取反加1 temp +=1; } else { str[0]=0xff; } TempH=temp>>4; TempL=temp&0x0F; TempL=TempL*6/10;//小数近似处理 str[1]=tab[(TempH%100)/10]; //十位温度 str[2]=tab[(TempH%100)%10]&0x7f; //个位温度,带小数点 str[3]=tab[TempL]; alarm(); } } /******************************************************************/ /* 定时器中断 */ /******************************************************************/ void tim(void) interrupt 1 using 1//中断,用于数码管扫描和温度检测间隔 { TH0=0xea;//定时器重装值 TL0=0xf0; num++; if (num==100) { num=0; flag_get=1;//获取温度标志位有效 } count++; if(count==1) { P2=0Xfe; P0=str[0]; }//数码管扫描 if(count==2) { if(str[1]==tab[0]) str[1]=0xff;//显示为空 P2=0Xfd; P0=str[1]; } if(count==3) { P2=0Xfb; P0=str[2]; } if(count==4) { P2=0Xf7; P0=str[3]; count=0; } } /******************************************************************/ /* 短延时函数 */ /******************************************************************/ void delay(unsigned int i)//短延时函数 { while(i--); } /******************************************************************/ /* 初始化 */ /******************************************************************/ void Init_DS18B20(void) { unsigned char x=0; DQ = 1; //DQ复位 delay(8); //稍做延时 DQ = 0; //单片机将DQ拉低 delay(80); //精确延时 大于 480us DQ = 1; //拉高总线 delay(10); x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败 delay(5); } /******************************************************************/ /* 读一个字节 */ /******************************************************************/ unsigned char ReadOneChar(void) { 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(5); } return(dat); } /******************************************************************/ /* 写一个字节 */ /******************************************************************/ void WriteOneChar(unsigned char dat) { unsigned char i=0; for (i=8; i>0; i--) { DQ = 0; DQ = dat&0x01; delay(5); DQ = 1; dat>>=1; } delay(5); } /******************************************************************/ /* 读取温度 */ /******************************************************************/ unsigned int ReadTemperature(void) { unsigned char a=0; unsigned int b=0; unsigned int t=0; Init_DS18B20(); WriteOneChar(0xCC); // 跳过读序号列号的操作 WriteOneChar(0x44); // 启动温度转换 delay(200); Init_DS18B20(); WriteOneChar(0xCC); //跳过读序号列号的操作 WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度 a=ReadOneChar(); //低位 b=ReadOneChar(); //高位 b<<=8; t=a+b; return(t); } /******************************************************************/ /* 蜂鸣器报警程序 */ /******************************************************************/ void alarm() { if(display_mod==0)//在显示当前温度时报警才会动作 { if(TempH<(temp_min)) { buzzer=0; } else if(TempH>=(temp_max)) { buzzer=0; } else { buzzer=1; } } }
|
|
相关推荐
8个回答
|
|
可以帮你搞定 1002925094
|
|
|
|
|
|
|
|
应该不难吧,我觉得是挺简单的
|
|
|
|
谢谢你的回复,可以的话帮忙改一下,谢谢
|
|
|
|
|
|
|
|
路过,貌似不难的问题哦~~~楼主自己思考思考看呢
|
|
|
|
|
|
|
|
好好学习天天向上
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
【敏矽微ME32G070开发板免费体验】使用coremark测试敏矽微ME32G070 跑分
250 浏览 0 评论
【敏矽微ME32G070开发板免费体验】开箱+点灯+点亮OLED
473 浏览 2 评论
571 浏览 0 评论
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-内核编译之初次编译
260 浏览 0 评论
400 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11974 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-20 07:14 , Processed in 0.675111 second(s), Total 87, Slave 68 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号