#include "reg52.h"
#include "absacc.h"
#include "iic.h"
#include "ds1302.h"
#include "onewire.h"
数码管显示:
unsigned char code SMG[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//不带小数点
unsigned char code SMG_Point[] = {0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}//带小数点
void Delay(unsigned int t)
{
while(t--);
}
void Select_SMG(unsigned char pos,unsigned char dat)
{
XBYTE[0xc000] = 0x01<<pos;
XBYTE[0xe000] = dat;
}
void Select_ALL()
{
XBYTE[0xc000] = 0xff;
XBYTE[0xe000] = 0x00;
}
void Display()
{
Select_SMG(0,SMG[]);
Delay(500);
Select_SMG(1,SMG[]);
Delay(500);
Select_SMG(2,SMG[]);
Delay(500);
Select_SMG(3,SMG[]);
Delay(500);
Select_SMG(4,SMG[]);
Delay(500);
Select_SMG(5,SMG[]);
Delay(500);
Select_SMG(6,SMG[]);
Delay(500);
Select_SMG(7,SMG[]);
Delay(500);
Select_ALL();//消隐
}
DS18B20温度测量
unsigned int temp;
void Read_temp()
{
unsigned char LSB,MSB;
Init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0x44);
Delay(1000);
Init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0x44);
LSB = Read_DS18B20();
MSB = Read_Ds18B20();
temp = MSB;
temp = (temp<<8)|LSB;
//显示整数时
temp = temp/16;
//显示小数
if((temp & 0xf800) == 0x0000)
{
temp >>= 4;
temp = temp*10;
temp = temp + (LSB & 0x0f) * 0.625;
}
}
DS1302时钟芯片
unsigned char code Read_RTC_ADDR[7] = {0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};
unsigend char code Write_RTC_ADDR[7] = {0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};
unsigend char TIME[7] = {0x50,0x59,0x23,0x07,0x04,0x02,0x22};//2022年4月7日23时59分50秒
void Ds1302_Config()
{
unsigned char i;
Write_Ds1302_Byte(0x8e,0x00);
for(i = 0;i < 7;i++)
{
Write_Ds1302_Byte(Write_RTC_ADDR[i],TIME[i]);
}
Write_Ds1302_Byte(0x8e,0x80);
}
void Ds1302_ReadTime()
{
unsigned char i;
for(i = 0;i < 7;i++)
{
TIME[i] = Read_Ds1302_Byte(Read_RTC_ADDR[i]);
}
}
NE555频率测量
写定时器要注意初始化!!以及定时器函数书写规范interrupt不要忘!
unsigned char count_t;//用于计时
unsigned char count_f;//用于计数
unsigned char dat_t;//得到的频率
void InitTime()
{
TMOD = 0x16;//定时器0计数 定时器1定时
TH0 = 0xff;
TL0 = 0xff;
TH1 = (65536-50000)/256;
TL1 = (65536-50000)%256;
EA = 1;
ET0 = 1;
ET1 = 1;
TR0 = 1;
TR1 = 1;
}
void Timer0() interrupt 1
{
count_f++;
}
void Timer1() interrupt 3
{
TH1 = (65536-50000)/256;
TL1 = (65536-50000)%256;
count_t++;
if(count_t == 20)
{
dat_t = count_f;
count_f = 0;
count_t = 0;
}
}
IIC总线
PCF8091/AD/DA
ad:0x01通道对应光敏电阻,0x03通道对应电位器
da:0x40
通过参考小蜜蜂老师讲解,通道选择时需要da才会写4。eg:0x43
unsigned char temp;//ad
void dac_out(unsigned char dat)
{
IIC_Start();
IIC_SendByte(0x90);
IIC_WaitACk();
IIC_SendByte(0x40);
IIC_WaitACk();
IIC_SendByte(dat);
IIC_WaitACk();
IIC_Stop();
}
void ad_read(unsigned char i)
{
IIC_Start();
IIC_SendByte(0x90);//伪写
IIC_WaitACk();
IIC_SendByte(i);
IIC_WaitACk();
IIC_Stop();
IIC_Start();
IIC_SendByte(0x91);//写操作
IIC_WaitACk();
temp = IIC_RecByte();
IIC_SendACK(1);//发送应答0、1均出现过取决于版本
IIC_WaitACk();
IIC_Stop();
}
24C02/EEPROM
采用单字节写入与da、ad很像。
在写入24C02时要注意添加延时,因为写操作需要时间
void Write_24C02(unsigned char addr,unsigned char dat)
{
IIC_Start();
IIC_SendByte(0xa0);
IIC_WaitACk();
IIC_SendByte(addr);
IIC_WaitACk();
IIC_SendByte(dat);
IIC_WaitACk();
IIC_Stop();
}
unsigned char Read_24C02(unsigned char addr)
{
IIC_Start();
IIC_SendByte(0xa0);//伪写
IIC_WaitACk();
IIC_SendByte(addr);
IIC_WaitACk();
IIC_Stop();
IIC_Start();
IIC_SendByte(0xa1);//写操作
IIC_WaitACk();
temp = IIC_RecByte();
IIC_SendACK(1);//发送应答0、1均出现过取决于版本
IIC_WaitACk();
IIC_Stop();
return temp;//不要忘记写return
}
以上代码大多数参考小蜜蜂老师的讲解,部分是从其他大佬处所学。如有错误,望大家指正。