蓝桥杯之单片机学习(终)——关于之前文章的错误及更正(附:第十四届蓝桥杯单片机赛题)

news2025/2/28 17:14:14

文章目录

  • 零、吐槽
  • 一、关于自创模板,和自写模板库的问题
  • 二、关于 `详解A/D、D/A、PCF8591` 这篇文章一些小错误
  • 三、模板最终版本
    • main.c
    • ds1302,h
    • ds1302.c
    • onewire.h
    • onewire.c
    • iic.h
    • iic.c
  • 附、第十四届蓝桥杯单片机赛题

零、吐槽

今年是矩阵键盘+三个协议一起调用啊。真是一年比一年难了,去年是超声波。后来者们,加油!

一、关于自创模板,和自写模板库的问题

那两篇文章,代码可以不用看了,直接看最新的,我都总结在里面了

蓝桥杯之单片机学习(三十)——模板罗列、技巧总结与心得

这个由于我之前自己的个人疏忽,从而有很多错误没有更正,并且我之后会在更新用法。保证程序的正确性
并且在这里我也列一下。

二、关于 详解A/D、D/A、PCF8591 这篇文章一些小错误

就是对于AIN1和AIN3的注释的一些错误
我会进行一一更正。

三、模板最终版本

主函数:是注释了矩阵键盘,打开了独立按键(如果需要可以解开矩阵键盘的代码)
ds1302协议:调用万年历时,需要在主函数初始化时,加入ds1302的初始化,之后直接调用,read_ds1302即可,再从shijian这是数组取出,数组内部顺序是秒、分、时、日、月、周、年
onewire协议:温度读取直接调用tempget(),即可,但是好像精度达不到小数点之后,函数体有实例
iic协议
①关于 EEPROM,直接调用:EEPROM_readEEPROM_write就行,但要注意地址
②关于 光敏电阻 数值读取:调用:read_AIN1()即可,函数体下面有获取实例,可以看看
③关于 Rb2电位 数值读取:调用:read_AIN3()即可。实例同上

main.c

#include <STC15F2K60S2.h>
#include "onewire.h"
#include "iic.h"
#include "ds1302.h"

#define uchar unsigned char
#define uint unsigned int
extern uchar shijian[7];
//共阳,低四位是abcd
//LED共阳
uchar SMG_duanma[19] = 
					{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
						 0x88,0x80,0xc6,0xc0,0x86,0x8e,
						 0xbf,0x7f,0XFF};//分别是0-9(对应下标),A-F,“-”,“.”

uchar yi,er,san,si,wu,liu,qi,ba;
/*
void keycan16();
void delayms(int b);
*/				 
void SelectHC138(uchar channel);
void initsys();
void DisplaySMG_Bit(uchar pos, uchar value);
void Delay_one_ms_SMG();
void SMG_Display();
void Alone_Key();
void Delay_five_ms_Key();
void Timer0Init(void);


void main()
{
	yi = er = san = si = wu = liu = qi = ba = 18;
	initsys();
	Timer0Init();
	while(1)
	{
		Alone_Key();
		SMG_Display();
	}
}


void SelectHC138(uchar channel)
{
	switch(channel)
	{
		case 4:    //LED
			P2 = (P2 & 0X1F) | 0X80;
		break;
		case 5:    //蜂鸣器和继电器
			P2 = (P2 & 0X1F) | 0XA0;
		break;
		case 6:    //位码
			P2 = (P2 & 0X1F) | 0XC0;
		break;
		case 7:    //段码
			P2 = (P2 & 0X1F) | 0XE0;
		break;
	}
}

void initsys()
{
	SelectHC138(5);
	P0 = 0X00;//关闭蜂鸣器和继电器
	//0X10是蜂鸣器,0x40是继电器
	SelectHC138(4);
	P0 = 0XFF;
	
	SelectHC138(6);
	P0 = 0XFF;
	SelectHC138(7);
	P0 = 0XFF;
}

void DisplaySMG_Bit(uchar pos, uchar value)
{
	SelectHC138(6);
	P0 = 0X01 << pos;
	SelectHC138(7);
	P0 = value;
}

void Delay_one_ms_SMG()
{
	uint j;
	for(j = 845; j > 0; j--);
}

