1. Trang chủ
  2. » Luận Văn - Báo Cáo

Báo cáo hệ thống nhúng 2022 UTC ĐHGTVT

127 20 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Hệ Thống Điều Khiển Nhúng
Tác giả Đỗ Vương Anh, Đinh Đức Lượng, Nguyễn Kim Tưởng, Nguyễn Văn Toàn, Ưng Sỹ Sang, Trần Văn Thế, Nguyễn Xuân Tuấn, Tạ Quang Vinh, Đỗ Ngọc Hiệp, Trần Ngọc Tuấn, Nguyễn Xuân Thảo
Người hướng dẫn TS. Nguyễn Văn Tiềm
Trường học Trường Đại Học Giao Thông Vận Tải
Chuyên ngành Điều Khiển Học
Thể loại báo cáo
Năm xuất bản 2017
Thành phố Hà Nội
Định dạng
Số trang 127
Dung lượng 1,96 MB

Cấu trúc

  • LỜI NÓI ĐẦU

    • a. Giới thiệu

    • b. Sơ đồ khối

      • Sơ đồ khối:

      • CODE:

      • #include <pic.h> #include <pic16f877a.h> #include <xc.h> #include <stdio.h> #include <stdlib.h>

      • #define _XTAL_FREQ 20000000

      • #pragma config FOSC = HS #pragma config WDTE = OFF #pragma config PWRTE = OFF #pragma config BOREN = OFF #pragma config LVP = OFF #pragma config CPD = OFF #pragma config WRT = OFF #pragma config CP = OFF

      • int d = 0;

      • void hieuung1()

      • {

      • delay_ms(500);

      • delay_ms(500);

      • }

      • void hieuung2()

      • {

      • PORTD = 0b10000000;

      • delay_ms(500); for(int j = 0; j<7 ;j++)

      • {

      • PORTD >>=1;

      • delay_ms(500);

      • }

      • }

      • void hieuung3 ()

      • {

      • char Mang2[] = {0b10000001, 0b11000011, 0b11100111, 0xff};

      • for(int j =0;j<4;j++)

      • {

      • PORTD = Mang2[j];

      • delay_ms (500);

      • }

      • }

      • void main(void)

      • {

      • while(1)

      • {

      • if(d==1)

      • {

      • hieuung1();

      • }

      • if(d==2)

      • {

      • hieuung2();

      • }

      • if(d==3)

      • {

      • hieuung3();

      • }

      • }

      • }

      • void interrupt NGAT(void)

      • {

      • {

      • d++;

      • {

      • d=1;

      • }

      • }

      • }

      • Mô phỏng

      • Mục đích

      • Sơ đồ khối:

      • CODE:

      • #include <pic.h> #include <pic16f877a.h> #include <xc.h> #include <stdio.h> #include <stdlib.h>

      • #define _XTAL_FREQ 20000000

      • #pragma config FOSC = HS #pragma config WDTE = OFF #pragma config PWRTE = OFF #pragma config BOREN = OFF #pragma config LVP = OFF #pragma config CPD = OFF #pragma config WRT = OFF #pragma config CP = OFF

      • void delay_timer0_5ms(unsigned int time)

      • {

      • {

      • OPTION_REGbits.PS1 = 1;

      • }

      • }

      • void hienthi(unsigned int h,unsigned int m,unsigned int s)

      • {

      • h1 = h/10; h2 = h%10;

      • m1=m/10; m2=m%10;

      • s1=s/10; s2=s%10;

      • {

      • PORTDbits.RD1=0; PORTB = MALED[h1];

      • delay_timer0_5ms(2); PORTDbits.RD1=1; PORTDbits.RD2=0; PORTB = MALED[h2];

      • delay_timer0_5ms(1); PORTDbits.RD2=1;

      • PORTDbits.RD3=0; PORTB = MALED[m1];

      • delay_timer0_5ms(2); PORTDbits.RD3=1; PORTDbits.RD4=0; PORTB = MALED[m2];

      • delay_timer0_5ms(2); PORTDbits.RD4=1;

      • PORTDbits.RD5=0; PORTB = MALED[s1];

      • delay_timer0_5ms(2); PORTDbits.RD5=1; PORTDbits.RD6=0; PORTB = MALED[s2];

      • delay_timer0_5ms(1); PORTDbits.RD6=1;

      • }

      • }

      • void main(void)

      • {

      • TRISB = 0x00; TRISD = 0x00; TRISC = 0x00;

      • unsigned int gio = 0,giay= 0,phut = 0; while(1)

      • {

      • {

      • }

      • {

      • phut=0; gio++;

      • }

      • {

      • gio = 0;

      • }

      • }

      • }

      • Mô phỏng:

      • #define _XTAL_FREQ 20000000

      • #define RS RD2 #define EN RD3 #define D4 RD4 #define D5 RD5 #define D6 RD6 #define D7 RD7

      • #include <pic.h> #include <pic16f877a.h> #include <xc.h> #include <stdio.h> #include <stdlib.h>

      • #pragma config FOSC = HS #pragma config WDTE = OFF #pragma config PWRTE = OFF #pragma config BOREN = OFF #pragma config LVP = OFF #pragma config CPD = OFF #pragma config WRT = OFF #pragma config CP = OFF

      • void Lcd_Port(char a)

      • {

      • if(a & 1)

      • D4 = 1;

      • else

      • D4 = 0;

      • if(a & 2)

      • D5 = 1;

      • else

      • D5 = 0;

      • if(a & 4)

      • D6 = 1;

      • else

      • D6 = 0;

      • if(a & 8)

      • D7 = 1;

      • else

      • }

      • D7 = 0;

      • void Lcd_Cmd(char a)

      • {

      • EN = 0;

      • }

      • void Lcd_Clear()

      • {

      • Lcd_Cmd(0);

      • }

      • void Lcd_Set_Cursor(char a, char b)

      • {

      • char temp,z,y;

      • {

      • y = temp & 0x0F; Lcd_Cmd(z); Lcd_Cmd(y);

      • }

      • {

      • temp = 0xC0 + b - 1; z = temp>>4;

      • y = temp & 0x0F; Lcd_Cmd(z); Lcd_Cmd(y);

      • }

      • }

      • void Lcd_Init()

      • {

      • Lcd_Port(0x00);

      • delay_ms(20); Lcd_Cmd(0x03);

      • delay_ms(5); Lcd_Cmd(0x03);

      • delay_ms(11); Lcd_Cmd(0x03);

      • ///////////////////////////////////////////////////// Lcd_Cmd(0x02);

      • Lcd_Cmd(0x02); Lcd_Cmd(0x08); Lcd_Cmd(0x00); Lcd_Cmd(0x0C); Lcd_Cmd(0x00); Lcd_Cmd(0x06);

      • }

      • void Lcd_Write_Char(char a)

      • {

      • char temp,y;

      • y = a&0xF0;

      • Lcd_Port(y>>4);

      • delay_us(40); EN = 0;

      • Lcd_Port(temp); EN = 1;

      • delay_us(40); EN = 0;

      • }

      • void Lcd_Write_String(char *a)

      • {

      • int i;

      • Lcd_Write_Char(a[i]);

      • }

      • void Lcd_Shift_Right()

      • {

      • Lcd_Cmd(0x01); Lcd_Cmd(0x0C);

      • }

      • void Lcd_Shift_Left()

      • {

      • Lcd_Cmd(0x01); Lcd_Cmd(0x08);

      • }

      • void main(void)

      • {

      • TRISA4 = 1;

      • Lcd_Init(); while (1)

      • {

      • sprintf(b,”Xung dem: %d”,dem); Lcd_Set_Cursor(1,1);

      • dem=TMR0;

      • {

      • TMR0=0;

      • dem=0;

      • }

      • }

      • }

      • #define _XTAL_FREQ 20000000

      • #include <pic.h> #include <pic16f877a.h> #include <xc.h> #include <stdio.h> #include <stdlib.h>

      • #pragma config FOSC = HS #pragma config WDTE = OFF #pragma config PWRTE = OFF #pragma config BOREN = OFF #pragma config LVP = OFF #pragma config CPD = OFF

      • #pragma config WRT = OFF #pragma config CP = OFF void Timer1_Init()

      • {

      • }

      • void interrupt timer1()

      • {

      • if(PIR1bits.TMR1IF ==1)

      • {

      • TMR1L=3035&0X00FF;

      • PIR1bits.TMR1IF = 0;

      • }

      • }

      • void main()

      • {

      • TRISBbits.TRISB0 = 0;

      • PORTBbits.RB0 = 0;

      • Timer1_Init(); while(1)

      • {}

      • }

      • #include <pic.h> #include <pic16f877a.h> #include <xc.h> #include <stdio.h> #include <stdlib.h>

      • #define _XTAL_FREQ 20000000

      • #pragma config FOSC = HS #pragma config WDTE = OFF #pragma config PWRTE = OFF #pragma config BOREN = OFF #pragma config LVP = OFF #pragma config CPD = OFF #pragma config WRT = OFF #pragma config CP = OFF

      • #define dx1 RB0 #define dv1 RB1 #define dd1 RB2 #define dx2 RB3 #define dv2 RB4 #define dd2 RB5 #define dx3 RB6 #define dv3 RB7 #define dd3 RC0 #define dx4 RC1 #define dv4 RC2 #define dd4 RC3

      • #define bat 1

      • #define tat 0

      • void delay_timer2(unsigned int time)

      • {

      • while(time--)

      • {

      • T2CONbits.T2CKPS1 = 1;

      • T2CONbits.TOUTPS3 = 0;

      • T2CONbits.TOUTPS2 = 0;

      • T2CONbits.TOUTPS1 = 0;

      • void main(void)

      • {

      • TRISB = TRISC = 0x00; PORTB = PORTC = 0x00;

      • while(1)

      • {

      • {

      • delay_timer2(1000);

      • }

      • {

      • dx1 = dx3 = dv1 = dv3 = dx2 = dx4 = dd2 = dd4 =tat; dv2 = dv4 = dd1 = dd3 = bat;

      • delay_timer2(1000); dem++;

      • }

      • {

      • dx2 = dx4 = dd1 = dd3 = dv1 = dv2 = dv3 = dv4 = tat; dx1 = dx3 = dd2 = dd4 = bat;

      • delay_timer2(1000); dem++;

      • }

      • {

      • dx2 = dx4 = dx1 = dx3 = dv2 = dv4 = dd1 = dd3 = tat; dv1 = dv3 = dd2 = dd4 = bat;

      • delay_timer2(1000); dem++;

      • }

      • {

      • dem = 0;

      • }

      • }

      • }

      • #include <pic.h> #include <pic16f877a.h> #include <xc.h> #include <stdio.h> #include <stdlib.h>

      • #define _XTAL_FREQ 20000000

      • #pragma config FOSC = HS #pragma config WDTE = OFF #pragma config PWRTE = OFF #pragma config BOREN = OFF #pragma config LVP = OFF #pragma config CPD = OFF #pragma config WRT = OFF #pragma config CP = OFF

      • #define RS RD2 #define EN RD3 #define D4 RD4 #define D5 RD5 #define D6 RD6 #define D7 RD7

      • void ADC_Init(void)

      • {

      • ADCON1bits.ADCS2 = 0;

      • ADCON0bits.ADCS1 = 1;

      • ADCON0bits.CHS2 = 0;

      • ADCON0bits.CHS1 = 0;

      • ADCON1bits.PCFG3 = 1;

      • ADCON1bits.PCFG2 = 1;

      • ADCON1bits.PCFG1 = 1;

      • ADCON0bits.ADON = 1;

      • }

      • unsigned int ADC_Read()

      • {

      • }

      • void main(void)

      • {

      • PORTD = 0x00; TRISBbits.TRISB0 = 0;

      • PORTBbits.RB0 = 0;

      • TRISAbits.TRISA0 = 1;

      • PORTAbits.RA0 = 1;

      • Lcd_Init(); ADC_Init(); char str[20]; while(1)

      • {

      • {

      • Lcd_Set_Cursor(1,1); Lcd_Write_String(str);

      • Lcd_Write_String("C"); Lcd_Set_Cursor(2,1); Lcd_Write_String(" GOOD! ");

      • }

      • else

      • {

      • Lcd_Set_ Cursor(1,1); Lcd_Write_String(“ WARNING! ”); Lcd_Set_Cursor(2,1)

      • Lcd_Write_String(“ NHIET DO CAO”);

      • }

      • }

      • }

      • #pragma config FOSC = HS #pragma config WDTE = OFF #pragma config PWRTE = OFF #pragma config BOREN = OFF #pragma config LVP = OFF #pragma config CPD = OFF #pragma config WRT = OFF #pragma config CP = OFF

      • #include <xc.h> #include <pic.h> #include <stdio.h> #include <stdlib.h> #include <pic16f877a.h>

      • #define _XTAL_FREQ 20000000

      • #define PRESCALE 4

      • long fre1,fre2;

      • void PWM1_Init(long fre)

      • {

      • }

      • void PWM2_Init(long fre)

      • {

      • PR2 =(_XTAL_FREQ / (4*fre*PRESCALE)-1);

      • fre2=fre;

      • }

      • void PWM1_Start()

      • {

      • CCP1CONbits.CCP1M2=1;

      • }

      • void PWM2_Start()

      • {

      • CCP2CONbits.CCP2M2 = 1;

      • CCP2CONbits.CCP2M3 = 1;

      • T2CONbits.TMR2ON = 1;

      • TRISCbits.TRISC1 = 0;

      • }

      • void Duty_Cycle(unsigned int cpp, unsigned int duty)

      • {

      • {

      • }

      • {

      • duty = ((float)duty/1023) * (_XTAL_FREQ/(fre2*PRESCALE)); CCP2CONbits.CCP2X = duty&2;

      • CCP2CONbits.CCP2Y = duty&1; CCPR2L = duty>>2;

      • }

      • }

      • void PWM1_Stop()

      • {

      • CCP1CONbits.CCP1M2 = 0;

      • CCP1CONbits.CCP1M1 = 0;

      • CCP1CONbits.CCP1M0 = 0;

      • }

      • void PWM2_Stop()

      • {

      • CCP2CONbits.CCP2M2 = 0;

      • CCP2CONbits.CCP2M1 = 0;

      • CCP2CONbits.CCP2M0 = 0;

      • }

      • void main(void)

      • {

      • PWM2_Init(10000); TRISBbits.TRISB0 = 1;

      • TRISBbits.TRISB1 = 1;

      • TRISBbits.TRISB2 = 1; PORTB = 0xFF;

      • while(1)

      • {

      • {

      • PWM1_Start();

      • }

      • else if(RB1 == 0)

      • {

      • PWM2_Start();

      • }

      • else if(RB3 == 0)

      • {

      • PWM2_Stop();

      • }

      • }

      • }

      • #include <pic.h> #include <pic16f877a.h> #include <xc.h> #include <stdio.h> #include <stdlib.h>

      • #define _XTAL_FREQ 20000000

      • #pragma config FOSC = HS #pragma config WDTE = OFF #pragma config PWRTE = OFF #pragma config BOREN = ON #pragma config LVP = OFF #pragma config CPD = OFF #pragma config WRT = OFF #pragma config CP = OFF

      • void UART_Init(void)

      • {

      • }

      • void UART_Put_Char(unsigned char dl)

      • {

      • TXREG = dl;

      • }

      • void UART_Put_String(unsigned char *dl)

      • {

      • {

      • while(PIR1bits.TXIF == 0); TXREG = *dl++;

      • }

      • }

      • char UART_Data_Ready()

      • {

      • return RCIF;

      • }

      • char UART_Read()

      • {

      • while (!RCIF); return RCREG;

      • }

      • void main(void)

      • {

      • TRISBbits.TRISB0 = TRISBbits.TRISB1 = TRISCbits.TRISC7 = 1; TRISBbits.TRISB2 = TRISBbits.TRISB3 = TRISCbits.TRISC6 = 0;

      • UART_Init();

      • while(1)

      • {

      • {

      • UART_Put_String("NHOM 4 VO DOI ");

      • delay_ms(500);

      • }

      • {

      • UART_Put_String("TU DONG HOA VA DIEU KHIEN ");

      • delay_ms(500);

      • }

      • {

      • kt = UART_Read();

      • }

      • {

      • PORTBbits.RB2 = 1;

      • PORTBbits.RB3 = 0;

      • }

      • {

      • PORTBbits.RB3 = 1;

      • PORTBbits.RB2 = 0;

      • }

      • }

      • return;

      • }

      • #define _XTAL_FREQ 20000000

      • #define PRESCALE 4

      • #define RS RD2 #define EN RD3 #define D4 RD4 #define D5 RD5 #define D6 RD6 #define D7 RD7

      • #include <xc.h> #include <pic.h> #include <stdio.h> #include <stdlib.h> #include <pic16f877a.h>

      • #pragma config FOSC = HS #pragma config WDTE = OFF #pragma config PWRTE = OFF #pragma config BOREN = OFF #pragma config LVP = OFF #pragma config CPD = OFF #pragma config WRT = OFF #pragma config CP = OFF

      • char s1[20],s2[20];

      • void Timer1_Init()

      • {

      • }

      • void Int_Init()

      • {

      • }

      • void main(void)

      • {

      • TRISD = 0x00; TRISB0 = 1;

      • TRISB1= TRISB2 = TRISB3 = 0; TRISA0 = TRISA1 = TRISA2 = 1;

      • PORTA = 0xFF;

      • PORTB = PORTD = 0x00;

      • Lcd_Init(); ADC_Init();

      • {

      • {

      • PORTBbits.RB3 = 1;

      • PORTBbits.RB2 = 1;

      • }

      • PORTBbits.RB3 = 1;

      • PORTBbits.RB2 = 0;

      • }

      • {

      • PORTBbits.RB3 = 0;

      • }

      • Lcd_Set_Cursor(1,1); Lcd_Write_String(s1);

      • sprintf(s2,"TOC DO:%4.0f v/p ",tocdo); Lcd_Set_Cursor(2,1); Lcd_Write_String(s2);

      • }

      • return;

      • }

      • void interrupt NGAT(void)

      • {

      • {

      • }

      • {

      • TMR1L=34286&0X00FF;

      • }

      • }

      • #define _XTAL_FREQ 20000000

      • //Khai báo thư viện #include <stdio.h> #include <stdlib.h> #include <pic.h> #include <pic16f877a.h> #include <xc.h>

      • #pragma config FOSC = HS #pragma config WDTE = OFF #pragma config PWRTE = OFF #pragma config BOREN = OFF #pragma config LVP = OFF #pragma config CPD = OFF #pragma config WRT = OFF #pragma config CP = OFF

      • void I2C_Master_Init(unsigned long clock)

      • {

      • SSPCON2 = 0x00;

      • }

      • void I2C_Master_Wait()

      • {

      • }

      • void I2C_Master_Start()

      • I2C_Master_Wait(); SEN = 1;

      • }

      • void I2C_Master_Stop()

      • {

      • I2C_Master_Wait(); PEN = 1;

      • }

      • void I2C_Master_Restart()

      • {

      • I2C_Master_Wait(); RSEN = 1;

      • }

      • void I2C_Master_Write(unsigned char data)

      • {

      • I2C_Master_Wait(); SSPBUF = data;

      • }

      • unsigned char I2C_Master_Read(unsigned char ack)

      • {

      • unsigned char temp; I2C_Master_Wait();

      • I2C_Master_Wait();

      • I2C_Master_Wait();

      • }

      • void main(void)

      • {

      • I2C_Master_Start();

      • delay_ms(200); I2C_Master_Restart();

      • I2C_Master_Stop();

      • delay_ms(200);

      • }

      • }

      • #define _XTAL_FREQ 20000000

      • //Khai báo thư viện #include <stdio.h> #include <stdlib.h> #include <pic.h> #include <pic16f877a.h> #include <xc.h>

      • #pragma config FOSC = HS #pragma config WDTE = OFF #pragma config PWRTE = OFF #pragma config BOREN = OFF #pragma config LVP = OFF #pragma config CPD = OFF #pragma config WRT = OFF #pragma config CP = OFF

      • unsigned char z;

      • void I2C_Slave_Init(unsigned char address)

      • {

      • void interrupt I2C_Slave_Read()

      • {

      • {

      • {

      • }

      • {

      • }

      • {

      • }

      • }

      • }

      • void main()

      • {

      • TRISD = 0x00;

      • }

      • CODE CHO MASTE

      • #define _XTAL_FREQ 20000000

      • //Khai báo thư viện #include <stdio.h> #include <stdlib.h> #include <pic.h> #include <pic16f877a.h> #include <xc.h>

      • #pragma config FOSC = HS #pragma config WDTE = OFF #pragma config PWRTE = OFF #pragma config BOREN = OFF #pragma config LVP = OFF #pragma config CPD = OFF #pragma config WRT = OFF

      • void SPI_Master_Init()

      • {

      • SSPCONbits.SSPM3 = 0;

      • SSPCONbits.SSPM2 = 0;

      • SSPCONbits.SSPM1 = 1;

      • }

      • unsigned char SPI_Master_Read()

      • {

      • }

      • void SPI_Master_Write(unsigned char Tvalue)

      • {

      • }

      • void main()

      • {

      • SPI_Master_Init();

      • TRISD = 0x00;

      • PORTB = 0xff;

      • while(1)

      • {

      • delay_ms(100);

      • delay_ms(100);

      • }

      • }

      • CODE CHO SLAVE

      • #define _XTAL_FREQ 20000000

      • //Khai báo thư viện #include <stdio.h> #include <stdlib.h> #include <pic.h> #include <pic16f877a.h> #include <xc.h>

      • #pragma config FOSC = HS #pragma config WDTE = OFF #pragma config PWRTE = OFF #pragma config BOREN = OFF #pragma config LVP = OFF #pragma config CPD = OFF #pragma config WRT = OFF

      • void SPI_Slave_Init()

      • {

      • SSPCONbits.SSPM2 = 1;

      • SSPCONbits.SSPM1 = 0;

      • }

      • unsigned char SPI_Slave_Read()

      • {

      • }

      • void SPI_Slave_Write(unsigned char Tvalue)

      • {

      • }

      • void main()

      • {

      • SPI_Slave_Init();

      • TRISD = 0x00;

      • PORTB = 0xFF;

      • while(1)

      • {

      • delay_ms(100);

      • delay_ms(100);

      • }

      • }

      • #define _XTAL_FREQ 20000000

      • #include <stdio.h> #include <stdlib.h> #include <pic.h> #include <pic16f877a.h> #include <xc.h>

      • // CONFIG #pragma config FOSC = HS #pragma config WDTE = OFF #pragma config PWRTE = OFF #pragma config BOREN = OFF #pragma config LVP = OFF #pragma config CPD = OFF #pragma config WRT = OFF

      • #define DATA PORTB

      • const unsigned char cot[] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};

      • const unsigned char hang[] = {

      • 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x03,0x01,0xf4,0xe4,0xe4,0x01,0x03,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff

      • };

      • void vaodulieu(unsigned char m)

      • {

      • unsigned char t,temp;

      • {

      • temp = m&0x80; if(temp == 0x80) DS=1;

      • else DS =0;

      • SCK =1;

      • }

      • }

      • void main()

      • {

      • TRISD = 0x18;

      • while (1)

      • {

      • {

      • {

      • {

      • {

      • vaodulieu(hang[i+k+8]);

      • vaodulieu(hang[i+k]);

      • STR=1;

      • delay_ms(5); DATA=0x00;

      • }

      • }

      • }

      • }

      • {

      • delay_ms(50); while (LTR ==0);

      • for(i=24;i>0;i--)

      • {

      • for(j=0;j<10;j++)

      • {

      • for(k=0;k<8;k++)

      • {

      • vaodulieu(hang[i+k+8]); vaodulieu(hang[i+k]); STR=0;

      • STR=1;

      • DATA=cot[k];

      • delay_ms(5); DATA=0x00;

      • }

      • }

      • }

      • }

      • }

      • }

      • #define _XTAL_FREQ 20000000

      • #define D4 RB4 #define D5 RB5 #define D6 RB6 #define D7 RB7

      • #define C2 RD1 #define C3 RD2 #define C4 RD3 #define H1 RD4 #define H2 RD5 #define H3 RD6 #define H4 RD7

      • #include <stdio.h> #include <stdlib.h> #include <xc.h> #include "LCD16x2.h"

      • #pragma config FOSC = HS #pragma config WDTE = OFF #pragma config PWRTE = OFF #pragma config BOREN = ON #pragma config LVP = OFF #pragma config CPD = OFF #pragma config WRT = OFF

      • unsigned char Quetphim()

      • {

      • unsigned char giatri,i;

      • for(i=0;i<4;i++)

      • {

      • if(H1==0) { delay_ms(40);if(H1==0){ while(H1==0); giatri = 1 + 4*i;}}

      • if(H2==0) { delay_ms(40);if(H2==0){ while(H2==0); giatri = 2 + 4*i;}} //Vi du hang 2 cot 1(0xfe) ta thu dk gt=2

      • if(H3==0) { delay_ms(40);if(H3==0){ while(H3==0); giatri = 3 + 4*i;}}

      • if(H4==0) { delay_ms(40);if(H4==0){ while(H4==0); giatri = 4 + 4*i;}}

      • }

      • }

      • void main()

      • {

      • TRISB = 0x00; TRISD = 0xF0; PORTB = 0x00; PORTD = 0xF0;

      • unsigned char num,check,check1,KT,gt1,gt2,pt,a[16]; float kq;

      • const unsigned int Mangso[] =

      • const unsigned char Mang[] =

      • while(1)

      • {

      • {

      • {

      • }

      • }

      • {

      • if(num!=0&&num<11)

      • {

      • }

      • Lcd_Write_Char(Mang[num-1]);

      • {

      • }

      • {

      • }

      • {

      • }

      • }

      • {

      • {

      • check=1; Lcd_Write_Char(Mang[num-1]);

      • }

      • }

      • {

      • num=Mangso[Quetphim()]; if(num!=0&&num<11)

      • {

      • Lcd_Write_Char(Mang[num-1]);

      • if(num==10)

      • {

      • }

      • else

      • {

      • }

      • }

      • gt2=gt2*10;

      • gt2=(gt2*10)+num;

      • {

      • kq=(float)gt1/gt2;

      • }

      • {

      • kq=(float)gt1*gt2;

      • }

      • {

      • kq=(float)gt1 - gt2;

      • }

      • {

      • kq=(float)gt1+gt2;

      • }

      • }

      • }

      • {

      • sprintf(a,"%4.2f",kq); Lcd_Write_String(a);

      • }

      • {

      • }

      • }

      • }

