Lanqiao Cup MCU - モジュラーコードの概要

#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 の説明を参照しており、そのうちのいくつかは他の偉人から学んだものです。間違いがあれば修正してください。

おすすめ

転載: blog.csdn.net/weixin_49640235/article/details/124026178