void SMG_Display()
{
	DisplaySMG_Bit(0, SMG_duanma[yi]);
	Delay_one_ms_SMG();
	DisplaySMG_Bit(1, SMG_duanma[er]);
	Delay_one_ms_SMG();
	DisplaySMG_Bit(2, SMG_duanma[san]);
	Delay_one_ms_SMG();
	DisplaySMG_Bit(3, SMG_duanma[si]);
	Delay_one_ms_SMG();
	
	DisplaySMG_Bit(4, SMG_duanma[wu]);
	Delay_one_ms_SMG();
	DisplaySMG_Bit(5, SMG_duanma[liu]);
	Delay_one_ms_SMG();
	DisplaySMG_Bit(6, SMG_duanma[qi]);
	Delay_one_ms_SMG();
	DisplaySMG_Bit(7, SMG_duanma[ba]);
	Delay_one_ms_SMG();
}

void Delay_five_ms_Key()
{
	uint i,j;
	for(i = 0;i < 5;i++)
		for(j = 845; j > 0;j--);
}

void Alone_Key()
{
	//S7
	if(P30 == 0)
	{
		Delay_five_ms_Key();
		if(P30 == 0)
		{
			yi = 1;
		}
		while(!P30);
	}
	//S6
	if(P31 == 0)
	{
		Delay_five_ms_Key();
		if(P31 == 0)
		{
			er = 1;
		}
		while(!P31);
	}
	//S5
	if(P32 == 0)
	{
		Delay_five_ms_Key();
		if(P32 == 0)
		{
			san = 1;
		}
		while(!P32);
	}
	//S4
	if(P33 == 0)
	{
		Delay_five_ms_Key();
		if(P33 == 0)
		{
			si = 1;
		}
		while(!P33);
	}
}

void Timer0Init(void)		//1毫秒@12.000MHz
{
	AUXR |= 0x80;		//定时器时钟1T模式
	TMOD &= 0xF0;		//设置定时器模式
	TL0 = 0x20;		//设置定时初值
	TH0 = 0xD1;		//设置定时初值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
}

void Timer0Service() interrupt 1
{
	
}
/*  矩阵键盘
void delayms(int b)
{
	int i,a;
	for(i=b;i>0;i--)
	for(a=110;a>0;a--);
}


void keycan16()
{
	int temp;
	//第一列
	P3=0x7f;P44=0;P42=1;
	temp=P3;
	temp=temp&0x0f;
	if(temp!=0x0f)
	{
		delayms(5);
		temp=P3;
		temp=temp&0x0f;
		if(temp!=0x0f)
		{temp=P3;
			switch(temp)
			{
				case 0x7e: P0=0XFF;break;//S7
				case 0x7d: P0=0xff;break;//S6
			  case 0x7b: P0=0x55;break;//S5
				case 0x77: P0=0x0f;break;//S4	
			}
			while(temp!=0x0f)
			{
				temp=P3;
				temp=temp&0x0f;		
			}	
		}
	}

   P3=0xbf;P44=1;P42=0;
	temp=P3;
	temp=temp&0x0f;
	if(temp!=0x0f)
	{
		delayms(5);
		temp=P3;
		temp=temp&0x0f;
		if(temp!=0x0f)
		{temp=P3;
			switch(temp)
			{
				case 0xbe: P0=0x0f;break;
				case 0xbd: P0=0x00;break;
			  case 0xbb: P0=0x55;break;
				case 0xb7: P0=0xff;break;				
			}
			while(temp!=0x0f)
			{
				temp=P3;
				temp=temp&0x0f;		
			}	
		}
	}
  P3=0xdf;P44=1;P42=1;
	temp=P3;
	temp=temp&0x0f;
	if(temp!=0x0f)
	{
		delayms(5);
		temp=P3;
		temp=temp&0x0f;
		if(temp!=0x0f)
		{temp=P3;
			switch(temp)
			{
				case 0xde: P0=0xf0;break;
				case 0xdd: P0=0xfc;break;
			  case 0xdb: P0=0xf3;break;
				case 0xd7: P0=0xff;break;				
			}
			while(temp!=0x0f)
			{
				temp=P3;
				temp=temp&0x0f;
			}	
		}
	}
   P3=0xef;P44=1;P42=1;
	temp=P3;
	temp=temp&0x0f;
	if(temp!=0x0f)
	{
		delayms(5);
		temp=P3;
		temp=temp&0x0f;
		if(temp!=0x0f)
		{temp=P3;
			switch(temp)
			{
				case 0xee: P0=0xf0;break;
				case 0xed: P0=0xfc;break;
			  case 0xeb: P0=0x55;break;
				case 0xe7: P0=0x0f;break;
			}
			while(temp!=0x0f)
			{
				temp=P3;
				temp=temp&0x0f;		
			}	
		}
	}
}

*/

ds1302,h

//主函数有下面这一行
//extern uchar shijian[7];
//秒、分、时、日、月、周、年

#ifndef __DS1302_H__
#define __DS1302_H__

