被课程设计虐的死去活来,实在是没有思路特此前来一问~
题目的要求如下:初始温度50度,通过按键设定加热温度并显示在数码管上。环境温度由Ds18b20进行检测,传到单片机进行处理。蜂鸣器用来报警,温度超过70度发出警报。加热电路我的想法是用继电器和LED灯进行模拟,不知道可不可行。
现在栽到了数码管显示上面,仿真时会闪烁一下,然后熄灭不亮。我研究一天了,无奈实在看不懂,希望各位答疑解惑,先谢过了~程序和原理图如下。
这个仿真结果看得我也是一脸懵逼啊,咋个电平都不变换的?本人是真的纯单片机小白一枚了,请各位见谅!
这个程序是c和汇编的综合,我在编译的时候设置过了,编译是没有问题的,0error。就是显示不出来,急的我嘴上冒了三个大泡了!
数码管选用的是共阳,也试了把数码管的参数改成了0.1us,都没有用,不知道是程序出了问题还是电路都画错了,希望各位指点一二,跪谢!!!
如果看不清我上传了一份附件,欢迎各位下载指正!在此跪谢!!!
程序如下:
- #include "reg52.h"
- #define Disdata P0 //段码输出口
- #define discan P2 //位选输出口
- #define uchar unsigned char
- #define uint unsigned int
- sbit DQ=P3^7; //温度输入口
- sbit Ha=P1^5; //加热器
- sbit Wa=P1^5; //报警器
- sbit Key_I=P3^2;
- sbit Key_II=P3^3;
- uint h;
- uint key_[2]={5,0}; //初始温度
- uchar dis_7[12]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
- //数码管显示列表 "0" "1" "2" "3" "4" "5" "6" "7" "8" "9"
- uchar code scan_con[2]={0xfd,0xfe}; // 列扫描控制字 */
- uchar temp_data[2];
- //11US延时函数
- void delay(uint t)
- {
- for(;t>0;t--);
- }
- //显示扫描函数
- void scan()
- {
- uchar k;
- for(k=0;k<2;k++) //2位LED扫描控制
- {Disdata=dis_7[key_[k]];
- discan=scan_con[k];}
- delay(20);
- discan=0xff;
- }
- //18B20写命令函数
- void write_byte(uchar val)
- {
- uchar i;
- for (i=8; i>0; i--) //
- {
- DQ=1;
- DQ = 0;
- DQ = 0;
- #pragma ASM
- NOP
- NOP
- NOP
- NOP
- NOP
- #pragma ENDASM //5us
- DQ = val&0x01; //最低位移出
- delay(6); //66us
- val=val/2; //右移一位
- }
- DQ = 1;
- delay(1);
- }
- //18B20读1个字节函数
- uchar read_byte(void)
- {
- uchar i;
- uchar value = 0;
- for (i=8;i>0;i--)
- {
- DQ=1;
- #pragma ASM
- NOP
- NOP
- #pragma ENDASM
- value>>=1;
- DQ = 0;
- #pragma ASM
- NOP
- NOP
- NOP
- NOP
- #pragma ENDASM //4us
- DQ = 1;
- DQ = 0;
- #pragma ASM
- NOP
- NOP
- NOP
- NOP
- #pragma ENDASM
- if(DQ)value|=0x80;
- delay(6); //66us
- }
- DQ=1;
- return(value);
- }
- //18B20复位函数
- ow_reset(void)
- {
- char presence=1;
- while(presence)
- {
- while(presence)
- {
- DQ=1;
- DQ = 0;
- #pragma ASM
- NOP
- NOP
- #pragma ENDASM
- DQ=0;
- delay(50);
- DQ=1;
- delay(6);
- presence=DQ; // presence=0继续下一步
- }
- delay(45); //延时500us
- presence = ~DQ;
- }
- DQ=1;
- }
- void read_temp()
- {
- write_byte(0xCC); // 发Skip ROM命令
- write_byte(0xBE); // 发读命令
- temp_data[0]=read_byte(); //温度低8位
- temp_data[1]=read_byte(); //温度高8位
- ow_reset();
- write_byte(0xCC); // Skip ROM
- write_byte(0x44); // 发转换命令
- }
- //温度数据处理函数
- //越线报警
- //加热控制
- void work_temp()
- {uchar tt_[2],tt,key;
- key=key_[0]*10+key_[1];
- tt_[0]=temp_data[0]&0xf0;
- tt_[1]=temp_data[1]&0x0f;
- tt=tt_[1]+tt_[2];
- if(tt>0x70){Wa=0;} //报警
- if(tt>key)
- Ha=1; //关加热器
- if(tt<key)
- Ha=0; //开加热器
- }
- main()
- {
- Wa=1;
- Ha=1;
- P3=0XFF;
- EX0=1;
- EX1=1;
- EA=1;
- Disdata=0xff; //初始化端口
- discan=0X00;
- scan();
- write_byte(0xCC); // 发Skip ROM命令
- write_byte(0xBE);
- while(1)
- {
- read_temp(); //读出18B20温度数据
- work_temp(); //加热控制
- }
- }
- //
- void intto(void) interrupt 0
- {delay(2);
- if(Key_I==1)
- {
- if(key_[0]==9)
- key_[0]=0;
- else
- key_[0]++;
- scan();
- }
- Key_I=0;
- }
- void intt1(void) interrupt 1
- {delay(2);
- if(Key_II==1)
- {
- if(key_[1]==9)
- key_[1]=0;
- else
- key_[1]++;
- scan();
- }
- Key_II=0;
- }
复制代码
温度3.rar
(79.43 KB, 下载次数: 19)
|