保温饭盒毕业设计程序

来源:互联网 发布:c语言如何输出文本 编辑:程序博客网 时间:2024/04/28 10:26
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义#define uchar unsigned char#define uint  unsigned intsbit LED0=P1^0;//定义按键位置sbit LED1=P1^1;sbit RELAY = P1^2; //定义继电器位置code unsigned char  tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};          //共阴数码管 0-9uchar smg[4];                 //定义缓冲区void init_ds18b20(void) ;     //DS18B20初始化void ds18b20write_byte(uchar dat);  //DS18B20写字节uchar ds18b20read_byte(void);   //DS18B20读字节uchar readtemperature(void);     //DS18B20读取温度void delay(unsigned int i);   sbit DQ=P3^7;  //ds18b20 端口void delayds18b20(uint t){while(t--);}void delay(unsigned int cnt){ while(--cnt);} void display(int b,int a)   //位分离{      smg[0]=tab[a/10];           smg[1]=tab[a%10];      smg[2]=tab[b/10];           smg[3]=tab[b%10]; }/*------------------------------------------------              键盘扫描程序------------------------------------------------*/uchar keyscan(void)  //键盘扫描函数,使用行列反转扫描法{ uchar cord_h,cord_l;//行列值中间变量 P3=0xf0;            //行线输出全为0 P1=0xff;   cord_h=P3&0xf0;     //读入列线值 if(cord_h!=0x0f)    //先检测有无按键按下 {  delay(100);        //去抖  if(cord_h!=0x0f)  {       cord_h=P3&0xf0;  //读入列线值    P3=cord_h|0x0f;  //输出当前列线值    cord_l=P3&0x0f;  //读入行线值     return(cord_h+cord_l);//键盘最后组合码值   }  }  }void main(){    uint  key,i,a=0,b=0;  RELAY=0;init_ds18b20();key=keyscan();     //调用键盘扫描,for(i=0;i<4;i++)    //显示函数   {    display(a,b);     P0=smg[i]; P2=i; delay(100);   }  if(key==0xe7)    while(1)   {   b=readtemperature();       delay(100);      key=keyscan();           switch(key)    {  case 0x7e:a=0;break;//0 按下相应的键显示相对应的码值  case 0xbe:a=40;break;   case 0xde:a=45;break;  case 0xee:a=55;break;    case 0x7d:a=65;break;       case 0xbd:a=75;break;       case 0xdd:a=85;break;       case 0xed:a=95;break;            } display(b,a);  for(i=0;i<4;i++)    //显示函数   {        P0=smg[i]; P2=i; delay(100);   }    if(a>b)    //温度判断     {    RELAY=1;    //继电器吸和       LED0=0; }    else    {    RELAY=0;   //继电器断开LED1=0;}   }    }void init_ds18b20(void)    //   初始化     {uchar n;DQ=1;    //DQ复位delayds18b20(8);DQ=0;delayds18b20(80);  //精确延时 大于 480usDQ=1;delayds18b20(10);n=DQ;delayds18b20(5);}void ds18b20write_byte(uchar dat)  //   写一个字节  {uchar i;for(i=0;i<8;i++){DQ=0;DQ=dat&0x01;delayds18b20(5);DQ=1;dat>>=1;}delayds18b20(5);}uchar ds18b20read_byte(void)//读一个字节  {uchar i,value;for(i=0;i<8;i++){DQ=0;// 给脉冲信号value>>=1;DQ=1;  // 给脉冲信号if(DQ)value|=0x80;delayds18b20(5);}return value;}uchar readtemperature(void)  //  读取温度 {uchar a,b;init_ds18b20();ds18b20write_byte(0xcc);//跳过ROMds18b20write_byte(0x44);//启动温度测量delayds18b20(200);init_ds18b20();ds18b20write_byte(0xcc);ds18b20write_byte(0xbe);a=ds18b20read_byte();  //低位b=ds18b20read_byte();   //高位       b<<=4;b+=(a&0xf0)>>4;return b;}


1 0
原创粉丝点击