#include <STC15F2K60S2.h>
#include <intrins.h>

sbit SCK = P1^7;		
sbit SDA = P2^3;		
sbit RST = P1^3; 

void Write_Ds1302(unsigned char temp);
void Write_Ds1302_Byte( unsigned char address,unsigned char dat );
unsigned char Read_Ds1302_Byte( unsigned char address );

#endif

ds1302.c

#include "ds1302.h"  									

#define DecToBCD(dec) (dec/10*16)+(dec%10)
#define BCDToDec(BCD) (BCD/16*10)+(BCD%16)
unsigned char shijian[7]={50,59,23,0,0,0,0};
//写字节
void Write_Ds1302(unsigned  char temp) 
{
	unsigned char i;
	for (i=0;i<8;i++)     	
	{ 
		SCK = 0;
		SDA = temp&0x01;
		temp>>=1; 
		SCK=1;
	}
}   

//向DS1302寄存器写入数据
void Write_Ds1302_Byte( unsigned char address,unsigned char dat )     
{
 	RST=0;	_nop_();
 	SCK=0;	_nop_();
 	RST=1; 	_nop_();  
 	Write_Ds1302(address);	
 	Write_Ds1302(dat);		
 	RST=0; 
}

//从DS1302寄存器读出数据
unsigned char Read_Ds1302_Byte ( unsigned char address )
{
 	unsigned char i,temp=0x00;
 	RST=0;	_nop_();
 	SCK=0;	_nop_();
 	RST=1;	_nop_();
 	Write_Ds1302(address);
 	for (i=0;i<8;i++) 	
 	{		
		SCK=0;
		temp>>=1;	
 		if(SDA)
 		temp|=0x80;	
 		SCK=1;
	} 
 	RST=0;	_nop_();
 	SCK=0;	_nop_();
	SCK=1;	_nop_();
	SDA=0;	_nop_();
	SDA=1;	_nop_();
	return (temp);			
}

void Init_DS1302()
{
	unsigned char i,add;
	add = 0X80;
	Write_Ds1302_Byte(0X8E, 0X00);
	for(i = 0; i < 7; i++)
	{
		Write_Ds1302_Byte(add,DecToBCD(shijian[i]));
		add = add + 2;
	}
}

void Read_DS1302()
{
	unsigned char i,add;
	add = 0X81;
	for(i = 0; i < 7; i++)
	{
		shijian[i] = BCDToDec(Read_Ds1302_Byte(add));
		add = add + 2;
	}
	
}

onewire.h

#ifndef __ONEWIRE_H__
#define __ONEWIRE_H__

#include <STC15F2K60S2.h>

sbit DQ = P1^4;  

unsigned char rd_temperature(void);  
unsigned char tempget();

#endif

onewire.c

#include "onewire.h"

//单总线内部延时函数
void Delay_OneWire(unsigned int t)  
{
	while(t--);
}

//单总线写操作
void Write_DS18B20(unsigned char dat)
{
	unsigned char i;
	for(i=0;i<8;i++)
	{
		DQ = 0;
		DQ = dat&0x01;
		Delay_OneWire(50);
		DQ = 1;
		dat >>= 1;
	}
	Delay_OneWire(50);
}

//单总线读操作
unsigned char Read_DS18B20(void)
{
	unsigned char i;
	unsigned char dat;
  
	for(i=0;i<8;i++)
	{
		DQ = 0;
		dat >>= 1;
		DQ = 1;
		if(DQ)
		{
			dat |= 0x80;
		}	    
		Delay_OneWire(50);
	}
	return dat;
}

//DS18B20初始化
bit init_ds18b20(void)
{
  	bit initflag = 0;
  	
  	DQ = 1;
  	Delay_OneWire(120);//12
  	DQ = 0;
  	Delay_OneWire(800);//80
  	DQ = 1;
  	Delay_OneWire(100); //10
    initflag = DQ;     
  	Delay_OneWire(50);//5
  
  	return initflag;
}
unsigned char tempget()
{
	unsigned char high,low,temp;
	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0x44);
	
	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0xbe);
	
	low=Read_DS18B20();
	high=Read_DS18B20();
	temp=(unsigned char )((high<<8|low)*0.0625f);
	return temp;
}


//temp = tempget();
//qi = temp / 10;
//ba = temp % 10;

iic.h

#ifndef __IIC_H__
#define __IIC_H__

#include <STC15F2K60S2.h>
#include "intrins.h"

sbit SD = P2^1;
sbit SCL = P2^0;

