柳州網(wǎng)站建設(shè)工作室營銷方式和手段有哪些
文章目錄
- 參考資料
- 1. 準(zhǔn)備工作
- 1.1 win10配置51單片機(jī)開發(fā)環(huán)境
- 1.1 Ubuntu配置51單片機(jī)開發(fā)環(huán)境
- 問題1:`mcs51/8051.h`依賴于`mcs51/lint.h`
- 問題2:提示找不到頭文件`mcs51/8051.h`
- 2. 認(rèn)識51單片機(jī)
- 2.1 STC89C52單片機(jī)
- 2.2 管腳圖
- 2.3 原理圖
- 2.4 按鍵抖動
- 2.5 頭文件說明
- 2.6 模塊化函數(shù)
- 2.6.1 延時(shí)函數(shù)
- 2.6.2 矩陣鍵盤
- 3. LED模塊
- 3.1 原理圖
- 實(shí)驗(yàn)1:點(diǎn)亮LED燈D1
- 實(shí)驗(yàn)2:LED燈D8閃爍
- 實(shí)驗(yàn)3:LED流水燈
- 4. 獨(dú)立按鍵模塊
- 4.1 原理圖
- 實(shí)驗(yàn)1:獨(dú)立按鍵控制LED燈D1
- 5. 動態(tài)數(shù)碼管模塊
- 5.1 原理圖
- 實(shí)驗(yàn)1:數(shù)碼管LED3顯示2
- 實(shí)驗(yàn)2:數(shù)碼管LED8 ~ LED1分別顯示0 ~ 8
- 6. LCD1602接口
- 6.1 原理圖
- 7. 矩陣按鍵模塊
- 7.1 原理圖
- 實(shí)驗(yàn)1:在LCD1602顯示按下的鍵碼(1 ~ 16)
- 實(shí)驗(yàn)2:4位密碼鎖
- 8. 定時(shí)器與中斷
- 8.1 原理圖
- 實(shí)驗(yàn)1:實(shí)現(xiàn)一個(gè)電子時(shí)鐘
- 9. 串口通信
- 9.1 原理圖
參考資料
51單片機(jī)入門教程-2020版 程序全程純手打 從零開始入門
江協(xié)科技資料下載
51單片機(jī)(STC89C52RC)系統(tǒng)性學(xué)習(xí)筆記
1. 準(zhǔn)備工作
1.1 win10配置51單片機(jī)開發(fā)環(huán)境
- 51單片機(jī)
正在重新握手 ... 成功 [0.578"]
當(dāng)前的波特率: 115200
正在擦除目標(biāo)區(qū)域 ... 完成 ! [0.328"]
正在下載用戶代碼 ... 完成 ! [0.141"]
正在設(shè)置硬件選項(xiàng) ... 完成 ! [0.031"]更新后的硬件選項(xiàng)為:. 當(dāng)前的時(shí)鐘頻率: 11.088MHz. 系統(tǒng)頻率為12T(單倍速)模式. 振蕩器的放大增益不降低. 當(dāng)看門狗啟動后,任何復(fù)位都可停止看門狗. MCU內(nèi)部的擴(kuò)展RAM可用. ALE腳的功能選擇仍然為ALE功能腳. P1.0和P1.1與下次下載無關(guān). 下次下載用戶程序時(shí),不擦除用戶EEPROM區(qū)單片機(jī)型號: STC89C52RC/LE52RC固件版本號: 6.6.4C
-
編程工具
Keil5 C51
新建項(xiàng)目時(shí)選擇AT89C51RC2
-
將程序載入到51單片機(jī)的工具
STC-ISP
-
51單片機(jī)接入電腦,并配置驅(qū)動CH340_CH341
1.1 Ubuntu配置51單片機(jī)開發(fā)環(huán)境
- 編輯器 VS Code 安裝教程
- 安裝VS Code插件
C/C++ Extension Pack
- 安裝編譯工具
sudo apt-get install sdcc
- 程序編譯
sdcc 1_LED_1.c
將編譯生成的文件輸出到out目錄,需要先通過sudo mkdir out
創(chuàng)建out目錄
sdcc 1_LED_1.c -o out/
問題1:mcs51/8051.h
依賴于mcs51/lint.h
#include <mcs51/lint.h>
#include <mcs51/8051.h>
問題2:提示找不到頭文件mcs51/8051.h
8051.h
是安裝sdcc
后產(chǎn)生的,請先確保sdcc
已經(jīng)安裝,sudo find / -name 8051.h
搜索一下頭文件8051.h
所在的目錄
這里目錄是/usr/share/sdcc/include
,將該路徑配置到includepath
,先點(diǎn)擊Quick Fix
再點(diǎn)擊Edit “includePath” setting
添加/usr/share/sdcc/include
到Include path
2. 認(rèn)識51單片機(jī)
2.1 STC89C52單片機(jī)
- 所屬系列:51單片機(jī)系列
- 公司:STC公司
- 位數(shù):8位
- RAM:512字節(jié)
- ROM:8K(Flash)
- 工作頻率:12MHz(本開發(fā)板使用)
2.2 管腳圖
2.3 原理圖
高清PDF可從這里下載江協(xié)科技資料下載
2.4 按鍵抖動
對于機(jī)械開關(guān),當(dāng)機(jī)械觸點(diǎn)斷開、閉合時(shí),由于機(jī)械觸點(diǎn)的彈性作用,一個(gè)開關(guān)在閉合時(shí)不會馬上穩(wěn)定地接通,在斷開時(shí)也不會一下子斷開,所以在開關(guān)閉合及斷開的瞬間會伴隨一連串的抖動。
因此,需要進(jìn)行防抖處理,如下:
// 這是一個(gè)檢測獨(dú)立按鍵K1是否按下,并控制LED模塊的簡化代碼
if(P3_1==0) // 如果K1按鍵按下,P3_1的值會變?yōu)?
{Delay(20); // 延時(shí)20毫秒消抖while(P3_1==0); // 死循環(huán)空轉(zhuǎn),直到K1按鍵松開,P3_1變?yōu)?,跳出循環(huán)Delay(20); // 延時(shí)20毫秒消抖P2_0=~P2_0; // LED1的亮滅情況
}
2.5 頭文件說明
#include <mcs51/lint.h>
#include <mcs51/8051.h>
#include <REGX52.H>
2.6 模塊化函數(shù)
2.6.1 延時(shí)函數(shù)
#ifndef __DELAY_H__
#define __DELAY_H__void Delayms(unsigned char k);#endif
#include <INTRINS.H>// 延時(shí)k ms
void Delayms(unsigned char k) //@11.0592MHz
{unsigned char i, j;while (k --) {_nop_();i = 2;j = 199;do{while (--j);} while (--i);}
}
2.6.2 矩陣鍵盤
#ifndef __MATRIXKEYBOARD_H__
#define __MATRIXKEYBOARD_H__unsigned int matrixKeyboard();#endif
#include <at89c51RC2.h>
#include "Delay.h"
// 反回鍵碼(1 ~ 16),行優(yōu)先遍歷
// 按列掃描矩陣鍵盤
// 如果按行的話,P1_5和蜂鳴器沖突,會導(dǎo)致其發(fā)聲
unsigned int matrixKeyboard() {unsigned int keyNum = 0;P1 = 0xFF;P1_3 = 0; // 第一列if (P1_7 == 0) {Delayms(20); while (P1_7 == 0); Delayms(20); keyNum = 1;}if (P1_6 == 0) {Delayms(20); while (P1_6 == 0); Delayms(20); keyNum = 5;}if (P1_5 == 0) {Delayms(20); while (P1_5 == 0); Delayms(20); keyNum = 9;}if (P1_4 == 0) {Delayms(20); while (P1_4 == 0); Delayms(20); keyNum = 13;}P1 = 0xFF;P1_2 = 0; // 第二列if (P1_7 == 0) {Delayms(20); while (P1_7 == 0); Delayms(20); keyNum = 2;}if (P1_6 == 0) {Delayms(20); while (P1_6 == 0); Delayms(20); keyNum = 6;}if (P1_5 == 0) {Delayms(20); while (P1_5 == 0); Delayms(20); keyNum = 10;}if (P1_4 == 0) {Delayms(20); while (P1_4 == 0); Delayms(20); keyNum = 14;}P1 = 0xFF;P1_1 = 0; // 第三列if (P1_7 == 0) {Delayms(20); while (P1_7 == 0); Delayms(20); keyNum = 3;}if (P1_6 == 0) {Delayms(20); while (P1_6 == 0); Delayms(20); keyNum = 7;}if (P1_5 == 0) {Delayms(20); while (P1_5 == 0); Delayms(20); keyNum = 11;}if (P1_4 == 0) {Delayms(20); while (P1_4 == 0); Delayms(20); keyNum = 15;}P1 = 0xFF;P1_0 = 0; // 第四列if (P1_7 == 0) {Delayms(20); while (P1_7 == 0); Delayms(20); keyNum = 4;}if (P1_6 == 0) {Delayms(20); while (P1_6 == 0); Delayms(20); keyNum = 8;}if (P1_5 == 0) {Delayms(20); while (P1_5 == 0); Delayms(20); keyNum = 12;}if (P1_4 == 0) {Delayms(20); while (P1_4 == 0); Delayms(20); keyNum = 16;}return keyNum;
}
3. LED模塊
3.1 原理圖
LED等的左側(cè)接入VCC正極,若要使燈亮,則右側(cè)需要接入負(fù)極,也就是對應(yīng)的寄存器位需要賦值為0。
實(shí)驗(yàn)1:點(diǎn)亮LED燈D1
#include <AT89C51RC2.h>
/*** 點(diǎn)亮LED燈D1
*/
void main() {P2 = 0xFF; // 將所有燈熄滅P2_0 = 0; // D1燈亮起while (1); // 程序始終保持運(yùn)行
}
實(shí)驗(yàn)2:LED燈D8閃爍
#include <AT89C51RC2.h>
#include <INTRINS.H>/*** LED燈D8閃爍
*/
void main() {P2 = 0xFF; while (1){P2_7 = 0; // D8燈亮Delayms(1000); // 延遲1000ms = 1sP2_7 = 1; // D8燈滅Delayms(1000); // 延遲1000ms = 1s}
}
實(shí)驗(yàn)3:LED流水燈
#include <AT89C51RC2.h>
#include "Delay.h"/*** LED燈D1 ~ D8按順序點(diǎn)亮,每次只有一個(gè)燈亮
*/
void main() {// 1111 1110// 1111 1101// 1111 1011// ...// 1111 1110// =》 其實(shí)就是實(shí)現(xiàn)循環(huán)左移P2 = 0xFE;while (1){P2 <<= 1;if (P2 != 0xFE) P2 |= 0x01;Delayms(1000); // 延遲1000ms = 1s}
}
4. 獨(dú)立按鍵模塊
4.1 原理圖
實(shí)驗(yàn)1:獨(dú)立按鍵控制LED燈D1
#include <AT89C51RC2.h>
#include "Delay.h"/*** 獨(dú)立按鍵K1控制LED燈D1* 按下按鍵并松開后,變換燈D1的狀態(tài)
*/
void main() {while (1){// 注意控制K1的是P3_1,控制K2的是P3_0// 當(dāng)值為0是代表按鍵按下if (P3_1 == 0) {Delay(20); // 消除按鍵抖動while (P3_1 == 0); // 一直保持按下的狀態(tài)則卡在這Delay(20); // 消除按鍵抖動P2_0 = ~P2_0; // 狀態(tài)取反}}
}
5. 動態(tài)數(shù)碼管模塊
5.1 原理圖
LED1 ~ LED8的亮滅(位選)由P24, P23, P22三位決定,P24位高位,當(dāng)這三個(gè)位表示數(shù)據(jù)n時(shí),Yn對應(yīng)的燈亮,Y0對應(yīng)LED1
P0_0 ~ P0_6分別控制a ~ g晶體管,P0_7控制dp晶體管,為1代表選中。(P0_7是最高位,P0_0是最低位)
實(shí)驗(yàn)1:數(shù)碼管LED3顯示2
#include <AT89C51RC2.h>/*** 數(shù)碼管LED3顯示2
*/
void main() {// 選中數(shù)碼管LED3,對應(yīng)Y2 P2_4 P2_3 P2_2 = 0 1 0P2_4 = 0;P2_3 = 1;P2_2 = 0;// a b c d e f g dp// 0 1 2 3 4 5 6 7// a b c d e f g dp// 1 1 0 1 1 0 1 0 => 0101 1011 = 0x5B// 數(shù)字2,需要點(diǎn)亮 a b g e dP0 = 0x5B;while (1);
}
實(shí)驗(yàn)2:數(shù)碼管LED8 ~ LED1分別顯示0 ~ 8
// 對應(yīng)數(shù)字 0 ~ 9 的段碼
unsigned char NixieTable[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};
// 在LED-loc 顯示num
void Nixie(unsigned char loc, unsigned char num) { P2_4 = 0; P2_3 = 0; P2_2 = 0; // 1110 0011 = 0xE3 P2 &= 0xE3if ((loc & 0x01) == 1) P2_2 = 1;if ((loc & 0x02) == 2) P2_3 = 1;if ((loc & 0x04) == 4) P2_4 = 1;P0 = NixieTable[num];// 消影,數(shù)字清零,防止上一個(gè)位置的數(shù)字顯示到下一個(gè)位置Delayms(1);P0 = 0x00;
}/*** 數(shù)碼管LED8 ~ LED1分別顯示0 ~ 8
**/
void main() {unsigned char i;while (1) {for (i = 0; i <= 7; i ++) {Nixie(7 - i, i);}}
}
6. LCD1602接口
6.1 原理圖
7. 矩陣按鍵模塊
7.1 原理圖
實(shí)驗(yàn)1:在LCD1602顯示按下的鍵碼(1 ~ 16)
#include <at89c51RC2.h>
#include "Delay.h"
// 反回鍵碼(1 ~ 16),行優(yōu)先遍歷
// 沒有按下任何鍵則返回0
// 按列掃描矩陣鍵盤
// 如果按行的話,P1_5和蜂鳴器沖突,會導(dǎo)致其發(fā)聲
unsigned int matrixKeyboard() {unsigned int keyNum = 0;P1 = 0xFF;P1_3 = 0; // 第一列if (P1_7 == 0) {Delayms(20); while (P1_7 == 0); Delayms(20); keyNum = 1;}if (P1_6 == 0) {Delayms(20); while (P1_6 == 0); Delayms(20); keyNum = 5;}if (P1_5 == 0) {Delayms(20); while (P1_5 == 0); Delayms(20); keyNum = 9;}if (P1_4 == 0) {Delayms(20); while (P1_4 == 0); Delayms(20); keyNum = 13;}P1 = 0xFF;P1_2 = 0; // 第二列if (P1_7 == 0) {Delayms(20); while (P1_7 == 0); Delayms(20); keyNum = 2;}if (P1_6 == 0) {Delayms(20); while (P1_6 == 0); Delayms(20); keyNum = 6;}if (P1_5 == 0) {Delayms(20); while (P1_5 == 0); Delayms(20); keyNum = 10;}if (P1_4 == 0) {Delayms(20); while (P1_4 == 0); Delayms(20); keyNum = 14;}P1 = 0xFF;P1_1 = 0; // 第三列if (P1_7 == 0) {Delayms(20); while (P1_7 == 0); Delayms(20); keyNum = 3;}if (P1_6 == 0) {Delayms(20); while (P1_6 == 0); Delayms(20); keyNum = 7;}if (P1_5 == 0) {Delayms(20); while (P1_5 == 0); Delayms(20); keyNum = 11;}if (P1_4 == 0) {Delayms(20); while (P1_4 == 0); Delayms(20); keyNum = 15;}P1 = 0xFF;P1_0 = 0; // 第四列if (P1_7 == 0) {Delayms(20); while (P1_7 == 0); Delayms(20); keyNum = 4;}if (P1_6 == 0) {Delayms(20); while (P1_6 == 0); Delayms(20); keyNum = 8;}if (P1_5 == 0) {Delayms(20); while (P1_5 == 0); Delayms(20); keyNum = 12;}if (P1_4 == 0) {Delayms(20); while (P1_4 == 0); Delayms(20); keyNum = 16;}return keyNum;
}// 在LCD1602顯示按下的鍵碼(1 ~ 16)
void main() {unsigned int num = 0, newNum = 0;LCD_Init();while (1) {newNum = matrixKeyboard();if (newNum != 0) {num = newNum;}LCD_ShowNum(1, 1, num, 2); // 第一行第一列顯示,占兩個(gè)位置}
}
實(shí)驗(yàn)2:4位密碼鎖
// 10為0,11為確認(rèn),12為清空
void main() {// num,保存當(dāng)前輸入的密碼// keyNum,記錄矩陣鍵盤按下的鍵碼// count,記錄當(dāng)前已經(jīng)輸入多少個(gè)數(shù)字unsigned int num = 0, keyNum = 0, count = 0;// LCD1602初始化LCD_Init();// 在第一行的前9個(gè)輸入固定顯示輸入提示符LCD_ShowString(1, 1, "PASSWORD:");while (1) {// 第10個(gè)字符顯示當(dāng)前輸入的密碼LCD_ShowNum(1, 10, num, 4);// 獲取當(dāng)前矩陣鍵盤的鍵碼(沒有按下任何鍵則返回0)keyNum = matrixKeyboard();if (keyNum >= 1 && keyNum <= 9 && count < 4) {num = num * 10 + keyNum;count ++;} else if (keyNum == 11 && count == 4) {if (num == 1234) {LCD_ShowString(2, 1, "OK");} else {LCD_ShowString(2, 1, "ERR");}} else if (keyNum == 12) {num = 0;count = 0;LCD_ShowString(2, 1, " ");}}
}
8. 定時(shí)器與中斷
定時(shí)器介紹:51單片機(jī)的定時(shí)器屬于單片機(jī)的內(nèi)部資源,其電路的連接和運(yùn)轉(zhuǎn)均在單片機(jī)內(nèi)部完成
定時(shí)器作用︰
(1)用于計(jì)時(shí)系統(tǒng),可實(shí)現(xiàn)軟件計(jì)時(shí),或者使程序每隔一固定時(shí)間完成一項(xiàng)操作
(2)替代長時(shí)間的Delay,提高CPU的運(yùn)行效率和處理速度(…)
8.1 原理圖
TL0和TH0發(fā)生溢出時(shí)(達(dá)到65535),TF0標(biāo)志位被置位1,從而引發(fā)中斷。
- 生成定時(shí)器初始化代碼
void Timer0Init(void) //1毫秒@11.0592MHz
{AUXR &= 0x7F; //定時(shí)器時(shí)鐘12T模式TMOD &= 0xF0; //設(shè)置定時(shí)器模式TMOD |= 0x01; //設(shè)置定時(shí)器模式TL0 = 0x66; //設(shè)置定時(shí)初值TH0 = 0xFC; //設(shè)置定時(shí)初值TF0 = 0; //清除TF0標(biāo)志TR0 = 1; //定時(shí)器0開始計(jì)時(shí)// 這兩個(gè)開關(guān)配置需要自己加一下ET0 = 1; // 打開定時(shí)器0EA = 1; // 打開總開關(guān)
}
實(shí)驗(yàn)1:實(shí)現(xiàn)一個(gè)電子時(shí)鐘
void Timer0Init() //1毫秒@11.0592MHz
{AUXR &= 0x7F; //定時(shí)器時(shí)鐘12T模式TMOD &= 0xF0; //設(shè)置定時(shí)器模式TMOD |= 0x01; //設(shè)置定時(shí)器模式TL0 = 0x66; //設(shè)置定時(shí)初值 TH0 = 0xFC; //設(shè)置定時(shí)初值TF0 = 0; //清除TF0標(biāo)志TR0 = 1; //定時(shí)器0開始計(jì)時(shí)ET0 = 1; // 打開定時(shí)器0EA = 1; // 打開總開關(guān)
}unsigned int count = 0;
// 設(shè)置時(shí)鐘為 23:59:45 方便調(diào)試
unsigned int second = 45;
unsigned int minute = 59;
unsigned int hour = 23;void main() {
// // TMOD不可位尋址, M0給1 => 0x01
// // TMOD = 0x01; // 配置定時(shí)器0
// // 防止對定時(shí)器1的配置產(chǎn)生影響,使用與或賦值法
// TMOD &= 0xF0; // 清空定時(shí)器0的配置
// TMOD |= 0x01; // 配置定時(shí)器0
//
// // TCON可位尋址,TF0 = 0, TR0 = 1
// TF0 = 0;
// TR0 = 1;
//
// // 64635 到 65535 相差1000,也就是1ms會發(fā)生中斷
// TH0 = 64535 / 256; // 取高8位
// TL0 = 54535 % 256; // 取低8位
//
// // 定時(shí)器開關(guān)
// ET0 = 1; // 打開定時(shí)器0
// EA = 1; // 打開總開關(guān)
PT0 = 0;Timer0Init();LCD_Init();LCD_ShowChar(1, 3, ':');LCD_ShowChar(1, 6, ':');while (1) {if (second == 60) {second = 0;minute ++;}if (minute == 60) {minute = 0;hour ++;}if (hour == 24) {hour = 0;}LCD_ShowNum(1, 1, hour, 2);LCD_ShowNum(1, 4, minute, 2);LCD_ShowNum(1, 7, second, 2);}
}// 發(fā)生時(shí)鐘中斷時(shí),會觸發(fā)該函數(shù),中斷號為1
void Timer0_Routube() interrupt 1 {TL0 = 0x66; //設(shè)置定時(shí)初值TH0 = 0xFC; //設(shè)置定時(shí)初值count ++;if (count == 1000) {second ++;count = 0;// 中斷程序應(yīng)該盡量簡短
// if (second == 60) {
// second = 0;
// minute ++;
// if (minute == 60) {
// minute = 0;
// hour ++;
// if (hour == 24) {
// hour = 0;
// }
// }
// }}
}