【蓝桥杯】赛前一周模板

小蜜蜂代码风格的,模块都在,希望能够帮助你吧。

目录

AT24C02存储芯片

DS18B20温度传感器

DS1302 时钟

NE555频率测量

PCF8591 AD 

PWM波

超声波测距

串口UART

4X4矩阵按键


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;
    }
}

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Caihua_X

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值