Text2.zip

  • jianbei
    了解作者
  • C/C++
    开发工具
  • 3KB
    文件大小
  • zip
    文件格式
  • 0
    收藏次数
  • 1 积分
    下载积分
  • 3
    下载次数
  • 2014-05-06 19:09
    上传日期
可以实现调用电脑时间,查看世界各地时间还有设置闹钟
Text2.zip
  • Text2.c
    6.8KB
内容介绍
#include<reg52.h> #define uchar unsigned char #define uint unsigned int #define V_TH0 0X3C #define V_TL0 0XB0 #define V_TMOD 0X01 unsigned char code str[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//共阳数码管字码表 unsigned char code str1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x08,0x03,0x46,0x21,0x06,0x8e};//个位带小数点字码表 unsigned char code wei[]={0x0fe,0x0fd,0x0fb,0x0f7};//数码管位选,实际用三个,最低位是小数 uchar data disdata[5]; sbit DQ=P0^0;//ds18b20与单片机连接口,DQ是18B20的一个端口, sbit highled=P0^6; //报警灯 sbit beep=P0^1; //蜂鸣器 sbit key_xiao=P2^4; //小数 sbit key_ge=P2^5; //个位 sbit key_shi=P2^6; //十位 sbit key_enter=P2^7; //确定键,通过这四个按键控制上限温度的数值并确定 sbit shuchu =P0^2;//继电器接口,另一个接地 uint tvalue;//温度值 uchar tflag;//温度正负标志 uint ZKB; //定义占空比初始值; float zkc; //以下为PID控制的一些定义 int kkk; uint kp=4; float ki=0.17; uint kd=16; uint uc=5000; float ek; float u_k; float uk; float uk1=0; float ek1=0; float ek2=0; uchar click=0; uint zhouqi=0; uint high=0; uint hr; uint r,i; uint xiao=0,ge=0,shi=0,enter=1,t=1,s;// /******************************ds1820程序***************************************/ void delay_18B20(unsigned int i)//延时1微秒 { while(i--); } void ds1820rst()/*ds1820复位*/ { unsigned char x=0; DQ = 1; //DQ复位 delay_18B20(4); //延时 DQ = 0; //DQ拉低 delay_18B20(100); //精确延时大于480us DQ = 1; //拉高 delay_18B20(40); } uchar ds1820rd()/*读数据函数*/ { 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_18B20(10); } return(dat); } void ds1820wr(uchar wdata)/*写数据函数*/ {unsigned char i=0; for (i=8; i>0; i--) { DQ = 0; DQ = wdata&0x01; delay_18B20(10); DQ = 1; wdata>>=1; } } //复位+读数据+写数据是18b20的初始化 read_temp()/*读取温度值并转换,整个函数直接拿来用的*/ { uchar a,b; ds1820rst(); ds1820wr(0xcc);//*跳过读序列号*/ ds1820wr(0x44);//*启动温度转换*/ ds1820rst(); ds1820wr(0xcc);//*跳过读序列号*/ ds1820wr(0xbe);//*读取温度*/ a=ds1820rd(); b=ds1820rd(); tvalue=b; tvalue<<=8; tvalue=tvalue|a; if(tvalue<0x0fff) tflag=0; else {tvalue=~tvalue+1; tflag=1; } tvalue=tvalue*(0.625);//温度值扩大10倍,精确到1位小数 return(tvalue); } /*******************************************************************/ void ds1820disp(uint sdata)//温度值显示 { uchar flagdat; uchar i; disdata[0]= sdata/1000;//百位数 disdata[1]= sdata%1000/100;//十位数 disdata[2]= sdata%100/10;//个位数 disdata[3]= sdata%10;//小数位 if(tflag==0) flagdat=0x20;//正温度不显示符号 else flagdat=0x2d;//负温度显示负号:- if(disdata[0]==0x30) {disdata[0]=0x20;//如果百位为0,不显示 if(disdata[1]==0x30) {disdata[1]=0x20;//如果百位为0,十位为0也不显示 } } for(i=0;i<50;i++) { P2=wei[0]; P1=str[disdata[3]]; delay_18B20(20); P2=wei[1]; P1=str1[disdata[2]]; delay_18B20(20); P2=wei[2]; P1=str[disdata[1]]; delay_18B20(20); P2=wei[3]; P1=str[disdata[0]]; delay_18B20(20); } } void keyscan()//键盘扫描,总共四个独立对地按键 { while(enter==1)//只有按下enter键才会跳出,否则一直键盘扫描 { if(key_xiao==0) //小数位扫描 { delay_18B20(5000); //延时 if(key_xiao==0) { xiao++; if(xiao>9) xiao=0; } } if(key_ge==0) //个位扫描 { delay_18B20(5000); if(key_ge==0) { ge++; if(ge>9) ge=0; } } if(key_shi==0) //十位扫描 { delay_18B20(5000); if(key_shi==0) { shi++; if(shi>9) shi=0; } } high=shi*100+ge*10+xiao; //算出设定最高温度 ds1820disp(high); if(key_enter==0) //按键结束扫描 { delay_18B20(5000); if(key_enter==0) { enter=0; if(xiao==0&&ge==0&&shi==0)//没有数据输入直接按enter的复位,重新按键扫描 enter=1; } } } } void deal(uint t) //PID控制继电器 { TR0=1; if(zhouqi==1) { zhouqi=0; ek=high-t; u_k=kp*(ek-ek1) + ki*ek+kd*(ek-2*ek1+ek2); uk=uk1+u_k; zkc=100*uk/uc; if(zkc>=95) zkc=95; kkk=(int)zkc; //meiyongdao } if(t>=high) //you wen shuchu=0; // ti else { ZKB=(int)zkc; if(click<=ZKB) shuchu=0; else shuchu=1; } } void timer0(void) interrupt 1 { TH0=V_TH0; TL0=V_TL0; click++; if(click>=100) { click =0; zhouqi=1; } } void BEEP() //蜂鸣器,tvalue是传感器实测温度,high是自己设定最高温度 { if(tvalue>=high) { beep=!beep; highled=0; //灯亮,蜂鸣器响,警报超温度 } else //温度降低下去的时候,警报灯灭掉 { highled=1; } } /********************主程序***********************************/ void main() { TMOD=V_TMOD; //计时器,中断方面的初始化 TH0=V_TH0; TL0=V_TL0; ET0=1; EA=1; beep=0;//防止通电蜂鸣器响 ds1820rst();//初始化显示 keyscan(); while(1) { s=1;//跳出按键加减温度标志 read_temp();//读取温度 BEEP(); ds1820disp(tvalue);//显示 if(tvalue>=high) { beep=1; highled=0; } else { beep=0; highled=1; deal(tvalue); uk1=uk; ek2=ek1; ek1=ek; } if(key_enter==0)//按键查询最高温度,会显示一会,然后数码管继续显示当前温度 { delay_18B20(5000); if(key_enter==0) { for(i=0;i<30;i++) ds1820disp(high); } } if(key_ge==0) //按键加一,按enter键后跳出 { delay_18B20(5000); if(key_ge==0) { high=high+10; while(s==1) { if(key_ge==0) { delay_18B20(5000); if(key_ge==0) { high=high+10; } } ds1820disp(high); if(key_enter==0)//显示最高温度 { delay_18B20(5000); if(key_enter==0) { s=0; } } } } } if(key_xiao==0) //按键减一,按enter键后跳出 { delay_18B20(5000); if(key_xiao==0) { high=high-10; while(s==1) { if(key_xiao==0) { delay_18B20(5000); if(key_xiao==0) { high=high-10; } } ds1820disp(high); if(key_enter==0)//显示最高温度 { delay_18B20(5000); if(key_enter==0) { s=0; } } } } } } }
评论
    相关推荐
    • 数据库课程设计
      一个数据库课程设计,access管理工具实现,用的是窗体!
    • 数据库课程设计
      数据库课程设计十分完整有需要的请下载啊谢谢
    • 数据库课程设计
      广东工业大学数据库课程设计,可视化界面连接数据库,delphi7
    • 数据库课程设计
      数据库课程设计实验及其描述 数据库课程设计实验及其描述 数据库课程设计实验及其描述 数据库课程设计实验及其描述 数据库课程设计实验及其描述 数据库课程设计实验及其描述
    • 数据库课程设计
      数据库课程设计》由周爱武、汪海威、肖云编著,遵循数据库课程设计的具体要求,独立于具体的数据库教材,从实际应用系统的需求着手,引导读者逐步完成数据库设计全过程,重点讲解数据库系统的需求分析、概念设计、...
    • 数据库课程设计
      数据库课程设计人事管理系统 数据库课程设计人事管理系统数据库课程设计人事管理系统数据库课程设计人事管理系统数据库课程设计人事管理系统数据库课程设计人事管理系统数据库课程设计人事管理系统数据库课程设计...
    • 数据库课程设计
      数据库课程设计,基于visual basic自助银行管理系统,界面很清爽,实用。同学都说好,所以就上传了!!!
    • 数据库课程设计
      数据库课程设计 里面有详细的文档资料 包含数据库一切的图 以及生成的数据库表文件 期末得分为优秀
    • 数据库课程设计
      可以作为数据库课程设计,也可以作为Java的课程设计,内容全面。本资源转载的,非本人原创。用于交流学习,特此申明!
    • 数据库课程设计
      数据库课程设计蓝天大学学生管理系统 2.商店信息管理系统 3.实验室机房收费管理系统 4.图书馆资料检索系统 5.企业库存管理系统 6.仓库管理系统 7.工程项目管理系统 8.教材管理系统 9.企业人事管理系统 10.企业财务...