DS1302驱动和数码管驱动程序如附件!
单片机源程序如下:
- #include "ds18b20.h"
- #include "display.h"
- #include "delay.h"
- void Ds18B20_Output()
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG,ENABLE); //使能PG时钟
-
- GPIO_InitStructure.GPIO_Pin=GPIO_Pin_11; //PG11口
- GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //设定I/O口推挽输出
- GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
- GPIO_Init(GPIOG,&GPIO_InitStructure);
- }
- void Ds18B20_Input()
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG,ENABLE); //使能PG时钟
-
- GPIO_InitStructure.GPIO_Pin=GPIO_Pin_11; //PG11口
- GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING; //浮空输入
- GPIO_Init(GPIOG,&GPIO_InitStructure);
- }
- void Ds18b20_Reset(void)
- {
- Ds18B20_Output(); //将PG11配置为推挽输出
- DQ_Write_1; //拉高总线
- delayus(1);
- DQ_Write_0; //拉低总线
- delayus(480); //延时,拉低总线480~960us
- DQ_Write_1; //释放总线
- Ds18B20_Input(); //DQ改为输入模式
- delayus(40); //延时约60us
- while((DQ_ReadBit)); //等待从机DS18B20应答
- while(!(DQ_ReadBit)); //等待应答信号结束,释放总线
- }
- void Ds18b20_Write(u8 dat)
- {
- u8 m0;
- Ds18B20_Output(); //将PG11配置为推挽输出
- for(m0=0;m0<8;m0++)
- {
- DQ_Write_0; //拉低总线
- delayus(10); //延时10us,最大不超过15us
- if(dat&0x01)
- DQ_Write_1;
- else
- DQ_Write_0;
- delayus(30); //延时40us
- DQ_Write_1; //释放总线
- delayus(1); //两个写之间,间隔至少1us
- dat>>=1; //右移1位,
- }
- }
- u8 Ds18b20_Read(void)
- {
- u8 m0,temp0;
- for(m0=0;m0<8;m0++)
- {
- temp0>>=1; //数据右移一位
- Ds18B20_Output(); //将PG11配置为推挽输出
- DQ_Write_0; //拉低总线,启动
- DQ_Write_1; //释放总线
- if(DQ_ReadBit==1)
- temp0|=0x80;
- delayus(40);
- }
- return temp0;
- }
- void temperature(void)
- {
- u16 temp1,temp2;
- Ds18b20_Reset();
- Ds18b20_Write(0xcc); //跳过ROM
- Ds18b20_Write(0x44); //温度转换
- Ds18b20_Reset();
- Ds18b20_Write(0xcc); //跳过ROM
- Ds18b20_Write(0xbe); //读取RAM
-
- temp1=Ds18b20_Read(); //读取低8位
- temp2=Ds18b20_Read(); //读取高8位
- Ds18b20_Reset(); //复位,表示读取结束
- display(((temp2<<8)|temp1)*0.0625);
- }
复制代码
注意缺少main函数等,介意的就不要下载了:
HARDWARE.rar
(2.22 KB, 下载次数: 30)
|