单片机外扩芯片运用(自用)

ds1302

void Time_Read(unsigned char* Time){//从ds1302里面读取时间
	unsigned char i;
	for(i=0;i<3;i++){
		Time[i] = Read_Ds1302_Byte(0x85-2*i);
	}
}

void Time_Write(unsigned char* Time){//往ds1302里面写入时间一般上电使用
	unsigned char i;
	Write_Ds1302_Byte(0x8e,0x00);
	for(i=0;i<3;i++){
		Write_Ds1302_Byte(0x84-2*i,Time[i]);
	}
	Write_Ds1302_Byte(0x8e,0x80);
}

void Date_Write(unsigned char* Date){//往ds1302写入日期
	Write_Ds1302_Byte(0x8e,0x00);
	Write_Ds1302_Byte(0x8c,Date[0]);
	Write_Ds1302_Byte(0x88,Date[1]);
	Write_Ds1302_Byte(0x86,Date[2]);
	Write_Ds1302_Byte(0x8e,0x80);
}

void Date_Read(unsigned char* Date){//从ds1302里面读取日期
	Date[0] = Read_Ds1302_Byte(0x8d);
	Date[1] = Read_Ds1302_Byte(0x89);
	Date[2] = Read_Ds1302_Byte(0x87);
}

ds18b20

float Read_Tempture(){
	unsigned char high,low;
	init_ds18b20();//初始化芯片
	Write_DS18B20(0xcc);//跳过芯片的检验
	Write_DS18B20(0x44);//告诉芯片做好进行温度读取的准备
	init_ds18b20();//初始化芯片
	Write_DS18B20(0xcc);//跳过芯片的检验
	Write_DS18B20(0xbe);//告诉芯片进行温度读取
	low = Read_DS18B20();//先读取低位
	high = Read_DS18B20();//在读取高位
	
	return ((high<<8)|low) /16.0;//得到的数据除以16.0得到我们正常的摄氏度温度
}

AD/DA转换

unsigned char Ad_Change(unsigned char addr){
	unsigned char temp;
	IIC_Start();//启动IIC协议
	IIC_SendByte(0x90);//告诉芯片要进行AD/DA转换
	IIC_WaitAck();//等待芯片回应

	IIC_SendByte(addr);//告诉芯片要进行转换的地点,0x41光敏电阻0x43滑动变阻器
	IIC_WaitAck();
	
	IIC_Start();//再次启动IIC
	IIC_SendByte(0x91);//告诉芯片要从转换的开始读取数据
	IIC_WaitAck();
	
	temp = IIC_RecByte();//得到对应的数据
	IIC_SendAck(1);//告诉芯片读取完成
	IIC_Stop();//退出
	
	return temp;//返回读取值
}

void Da_Change(unsigned char val){//数字量转换成模拟量DAC输出
	IIC_Start();//启动IIC协议
	IIC_SendByte(0x90);//告诉芯片要进行AD/DA转换
	IIC_WaitAck();//等待芯片回应
	
	IIC_SendByte(0x41);//启动芯片输出功能
	IIC_WaitAck();
	IIC_SendByte(val);//给芯片要输出的输出值
	
	IIC_WaitAck();
	IIC_Stop();//退出
}

EEprom

void EEPROM_Write(unsigned char* EEPROM_Arry,unsigned char addr,unsigned char num){
	IIC_Start();//启动IIC协议
	IIC_SendByte(0xA0);//告诉芯片进行EEprom操作 
	IIC_WaitAck();
	
	IIC_SendByte(addr);//给芯片进行EEprom操作的地址
    IIC_WaitAck();

	while(num--){
		IIC_SendByte(*EEPROM_Arry++);//把数组内容写入芯片
		IIC_WaitAck();//等待回应
		IIC_Delay(200);//延时
	}	
	IIC_Stop();//写入完成退出
}

void EEPROM_Read(unsigned char* EEPROM_Arry,unsigned char addr,unsigned char num){
	IIC_Start();//启动IIC协议
	IIC_SendByte(0xA0);//告诉芯片进行EEprom操作 
	IIC_WaitAck();
	
	IIC_SendByte(addr);//给芯片进行EEprom操作的地址
	IIC_WaitAck();
	
	IIC_Start();//鍐嶆寮€鍚痠ic鎬荤嚎,杩涜璇荤殑鎿嶄綔
	IIC_SendByte(0xA1);//鍛婅瘔鑺墖瑕佸紑濮嬭鍙栦笢瑗夸簡
	IIC_WaitAck();
	
	while(num--){
		*EEPROM_Arry++ = IIC_RecByte();//获取芯片内EEprom的值
		if(num){
			IIC_SendAck(0);
		}//告诉芯片没有读取完成
		else{
			IIC_SendAck(1);//告诉芯片读取完成
		}
	}
	IIC_Stop();//退出
}

超声波模块

#include <ultrasound.h>
#include <intrins.h>

sbit TX = P1^0;
sbit RX = P1^1;

void Delay12us(void)	//@12.000MHz
{
	unsigned char data i;

	_nop_();
	_nop_();
	i = 38;
	while (--i);
}

void ultra_Send(){
	unsigned char i;
	for(i=0;i<8;i++){//8次25us的信号模拟
		TX = 1;
		Delay12us();
		TX = 0;
		Delay12us();
	}
}

unsigned char ultra_Val(){
	unsigned int time;
	TMOD &= 0x0f;//选择定时器1的计数器模式
	TH1 = TL1 = 0;//初始化定时器1
	ultra_Send();
	TR1 = 1;//启动定时器1
	while((TF1==0)&&(RX==1));//如果没有接收到信号或者计数溢出
	TR1 = 0;//关闭定时器1
	if(TF1==0){//如果不是计数溢出,也就是接收到信号了
		time =  TH1<<8|TL1 ;
		return (time*0.017);
	}
	else{
		TF1 = 0;//计数值溢出得到无效值
		return 0;
	}
	
}

串口通讯模块

#include <Uart.h>

void Uart1_Init(void)	//9600bps@12.000MHz
{
	SCON = 0x50;		//8位数据,可变波特率
	AUXR |= 0x01;		//串口1选择定时器2为波特率发生器
	AUXR &= 0xFB;		//定时器时钟12T模式
	T2L = 0xE6;			//设置定时初始值
	T2H = 0xFF;			//设置定时初始值
	AUXR |= 0x10;		//定时器2开始计时
    ES = 1;//打开串口中断
    EA = 1;//打开总中断
}

void Uart_Send_Byte(unsigned char Dat){
	SBUF = Dat;
	while(TI == 0);//发送数据成功TI自动置1
	TI = 0;//手动复位TI
}

void Uart_Send_String(unsigned char *Dat){
	while(*Dat != '\0'){//字符串末尾是\0
		Uart_Send_Byte(*Dat++);
	}
}
void Uart_Service() interrupt 4
{
	if(RI == 1){
		dat_rec = SBUF;//记录接收到的值
		rec_index = 1;//接收到信号标志位置一
		RI = 0;
	}
	
}

串口配合 stdio.h头文件里面的 sprintf函数进行使用

%d 对应的整数类型,传入的数据要强制类型转换成(unsigned int)或者 (int)类型

NE555

if(++time_1s == 1000){//在定时器1里面进行1s计时来判断触发多少次计数器0得到对应的频率值
		time_1s = 0;
        TR0 = 0;
		freq = (TH0<<8)|TL0;
		TH0 = TL0 = 0;//
        TR0 = 1;

周期就是 1000000除以频率值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值