void IIC_Start(void); 
void IIC_Stop(void);  
bit IIC_WaitAck(void);  
void IIC_SendAck(bit ackbit); 
void IIC_SendByte(unsigned char byt); 
unsigned char IIC_RecByte(void); 
//输出DAC
void Read_DAC(unsigned char date);
unsigned char Write_ADC(unsigned char add);

//读取电位器Rb2
unsigned char read_AIN3();
//读取光敏电阻
unsigned char read_AIN1();

unsigned char EEPROM_read(unsigned char add);

void EEPROM_write(unsigned char add,unsigned char date);

#endif

iic.c

#include "iic.h"

#define DELAY_TIME 5

//I2C总线内部延时函数
void IIC_Delay(unsigned char i)
{
    do{_nop_();}
    while(i--);        
}

//I2C总线启动信号
void IIC_Start(void)
{
    SD = 1;
    SCL = 1;
    IIC_Delay(DELAY_TIME);
    SD = 0;
    IIC_Delay(DELAY_TIME);
    SCL = 0;	
}

//I2C总线停止信号
void IIC_Stop(void)
{
    SD = 0;
    SCL = 1;
    IIC_Delay(DELAY_TIME);
    SD = 1;
    IIC_Delay(DELAY_TIME);
}

//发送应答或非应答信号
void IIC_SendAck(bit ackbit)
{
    SCL = 0;
    SD = ackbit;  					
    IIC_Delay(DELAY_TIME);
    SCL = 1;
    IIC_Delay(DELAY_TIME);
    SCL = 0; 
    SD = 1;
    IIC_Delay(DELAY_TIME);
}

//等待应答
bit IIC_WaitAck(void)
{
    bit ackbit;
	
    SCL  = 1;
    IIC_Delay(DELAY_TIME);
    ackbit = SD;
    SCL = 0;
    IIC_Delay(DELAY_TIME);
    return ackbit;
}

//I2C总线发送一个字节数据
void IIC_SendByte(unsigned char byt)
{
    unsigned char i;

    for(i=0; i<8; i++)
    {
        SCL  = 0;
        IIC_Delay(DELAY_TIME);
        if(byt & 0x80) SD  = 1;
        else SD  = 0;
        IIC_Delay(DELAY_TIME);
        SCL = 1;
        byt <<= 1;
        IIC_Delay(DELAY_TIME);
    }
    SCL  = 0;  
}

//I2C总线接收一个字节数据
unsigned char IIC_RecByte(void)
{
    unsigned char i, da;
    for(i=0; i<8; i++)
    {   
    	SCL = 1;
	IIC_Delay(DELAY_TIME);
	da <<= 1;
	if(SD) da |= 1;
	SCL = 0;
	IIC_Delay(DELAY_TIME);
    }
    return da;    
}

unsigned char Write_ADC(unsigned char add)
{
	unsigned char dat;
	IIC_Start();
	IIC_SendByte(0X90);
	IIC_WaitAck();
	IIC_SendByte(add);
	IIC_WaitAck();
	
	IIC_Start();
	IIC_SendByte(0X91);
	IIC_WaitAck();
	dat = IIC_RecByte();
	IIC_SendAck(1);
	IIC_Stop();
	
	return dat;
}

//输出DAC
void Read_DAC(unsigned char date)
{
	IIC_Start();
	IIC_SendByte(0X90);
	IIC_WaitAck();
	IIC_SendByte(0X40);
	IIC_WaitAck();
	IIC_SendByte(date);
	IIC_WaitAck();
	IIC_Stop();
}

void EEPROM_write(unsigned char add,unsigned char date)
{
	IIC_Start();
	IIC_SendByte(0XA0);
	IIC_WaitAck();
	IIC_SendByte(add);
	IIC_WaitAck();
	IIC_SendByte(date);
	IIC_WaitAck();
	IIC_Stop();
	
	IIC_Delay(5);
}

unsigned char EEPROM_read(unsigned char add)
{
	unsigned char dat;
	IIC_Start();
	IIC_SendByte(0XA0);
	IIC_WaitAck();
	IIC_SendByte(add);
	IIC_WaitAck();
	
	IIC_Start();
	IIC_SendByte(0XA1);
	IIC_WaitAck();
	dat = IIC_RecByte();
	IIC_SendAck(1);
	IIC_Stop();
	return dat;
}


/*
STC89C52RC内部EEPROM详细地址表:
第一扇区                   第二扇区                    第三扇区                    第四扇区
起始地址  结束地址   起始地址   结束地址   起始地址   结束地址   起始地址    结束地址
2000h      21FFh       2200h       23FFh      2400h       25FFh       2600h        27FFH
第五扇区                    第六扇区                     第七扇区                    第八扇区
起始地址   结束地址   起始地址   结束地址    起始地址   结束地址   起始地址    结束地址
2800h       29FFh       2A00h      2BFFh        2C00h      2DFFh      2E00h        2FFFh
*/

