锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

蓝桥杯单片机·蓝桥杯全国软件和信息技术专业人才大赛电子类单片机 常用代码笔记

时间:2023-04-07 01:07:00 200继电器输出6es71347d计数继电器16位继电器驱动板16l1

蓝桥杯笔记

1. 调用模块调用模板

#include  //#include  #define uchar unsigned char #define uint unsigned int   uchar tab[]={ 
        0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,              0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0xbf,0xff}; uchar yi,er,san,si,wu,liu,qi,ba; uchar num;  void delayms(int ms) { 
          int i,j;  for(i=0;i<ms;i )   for(j=845;j>0;j--); }  void Allinit() { 
          P2=0xA0; P0=0x00; P2=0x80; P0=0xFF; P2=0xC0; P0=0xFF; P2=0xFF; P0=0xFF; } //void allinit(void) //{ 
          // P2|=0XA0; // P2&=0XBF; // P0=0X00;//关闭蜂鸣器继电器 //  // P2|=0X80; // P2&=0X9F; // P0=0XFF;//关闭LED灯 //  // P2|=0XC0;//打开位选573 U8 // P2&=0XDF; // P0=0XFF;//选择所有数码管 // P2|=0XE0;//打开位选573 U7 // P2&=0XFF; // P0=0XFF;//关闭所有数码管 //} void display1(uchar yi,uchar er,uchar san,uchar si) { 
          P2=0xC0; P0=0x01; P2=0xFF; P0=tab[yi]; delayms(1); P2=0xC0; P0=0x02; P2=0xFF; P0=tab[er]; delayms(1); P2=0xC0; P0=0x04; P2=0xFF; P0=tab[san]; delayms(1); P2=0xC0; P0=0x08; P2=0xFF; P0=tab[si]; delayms(1); } void display2(uchar wu,uchar liu,uchar qi,uchar ba) { 
          P2=0xC0; P0=0x10; P2=0xFF; P0=tab[wu]; delayms(1); P2=0xC0; P0=0x20; P2=0xFF; P0=tab[liu]; delayms(1); P2=0xC0; P0=0x40; P2=0xFF; P0=tab[qi]; delayms(1); P2=0xC0; P0=0x80; P2=0xFF; P0=tab[ba]; delayms(1); } /*** void keyscan() { if(P30==0) { delayms(5); if(P30==0) { } while(!P30); } else if(P31==0) { delayms(5); if(P31==0) { } while(!P31); } else if(P32==0) { delayms(5); if(P32==0) { } while(!P32); } else if(P33==0) { delayms(5); if(P33==0) { } while(!P33); } } ***/ void keyscan16(void) { 
          uchar temp; P44=0;P42=1;P3=0X7F; temp=P3; temp=temp&0x0f; if(temp!=0x0f) { 
          delayms(5); temp=P3; temp=temp&0x0f; if(temp!=0x0f) { 
          temp=P3; switch(temp) { 
          case 0x7e: num=0; break; case 0x7d: num=1; break; case 0x7b: num=2; break; case 0x77: num=3; break; } while(temp!=0x0f) { 
          temp=P3; temp=temp&0x0f; } } } P44=1;P42=0;P3=0XBF; temp=P3; temp=temp&0x0f; if(temp!=0x0f) { 
          delayms(5); temp=P3; temp=temp&0x0f; if(temp!=0x0f) { 
          temp=P3; switch(temp) { 
          case 0xbe: num=4; break; case 0xbd: num=5; break; case 0xbb: num=6; break; case 0xb7: num=7; break; } while(temp!=0x0f) { 
          temp=P3; temp=temp&0x0f; } } } P44=1;P42=1;P3=0XDF; temp=P3; temp=temp&0x0f; if(temp!=0x0f) { 
          delayms(5); temp=P3; temp=temp&0x0f; if(temp!=0x0f) { 
          temp=P3; switch(temp) { 
          case 0xde: num=8; break; case 0xdd: num=9; break; case 0xdb: num=10; break; case 0xd7: num=11; break; } while(temp!=0x0f) { 
          temp=P3; temp=temp&0x0f; } } } P44=1;P42=1;P3=0XEF; temp=P3; temp=temp&0x0f; if(temp!=0x0f) { 
          delayms(5); temp=P3; temp=temp&0x0f; if(temp!=0x0f) { 
          temp=P3; switch(temp) { 
          case 0xee: num=12; break; case 0xed: num=13; break; case 0xeb: num=14; break; case 0xe7: num=15; break; } while(temp!=0x0f) { 
          temp=P3; temp=temp&0x0f; } } } } void main(void) { 
          Allinit(); while(1) { 
          //keyscan(); keyscan16(); display1(yi,er,san,si); display2(wu,liu,qi,ba); } } 

2. 官方驱动模块改写

2.1 onewire (DS18b20)

官方onewire.c

/* 程序说明: 单总线驱动程序 软件环境: Keil uVision 4.10 硬件环境: CT107单片机综合实训平台(外部晶振12MHz) STC89C52RC单片机 日 期: 2011-8-9 */
#include "reg52.h"

sbit DQ = P1^4;  //单总线接口

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

//通过单总线向DS18B20写一个字节
void Write_DS18B20(unsigned char dat)
{ 
        
	unsigned char i;
	for(i=0;i<8;i++)
	{ 
        
		DQ = 0;
		DQ = dat&0x01;
		Delay_OneWire(5);
		DQ = 1;
		dat >>= 1;
	}
	Delay_OneWire(5);
}

//从DS18B20读取一个字节
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(5);
	}
	return dat;
}

