main.c
#include "STC15F2K60S2.H"
#include "bsp_init.H"
#include "bsp_led.H"
#include "timer.H"
#include "bsp_seg.H"
#include "bsp_key.H"
#include "onewire.h"
#include "STDIO.H"
// led --------专用
unsigned char ucled;
//声明函数------专用
void Key_Pro(void);
void Seg_Pro(void);
void Led_Pro(void);
//减速 ------专用
unsigned char Key_Mm;
unsigned char Seg_Mm;
unsigned char Led_Mm;
//数码管-----专用
unsigned char Seg_sss[10];
unsigned char Seg_buf[8];
unsigned char Pos=0;
//按键-------专用
unsigned char Key_k1;
unsigned char Key_hig,key_low;
unsigned char os=0;
//--------------------------------------------------------------
void main()
{
Off_Ws (); // 关闭外设
Timer1Init();
EA = 1;
while(1)
{
Key_Pro();
Seg_Pro();
}
}
void tm1_isr() interrupt 3 //定时器中断 1ms
{
if(++Key_Mm ==10) Key_Mm= 0;
if(++Seg_Mm ==100) Seg_Mm= 0;
if(++Led_Mm ==300) Led_Mm= 0;
Seg_Vip(Seg_buf,Pos);
if(++Pos==8) Pos=0;
}
//------------------------------------------------------
void Key_Pro(void)
{ if(Key_Mm==0) return ;Key_Mm=1; //用于按键处理-----减速
Key_k1 = Key_Read(); //这地方是按键处理模式(现在用是矩阵键盘------调用函数)
key_low = Key_k1 & ( Key_hig ^ Key_k1);
Key_hig = Key_k1 ; //电平检测
}
void Seg_Pro(void)
{ if(Seg_Mm==0) return ;Seg_Mm=1; //用于数码管显示----减速
sprintf(Seg_sss,"%06.4f",(unsigned int )rd_temperature()/16.0); //要 /16.0 ,也就是16倍
Seg_ring(Seg_sss,Seg_buf);
}
子函数:
-
/* 程序说明: 单总线驱动程序 软件环境: Keil uVision 4.10 硬件环境: CT107单片机综合实训平台(外部晶振12MHz) STC89C52RC单片机 日 期: 2011-8-9 */ #include "onewire.h" sbit DQ = P1^4; //单总线接口 //单总线延时函数 void Delay_OneWire(unsigned int t) //STC89C52RC { t*=12;//-----------------------------------------------这里要自己加 t*=12 ;----------------------------- while(t--); } //通过单总线向DS18B20写一个字节 void Write_DS18B20(unsigned char dat) { unsigned char i; for(i=0;i<8;i++) { DQ = 0; DQ = dat&0x01; Delay_OneWire(5); DQ = 1; dat >>= 1; } Delay_OneWire(5); } //从DS18B20读取一个字节 unsigned char Read_DS18B20(void) { unsigned char i; unsigned char dat; for(i=0;i<8;i++) { DQ = 0; dat >>= 1; DQ = 1; if(DQ) { dat |= 0x80; } Delay_OneWire(5); } return dat; } //DS18B20设备初始化 bit init_ds18b20(void) { bit initflag = 0; DQ = 1; Delay_OneWire(12); DQ = 0; Delay_OneWire(80); DQ = 1; Delay_OneWire(10); initflag = DQ; Delay_OneWire(5); return initflag; } //-----------------------------------------------上面官方有给,下面是自己要写的代码----------------------------- unsigned int rd_temperature(void) { unsigned char low; unsigned char hig; init_ds18b20(); //初始化 Write_DS18B20(0xcc);// 跳过rom Write_DS18B20(0x44);//功能指令(转换温度) init_ds18b20(); //初始化 Write_DS18B20(0xcc);// 跳过rom Write_DS18B20(0xbe); //读暂存器 指令 low = Read_DS18B20(); hig = Read_DS18B20(); return (( hig<<8) | low); //高位和低位组合;得到16位;值 ( /16.0 ) }
-
头文件
#include "STC15F2K60S2.H" unsigned int rd_temperature(void);
硬件图:
-
芯片资料
简单来说就是三大步骤:
1:初始化
2:Rom指令
3.功能指令