//读取光敏电阻
unsigned char	read_AIN1()
{
		unsigned char dat1;
    IIC_Start();    //IIC总线起始信号
    IIC_SendByte(0x90);     //PCF8591的写设备地址
    IIC_WaitAck();  //等待从机应答
    IIC_SendByte(0x01);     //写入PCF8591的控制字
    IIC_WaitAck();  //等待从机应答
    IIC_Stop();     //IIC总线停止信号
    
    IIC_Start();    //IIC总线起始信号
    IIC_SendByte(0x91);     //PCF8591的读设备地址
    IIC_WaitAck();  //等待从机应答
    dat1 = IIC_RecByte();     //读取PCF8591通道1的数据
    IIC_Stop();     //IIC总线停止信号
		return dat1;
    
}
/*
		liu = temp / 100;
		qi  = temp % 100 / 10;
		ba  = temp % 10;
*/

//读取电位器Rb2
unsigned char read_AIN3()
{
		unsigned char dat3;
    IIC_Start();    //IIC总线起始信号
    IIC_SendByte(0x90);     //PCF8591的写设备地址
    IIC_WaitAck();  //等待从机应答
    IIC_SendByte(0x03);     //写入PCF8591的控制字
    IIC_WaitAck();  //等待从机应答
    IIC_Stop();     //IIC总线停止信号
    
    IIC_Start();    //IIC总线起始信号
    IIC_SendByte(0x91);     //PCF8591的读设备地址
    IIC_WaitAck();  //等待从机应答
    dat3 = IIC_RecByte();     //读取PCF8591通道1的数据
    IIC_Stop();     //IIC总线停止信号
    return dat3;
}
/*
		liu = temp / 100;
		qi  = temp % 100 / 10;
		ba  = temp % 10;
*/

附、第十四届蓝桥杯单片机赛题

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

#include <STC15F2K60S2.h>
#include "onewire.h"
#include "iic.h"
#include "ds1302.h"

#define uchar unsigned char
#define uint unsigned int
extern uchar shijian[7];

sbit LED_0 = P0^0;
sbit LED_1 = P0^1;
sbit LED_2 = P0^2;

sbit LED_3 = P0^3;
sbit LED_4 = P0^4;
//共阳,低四位是abcd
//LED共阳
uchar SMG_duanma[21] = 
					{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
						 0x88,0x80,0xc6,0xc0,0x86,0x8e,
						 0xbf,0x7f,0XFF,0X8C,0X89};//分别是0-9(对应下标),A-F,“-”,“.”,"灭",“P”,"H"

uchar yi,er,san,si,wu,liu,qi,ba;
	 
 
void keycan16();
void delayms(int b);				 
void SelectHC138(uchar channel);
void initsys();
void DisplaySMG_Bit(uchar pos, uchar value);
void Delay_one_ms_SMG();
void SMG_Display();
void Timer0Init(void);
void S4_chocie(uchar S4_st);
void MODE_back(uchar S5_st);
void Check_light();

//原初界面-0和采集界面-1
uchar Two_win = 0;
//s4的三个界面
uchar S4_st = 0;
//s5的三个回显
uchar S5_st = 0;
//采集次数
uchar gather = 0;
//温度参数
uchar wen_can = 30;
//
uchar old_light = 0; 

uchar shijian_new[7];

uchar shidu = 0;

uchar wendu_table[10] = 0;

void main()
{
 uchar temp;
	yi = er = san = si = wu = liu = qi = ba = 18;
	initsys();
	Timer0Init();
 Init_DS1302();
 
	while(1)
	{

		keycan16();
 S4_chocie(S4_st);

		SMG_Display();
	}
}
//S5界面选择
void MODE_back(uchar S5_st)
{
 uchar wendu_show_max=0;
 uchar wendu_show_avr=0;
 uchar i;
 if(S5_st==0)
 {
  {
   wendu_show_max = tempget();
   yi = 12;
   er=18;
   san = wendu_show_max / 10;
   si  = wendu_show_max % 10;
   wu = 16;
   liu = wendu_show_max / 10;
   qi  = wendu_show_max % 10;
   ba  = (wendu_show_max * 10) % 10;
  }
 
 }
 else if(S5_st==1)
 {
  yi = 20;
  wu = 16;
  er = 18 ;
  san = si = liu = ba = qi = 10;
 }
 else if(S5_st==2)
 {
  yi = 15;
  er = san = 0;
  si = shijian[2] / 10;
  wu = shijian[2] % 10;
  liu = 16;
  qi = shijian[1] / 10;
  ba = shijian[1] % 10;
 }
}