//DS18B20设备初始化
bit init_ds18b20(void)
{ 
        
  	bit initflag = 0;
  	
  	DQ = 1;
  	Delay_OneWire(12);
  	DQ = 0;
  	Delay_OneWire(80);
  	DQ = 1;
  	Delay_OneWire(10); 
    initflag = DQ;     
  	Delay_OneWire(5);
  
  	return initflag;
}

改写onewire(ds18b20)

//1. 头文件修改(#include ,#include "onewire.h")
//2. 所有调用Delay_OneWire()函数内地参数后面加个0(扩大十倍)
//3. 编写获取温度地函数Tempget() (数值为整数)
unsigned char Tempget(void)
{ 
        
	unsigned char low,high,temp;
	init_ds18b20();
	Write_DS18B20(0XCC);
	Write_DS18B20(0X44);
	Delay_OneWire(200); 
	
	init_ds18b20();
	Write_DS18B20(0XCC);
	Write_DS18B20(0XBE);

	low=Read_DS18B20();
	high=Read_DS18B20();
	
	temp=high<<4;
	temp|=(low>>4);
	
	return temp;
}

//4.温度含小数点的情况
long Tempget(void)	//(返回为温度值*10000)25.0625
{ 
        
	long high,low,temp;
	
	init_ds18b20();
	Write_DS18B20(0xCC);
	Write_DS18B20(0x44);
	Delay_OneWire(200);
	
	init_ds18b20();
	Write_DS18B20(0xCC);
	Write_DS18B20(0xBE);
	Delay_OneWire(200);
	
	low=Read_DS18B20();
	high=Read_DS18B20();
	temp=((high&0x0F)<<8)|low;
	temp=temp*625;
	
	return temp;
}

//4.onewire.h中添加 unsigned char Tempget(void);主函数头文件调用

2.2 ds1302

官方ds1302.c

/* 程序说明: DS1302驱动程序 软件环境: Keil uVision 4.10 硬件环境: CT107单片机综合实训平台 8051,12MHz 日 期: 2011-8-9 */

#include 
#include 

sbit SCK=P1^7;		
sbit SDA=P2^3;		
sbit RST = P1^3;   // DS1302复位 

void Write_Ds1302(unsigned  char temp) 
{ 
        
	unsigned char i;
	for (i=0;i<8;i++)     	
	{ 
         
		SCK=0;
		SDA=temp&0x01;
		temp>>=1; 
		SCK=1;
	}
}   

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

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

改写ds1302

//1. 头文件修改
//2. 每一组__nop__();函数增加为8到10个
//3. 改写写入函数Write_Ds1302_Byte (十进制转十六进制)
void Write_Ds1302_Byte( unsigned char address,unsigned char dat )     
{ 
        
 	RST=0;	_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_();
 	SCK=0;	_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_();
 	RST=1; 	_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_();  
 	Write_Ds1302(address);	
 	Write_Ds1302((dat/10<<4)|(dat%10));		
 	RST=0; 
}
//4.改写读取函数Read_Ds1302_Byte (十六进制转十进制)
unsigned char Read_Ds1302_Byte ( unsigned char address )
{ 
        
 	unsigned char i,dat1,dat2,temp=0x00;
 	RST=0;	_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_();
 	SCK=0;	_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_();
 	RST=1;	_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_ 

相关文章