• <menu id="ugcm4"><strong id="ugcm4"></strong></menu>
  • 技術熱線: 4007-888-234

    PIC單片機C語言編程實例四

    更新時間: 2019-01-05
    閱讀量:1806

    通用同步/異步通信的應用
    8.5 單片機雙機異步通信
    1 單片機PIC1編程(發送部分)

    include

    /該程序實現單片機雙機異步通信功能,該程序是發送部分/
    unsigned char tran[8]; /定義一個數組存儲發送數據/
    unsigned char k,data; /定義通用寄存器/
    const char table[20]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0XD8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x7f,0xbf,0x89,0xff};
    /不帶小數點的顯示段碼表/
    /spi顯示初始化子程序/
    void SPIINIT()
    {
    PIR1=0;
    SSPCON=0x30;
    SSPSTAT=0xC0;
    /設置SPI的控制方式,允許SSP方式,并且時鐘下降沿發送,與”74HC595,當其 SCLK從低到高跳變時,串行輸入寄存器”的特點相對應/
    TRISC=0xD7; /
    SDO引腳為輸出,SCK引腳為輸出/
    TRISA5=0; /
    RA5引腳設置為輸出,以輸出顯示鎖存信號/
    }
    /
    給數組賦初值子程序 /
    void fuzhi()
    {
    for(k=0;k<8;k++) {
    tran[k]=k+3;
    }
    }
    /
    SCI部件初始化子程序/
    void sciint()
    {
    SPBRG=0X19; /
    將傳輸的波特率設為約9 600位/秒/
    TXSTA=0X04; /
    選擇異步高速方式傳輸8位數據/
    RCSTA=0X80; /
    允許同步串行口工作/
    TRISC6=1;
    TRISC7=1; /
    將RC6、RC7設置為輸入方式,對外部呈高阻狀態/
    }
    /
    SPI傳輸數據子程序/
    void SPILED(data)
    {
    SSPBUF=data; /
    啟動發送/
    do {
    ;
    }while(SSPIF==0);
    SSPIF=0;
    }
    /
    顯示子程序,顯示8位數/
    void display()
    {
    RA5=0; /
    準備鎖存/
    for(k=0;k<8;k++) {
    data=tran[k];
    data=table[data]; /
    查得顯示的段碼/
    SPILED(data); /
    發送顯示段碼/
    }
    RA5=1; /
    最后給一個鎖存信號,代表顯示任務完成/
    }
    /
    主程序/
    main()
    {
    SPIINIT();
    fuzhi(); /
    給數組賦初值/
    sciint(); /
    SCI部件初始化/
    di(); /
    中斷禁止/
    TXEN=1; /
    發送允許/
    CREN=1; /
    接收數據允許/
    for(k=0;k<8;k++){
    TXREG=tran[k]; /
    發出一個字符/
    while(1){
    if(TXIF==1) break;
    } /
    等待寫入完成/
    while(1){
    if(RCIF==1) break;/
    若收到響應字節,則終止等待/
    }
    RCREG=RCREG; /
    讀響應字節,清RCIF/
    }
    display(); /
    顯示發送的數據*/
    while(1){
    ;
    }
    }

    2 單片機PIC2編程(接收部分)

    include

    /該程序實現單片機雙機異步通信功能,該程序是接收部分,并把接收的數據顯示在8 個LED上/
    unsigned char rece[8];/
    定義一個數組存儲接收數據/
    unsigned char k,data;/
    定義通用寄存器/
    const char table[20]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0XD8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x7f,0xbf,0x89,0xff};
    /
    不帶小數點的顯示段碼表/
    /
    spi顯示初始化子程序/
    void SPIINIT()
    {
    ;詳細語句見發送程序
    }
    /
    SCI部件初始化子程序/
    void sciint()
    {
    SPBRG=0X19; /
    波特率設置與PIC1相同,為約9 600位/秒/
    TXSTA=0X04; /
    異步高速傳輸/
    RCSTA=0X80; /
    串行口工作使能/
    TRISC6=1;
    TRISC7=1; /
    將RC6、RC7設置為輸入方式,對外部呈高阻狀態/
    }
    /
    SPI傳送數據子程序/
    void SPILED(data)
    {
    ;詳細語句與見發送程序
    }
    /
    顯示子程序,顯示4位數/
    void display()
    {
    RA5=0; /
    準備鎖存/
    for(k=0;k<8;k++){
    data=rece[k];
    data=table[data]; /
    查得顯示的段碼/
    SPILED(data); /
    發送顯示段碼/
    }
    RA5=1; /
    最后給一個鎖存信號,代表顯示任務完成/
    }
    /
    主程序/
    main()
    {
    SPIINIT(); /
    spi顯示初始化/
    sciint(); /
    SCI部件初始化/
    di(); /
    中斷禁止/
    CREN=1; /
    接收允許/
    TXEN=1; /
    發送允許/
    for(k=0;k<8;k++){
    while(1){
    if(RCIF==1) break;
    } /
    等待接收數據/
    rece[k]=RCREG; /
    讀取接收數據,同時清掉RCIF/
    TXREG=rece[k]; /
    發送接收到的數據/
    while(1){
    if(TXIF==1) break;
    } /
    等待寫入完成/
    }
    display(); /
    顯示接收的數據*/
    while(1){
    ;
    }
    }
    8.6 單片機雙機同步通信
    1 單片機PIC1編程(主控發送)

    include

    /該程序實現單片機雙機同步通信功能,是主控發送部分。程序上電后顯示 相應的字符,表示系統正常工作。發送完畢后顯示發送的數據/
    unsigned char tran[8]; /
    定義一個數組存儲發送數據/
    unsigned char k,data; /
    定義通用寄存器/
    const char table[20]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0XD8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x7f,0xbf,0x89,0xff};
    /
    不帶小數點的的顯示段碼表/
    /
    spi顯示初始化子程序/
    void SPIINIT()
    {
    ;詳細程序語句請參考本章8.5節
    }
    /
    給發送數組賦初值子程序 /
    void fuzhi()
    {
    for(k=0;k<8;k++){
    tran[k]=k;
    } /
    發送0~7八個數據/
    }
    /
    SCI部件初始化子程序/
    void sciint()
    {
    SPBRG=200 ; /
    將傳輸的波特率設為約9600位/秒/
    TXSTA=0X90; /
    選擇主控方式/
    RCSTA=0X80; /
    允許同步串行口工作/
    TRISC6=1;
    TRISC7=1; /
    將RC6、RC7設置為輸入方式,對外部呈高阻狀態/
    }
    /
    SPI傳送數據子程序/
    void SPILED(data)
    {
    ;詳細程序語句請參考本章8.5節
    }
    /
    顯示子程序,顯示8位數/
    void display()
    {
    RA5=0; /
    準備鎖存/
    for(k=0;k<8;k++){
    data=tran[k];
    data=table[data]; /
    查得顯示的段碼/
    SPILED(data); /
    發送顯示段碼/
    }
    RA5=1; /
    最后給一個鎖存信號,代表顯示任務完成/
    }
    /
    顯示子程序,顯示8位數/
    void display1()
    {
    RA5=0; /
    準備鎖存/
    for(k=0;k<8;k++){
    data=0xf9; /
    顯示”1”表示系統正常工作/
    SPILED(data); /
    發送顯示段碼/
    }
    RA5=1; /
    最后給一個鎖存信號,代表顯示任務完成/
    }
    /
    主程序/
    main()
    {
    SPIINIT(); /
    spi顯示初始化/
    fuzhi(); /
    給發送數組賦發送初值/
    sciint(); /
    SCI部件初始化/
    di(); /
    中斷禁止/
    TXEN=1; /
    發送允許/
    display1(); /
    顯示相應的字符,表示系統正常/
    while(1){
    for(k=0;k<8;k++){
    TXREG=tran[k];/
    發出一個字符/
    while(1){
    if(TXIF==1) break;
    } /
    等待上一個數據寫入完成/
    }
    display(); /
    顯示發送的數據/
    } /
    循環發送*/
    }

    2 單片機PIC2編程(從動接收)

    include

    /該程序實現單片機雙機 同步通信功能,是從動接收部分,并把接收的數據顯 示在8個LED上/
    unsigned char rece[8]; /
    定義一個數組存儲接收數據/
    unsigned char k,data; /
    定義通用寄存器/
    unsigned int i;
    const char table[20]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0XD8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x7f,0xbf,0x89,0xff};
    /
    不帶小數點的顯示段碼表/
    /
    spi顯示初始化子程序/
    void SPIINIT()
    {
    ;詳細程序語句請參考本章8.5節
    }
    /
    SCI部件初始化子程序/
    void sciint()
    {
    TXSTA=0X10 ; /
    選擇同步從動方式/
    RCSTA=0X90; /
    串行口工作使能/
    TRISC6=1;
    TRISC7=1; /
    將RC6、RC7設置為輸入方式對外部呈高阻狀態/
    }
    /
    SPI傳送數據子程序/
    void SPILED(data)
    {
    ;/
    詳細程序語句請參考本章8.5節/
    }
    /
    顯示子程序,顯示4位數/
    void display()
    {
    RA5=0; /
    準備鎖存/
    for(k=0;k<8;k++){
    data=rece[k];
    data=table[data]; /
    查得顯示的段碼/
    SPILED(data); /
    發送顯示段碼/
    }
    RA5=1; /
    最后給一個鎖存信號,代表顯示任務完成/
    }
    /
    主程序/
    main()
    {
    SPIINIT(); /
    spi顯示初始化/
    sciint(); /
    SCI部件初始化/
    di(); /
    中斷禁止/
    CREN=1; /
    接收允許/
    for(k=0;k<8;k++) rece[k]=0x03;
    display(); /
    顯示表示系統正常運行的數據/
    while(1) {
    while(1){
    CREN=1; /
    允許連續接收/
    while(1){
    if(RCIF==1) break;
    } /
    等待接收數據/
    k=0;
    rece[k]=RCREG; /
    讀取接收數據/
    if(OERR==1) { /
    如果有溢出錯誤,則處理/
    CREN=0;
    CREN=1;
    }
    if(rece[k]==0x00) break;/
    “0”為同步字符,只有接收到“0”時才進行下面的接收/
    }
    for(k=1;k<8;k++){
    while(1){
    if(RCIF==1) break;
    } /
    等待接收數據/
    rece[k]=RCREG;/
    讀取接收數據/
    if(OERR==1) { /
    如果有溢出錯誤,則處理/
    CREN=0;
    CREN=1;
    }
    rece[k]=rece[k]&0x0F;/
    屏蔽掉高位,防止干擾/
    }
    CREN=0;
    display(); /
    顯示接收的數據/
    for(i=65535;—i; )continue;
    for(i=65535;—i; )continue;/
    給予一定時間的延時,再進行下一輪接收*/
    }
    }

    8.7 單片機與PC機通信
    1 PC機編程
    PC采用Toubr C 進行編寫。程序如下:

    include

    define port 0x3f8 /利用串口1進行通信/

    int ch[15];
    main ()
    {
    int a;
    int i,j;
    int b[6]={88,15,38,26,20,0};
    char c;
    clrscr();
    outportb(port+3,0x80); /準備設置波特率/
    outportb(port,0x0C); /波特率設置為9600bps/
    outportb(port+1,0x00);
    outportb(port+3,0x03); /8位數據,無奇偶檢驗,1位停止位/
    outportb(port+1,0x00); /關中斷/
    inportb(port+5); /讀一次線路狀態寄存器,使其復位/
    for(;;){
    printf(“\t\tsend data or receive data: (s or r?)\n\n\n”);
    c=getchar();
    switch(c) {
    case ‘s’:
    case ‘S’: {
    while(!(inportb(port+5)&0x20));/發送保持器滿則等待/
    outportb(port,0x01); /否則發送數據01,通知單片機準備接收/
    for(i=0;i<6;i++){ /共發送6個數據/
    a=b[i];
    while(!(inportb(port+5)&0x20)) delay(100);/發送保持器滿,等待/
    outportb(port,a); /發送a/
    printf(“%d\n”,a); /顯示a/
    while(!(inport(port+5)&1)); /接收單片機送回的數據/
    ch[i]=inport(port); /保存/
    }
    delay(10);
    for(j=0;j<8;j++) printf(“\n%d\n”,ch[j]);/顯示接收的回送數據/
    getch();
    break;
    }
    case’r’: /接收數據/
    case’R’:{
    while(!(inportb(port+5)&0x20));
    outportb(port,0x02); /發送數據02,通知單片機發送數據/
    for(j=0;j<9;j++) { /共接收9個數據/
    while(!(inportb(port+5)&1));
    ch[j]=inportb(port);
    }
    for(j=0;j<9;j++) printf(“\n %d\n”,ch[j]);
    getch();
    break;
    }
    }
    }
    }

    刺激欲乱狂亲伦
  • <menu id="ugcm4"><strong id="ugcm4"></strong></menu>