Nội dung

Báo cáo Bài Tập Lớn Hệ thống nhúng đại học Giao Thông Vận TảiVới quá trình công nghiệp hóa hiện đại hóa như hiện nay thì việc áp dụng các công nghệ vi xử lý là một vấn đề khá là quan trọng. Ở học kỳ trước chúng ta đã có học qua môn Vi Xử Lý và ở kỳ này là môn Điều Khiển Nhúng. Với mức độ tiếp cận sâu hơn và tính thực tế cao hơn thì đây là một trong những môn rất quan trọng với các sinh viên của ngành Tự Động Hóa. Với mỗi dòng chip khác nhau thì datasheet của nó lại khác nhau hoàn toàn vì vậy khi chúng ta có thể tìm hiểu vài ba dòng chip rồi thì chúng ta không còn gặp phải khó khăn khi tiếp cận với một dòng chip nào mới cả. Sau một thời gian khá dài học về dòng điều khiển PIC16877A và các bài toán lập trình nhúng thì hôm nay nhóm chúng em đã tổng hợp được những bài lập trình có liên quan để viết nên bài báo cáo này. Trong quá trình làm gặp phải khá nhiều khó khăn nhưng với sự giúp đỡ nhiệt tình của thầy thì chúng em cũng đã hoàn thành được bản báo cáo này. Tuy vậy nhưng trong bản báo cáo này không thể không có sai sót do kiến thức của chúng em còn hạn chế. Rất mong được sự đóng góp của quý thầy cô để bản báo cáo tốt hơn.

