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除以频率值