#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 周波数測定
タイマーを書き込むときは初期化に注意してください。!タイマー機能の書き込み仕様割り込みも忘れずに!
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 チャネルはポテンショメータに対応します
はい: 0x40
リトルビー先生の説明を参考にすると、daは選局時に4を書く必要があります。例: 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
}
上記のコードのほとんどは Mr Little Bee の説明を参照しており、そのうちのいくつかは他の偉人から学んだものです。間違いがあれば修正してください。