PIC16F877A

Tómtắt đặcđiểmcủaPIC16F877A b Sơ đồ khối

 KhốicácPORTxuất nhập. c Sơ đồchân và chức năng cácchân

 Chân OSC1/CLKI (13): là ngõ vào kết nối với mạch dao động thạchanh hoặcngõvàonhậnxung clockbên ngoài.

 OSC1: ngõ vào dao động thạch anh hoặc ngõ vào nguồn xung bênngoài NgõcómạchSchmittTriggernếusửdụngdaođộngRC.

 Chân OSC2/CLKO (14): ngõ ra dao động thạch anh hoặc ngõ ra cấpxung clock.

 OSC2: ngõ ra dao động thạch anh Kết nối với thạch anh hoặc bộcộnghưởng.

 CLKO: ở chế độ RC, ngừ ra của OSC2 bằng ẳ tần số của OSC1vàchínhlàtốcđộcủachukỳlệnh.

phỏngcác bàilậptrìnhnhúng

NgắtTimer1-Chớptắtled

 Nguyên lý: Các timer về mục đích sử dụng là giống nhau nên chúng ta sẽnói sơ qua về Timer 1.Timer 1Là timer 16 bit gồm 2 thanh ghi

Timer 1 có khả năng đọc và ghi dữ liệu, cho phép tạo ra thời gian trễ chính xác hơn so với Timer 0 Tuy nhiên, bộ chia tần số của Timer 1 khá hạn chế, với tỷ lệ chia tối đa là 1:8 Để sử dụng ngắt Timer 1, cần chú ý đến các thanh ghi như INTCON, PIR1, TMR1L, TMR1H, PIE1 và T1CON Trong bài này, chúng ta sẽ áp dụng ngắt Timer 1 để điều khiển các đèn LED chớp tắt và sử dụng máy đo xung để kiểm tra độ chính xác của thời gian tạo ra Bài viết này sẽ không có nhiều tư duy logic, vì vậy sẽ không trình bày sơ đồ thuật toán Chúng ta sẽ tìm hiểu các thanh ghi cần thiết cho ngắt Timer 1.

