温度计C语言程序.doc_第1页
温度计C语言程序.doc_第2页
温度计C语言程序.doc_第3页
温度计C语言程序.doc_第4页
温度计C语言程序.doc_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

/*/MCU头文件#include #include 延时:nop/数据结构定义#define U8unsigned char 8字节 无符号字符型 2 8 256#define U16unsigned int 16字节 整型 2 16 65535#define VU8volatile unsigned char 定义字符#define VU16volatile unsigned int/数码管段码/const unsigned char led_7=0x3f,0x06,0x5b,0x4f,/ 0x66,0x6d,0x7d,0x07,/ 0x7f,0x6f,0x77,0x7c,/ 0x39,0x5e,0x79,0x71,/ 0x00,0xff,0x40,0x80;/const unsigned char position=0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f;const unsigned char led_7_a=0xc0,0xf9,0xa4,0xb0, 0x99,0x92,0x82,0xf8,段 0x80,0x90,0x88,0x83, 0xc6,0xa1,0x86,0x8e, 0xff,0x00,0xbf,0x7f;/const unsigned char position_a=0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80;const unsigned char position_a=0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01;位/数码管段码/const unsigned char led_7_a=0xA0,0xBE,0x62,0x2A,/ 0x3C,0x29,0x21,0xBA,/ 0x20,0x28,0x30,0x25,/ 0xE1,0x26,0x61,0x71,/ 0xff,0x00,0x7F,0xDF;/const unsigned char position_a=0x40,0x20,0x10,0x80,0x08,0x04,0x02,0x01;/IO口定义#define SEGP0 段接P0口#define DIGP2 位接P2口#define KEYP3 按键sbit DQ = P10; 位寻址 DS18b20 数据输入/出端sbit BEEP = P11; 蜂鸣器/按键功能定义#define SET0xfe#define UP0xfd 四键#define DOWN0xfb#define BACK0xf7#define WATCH0xef#define SVE 0xdf#define DATA0xbf#define CHANG0x7f/设置位标志定义#define TEMP_L_01 八位数码管低位第一位#define TEMP_L_12#define TEMP_L_23#define TEMP_L_34#define TEMP_H_05#define TEMP_H_16#define TEMP_H_27#define TEMP_H_38/缓冲区VU8move = 0;VU8buffer8=0,0,0,0,0,0,0,0; 初值VU8 count_1 = 0, count_2 = 0; /秒计数器VU8 count_dis = 0;/显示计数器VU8 count_flash = 0;/闪烁计数器VU8 flag_1s = 0;/1s标志VU8 flash_set = 0;/闪烁标志VU8 count_key = 0;/按键消抖计数器VU8flag_key = 0;/按键按下标志VU8 key_backup = 0;/按键状态保存寄存器(储存上时刻状态)VU8 key_value = 0;/按键值VU8 set = 0;/设置状态寄存器VU16 Temper = 0;/温度寄存器volatile char Temp_h4=0,8,2,16;/温度上限寄存器volatile char Temp_l4=0,6,2,16;/温度下线寄存器/11us延时函数void delay(U16 t) 内部经过定义 11us 汇编周期为11usfor(; t0; t-); /汇编指令结果所需时间/DS18B20复位函数void ow_reset(void) 先复后写再读char presence = 1; /判断是否循环复位,0跳出复位while(presence)while(presence)DQ = 1;_nop_(); /空指令,代表延时1us/_nop_();DQ = 0;/从高拉倒低delay(50);/550usDQ = 1;delay(6);/66uspresence = DQ;/presence = 0 复位成功,继续下一步delay(45);/500uspresence = DQ;DQ = 1;/拉高电平/DS18B20写命令函数void write_byte(U8 val)U8 i;for(i=8; i0; i-) /串行移八次DQ = 1;_nop_();_nop_();DQ = 0;/从高拉倒低_nop_();/5 us_nop_();_nop_();_nop_();_nop_();if(val&0x01)/最低位移出DQ = 1;elseDQ = 0;delay(6);/66 usval = 1;/右移1位DQ = 1;delay(1);/DS18B20读1字节函数U8 read_byte(void)U8 i;U8 value = 0;for(i=8; i0; i-)DQ = 1;_nop_();_nop_();value = 1;DQ = 0;_nop_();/4us_nop_();_nop_();_nop_();DQ = 1;_nop_();/4us_nop_();_nop_();_nop_();if(DQ)value |= 0x80; /把数据读回来delay(6);/66us/等待DQ = 1;return value;/读出温度函数void read_temp(void)U8 temp_data2 ; /俩个八位ow_reset(); /总线复位delay(200);write_byte(0xcc); /发命令使用ROMwrite_byte(0x44); /发转换命令使用总线ow_reset(); /delay(1);write_byte(0xcc); /发命令write_byte(0xbe); /发送读指令temp_data0=read_byte(); /读温度值的第字节temp_data1=read_byte(); /读温度值的高字节 Temper = (U16)temp_data1 8)/设置八位set = 1;break;case BACK:set = 0;/返回break;default:break; /报警温度设置void Temp_Set(void)BEEP = 1;/设置时关闭报警switch(set)case TEMP_L_0:if(key_value = UP)if(+Temp_l0 9)Temp_l0 = 0;if(key_value = DOWN)if(-Temp_l0 9)Temp_l1 = 0;if(key_value = DOWN)if(-Temp_l1 9)Temp_l2 = 0;if(key_value = DOWN)if(-Temp_l2 9)Temp_h0 = 0;if(key_value = DOWN)if(-Temp_h0 9)Temp_h1 = 0;if(key_value = DOWN)if(-Temp_h1 9)Temp_h2 = 0;if(key_value = DOWN)if(-Temp_h2 =temp_l_r & temp_now_r 4; /移位4次 右移 小数没有 是整数 s = (Temper&0x000f)*100/16; /小数转换0.0625buffer7 = s/10;buffer6 = z%10;buffer5 = z/10;buffer4 = 16;buffer3 = 16;buffer2 = 16;buffer1 = 16;buffer0 = 16;void Temp_Buff(void)if(set 0)/显示设置温度Current_Set();else/显示当前温度Temp_Now();/显示缓冲区数据void Display(void)Temp_Buff();/数据送入缓冲区DIG = led_7_a17; / /先关掉当前显示的,再显示传输来的值if(move = 6 | (move=2&set!=0) ) / /设置小数点位置 俩个小数点SEG = led_7_abuffermove & led_7_a19; / /显示数和小数点elseSEG = led_7_abuffermove;DIG = position_amove; / /动态扫描if(+move = 8)move = 0;/定时器初始化void Init_Time(void)TMOD = 0x22; 00100010 方式2 自动重装初值 2 8 256 TH0=TL0 (256-6)*1us=250us)TH0 = 6; TL0 = 6;TH1 = 6;TL1= 6;TR0 = 1; ET0 = 1;TR1 = 1; ET1 = 1; EA = 1;int main(void)Init_Time();while(1)if(set = 0)if(flag_1s = 1)flag_1s = 0;EA = 0;/关闭中断read_temp();EA = 1; /开启中断/报警Ring();if(flag_key = 2)flag_key = 0;Key_Switch();/温度设置if(set 0)Temp_Set();/定时器0中断void Time_0(void) interrupt 1/实时时间if(+count_1 = 40)count_1 = 0;if(+count_2 = 100)count_2 = 0;flag_1s = 1;/1s/定时器1中断void Time_1(void) interrupt 3/显示扫描if(+count_dis = 10)count_dis = 0;Display();/闪烁if(+count_flash = 100)count_

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论