//S4界面选择
void S4_chocie(uchar S4_st)
{
 if(Two_win==0)
 {
  P0 &=0xFF;
  if(S4_st==0)
  {
   Read_DS1302();
   SelectHC138(4);
   LED_0 = 0;LED_1 = 1;LED_2 = 1;
   yi = shijian[2] / 10;er = shijian[2] % 10;
   san = 16;
   si = shijian[1] / 10;wu = shijian[1] % 10;
   liu = 16;
   qi = shijian[0] / 10;ba = shijian[0] % 10;
  }
  else if(S4_st==1)
  {
    SelectHC138(4);
    LED_0 = 1;LED_1 = 0;LED_2 = 1;
    MODE_back(S5_st);
  }
  else if(S4_st==2)
  {
    SelectHC138(4);
    LED_0 = 1;LED_1 = 1;LED_2 = 0;
    yi = 19;er=san=si=wu=liu=18;
    qi = wen_can / 10;
    ba = wen_can % 10;
  }
 }
}

void Check_light()
{
  uchar light_temp;
  uchar wendu;
  uchar i;
  light_temp = read_AIN1();
  liu = light_temp / 100;
  qi  = light_temp % 100 /10;
  ba  = light_temp % 10; 
  if(old_light - light_temp > 50)
  {
   Two_win = 1;
  }
  else if(old_light - light_temp < 50)
  {
   Two_win = 0;
  }
  old_light = light_temp;
   delayms(10000);
 
  if(Two_win == 1)
  {
   gather++;
   wendu = tempget();
   shidu = 0;
   for(i=0;i<3;i++)
   {
    shijian_new[i] = shijian[i];
   }
   for(i=0;i=10;i++)
   {
    if(wendu_table[i]==0)
    {
     wendu_table[i]=wendu;
    }
   }
  }

  
}

void SelectHC138(uchar channel)
{
	switch(channel)
	{
		case 4:    //LED
			P2 = (P2 & 0X1F) | 0X80;
		break;
		case 5:    //蜂鸣器和继电器
			P2 = (P2 & 0X1F) | 0XA0;
		break;
		case 6:    //位码
			P2 = (P2 & 0X1F) | 0XC0;
		break;
		case 7:    //段码
			P2 = (P2 & 0X1F) | 0XE0;
		break;
	}
}

void initsys()
{
	SelectHC138(5);
	P0 = 0X00;//关闭蜂鸣器和继电器
	//0X10是蜂鸣器,0x40是继电器
	SelectHC138(4);
	P0 = 0XFF;
	
	SelectHC138(6);
	P0 = 0XFF;
	SelectHC138(7);
	P0 = 0XFF;
}

void DisplaySMG_Bit(uchar pos, uchar value)
{
	SelectHC138(6);
	P0 = 0X01 << pos;
	SelectHC138(7);
	P0 = value;
}

void Delay_one_ms_SMG()
{
	uint j;
	for(j = 845; j > 0; j--);
}

void SMG_Display()
{
	DisplaySMG_Bit(0, SMG_duanma[yi]);
	Delay_one_ms_SMG();
	DisplaySMG_Bit(1, SMG_duanma[er]);
	Delay_one_ms_SMG();
	DisplaySMG_Bit(2, SMG_duanma[san]);
	Delay_one_ms_SMG();
	DisplaySMG_Bit(3, SMG_duanma[si]);
	Delay_one_ms_SMG();
	
	DisplaySMG_Bit(4, SMG_duanma[wu]);
	Delay_one_ms_SMG();
	DisplaySMG_Bit(5, SMG_duanma[liu]);
	Delay_one_ms_SMG();
	DisplaySMG_Bit(6, SMG_duanma[qi]);
	Delay_one_ms_SMG();
	DisplaySMG_Bit(7, SMG_duanma[ba]);
	Delay_one_ms_SMG();
 SelectHC138(6);
	P0 = 0XFF;
	SelectHC138(7);
	P0 = 0XFF;
}


void Timer0Init(void)		//1毫秒@11.0592MHz
{
	AUXR |= 0x80;		//定时器时钟1T模式
	TMOD &= 0xF0;		//设置定时器模式
	TL0 = 0xCD;		//设置定时初值
	TH0 = 0xD4;		//设置定时初值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
}

void Timer0Service() interrupt 1
{
		TL0 = 0xCD;		//设置定时初值
  TH0 = 0xD4;		//设置定时初值

}