Bit 1TMR1CS: Chọn xung vào cho timer1 là xung nội hay xungngoại.

1: chọn xung vào là xung ngoại dùng chân RC0/T1CKI.Bit0TMR1ON:bậttắt timer1.

0: Cho phép timer 1 hoạt động1:D ừ n g timer1.

0: Không cho phép ngắt ngoại vi.1:Cho phép ngắt ngoạivi.

Bit0TMR1IF:cờbáongắt tràncủaTMR1.

0: thanh ghi TMR1 không tràn.1:thanhghiTMR1đãtràn.

Bit0TMR1IE:Chophépngắttràn timer 1.

0: không cho phép ngắt TMR1 tràn.1:cho phép ngắtTMR1tràn.

TMR1L và TMR1H là hai thanh ghi chứa giá trị đếm của Timer1 Để nạp giá trị đặt trước vào hai thanh ghi này nhằm tạo ra thời gian trễ thích hợp, chúng ta cần tính toán giá trị cần nạp Công thức tính toán gần giống với Timer0, với chu kỳ máy thực hiện trong 1 giây là 4M chu kỳ máy, tương ứng với 100ms cần thực hiện 500K chu kỳ máy Vì Timer1 sử dụng 16 bit, giá trị tối đa là 65535 Sử dụng bộ chia 1:8 là hợp lý cho 100ms, do đó giá trị nạp vào thanh ghi TMR1 được tính là 65535 – (500K/8) = 3035 Cuối cùng, chúng ta tách số này thành 8 bit cao và 8 bit thấp để nạp vào thanh ghi TMR1H và TMR1L.

