蓝桥杯单片机·蓝桥杯全国软件和信息技术专业人才大赛电子类单片机 常用代码笔记
时间:2023-04-07 01:07:00
蓝桥杯笔记
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_