完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
小白本人在单片机实验中,水温控制系统中,我的proteus仿真中四位共阴极数码管不亮,不知道是代码编写问题还是电路图的问题
数码管代码: void xianshi() { unsigned int i,l; for(i=0;i<4;i++)//显示到数码管上面 { l=7-i; PORTD=~(1< delay_nus(1000); PORTD=0xff; } } 全部代码: #include #include #include #define k1 (PINB & (1 << PB0)) //控键1读取 #define k2 (PINB & (1 << PB1)) //控键2读取 #define k3 (PINB & (1 << PB2)) //控键3读取 //DS18B20端口定义 #define DS18B20_O PORTB #define DS18B20_I PINB #define DS18B20_C DDRB #define DS18B20_L PB3 //DS18B20操作定义 #define BIT_SET(a,b) a|=BIT(b) #define BIT_CLR(a,b) a&=~BIT(b) #define BIT_INV(a,b) a^=BIT(b) #define BIT_STATUS(a,b) a&BIT(b) #define CLR_DS18B20 BIT_CLR(DS18B20_O,DS18B20_L) //数据线强制拉低 #define SET_DS18B20 BIT_SET(DS18B20_O,DS18B20_L) //数据线强制拉高,上拉 #define HLD_DS18B20 BIT_SET(DS18B20_C,DS18B20_L) //Mega16控制总线 #define RLS_DS18B20 BIT_CLR(DS18B20_C,DS18B20_L) //释放总线 #define STU_DS18B20 BIT_STATUS(DS18B20_I,DS18B20_L) //数据线的状态 void delay_us(void) { unsigned char t=2; t--; } void delay_nus(unsigned int t) { while (t--) delay_us(); } void delay_ms(void) { delay_nus(1000); } void delay_nms(unsigned int t) { while (t--) delay_ms(); } signed int wendu; unsigned int set=30; char flang=0; unsigned char display_numb[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07, 0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};;//数码管编码 unsigned char display_data[8];//显示缓冲 /********************************************************************** functionName: unsigned char resetDS18B20(void) description :DS18B20初始化 **********************************************************************/ unsigned char resetDS18B20(void) { unsigned char errTime=0; RLS_DS18B20; //释放总线 _NOP(); HLD_DS18B20; //Maga16控制总线 CLR_DS18B20; //强制拉低 delay_nus(480); //209.42us //以上延时大于480us RLS_DS18B20; //释放总线,总线自动上拉 _NOP(); while(STU_DS18B20) { delay_nus(6); //5.15us errTime++; if(errTime>20) return(0x00); //如果等带大于约 5.15us*20就返回0x00,报告复位失败(实际上只要等待15-60us) } errTime=0; while(!(STU_DS18B20)) { delay_nus(6); //5.15us errTime++; if(errTime>50) return(0x00); //如果等带大于约 5.15us*50就返回0x00,报告复位失败(实际上只要等待60-240us) } return(0xff); } /********************************************************************** functionName: unsigned char readByteDS18B20(void) description :读DS18B20一个字节 **********************************************************************/ unsigned char readByteDS18B20(void) { unsigned char i; unsigned char retVal=0; RLS_DS18B20; //释放总线 for(i=8;i>0;i--) { retVal>>=1; HLD_DS18B20; //Maga16控制总线 CLR_DS18B20; //强制拉低 delay_nus(8); //延时大于1us SET_DS18B20; //释放总线,DS18B20会将总线强制拉低 RLS_DS18B20; //释放总线 if(STU_DS18B20) retVal|=0x80; delay_nus(32); //31us HLD_DS18B20; //释放总线 SET_DS18B20; //释放总线,DS18B20会将总线强制拉低 } delay_nus(5); //2.71us(大于1us就行了) return(retVal); } /********************************************************************** functionName: unsigned char readByteDS18B20(void) description :写DS18B20一个字节 **********************************************************************/ void writeByteDS18B20(unsigned char wb) { unsigned char i; unsigned char temp; RLS_DS18B20; //释放总线 for(i=0;i<8;i++) { HLD_DS18B20; //Maga16控制总线 CLR_DS18B20; //强制拉低 delay_nus(4); //14.92us temp=wb>>i; temp&=0x01; if(temp) SET_DS18B20; //释放总线 else CLR_DS18B20; //强制拉低 delay_nus(50); //30.38us SET_DS18B20; //释放总线 delay_nus(4); //2.71us(大于1us就行了) } } /********************************************************************** functionName: unsigned int readTempDS18B20(void) description :读DS18B20温度 **********************************************************************/ signed int readTempDS18B20(void) { unsigned char tempL,tempH; signed int x; delay_nms(1); //等待1ms resetDS18B20(); writeByteDS18B20(0xcc); //跳过ROM writeByteDS18B20(0xbe); //读数据 tempL=readByteDS18B20(); tempH=readByteDS18B20(); x=(tempH<<8)|tempL; if((tempH&0xfc)==0xfc)//负温度 { x=((~x)+1); x=x*0.0625*10; x=0-x; } else { x=x*0.0625*10; } resetDS18B20(); writeByteDS18B20(0xcc); //跳过ROM writeByteDS18B20(0x44); //启动温度转换 return(x); } void xianshi() { unsigned int i,l; for(i=0;i<4;i++)//显示到数码管上面 { l=7-i; PORTD=~(1< delay_nus(1000); PORTD=0xff; } } void key() { if(k1==0) // 功能键检测 { delay_nms(80); if(k1==0) { flang++; if(flang==2) flang =0; } } if(flang==1)//上限设置模式下 { if(k2==0)// 加键检测 { delay_nms(80); if(k2==0) { set+=1; if(set>=125) set=125; delay_nms(50); } } if(k3==0)// 减键检测 { delay_nms(80); if(k3==0) { if(set>=0) set--; else set=0; delay_nms(50); } } } } /*接收数据函数*/ #pragma interrupt_handler uart_rx_isr:12 void uart_rx_isr(void) { unsigned int k; k=UDR; set=k+10; if(set>=125) set=125; } void main(void) { DDRB = 0X00; PORTB=0XFF; DDRD =0XF0; ; PORTD=0XFF; DDRA = 0XFF; PORTA=0XFF; DDRC = 0X80; PORTC=0XFF; resetDS18B20(); display_data[0]=0X00;//初始化显示 display_data[1]=0X00; display_data[2]=0x00; display_data[3]=0x00; UCSRA=0x00;//控制寄存器清零 UCSRB=0X00;//关闭串口 UCSRC=(1< UBRRH=0x00; UCSRB=(1< while(1) { xianshi();//转换显示 wendu=readTempDS18B20();//读取温度值 if(flang==0) { display_data[0]=display_numb[(wendu)/1000]; display_data[1]=display_numb[(wendu)/100%10]; display_data[2]=display_numb[(wendu)/10%10]|0X80; display_data[3]=display_numb[(wendu)%10]; if(wendu<0) display_data[0]=0xbf; } else { display_data[0]=0x00; display_data[1]=display_numb[(set)/100%10]; display_data[2]=display_numb[(set)/10%10]; display_data[3]=display_numb[(set)%10]; if(set<0) display_data[1]=0xbf; } key();//检测按键 if((unsigned int)wendu<10*set)//比较温度 PORTC&=~(1< PORTC|=(1< } 继电器为后加功能,不知道是否连接正确,求各位大神帮帮忙,非常感谢 |
|
相关推荐
1个回答
|
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
4607 浏览 3 评论
5890 浏览 1 评论
6164 浏览 0 评论
Protues中自己封装的芯片元件无Program File、Clock Frequency选项怎么解决,求求大神了!
7901 浏览 1 评论
基于51单片机的车辆倒车雷达报警系统,HC-SR04超声波测距,全套资料
1226 浏览 0 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-25 19:35 , Processed in 0.687308 second(s), Total 76, Slave 57 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号