小蜜蜂代码风格的,模块都在,希望能够帮助你吧。
目录
AT24C02存储芯片
void Write_AT24C02(unsigned char addr,unsigned char dat)
{
I2CStart();
I2CSendByte(0xa0);
I2CWaitAck();
I2CSendByte(addr);
I2CWaitAck();
I2CSendByte(dat);
I2CWaitAck();
I2CStop();
}
void Read_AT24C02(unsigned char addr)
{
I2CStart();
I2CSendByte(0xa0);
I2CWaitAck();
I2CSendByte(addr);
I2CWaitAck();
I2CStart();
I2CSendByte(0xa1);
I2CWaitAck();
tmp = I2CReceiveByte();
I2CSendAck(1);
I2CStop();
}
DS18B20温度传感器
void Read_ds18b20_adc()
{
unsigned char LSB, MSB;
unsigned int tmep = 0;
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0x44);
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0x44);
LSB = Read_DS18B20();
MSB = Read_DS18B20();
tmep = (LSB << 8) | MSB;
if ((temp & 0xf800) == 0x0000)
{
temp_ds18b2 = temp * 0.0625;
}
}
// 如果上电就是85 记得Delay一下
DS1302 时钟
unsigned char code READ_RTC_ADDR[7] = {
0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d};
unsigned char code WRITE_RTC_ADDR[7] = {
0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};
unsigned char TIME[7] = {
0x24, 0x58, 0x23, 0x19, 0x04, 0x06, 0x20};
void Init_ds1302()
{
unsigned char i;
Write_Ds1302_Byte(0x8E, 0x00);
for (i = 0; i < 3; i++)
{
Write_Ds1302_Byte(WRITE_RTC_ADDR[i], TIME[i]);
}
Write_Ds1302_Byte(0x8E, 0x80);
}
unsigned char hour, min, sec;
void Read_ds1302()
{
sec = Read_Ds1302_Byte(0x81);
min = Read_Ds1302_Byte(0x83);
hour = Read_Ds1302_Byte(0x85);
}
// 考点显示
void DisplaySMG_ds1302()
{
DisplaySMG_Bit(0, SMG_NoDot[hour >> 4]);
DisplaySMG_Bit(1, SMG_NoDot[hour & 0x0f]);
DisplaySMG_Bit(2, 0xbf);
DisplaySMG_Bit(3, SMG_NoDot[min >> 4]);
DisplaySMG_Bit(4, SMG_NoDot[min & 0x0f]);
DisplaySMG_Bit(5, 0xbf);
DisplaySMG_Bit(6, SMG_NoDot[sec >> 4]);
DisplaySMG_Bit(7, SMG_NoDot[sec & 0x0f]);
}
NE555频率测量
// 方式1
void Init_timer()
{
TH0 = 0xff;
TL0 = 0xff; // 定时器 0 采用8位重装 0110
TH1 = (65536 - 50000) / 256;
TL1 = (65536 - 50000) % 256;
TMOD = 0x16;
ET0 = 1;
ET1 = 1;
EA = 1;
TR0 = 1;
TR1 = 1;
}
void Service_T0() interrupt 1
{
count_f++; // 每一次中断都加一
}
void Service_T1() interrupt 3
{
TH1 = (65536 - 50000) / 256;
TL1 = (65536 - 50000) % 256;
count_t++;
if (count_t == 20)
{
dat_f = count_f;
count_f = 0;
count_t = 0;
}
}
// 方式二
void Init_Timer0_Timer1()
{
TH1 = (65536 - 10000) / 256;
TL1 = (65536 - 10000) % 256;
TH0 = 0;
TL0 = 0;
TMOD = 0x15;
ET0 = 1;
ET1 = 1;
EA = 1;
TR0 = 1;
TR1 = 1;
}
void Service_Timer0() interrupt 3
{
TH1 = (65536 - 10000) / 256;
TL1 = (65536 - 10000) % 256;
count_t++;
if (count_t == 100)
{
count_t = 0;
freq = (TH0 << 8) | TL0;
TH0 = 0;
TL0 = 0;
}
}
PCF8591 AD
void Write_DA(unsigned char dat)
{
I2CStart();
I2CSendByte(0x90);
I2CWaitAck();
I2CSendByte(0x41);
I2CWaitAck();
I2CSendByte(dat);
I2CWaitAck();
IIC_Stop();
}
unsigned char Read_AD()
{
unsigned char temp;
I2CStart();
I2CSendByte(0x90);
I2CWaitAck();
I2CSendByte(0x41);
I2CWaitAck();
I2CStart();
I2CSendByte(0x91);
I2CWaitAck();
temp = I2CReceiveByte();
I2CSendAck(1);
I2CStop();
return temp;
}
// 用的最多的就是0x41 0x43
PWM波
// 10000 分成 100份
void Init_Timer0() interrupt 1
{
TH0 = (65536 - 100) / 256;
TL0 = (65536 - 100) % 256;
conut++;
if (count <= duty)
{
L1 = 0;
}
else if (count < 100)
{
L1 = 1;
}
else if (count == 100)
{
L1 = 0;
count = 0;
}
}
// 实现了呼吸灯
超声波测距
// 最好用T1实现 因为T0用来实现NE555
sbit TX = P1 ^ 0;
sbit RX = P1 ^ 1;
void Delay_12us()
{
unsigned char i;
_nop_();
_nop_(); // 空操作
i = 33;
while (--i);
}
// STC 生成出来的 带上头文件
void Send_Wave()
{
unsigned char i;
for(i = 0;i < 8;i++)
{
TX = 1;
Delay_12us();
TX = 0;
Delay_12us();
}
}
void Measure_Distance()
{
unsigned int time = 0;
TMOD &= 0x0f;
TH1 = 0x00;
TH1 = 0x00;
Send_Wave();
TR1 = 1;
while((RX == 1)&&(TF1 ==0))
TR1 = 0;
if (TF1 == 0)
{
time = TH1;
time = (time << 8) | TL1;
distance = ((time / 10) * 17) / 100 + 3;
}
else
{
TF1 = 0;
distance = 999;
}
}
串口UART
// 省赛基础版 发送命令
sfr AUXR = 0x8e;
void SendByte(unsigned char dat)
{
SBUF = dat;
while(TI == 0);
TI = 0;
}
void SendString(unsigned char *str)
{
while(*str != '\0')
{
SendByte(*str++);
}
}
void Init_Uart()
{
TMOD = 0x20;
TH1 = 0xfd;
TL1 = 0xfd;
TR1 = 1;
SCON = 0x50;
AUXR = 0x00;
ES = 1;
EA = 1;
}
unsigned char command = 0x00;
void Service_Uart() interrupt 4
{
if(RI == 1)
{
RI = 0;
command = SBUF;
}
}
// 建议用定时器2
// 串口用2,超声波用1,555用0
// 一般是够用了,实在不行再用pca
// 串口初始化函数
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 SendByte(unsigned char dat)
{
SBUF = dat;
while(TI == 0);
TI = 0;
}
// 发送字符串
void SendString(unsigned char *dat)
{
while(*dat != '\0')
SendByte(*(dat++)); // c语言基础
}
unsigned char Uart_Rev[10] = {0};
unsigned char Uart_Rev_Index = 0;
// 串口中断服务函数
void Service_Uart () interrput 4
{
if(RI == 1)
{
Uart_Rev[Uart_Rev_Index] = SBUF;
Uart_Rev_Index++;
RI = 0;
}
}
unsigned char Uart_Send[10] = {0};
// sprintf 的用法
#include "stdio.h"
sprintf(Uart_Send,"我是caihua %d",1);
SendString(Uart_Send);
4X4矩阵按键
sbit R1 = P3^3;
sbit R2 = P3^2;
sbit C1 = P4^4;
sbit C2 = P4^2;
void Scan_Keys()
{
R1 = 0;
R2 = 1;
if(C1 == 0)
{
DelaySMG(200);
if(C1 == 0)
{
S4_Func();
while(C1 == 0)
{
Display_SMG();
}
}
}
if(C2 == 0)
{
DelaySMG(200);
if(C2 == 0)
{
S8_Func();
while(C2 == 0)
{
Display_SMG();
}
}
}
R1 = 1;
R2 = 0;
if(C1 == 0)
{
DelaySMG(200);
if(C1 == 0)
{
S5_Func();
while(C1 == 0)
{
Display_SMG();
}
}
}
if(C2 == 0)
{
DelaySMG(200);
if(C2 == 0)
{
S9_Func();
while(C2 == 0)
{
Display_SMG();
}
}
}
}
LED控制
// 闪烁
if((stat_led & 0x08) == 0x00)
{
stat_led |= 0x08;
Set_HC573(4,stat_led);
}
else if(temp_smg > temp_param)
{
stat_led &= ~0x80;
Set_HC573(4,stat_led);
}
stat_led |= 0x08; //关闭 0000 1000
stat_led &= ~0x80; //点亮 1111 0111
PCA
// PCA做超声波
void Delay12us(void) //@12.000MHz
{
unsigned char data i;
_nop_();
_nop_();
i = 33; // 如果抖动就放38
while (--i);
}
void Ut_Wave_Init()
{
unsigned char i;
for (i = 0; i < 8; i++)
{
Tx = 1;
Delay12us();
Tx = 0;
Delay12us();
}
}
unsigned char Ut_Wave_Data()
{
unsigned char time;
CH = 0;
CL = 0;
CCON = 0;
EA = 0;
Ut_Wave_Init();
EA = 1;
CR = 1;
while (Rx && !CF);
CR = 0;
if (CF == 0)
{
time = CH << 8 | CL;
return (time * 0.017);
CH = 0;
CL = 0;
}
else
{
CF = 0;
return 0;
}
}