久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標(biāo)題:
藍(lán)橋杯單片機(jī)知識匯總
[打印本頁]
作者:
1475963
時間:
2019-12-29 11:40
標(biāo)題:
藍(lán)橋杯單片機(jī)知識匯總
本帖最后由 1475963 于 2019-12-29 12:37 編輯
原帖:
https://www.cnblogs.com/garden6zg/p/8469705.html
1.數(shù)碼管
段碼顯示
uchar code display[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0xbf, 0xff};
打開或關(guān)閉數(shù)碼管
P2 = (P2 & 0x1f) | 0xc0;
P0 = order[cnt];
P2 &= 0x1f;
P2 = (P2 & 0x1f) | 0xe0;
P0 = display[disbuf[cnt]];
P2 &= 0x1f;
2.LED顯示
P2 = (P2 & 0x1f) | 0x80;
P0 = 0xfe;
P2 &= 0x1f;
3.系統(tǒng)初始化
關(guān)閉外設(shè)
P2 = ((P2 & 0x1f) | 0xa0);
//關(guān)閉全部外設(shè)
P0 = 0x00;
P2 &= 0x1f;
P2 = (P2 & 0x1f) | 0xe0;
//數(shù)碼管都不顯示
P0 = 0xff;
P2 &= 0x1f;
定時器設(shè)置
TMOD = 0x01;
//計(jì)時器0,采用方式1
TH0 = (65536 - 2000) / 256;
//定時2ms
TL0 = (65536 - 2000) % 256;
EA = 1;
//打開總中斷
ET0 = 1;
//定時器中斷0打開
TR0 = 1;
//開始計(jì)數(shù)
串口通信設(shè)置
SCON = 0x50;
//工作方式1
AUXR = 0x40;
//模式為1T模式
TMOD = 0x20;
//定時器模式為2,自動重裝
TH1 = 256 - (11059200 / 2400 / 32);
//波特率為2400
TL1 = 256 - (11059200 / 2400 / 32);
EA = 1;
//打開總中斷
ES = 1;
//打開串口中斷
TR1 = 1;
//打開計(jì)時器1
4.IIC
#define SlaveAddrW 0x90
#define SlaveAddrR 0x91
#define EEPROMW 0xa0
#define EEPROMR 0xa1
5.DS1302
命令字
#define AM(X)
X
#define PM(X)
(X + 12)
#define DS1302_SECOND 0x80
#define DS1302_MINUTE 0x82
#define DS1302_HOUR 0x84
#define DS1302_DAY 0x86
#define DS1302_MONTH 0x88
#define DS1302_WEEK 0x8A
#define DS1302_YEAR 0x8C
#define DS1302_RAM(X) (0xC0 + (X) * 2)
函數(shù)操作
void InitDS1302(void)
{
Write_Ds1302(0x8E, 0x00);
//關(guān)掉寫保護(hù)
Write_Ds1302(0x80, 0x50);
//秒
Write_Ds1302(0x82, 0x59);
//分
Write_Ds1302(0x84, 0x23);
//時
Write_Ds1302(0x8E, 0x80);
//打開寫保護(hù)
}
/
/轉(zhuǎn)化時間格式
void DS1302_GetTime(SYSTEMTIME *Time)
{
unsigned
char
ReadValue;
/* 將BCD碼轉(zhuǎn)換成十進(jìn)制數(shù) */
ReadValue = Read_Ds1302(DS1302_MINUTE | 0x01);
Time->minute = ((ReadValue & 0x70)>>4) * 10 + (ReadValue & 0x0f);
ReadValue = Read_Ds1302(DS1302_HOUR | 0x01);
Time->hour = ((ReadValue & 0x70)>>4) * 10 + (ReadValue & 0x0f);
}
6.A/D
unsigned char Rb2_Read()
{
unsigned
char
dat;
IIC_Start();
IIC_SendByte(0x90);
//寫入地址
IIC_WaitAck();
IIC_SendByte(0x43);
//0x43是Rb2, 0x41是光敏
IIC_WaitAck();
IIC_Start();
IIC_SendByte(0x91);
//讀命令
IIC_WaitAck();
dat = IIC_RecByte();
//讀取一個字節(jié)
IIC_Ack(0);
IIC_Stop();
return
dat;
}
7.EEPROM(讀取和寫入數(shù)據(jù)都不可中斷)
unsigned char Read_EEPROM(unsigned char con)
{
unsigned
char
dat;
IIC_Start();
IIC_SendByte(0xa0);
//寫入地址
IIC_WaitAck();
IIC_SendByte(con);
//從起始位置開始讀取
IIC_WaitAck();
IIC_Start();
IIC_SendByte(0xa1);
//讀命令
IIC_WaitAck();
dat = IIC_RecByte();
//讀取一個字節(jié)
IIC_Ack(0);
IIC_Stop();
return
dat;
}
void Write_EEPROM(unsigned char date, unsigned char con)
{
IIC_Start();
IIC_SendByte(0xa0);
IIC_WaitAck();
IIC_SendByte(con);
IIC_WaitAck();
IIC_SendByte(date);
IIC_WaitAck();
IIC_Stop();
Delay(3);
//寫入后要注意延時一段時間
}
8.DS18B20(讀取溫度不可中斷)
延時函數(shù)
//單總線延時函數(shù)
void Delay_OneWire(uint t)
{
char
z;
while
(t--)
for
(z = 0; z < 12; z++);
}
讀取溫度
/* 讀取數(shù)據(jù)不可中斷,可以采用關(guān)閉終端來實(shí)現(xiàn) */
unsigned int Read_Temperature()
{
unsigned
char
low,high;
unsigned
int
temp;
float
t;
init_ds18b20();
//器件初始化
Write_DS18B20(0xcc);
//跳過讀序列
Write_DS18B20(0x44);
//啟動溫度轉(zhuǎn)換
Delay_OneWire(200);
//延遲一會
init_ds18b20();
Write_DS18B20(0xcc);
//同上
Write_DS18B20(0xbe);
//讀取溫度
low = Read_DS18B20();
//讀取低位
high = Read_DS18B20();
//讀取高位
temp = (high << 8) | low;
t = temp * 0.0625;
temp = t + 0.5;
return
temp;
}
9.矩陣鍵盤
sbit r1=P3^0;
//4行
sbit r2=P3^1;
sbit r3=P3^2;
sbit r4=P3^3;
sbit c1=P4^4;
//4列
sbit c2=P4^2;
sbit c3=P3^5;
sbit c4=P3^4;
unsigned char key_scan()
//讀取矩陣鍵盤鍵值
{
unsigned
char
key_value;
r1=0;
r2=r3=r4=1;
c1=c2=c3=c4=1;
else
if
(!c1) key_value=0;
else
if
(!c2) key_value=1;
else
if
(!c3) key_value=2;
else
if
(!c4) key_value=3;
r2=0;
r1=r3=r4=1;
c1=c2=c3=c4=1;
if
(!c1) key_value=4;
else
if
(!c2) key_value=5;
else
if
(!c3) key_value=6;
else
if
(!c4) key_value=7;
r3=0;
r2=r1=r4=1;
c1=c2=c3=c4=1;
if
(!c1) key_value=8;
else
if
(!c2) key_value=9;
else
if
(!c3) key_value=10;
else
if
(!c4) key_value=11;
r4=0;
r2=r3=r1=1;
c1=c2=c3=c4=1;
if
(!c1) key_value=12;
else
if
(!c2) key_value=13;
else
if
(!c3) key_value=14;
else
if
(!c4) key_value=15;
return
key_value;
}
10.超聲波測距
#define somenops {_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();}
sbit TX = P1^0;
//發(fā)射引腳
sbit RX = P1^1;
//接收引腳
//TX 引腳發(fā)送 40KHz 方波信號驅(qū)動超聲波發(fā)送探頭
void send_wave(void)
{
unsigned
char
i = 8;
//發(fā)送 8 個脈沖
do
{
TX = 1;
somenops;somenops;somenops;somenops;somenops;
somenops;somenops;somenops;somenops;somenops;
TX = 0;
somenops;somenops;somenops;somenops;somenops;
somenops;somenops;somenops;somenops;somenops;
}
while
(i--);
}
void Check_Distance()
{
uint t;
/* 關(guān)閉定時器 0 中斷:計(jì)算超聲波發(fā)送到返回的時間 */
ET0 = 0;
send_wave();
//發(fā)送方波信號
ET0 = 1;
TR1 = 1;
//啟動計(jì)時
while
((RX == 1) && (TF1 == 0));
//等待收到脈沖
TR1 = 0;
//關(guān)閉計(jì)時
//發(fā)生溢出
if
(TF1 == 1)
{
TF1 = 0;
distance = 99;
//無返回
}
else
{
/** 計(jì)算時間 */
t = TH1;
t <<= 8;
t |= TL1;
distance = (
unsigned
int
)(t * 12 * 0.017 / 12);
//計(jì)算距離
}
TH1 = 0;
TL1 = 0;
}
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
祝你幸福电影在线观看
|
亚洲大片一区
|
韩日一区二区三区
|
国产精品久久久久久av公交车
|
亚洲精品久久
|
av免费在线播放
|
91精品国产91久久久久久最新
|
国产日韩久久
|
欧美a区
|
www.久久久久久久久久久久
|
久久国产高清
|
欧美一级毛片在线播放
|
色综合久久久久
|
亚洲精品在线免费
|
日韩欧美在线视频播放
|
毛片网站免费观看
|
国内精品久久久久
|
一级a性色生活片久久毛片波多野
|
久久久av
|
三级黄色大片网站
|
欧美亚洲日本
|
亚洲 成人 在线
|
日韩精品免费在线观看
|
91影院
|
亚洲一区二区久久
|
天天狠狠
|
国产精品久久久久久久久图文区
|
免费黄色片在线观看
|
一区二区播放
|
亚洲一区二区视频
|
国产一区亚洲
|
亚洲精品久久久久久宅男
|
欧美一级淫片免费视频黄
|
日韩中文字幕一区二区
|
亚洲精品v
|
99热在线播放
|
网站黄色在线免费观看
|
国产精品免费一区二区三区四区
|
国产小视频在线
|
色香婷婷
|
免费在线视频一区二区
|