#include< x c h > #incl ude #include

#pragma config FOSC = HS#pragma config

WDTE = OFF#pragma config PWRTE =

OFF#pragma config BOREN = OFF#pragma config LVP =

OFF#pragma config CP = OFFvoid

T1CONbits.TMR1CS=0;//Dùng xungnội

TMR1L035&0X00FF; //Lấy 8 bít thấp T1CONbits.TMR1ON=1; //bật timer1 PIR1bits.TMR1IF=0; //Xóa cờ tràn PIE1bits.TMR1IE=1; //Cho phép ngắt timer

1 INTCONbits.PEIE=1; //Cho phép ngắt ngoại vi INTCONbits.GIE=1; //Chophépngắttoàncục.

{ if(PIR1bits.TMR1IF==1)

PORTBbits.RB0=~PORTBbits.RB0;/ / Đ ả o ttchânRB0

Mục đích của bài viết này là giúp chúng ta hiểu rõ hơn về Timer1 và cách tạo ra độ trễ mong muốn Chúng ta sẽ khám phá cách làm bài Counter 1 dựa trên nền tảng của Timer1, đồng thời so sánh với cách hoạt động của Counter0 Đặc biệt, Counter1 cho phép đếm giá trị lớn hơn nhiều, lên đến 65535.

Đèngiaothông sửdụngTimer2

Tại một nút giao thông có 4 cột đèn, trong đó 2 cột đèn đỏ và xanh sẽ hoạt động đồng thời Chúng ta chỉ cần xử lý tín hiệu cho 2 hướng di chuyển Cần thiết lập thời gian cho đèn xanh, đỏ, vàng của cả 2 hướng và sử dụng timer 2 để tạo ra thời gian trễ Quá trình này sẽ được lặp đi lặp lại liên tục Để thực hiện điều này, cần sử dụng ít nhất 1 biến đếm và xét biến đếm để điều khiển các đèn sáng theo yêu cầu Cuối cùng, chúng ta sẽ xem xét các thanh ghi PR2, TMR2, T2CON, PIR1 để sử dụng cho timer 2 và cách tính toán giá trị đặt cho timer.

Bit 2 (TMR2ON): Cho phép timer2 hoạt động0:không cho phép 1:chophép

Bit 1:0 (T2CKPS1:T2CKPS0): Bit chọn tỷ lệ bộ chia tần sốprescaler

0: thanh ghi TMR2 chưa tràn.1:thanhghiTMR2đã tràn.

Thanh ghi PR2 hỗ trợ cho Timer2, nơi giá trị của thanh ghi TMR2 sẽ được so sánh với PR2 Timer2 có hai bộ chia: bộ chia trước (prescaler) và bộ chia sau (postcaler), cho phép tạo ra nhiều bộ chia hơn Để tạo độ trễ 1ms, với 5 triệu chu kỳ máy trong 1 giây, ta có 5.000 chu kỳ trong 1ms Timer2 sử dụng 8 bit, với giá trị đếm tối đa là 255 Khi kết hợp hai bộ chia PRESCALER = 1:4 và POSTSCALER = 1:8, ta có bộ chia tổng là 1:32 Giá trị cần nạp cho PR2 được tính là PR2 = 5K/32.

 Đèn giao thông:Ở đây đèn đỏ 1 sẽ khóa chéo với đèn vàng

Thời gian tổng cho các đèn giao thông là 60 giây, với các chu kỳ sáng khác nhau Trong 20 giây đầu, đèn xanh 2 và đèn đỏ 1 sẽ sáng Từ 20 đến 25 giây, đèn đỏ 1 và đèn vàng 2 được kích hoạt Tiếp theo, từ 25 đến 55 giây, đèn xanh 1 và đèn đỏ 2 sẽ sáng Cuối cùng, trong khoảng thời gian từ 55 đến 60 giây, đèn xanh 1 và đèn vàng 2 sẽ hoạt động.

Tạo trễ từ timer2: delay_timer2(); dem = 0;

Kết thúc Đèn đỏ 2 sáng Đèn vàng 1 sáng dem = 0 dem>=0 dem< S dem>20 dem25 dem60 S dem>55 dem

Ngày đăng: 11/03/2022, 15:05

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w