这个是我的课件做的,所以电路图不知道怎么画 就用画图程序画了一个,将就看吧,功能很简单就是检测温度的高低,高于某个值就报警,蜂鸣器响,同理低于某个值也响,最高值和最低值可以通过修改源码初始化值重新编译下载到单片机里,当然,我也设置了功能按键,可以通过diy板上的键设置这两个值,区别在于每次断电后这两个值会恢复到源码里面设置那个值,好了上图上源码
单片机源程序如下:
- //采用共阴极数码管
- //P0接数码管段选 可加一个排阻
- //P2接数码管位选
- //P1^1接温度传感器
- //P1^0接蜂鸣器(需要一个三极管放大来驱动蜂鸣器,通常是8550)
- //仅供参考(八哥)
- /*****************************************************************************/
- //程序部分开始//
- /****************************************************************************/
- //头文件
- #include <reg51.h>
- /*****************************************************************************/
- //数码管的段码编码
- unsigned char code table[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
- //下一行的数组可以显示数值外,还可以显示数码管的点
- unsigned char code table_d[16] = {0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0xf7,0xfc,0xb9,0xde,0xf9,0xf1};
- unsigned char code LED_W[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
- unsigned int sec = 0,item_h=300,item_l=100;
- bit w = 0;
- bit v = 1;
- /*****************************************************************************/
- sbit KEY_1 = P1^4;
- sbit KEY_2 = P1^5;
- sbit KEY_3 = P1^6;
- sbit KEY_4 = P1^7;
- sbit led_r = P1^3;
- sbit led_g = P1^2;
- sbit DQ = P1^1;//ds18B20
- sbit beep = P1^0;//蜂鸣器
- /******************************************************************************/
- //DS18B20温度传感器驱动(显示0至60度)
- /******************************************************************************/
- void Delay(int num){//延时函数
- while(num--) ;
- }
- /****************************************************************************/
- void Delay_1ms(unsigned int a){//延时函数 1MS/次
- unsigned char i;
- while( --a != 0){
- for(i = 0; i < 125; i++); //一个 ; 表示空语句,CPU空转。
- } //i 从0加到125,CPU大概就耗时1毫秒
- }
- /****************************************************************************/
- /******************************************************************************/
- void Init_DS18B20(void){//初始化ds1820
- unsigned char x=0;
- DQ = 1; //DQ复位
- Delay(8); //稍做延时
- DQ = 0; //单片机将DQ拉低
- Delay(80); //精确延时 大于 480us
- DQ = 1; //拉高总线
- Delay(14);
- x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
- Delay(20);
- }
- /******************************************************************************/
- 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(4);
- }
- 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;
- }
- }
- /******************************************************************************/
- unsigned int ReadTemperature(void){//读取温度
- unsigned char a=0;
- unsigned char b=0;
- unsigned int t=0;
- float tt=0;
- Init_DS18B20();
- WriteOneChar(0xCC); // 跳过读序号列号的操作
- WriteOneChar(0x44); // 启动温度转换
- Init_DS18B20();
- WriteOneChar(0xCC); //跳过读序号列号的操作
- WriteOneChar(0xBE); //读取温度寄存器
- a=ReadOneChar(); //读低8位
- b=ReadOneChar(); //读高8位
- t=b;
- t<<=8;
- t=t|a;
- tt=t*0.0625;
- t= tt*10+0.5; //放大10倍输出并四舍五入
- return(t);
- }
- /*****************************************************************************/
- void Display(unsigned int i)
- {
- unsigned char a=0,b=0,c=0;
- a=i/100;
- b=(i/10)%10;
- c=i%10;
-
- P0 = 0;
- P2 = LED_W[3];
- P0 = table[12]; //显示C
- Delay_1ms(7.5);
-
- P0 = 0;
- P2 = LED_W[2];
- P0 = table[c]; //显示小数位温度
- Delay_1ms(7.5);
-
- P0 = 0;
- P2 = LED_W[1];
- P0 = table_d[b]; //显示个位温度,带点显示
- Delay_1ms(7.5);
-
- P0 = 0;
- P2 = LED_W[0];
- P0 = table[a]; //显示十位温度
- Delay_1ms(7.5);
- }
- /*****************************************************************************/
- void Beep_key(void){//-扬声器--按键音
- if (v == 1)
- {
- unsigned char a;//定义变量用于发声的长度设置
- for(a=100;a>0;a--){//声音的长度
- beep = ~beep;
- Delay(50);//音调设置延时
- }
- beep = 1;//音乐结束后扬声器拉高关闭
- }
- }
- /*****************************************************************************/
- void set_t(unsigned char sel)
- {
- if (sel==0)
- {
- Display(item_h);
- led_r = 1;
- led_g = 0;
- }
- if (sel==1)
- {
- Display(item_l);
- led_r = 0;
- led_g = 1;
- }
- if (KEY_1 == 0)
- {
- if (KEY_1 == 0 && sel == 0) item_h--;
- if (KEY_1 == 0 && sel == 1) item_l--;
- //if (KEY_1 == 0 && sel == 2) v = 1;
- }
- if (KEY_2 == 0)
- {
- if (KEY_2 == 0 && sel == 0) item_h++;
- if (KEY_2 == 0 && sel == 1) item_l++;
- //if (KEY_1 == 0 && sel == 2) v = 0;
- }
- }
- /*****************************************************************************/
- void main(void)
- {
- unsigned char e=0;
- beep = 1;
- while(1)
- {
- if(w == 0)
- {
- sec=ReadTemperature();//读温度并送显
- Display(sec);
- if (sec > item_h || sec < item_l)beep = 0; //蜂鸣器响
- else beep = 1;
- }
- else
- {
- if(e==0)Display(item_h);
- if(e==1)Display(item_l);
- }
- /*******************************************************/
- if (KEY_1 == 0) //减调整
- {
- Delay_1ms(15);
- if (KEY_1 == 0 && w == 1)//调温状态减调整
- {
- Beep_key();
- set_t(e);
- }
- }
- /*******************************************************/
- if (KEY_2 == 0) //加调整
- {
- Delay_1ms(15);
- if (KEY_2 == 0 && w == 1)//调温状态加调整
- {
- Beep_key();//按键音
- set_t(e);
- }
- }
- /*******************************************************/
- if (KEY_3 == 0) //模式调节
- {
- Delay_1ms(15);
- if (KEY_3 == 0 && w == 0) //正常显示状态进入调温状态
- {
- Beep_key();
- w = 1;
- }
- if (KEY_3 == 0 && w == 1) //调温状态选择上下限调节
- {
- e++;
- if (e>1) e = 0;
- set_t(e);
- }
- }
- /*******************************************************/
- if (KEY_4 == 0) //调温状时退出调温
- {
- Delay_1ms(15);
- if (KEY_4 == 0 && w == 1)
- {
- Beep_key();
- w = 0;
- }
- }
- }
- }
复制代码
|