第二周铁人战队学习总结
第二周鐵人戰隊學習總結
51單片機
1.1 點亮LED
#include "reg52.h" sbit led=P2^0;void main() {while(1){led=0;} }1.2 LED閃爍
#include "reg52.h" typedef unsigned int u16; typedef unsigned char u8;sbit led=P2^0;void delay(u16 i) {while(i--); }void main() {while(1){led=0;delay(50000); //延時450msled=1;delay(50000); //延時450ms } }1.3 LED流水燈
#include "reg52.h" #include<intrins.h> //因為要用到左右移函數,故加入這個頭文件typedef unsigned int u16; typedef unsigned char u8;#define led P2void delay(u16 i) {while(i--); } void main() {u8 i;led=~0x01;delay(50000);while(1){ for(i=0;i<8;i++){P2=~(0x01<<i);delay(50000);}}}crol(a,b);循環左移函數,a是左移的值,b是左移的位數。包含在instrins.h庫函數里面。
cror(a,b);循環右移函數,a是右移的值,b是右移的位數。包含在instrins.h庫函數里面。
1.4 蜂鳴器
#include "reg52.h" #include<intrins.h>typedef unsigned int u16; typedef unsigned char u8;sbit beep=P1^5;void delay(u16 i) {while(i--); }void main() { while(1){ beep=~beep;delay(100);//通過延長不同時間來改變發聲效果} }1.5 外部中斷
#include "reg52.h"typedef unsigned int u16; typedef unsigned char u8;sbit k3=P3^2; sbit led=P2^0;void delay(u16 i) { while(i--); }void Int0Init()//外部中斷函數 { IT0=1;//跳邊沿觸發方式為下降沿 EX0=1;//打開INTO的中斷允許 EA=1;//打開總中斷 }void main() { Int0Init(); while(1); }void Int0() interrupt 0 { delay(1000); if(k3==0) { led=~led; } }中斷概念:中斷是指CPU中斷當前所執行的任務,去執行中斷帶來的命令。
一、外部中斷觸發:
1、(P3.2)可由IT0(TCON.0)選擇其為低電平有效還是下降沿有效。(當CPU檢測到P3.2引腳上出現有效的中斷信號時,中斷標志IE0(TCON.1)置1,向CPU申請中斷。)2、(P3.3)可由IT1(TCON.2)選擇其為低電平有效還是下降沿有效。當CPU檢測到P3.3引腳上出現有效的中斷信號時,中斷標志IE1(TCON.3)置1,向CPU申請中斷。3、TF0(TCON.5),片內定時/計數器T0溢出中斷請求標志。當定時/計數器T0發生溢出時,置位TF0,并向CPU申請中斷。4、TF1(TCON.7),片內定時/計數器T1溢出中斷請求標志。當定時/計數器T1發生溢出時,置位TF1,并向CPU申請中斷。5、RI(SCON.0)或TI(SCON.1),串行口中斷請求標志。當串行口接收完一幀串行數據時置位RI或當串行口發送完一幀串行數據時置位TI,向CPU申請中斷。
二、中斷允許控制:
CPU對中斷系統所有中斷以及某個中斷源的開放和屏蔽是由中斷允許寄存器IE控制的。
EX0(IE.0),外部中斷0允許位;ET0(IE.1),定時/計數器T0中斷允許位;EX1(IE.2),外部中斷1允許位;ET1(IE.3),定時/計數器T1中斷允許位;ES(IE.4),串行口中斷允許位;EA (IE.7), CPU中斷允許(總允許)位。
三、中斷請求標志:
IT0(TCON.0),外部中斷0觸發方式控制位。當IT0=0時,為電平觸發方式,當IT0=1時,為邊沿觸發方式(下降沿有效)IE0(TCON.1),外部中斷0中斷請求標志位IT1(TCON.2),外部中斷1觸發方式控制位IE1(TCON.3),外部中斷1中斷請求標志位TF0(TCON.5),定時/計數器T0溢出中斷請求標志位TF1(TCON.7),定時/計數器T1溢出中斷請求標志位。
四、中斷源
編寫中斷程序時要用中斷所對應的中斷號。
中斷響應條件:中斷源有中斷請求、此中斷源的中斷允許位為1、CPU開中斷(即EA=1)
1.6 定時器
1.6.1 原理
單片機中有兩組定時器和計數器(既能定時又能計數),與CPU獨立,計術與定時過程自動完成。是根據機器內部的時鐘或者是外部的脈沖信號對寄存器中的數據加1,當加滿時計時器移除是中斷標志位置一,請求中斷(可見,由溢出時計數器的值減去計數初值才是加1計數器的計數值)
1.6.2 了解CPU時序
振蕩周期:為單片機提供定時信號的振蕩源的周期(晶振周期或外加振蕩周期)
狀態周期:2個振蕩周期為1個狀態周期,用S表示。振蕩周期又稱S周期或時鐘周期。
機器周期:1個機器周期含6個狀態周期,12個振蕩周期。
指令周期:完成1條指令所占用的全部時間,它以機器周期為單位。
例如:外接晶振為12MHz時,51單片機相關周期的具體值為:振蕩周期=1/12us;狀態周期=1/6us;機器周期=1us;指令周期=1~4us;
1.6.3 定時器結構
定時/計數器的實質是加1計數器(16位),由高8位和低8位兩個寄存器THx和TLx組成。
#include "reg52.h"typedef unsigned int u16; typedef unsigned char u8;sbit led=P2^0;void Timer0Init() {TMOD|=0X01;TH0=0XFC;TL0=0X18; ET0=1;EA=1;TR0=1; }void main() { Timer0Init();while(1); }void Timer0() interrupt 1 {static u16 i;TH0=0XFC;TL0=0X18;i++;if(i==1000){i=0;led=~led; } }1.7 EEPROM-IIC
原理
一、介紹
采用串行總線技術可以使系統的硬件設計大大簡化、系統的體積減小、可靠性提高。同時,系統的更改和擴充極為容易。常用的串行擴展總線有: I2C (Inter IC BUS)總線、單總線(1-WIRE BUS)、SPI(Serial Peripheral Interface)總線及Microwire/PLUS等。
二、串行總線概述
I2C總線只有兩根雙向信號線。一根是數據線SDA,另一根是時鐘線SCL。
I2C總線通過上拉電阻接正電源。當總線空閑時,兩根線均為高電平。連到總線上的任一器件輸出的低電平,都將使總線的信號變低,即各器件的SDA及SCL都是線“與”關系。
**每個接到I2C總線上的器件都有唯一的地址。**主機與其它器件間的數據傳送可以是由主機發送數據到其它器件,這時主機即為發送器。由總線上接收數據的器件則為接收器。在多主機系統中,可能同時有幾個主機企圖啟動總線傳送數據。為了避免混亂, I2C總線要通過總線仲裁,以決定由哪一臺主機控制總線。在80C51單片機應用系統的串行總線擴展中,我們經常遇到的是以80C51單片機為主機,其它接口器件為從機的單主機情況。
三、I2C總線的數據傳輸
(1)數據位的有效性規定
I2C總線進行數據傳送時,時鐘信號為高電平期間,數據線上的數據必須保持穩定,只有在時鐘線上的信號為低電平期間,數據線上的高電平或低電平狀態才允許變化。
(2)啟始和終止信號
SCL線為高電平期間,SDA線由高電平向低電平的變化表示起始信號;SCL線為高電平期間,SDA線由低電平向高電平的變化表示終止信號。
接收器件收到一個完整的數據字節后,有可能需要完成一些其它工作,如處理內部中斷服務等,可能無法立刻接收下一個字節,這時接收器件可以將SCL線拉成低電平,從而使主機處于等待狀態。直到接收器件準備好接收下一個字節時,再釋放SCL線使之為高電平,從而使數據傳送可以繼續進行。
(3)數據傳送格式
字節傳送與應答每一個字節必須保證是8位長度。
數據傳送時,先傳送最高位(MSB),每一個被傳送的字節后面都必須跟隨一位應答位(即一幀共有9位)。
#include "reg52.h" #include "i2c.h"typedef unsigned int u16; typedef unsigned char u8;sbit LSA=P2^2; sbit LSB=P2^3; sbit LSC=P2^4;sbit k1=P3^1; sbit k2=P3^0; sbit k3=P3^2; sbit k4=P3^3;char num=0; u8 disp[4]; u8 code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};void delay(u16 i) {while(i--); }void Keypros() {if(k1==0){delay(1000);if(k1==0){At24c02Write(1,num);}while(!k1);}if(k2==0){delay(1000);if(k2==0){num=At24c02Read(1);}while(!k2);}if(k3==0){delay(100);if(k3==0){num++;if(num>255)num=0;}while(!k3);}if(k4==0){delay(1000);if(k4==0){num=0;}while(!k4);} } void datapros() {disp[0]=smgduan[num/1000];disp[1]=smgduan[num%1000/100];disp[2]=smgduan[num%1000%100/10];disp[3]=smgduan[num%1000%100%10]; }void DigDisplay() {u8 i;for(i=0;i<4;i++){switch(i){case(0):LSA=1;LSB=1;LSC=0; break;case(1):LSA=0;LSB=1;LSC=0; break;ase(2):LSA=1;LSB=0;LSC=0; break;case(3):LSA=0;LSB=0;LSC=0; break;}P0=disp[i];delay(100);P0=0x00;} }void main() { while(1){Keypros();datapros();DigDisplay();} } #include"i2c.h"void Delay10us() {unsigned char a,b;for(b=1;b>0;b--)for(a=2;a>0;a--); }void I2cStart() {SDA=1;Delay10us();SCL=1;Delay10us();SDA=0;Delay10us();SCL=0; Delay10us(); }void I2cStop() {SDA=0;Delay10us();SCL=1;Delay10us();SDA=1;Delay10us(); }unsigned char I2cSendByte(unsigned char dat) {unsigned char a=0,b=0;for(a=0;a<8;a++){SDA=dat>>7;dat=dat<<1;Delay10us();SCL=1;Delay10us();SCL=0;Delay10us();}SDA=1;Delay10us();SCL=1;while(SDA){b++;if(b>200){SCL=0;Delay10us();return 0;}}SCL=0;Delay10us();return 1; }unsigned char I2cReadByte() {unsigned char a=0,dat=0;SDA=1;Delay10us();for(a=0;a<8;a++){SCL=1;Delay10us();dat<<=1;dat|=SDA;Delay10us();SCL=0;Delay10us();}return dat; }void At24c02Write(unsigned char addr,unsigned char dat) {I2cStart();I2cSendByte(0xa0);I2cSendByte(addr);I2cSendByte(dat);I2cStop(); }unsigned char At24c02Read(unsigned char addr) {unsigned char num;I2cStart();I2cSendByte(0xa0);I2cSendByte(addr);I2cStart();I2cSendByte(0xa1);num=I2cReadByte();I2cStop();return num; }1.8 串口通信
原理
串口通信分為:并行通信與串行通信,這里主要用串行通信。
一、串行通信的基本概念
(1)異步通信:發送設備與接收設備用各自時鐘(時鐘設備盡量一致),異步通信是以字符(構成的幀)為單位進行傳輸,字符與字符之間的間隙(時間間隔)是任意的,但每個字符中的各位是以固定的時間傳送的,即字符之間不一定有“位間隔”的整數倍的關系,但同一字符內的各位之間的距離均為“位間隔”的整數倍。
(2)同步通信:發送方時鐘直接控制接收方時鐘,傳輸數據的位之間的距離均為“位間隔”的整數倍,同時傳送的字符間不留間隙,即保持位同步關系,也保持字符同步關系。發送方對接收方的同步可以通過兩種方法實現。
單工是指數據傳輸僅能沿一個方向,不能實現反向傳輸。半雙工是指數據傳輸可以沿兩個方向,但需要分時進行。全雙工是指數據可以同時進行雙向傳輸。
二、80C51串行口
(1)串行口的結構:有兩個物理上獨立的接收、發送緩沖器SBUF,它們占用同一地址99H ;接收器是雙緩沖結構 ;發送緩沖器,因為發送時CPU是主動的,不會產生重疊錯誤。
(2)串行口的控制寄存器:SCON:SCON 是一個特殊功能寄存器,用以設定串行口的工作方式、接收/發送控制以及設置狀態標志。
三、串口如何使用
串行口工作之前,應對其進行初始化,主要是設置產生波特率的定時器1、串行口控制和中斷控制。
具體步驟如下:確定T1的工作方式(編程TMOD寄存器);計算T1的初值,裝載TH1,TL1;啟動T1(編程TCON中的TR1位);確定串行口控制(編程SCON寄存器);串行口在中斷方式工作是要進行中斷方式設置(編程IE,IP寄存器)。
#include "reg52.h"typedef unsigned int u16; typedef unsigned char u8;void UsartInit() {SCON=0X50;TMOD=0X20;PCON=0X80;TH1=0XF3;TL1=0XF3;ES=1;EA=1;TR1=1;}void main() { UsartInit();while(1); }void Usart() interrupt 4 {u8 receiveData;receiveData=SBUF;RI = 0;SBUF=receiveData;while(!TI);TI=0;}總結
以上是生活随笔為你收集整理的第二周铁人战队学习总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: cf战队服务器怎么分配位置,CF:全服最
- 下一篇: Web前端,CSS中的浮动、清除浮动