void delayms(int b)
{
	int i,a;
	for(i=b;i>0;i--)
	for(a=110;a>0;a--);
}


void keycan16()
{
	int temp;
	//第一列
	P3=0x7f;P44=0;P42=1;
	temp=P3;
	temp=temp&0x0f;
	if(temp!=0x0f)
	{
		delayms(5);
		temp=P3;
		temp=temp&0x0f;
		if(temp!=0x0f)
		{temp=P3;
			switch(temp)
			{
			  case 0x7b: 
      if(Two_win==0 && S4_st==1)
      {
       S5_st++;
       if(S5_st==3)
       {
        S5_st=0;
       }
      }
     ;break;//S5
				case 0x77: 
     if(Two_win==0)
      {
       S4_st++;
       if(S4_st==3)
       {
        S4_st=0;
       }
      }
    ;break;//S4	
			}
			while(temp!=0x0f)
			{
				temp=P3;
				temp=temp&0x0f;		
			}	
		}
	}
 P3=0xbf;P44=1;P42=0;
	temp=P3;
	temp=temp&0x0f;
	if(temp!=0x0f)
	{
		delayms(5);
		temp=P3;
		temp=temp&0x0f;
		if(temp!=0x0f)
		{temp=P3;
			switch(temp)
			{
			  case 0xbb: 
     if(Two_win==0 && S4_st==2)
     {
      wen_can -= 1;
     }
     ;break;//s9
				case 0xb7: 
     if(Two_win==0 && S4_st==2)
     {
      wen_can += 1; 
     }
    ;break;//s8
			}
			while(temp!=0x0f)
			{
				temp=P3;
				temp=temp&0x0f;		
			}	
		}
	}

}



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/412582.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

“AI+机器人”持续为多领域增“智”添“质”,开启效益增长飞轮

近期&#xff0c;工信部等17部门联合推出《“机器人”应用行动实施方案》&#xff0c;全面加快机器人领域应用拓展。据方案提出&#xff0c;至2025年&#xff0c;制造业机器人密度较2020年将实现翻番&#xff0c;服务机器人及特种机器人行业应用深度与广度显著提升。机器人融合…

服务器被DDoS攻击,怎么破?

文章目录前言网站受到DDoS的症状判断是否被攻击查看网络带宽占用查看网络连接TCP连接攻击SYN洪水攻击防御措施TCP/IP内核参数优化iptables 防火墙预防防止同步包洪水&#xff08;Sync Flood&#xff09;Ping洪水攻击&#xff08;Ping of Death&#xff09;控制单个IP的最大并发…

基于SpringBoot的私人健身和教练的预约管理系统源码数据库论文

目 录 第一章 概述 1.1研究背景 1.2开发意义 1.3研究现状 1.4研究内容 1.5论文结构 第二章 开发技术介绍 2.1系统开发平台 2.2平台开发相关技术 2.2.1 Javar技术 2.2.2 Mysql数据库介绍 2.2.3 Mysql环境配置 2.2.4 B/S架构 2.2.5 Springboot框架 …

主动配电网故障恢复的重构与孤岛划分统一模型研究【升级版本】(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

V8引擎执行原理

v8是C编写的Google开源高性能JavaScript和WebAssembly引擎&#xff0c;它用于Chrome和Node.js等。 它实现ECMAScript和WebAssembly。 v8可独立运行&#xff0c;也可嵌入到任何C应用程序中。 parse模块 parse模块会将JavaScript代码转换成AST(抽象语法树)&#xff0c;因为解…

[LeetCode周赛复盘] 第 340 场周赛20230409

[LeetCode周赛复盘] 第 340 场周赛20230409 一、本周周赛总结二、 6361. 对角线上的质数1. 题目描述2. 思路分析3. 代码实现三、6360. 等值距离和1. 题目描述2. 思路分析3. 代码实现四、6359. 最小化数对的最大差值1. 题目描述2. 思路分析3. 代码实现五、 6353. 网格图中最少访…

【排序】排序这样写才对Ⅰ --插入排序与选择排序

Halo&#xff0c;这里是Ppeua。平时主要更新C语言&#xff0c;C&#xff0c;数据结构算法......感兴趣就关注我吧&#xff01;你定不会失望。 &#x1f308;个人主页&#xff1a;主页链接 &#x1f308;算法专栏&#xff1a;专栏链接 我会一直往里填充内容哒&#xff01; &…

Axios请求(对于ajax的二次封装)——Axios请求的响应结构、默认配置

Axios请求&#xff08;对于ajax的二次封装&#xff09;——Axios请求的响应结构、默认配置知识回调&#xff08;不懂就看这儿&#xff01;&#xff09;场景复现核心干货axios请求的响应结构响应格式详解实际请求中的响应格式axios请求的默认配置全局axios默认值&#xff08;了解…

Debug | wget 的安装与使用(Windows)

!wget -nc http://labfile.oss.aliyuncs.com/courses/780/WeatherData.zip 报错信息&#xff1a; wget 不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件。 分析&#xff1a; 在jupyter notebook中做机器学习时导入数据使用!wget遇到了这个问题&#xff0c;查到…

轻松上手git代码版本管理工具--协同开发-冲突解决、线上分支合并以及使用pycharm操作git

一、协同开发 多人合作开发一个项目---->多人公用一个远程仓库 以后台项目为例: git init # git管理设置忽略文件.gitignore git add .git commit -m 第一次提交,写完了首页功能远程新建一个远程仓库(空) 创建一个origin git remote add origin git@gitee.com:xx…

穿戴规范智能识别系统 yolov7

穿戴规范智能识别系统通过yolov7python网络模型AI深度视觉学习算法&#xff0c;穿戴规范智能识别系统对工厂画面中人员穿戴行为自动识别分析&#xff0c;发现现场人员未按照规定穿戴着装&#xff0c;立即抓拍告警。YOLOv7 的发展方向与当前主流的实时目标检测器不同&#xff0c…

垃圾满溢检测系统 yolov5

垃圾满溢检测系统通过pythonyolov5网络模型技术&#xff0c;垃圾满溢检测系统对控画面中小区内的垃圾桶进行7*24小时不间断监控&#xff0c;发现垃圾桶溢满周围有堆积物立即触发预警推送给相关人员处理。YOLOv5中在训练模型阶段仍然使用了Mosaic数据增强方法&#xff0c;该算法…

kubeadm方式部署k8s最新版本V1.26.2

Kubernetes核心概念 Master主要负责资源调度&#xff0c;控制副本&#xff0c;和提供统一访问集群的入口。--核心节点也是管理节点 Node是Kubernetes集群架构中运行Pod的服务节点。Node是Kubernetes集群操作的单元&#xff0c;用来承载被分配Pod的运行&#xff0c;是Pod运行的宿…

测试7年,去过阿里也去过小公司,给你们年轻人一个忠告...

你眼中的软件测试岗位是怎样的&#xff1f;大部分人可能会给出这样的回答&#xff1a;“测试&#xff1f;简单啊&#xff0c;没什么技术含量&#xff0c;无非就是看需求、看业务手册、看设计文档、然后点点功能是否实现&#xff0c;麻烦点的就是测试下部署安装是否出现兼容性问…

分布式事务Seata原理

Seata 是一款开源的分布式事务解决方案&#xff0c;致力于提供高性能与简单易用的分布式事务服务&#xff0c;为用户提供了 AT、TCC、SAGA 和 XA 几种不同的事务模式。Seata AT模式是基于XA事务演进而来&#xff0c;需要数据库支持。AT 模式的特点就是对业务无入侵式&#xff0…

【故障定位】基于多元宇宙算法的主动配电网故障定位方法研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

LeetCode 37. 解数独

一、题目描述 编写一个程序&#xff0c;通过填充空格来解决数独问题。 数独的解法需 遵循如下规则&#xff1a; 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。&#xff08;请参考示例图&#x…

如果重回大学时光

目录如果重回大学时光1. 多参加社团活动&#xff0c;结交更多的朋友2. 认真考虑专业分流方向3. 根据兴趣和能力选择适合自己的出路4. 为未来做好准备&#xff0c;规划职业发展如果重回大学时光 当前我是一名普通的码农&#xff0c;还有几个月&#xff0c;又将有一批大学生将毕…

vue实现美观大方的动漫、cos、帖子类型网站

一、先上效果图 1.项目demo预览&#xff1a;点击预览 参照半次元的榜单-绘画榜、榜单-COS榜、榜单-写作榜、个人中心、登录注册页面&#xff0c;导航栏等&#xff0c;分别实现页面排版、数据交互、基础框架布局搭建以及自定义vue组件合理的封装及使用。在vue项目开发过程中&a…

梦中情树---二叉树

前言&#xff1a; 今天就来讲树的一种特殊结构---二叉树 当然先来给大家看一张图片 看到这棵树了吗&#xff1f;它从根开始&#xff0c;每个结点都有且仅有两个分支&#xff0c;这个结构就是我们的二叉树。 其实我们上次讲的堆也可以看成一棵二叉树&#xff0c;但是人家的本质…