PIC单片机通讯例程

合集下载

PIC单片机的C语言使用

PIC单片机的C语言使用

PIC单片机的C语言使用PIC(Perpheral Interface Controllers)单片机是一种高性价比的嵌入式处理器,也是应用最广泛的单片机之一、它们常常用于各种电子设备,例如家电、汽车、电子仪器仪表和医疗设备等。

PIC单片机的优点是具有较低的成本、低功耗和高性能。

在C语言中使用PIC单片机可以实现许多功能,例如控制输入输出、实现逻辑运算、实现算法等。

```c#include <xc.h>#include <pic.h>void mainTRISB=0x00;//将PORTB定义为输出口PORTB=0x00;//将PORTB的值初始化为0while(1)PORTB=0xFF;//将PORTB的值设置为全高电平__delay_ms(1000); // 延时1秒PORTB=0x00;//将PORTB的值设置为全低电平__delay_ms(1000); // 延时1秒}```上述示例程序中,我们使用了XC8编译器,它是一个用于编译PIC单片机C语言程序的开源编译器。

在以上代码中,我们将PORTB定义为输出口,然后在一个无限循环中将PORTB设置为全高电平,并延时1秒,然后将PORTB设置为全低电平,并再次延时1秒。

```c#include <xc.h>#include <pic.h>void mainADCON1=0x0F;//将ADCON1寄存器设置为模拟输入模式TRISB=0x00;//将PORTB定义为输出口PORTB=0x00;//将PORTB的值初始化为0while(1)ADCON0bits.GO = 1; // 启动A/D转换while(ADCON0bits.GO); //等待转换完成//读取A/D转换结果并进行温度转换int adcValue = ADRES;int temperature = (5 * adcValue) / 1023;PORTB = temperature; // 将温度值显示在PORTB上}```在以上代码中,我们首先将ADCON1寄存器设置为模拟输入模式,然后将PORTB定义为输出口,并初始化为0。

PIC单片机C语言编程实例一

PIC单片机C语言编程实例一
TRISC=0xD7;/*SDO引脚为输出,SCK引脚为输出*/
}
/*系统各输入输出口初始化子程序*/
voidinitial()
{
TRISA=0xDF;
TRISB=0XF0;/*设置与键盘有关的各口的数据方向*/
INTCON=0x00;/*关闭所有中断*/
data=0X00;/*待显示的寄存器赋初值*/
PORTA_5=0;/*LACK送低电平,为锁存做准备*/
}
/*SPI发送子程序*/
voidSPILED(int data)
{
SSPBUF=data;/*启动发送*/
do
{

}while(SSPIF==0);/*等待发送完毕*/
SSPIF=0;/*清除SSPIF标志*/
}
/*主程序*/
main()
{
data=table[j];/*获得需要送出显示的段码*/
RA5=0;/*LACK信号清0,为锁存做准备*/
SPILED(data);
RA5=1;/*最后给一个锁存信号,代表显示任务完成*/
}
/*中断服务程序*/
voidinterruptkeyint(void)
{
DELAY();/*软件延时*/
if ((RB5==0)||(RB4==0))/*该语句除了能够确认按键是否为干扰外,*/
}/*等待有键按下*/
DELAY();/*软件延时*/
if ((PORTB_5==0)||(PORTB_4==0))
KEYSERVE();/*如果仍有键按下,则调用键服务子程序*/
elsej=0x00;/*如果为干扰,则令返回值为0*/
return(j);
}

I2C24LC02C读写例程(PIC单片机)

I2C24LC02C读写例程(PIC单片机)

I2C24LC02C读写例程(PIC单片机)I2C 24LC02 C读写例程(PIC单片机)[单片机]发布时间:2008-04-22 10:11:001 I2C总线特点I2C总线最主要的优点是其简单性和有效性。

由于接口直接在组件之上,因此I2C总线占用的空间非常小,减少了电路板的空间和芯片管脚的数量,降低了互联成本。

总线的长度可高达25英尺,并且能够以10Kbps的最大传输速率支持40个组件。

I2C总线的另一个优点是,它支持多主控(multimastering),其中任何能够进行发送和接收的设备都可以成为主总线。

一个主控能够控制信号的传输和时钟频率。

当然,在任何时间点上只能有一个主控。

2 I2C总线工作原理I2C总线上的数据稳定规则,SCL为高电平时SDA上的数据保持稳定,SCL为低电平时允许SDA变化。

如果SCL处于高电平时,SDA 上产生下降沿,则认为是起始位,SDA上的上升沿认为是停止位。

通信速率分为常规模式(时钟频率100kHz)和快速模式(时钟频率400kHz)。

同一总线上可以连接多个带有I2C接口的器件,每个器件都有一个唯一的地址,既可以是单接收的器件,也可以是能够接收发送的器件。

每次数据传输都是以一个起始位开始,而以停止位结束。

传输的字节数没有限制。

最高有效位将首先被传输,接收方收到第8位数据后会发出应答位。

数据传输通常分为两种:主设备发送从设备接收和从设备发送主设备接收。

这两种模式都需要主机发送起始位和停止位,应答位由接收方产生。

从设备地址一般是1或2个字节,用于区分连接在同一I2C上的不同器件。

I2C总线在传送数据过程中共有三种类型信号,它们分别是:开始信号、结束信号和应答信号。

开始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。

结束信号:SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。

应答信号:接收数据的IC在接收到8bit数据后,向发送数据的IC 发出特定的低电平脉冲,表示已收到数据。

PIC单片机 串口通信程序

PIC单片机 串口通信程序
{
TXREG=RCREG; //把接收到的数据发送回去
}
}
#include<pic.h> //包含单片机内部资源预定义
__CONFIG(0xFF32);
//芯片配置字,看门狗关,上电延时开,掉电检测关,低压编程关,加密,4M晶体HS振荡
/****************************************************************************
TRISC=0XFF; //设置C口方向全为输出
SPBRG=0XC; //设置波特率为119200BPS
TXSTA=0X24; //使能串口发送,选择高速波特率
RCSTA=0X90; //使能串口工作,连功 能:主函数
* 入口参数:无
* 出口参数:无
* 说 明:无
****************************************************************************/
void main()
{
要判断中断源标志
****************************************************************************/
void interrupt usart(void)
{
if(RCIE&&RCIF) //判断是否为串口接收中断
RCIE=0X1; //使能接收中断
GIE=0X1; //开放全局中断
PEIE=0X1; //使能外部中断
while(1) //等待中断
/***************************************************************************************************

PIC单片机模拟异步串行通讯UART源程序

PIC单片机模拟异步串行通讯UART源程序

PIC单片机模拟异步串行通讯UART源程序用TMR0实现定时查询。

任何带中断的PIC上都可以实现。

可用此法扩展多个串口。

1.;|--------------------------------------------------------------|2.;| Implement duplex USART base on normal I/O pin |3.;| Using TIMER0 interrupt for bit timing |4.;| Tested on PIC16F83 running at 4MHz |5.;| Written by Paul Zhang, Microchip Tech Inc |6.;| 6 Aug, 2000 |7.;| All rights reserved |8.;|--------------------------------------------------------------|9.10.errorlevel -302 ;no bank warning11.errorlevel -301 ;no default file warning12.13.list p=16F83 ;define processor14.#include <p16F83.inc> ;15.16.__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _ XT_OSC17.;code protect = OFF18.;watchdog = OFF19.;power-up delay timer = ON20.;oscillator mode = XT21.22.;===============================23.;define RAM variables24.cblock 0x0c ;GPR start from 0x0c25.w_temp ;W context saving during interrupt26.status_temp ;STATUS context saving during inte rrupt27.pclath_temp ;PCLATH context saving during int errupt28.ART_F ;containing flags for USART30.RX_BUFF ;USART received data buffer31.TX_BUFF ;USART transmitting data buffer32.RX_SLICE ;RX bit-timing control33.TX_SLICE ;TX bit-timing control34.RX_bcnt ;RX received bit counting35.TX_bcnt ;TX transmitting bit counting36.RX_STA ;RX STATE-MACHINE controller37.TX_STA ;TX STATE-MACHINE controller38.endc39.40.;===============================41.;pre-definition for readability42.#define RX_PIN PORTA,2 ;assign RX pin43.#define TX_PIN PORTA,3 ;assign TX pin44.#define TXEN USART_F,0 ;USART transmit enable45.#define TXBUSY USART_F,1 ;USRAT transmit is in progress46.#define RXBF USART_F,2 ;USART receive buff full47.#define RXBUSY USART_F,3 ;USART receive is in progress48.#define RX_ERR USART_F,4 ;USART receive error49.#define TX_ERR USART_F,5 ;USART transmit error50.51.;===============================52.;define constant53.#define OSC_FREQ .4000 ;oscillator frequency in KHz54.#define BAUDRATE .240055.#define TMR0CONST .118 ;256-OSC_FREQ*1000/4/(BAUDRATE*3) + 256.57.;===============================58.;for my personal style59.#define skp0 btfsc60.#define skp1 btfss61.62.;******************************************************** ************** 0x00064.clrwdt65.goto MAIN ; go to beginning of program66.67.68.;================================== =====69.;Interrupt service routine 0x004 ; interrupt vector location71.72.movwf w_temp ; save off current W register cont ents73.movf STATUS,w ; move status register into W regis ter74.banksel status_temp75.movwf status_temp ; save off contents of STATUS r egister76.movf PCLATH,w77.movwf pclath_temp ; save off contents of PCLATH78.79.banksel INTCON ;select bank80.skp0 INTCON,T0IF ;test for TMR0 interrupt81.goto tmr0IntStart ;do TMR0 ISR82.;here test for any other interrupt source83.goto int_end84.85.tmr0IntStart ;TIMER0 interrupt service86.bcf INTCON,T0IF ;clear T0IF87.88.;====== start of RX =======89.movlw high($)90.movwf PCLATH ;set PCLATH before PCL change91.movf RX_STA,w ;get the state value for RX92.andlw 0x03 ;for safeguard purpose93.addwf PCL,f ;switch to STATE94.goto rxStartChk ;check for START bit95.goto rxReceiveBit ;receive DATA bit96.goto rxIdle ;wait for idle97.goto rxEnd ;do nothing98.rxStartChk ;check for START bit99.skp0 RX_PIN ;test RX pin for START bit100.goto rxEnd ;not found101.;start bit found. do following102.movlw .8103.movwf RX_bcnt ;count for 8 bits incoming data 104.movlw .4105.movwf RX_SLICE ;wait 4 time-slice for 1st data bit 106.movlw .1107.movwf RX_STA ;switch to STATE 1 for 1st data bi t sampling108.goto rxEnd109.rxReceiveBit ;receive DATA bit110.decfsz RX_SLICE,f ;wait of bit timing111.goto rxEnd112.;time to sample incoming data bit113.rrf RX_BUFF,f ;right shift for new bit space114.bcf RX_BUFF,7 ;pre-set to 0115.skp0 RX_PIN ;incoming data bit test116.bsf RX_BUFF,7 ;set if data bit = 1117.movlw .3 ;3 slice for data bit timing118.movwf RX_SLICE ;bit timing for next data bit119.decfsz RX_bcnt,f ;see if 8-bit completed120.goto rxEnd121.;bit receive completed, do follwoing122.movlw .2123.movwf RX_STA ;set to STATE 2 for idle waiting 124.bsf RXBF ;set receive buffer full125.movf RX_BUFF,w ;display data on PORTB126.movwf PORTB127.goto rxEnd128.rxIdle ;wait for idle129.skp0 RX_PIN ;try to find STOP bit130.clrf RX_STA ;back to STATE 0 for next byte 131.goto rxEnd132.;====== End of RX =========133.rxEnd134.;====== start of TX =======135.;do TX, if transmit is engaged136.skp1 TXEN ;skip if TXEN set, do TX137.goto tmr0IntEnd ;not in transmit mode138.movf TX_SLICE,f ;see if in bit-timing delay 139.skpnz ;140.goto txDo ;bit-timing completed141.decfsz TX_SLICE,f ;keep bit-timing delay142.goto txEnd143.txDo144.;Transmit STATE-MACHINE control145.movlw high($)146.movwf PCLATH ;set PCLATH before PCL change147.movf TX_STA,w ;get current state148.andlw 0x03 ;make sure in range149.addwf PCL,f ;switch to TX STATE150.goto txStartBit ;send START bit151.goto txDatBit ;send DATA bit152.goto txStop ;send STOP bit153.goto txIdle ;set transtim IDLE154.txStartBit ;TX_STA=0, send START bit here 155.bsf TXBUSY ;set TX busy flag156.movlw .8157.movwf TX_bcnt ;count for 8 bit transmitting 158.bcf TX_PIN ;start bit159.movlw .3160.movwf TX_SLICE ;set bit timing161.movlw .1162.movwf TX_STA ;set transmit STATE-MACHINE 163.goto txEnd164.txDatBit ;TX_STA=1, send DATA bit here 165.;time for next bit sending166.rrf TX_BUFF,f ;rotate bit to C167.skpnc ;test C168.goto $+3169.bcf TX_PIN ;0 out170.goto $+2171.bsf TX_PIN ;1 out172.movlw .3173.movwf TX_SLICE ;wait 3 time-slices174.decfsz TX_bcnt,f175.goto txEnd ;8 bit serial not end176.movlw .2177.movwf TX_STA ;set transmit STATE-MACHINE 178.goto txEnd179.txStop ;TX_STA=2, send STOP bit here180.bsf TX_PIN ;send STOP bit181.movlw .3182.movwf TX_SLICE ;set bit timing183.movlw .3184.movwf TX_STA ;set transmit STATE-MACHINE 185.goto txEnd186.txIdle ;TX_STA=3, reset transmission to IDLE187.bcf TXBUSY ;not busy188.bcf TXEN ;not in transmission189.clrf TX_STA ;reset transmit STATE-MACHINE190.goto txEnd191.;====== End of TX =========192.txEnd193.;add more TMR0 related code here194.tmr0IntEnd195.movlw TMR0CONST196.addwf TMR0,f197.goto int_end198.199.int_end200.banksel pclath_temp201.movf pclath_temp,w ; retieve copy of PCLATH regis ter202.movwf PCLATH203.movf status_temp,w ; retrieve copy of STATUS regi ster204.movwf STATUS ; restore pre-isr STATUS register contents205.swapf w_temp,f206.swapf w_temp,w ; restore pre-isr W register contents207.retfie ; return from interrupt208.209.210.;================================== =====211.;Code wriiten for test purpose212.MAIN213.banksel TRISA ;select respective bank214.movlw b'00000100' ;RA2-input, RA3-output215.movwf TRISA216.clrf TRISB217.movlw b'10001000' ;TMR0 in timer mode218.movwf OPTION_REG219.clrf STATUS ;make sure in bank 0220.221.call USART_INIT222.223.movlw TMR0CONST224.movwf TMR0225.226.movlw 0xff227.movwf PORTB228.229.bsf INTCON,T0IE230.bsf INTCON,GIE231.232.LOOP ;test code233.skp1 RXBF ;wait for data received234.goto $-1235.bcf RXBF ;clear data flag236.movf RX_BUFF,w237.movwf TX_BUFF ;send back received data238.bsf TXEN239.skp0 TXEN ;wait for transmit completion240.goto $-1241.goto LOOP ;242.243.244.245.;================================== =====246.;Initializtion of software USARTART_INIT248.clrf USART_F ;clear all flag bit249.clrf RX_STA ;reset STATE MACHINE250.clrf TX_STA251.bsf TX_PIN ;TX is in Idle252.return。

PIC单片机通用同步异步通信的应用

PIC单片机通用同步异步通信的应用

第8章通用同步/异步通信的应用8.5 单片机双机异步通信1 单片机PIC1编程(发送部分)#include<pic.h>/*该程序实现单片机双机异步通信功能,该程序是发送部分*/unsignedchartran[8];/*定义一个数组存储发送数据*/unsignedchark,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<pic.h>/*该程序实现单片机双机异步通信功能,该程序是接收部分,并把接收的数据显示在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位数*/voiddisplay(){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<pic.h>/*该程序实现单片机双机同步通信功能,是主控发送部分。

基于单片机的PCI总线通信功能设计

基于单片机的PCI总线通信功能设计

基于单片机的PCI总线通信功能设计————————————————————————————————作者:————————————————————————————————日期:郑州大学毕业设计(论文)题目:基于ARM的PCI总线通信功能设计指导教师:职称:学生姓名:学号:专业:院(系):完成时间:2011年5月25日年月日摘要本文详细介绍了基于AT91RM9200单片机的PCI总线通信功能的设计,包括硬件设计和软件设计两部分.通信功能的设计着重于单片机与上位机之间通过PCI总线进行的数据传送.本次设计在于用比较容易掌握的单片机来实现PCI控制器的功能,在PCI总线的简单运用场合,大大简化了设计的复杂程度。

设计的实现是利用单片机的I/O口与PCI 总线的控制信号线以及地址/数据信号线等直接相连,用对单片机的编程来控制数据的传输.文中介绍了PCI总线的基本概念,一些重要信号的定义,以及PCI总线事务的时序。

单片机部分介绍了型号的选择,选择了AT91RM9200单片机的理由和AT91RM9200单片机的基本知识.本次设计选择AM29LV160和57V561620作为AT91RM9200外接存储器。

设计的结果是成功的完成了原理图绘制和PCB版图的设计,和实验仿真。

关键词:PCI总线单片机AbstractThis paper introduces in detail the communication function design of the PCI bus based on AT91RM9200 MCU, including hardware design and software design。

Communication function design focuses on the data transfer between SCM and PC by PCI bus。

The design is to use MCU to realize the function of PCI controller,which is easier to master。

pic18系列单片机-汇编语言程序例程-AD

pic18系列单片机-汇编语言程序例程-AD

;程序实现A/D转换功能,A/D采用中断方式。

该程序通过单片机的RA2模拟通道送入;一直流电压,当送入的直流电压大于2.5V时,8个LED闪动,当直流电压恢复到2.5V以下;时,LED停止闪动。

为了防止干扰,本程序对直流电压采样10次后再作判断,中间的采样结;果用间接寻址的方式存取。

LIST P=18F458INCLUDE "P18F458.INC"TIMES EQU 0X20DEY EQU TIMES+1ACCALO EQU TIMES+2 ;ACCA为双精度加数寄存器ACCAHI EQU TIMES+3ACCBLO EQU TIMES+4 ;ACCB为双精度加法的结果寄存器ACCBHI EQU TIMES+5FLAG EQU TIMES+6DEYH EQU TIMES+7DEYL EQU TIMES+9BEGFSR EQU 0X30 ;间接寻址FSR的起始值(宏定义方式给出)ORG 0X0000GOTO MAINORG 0X0008GOTO INTSERVE ;转向中断服务子程序ORG 0X30;***双字节减法子程序,入口地址ACCB-ACCA,出口地址ACCB***D_SUBCALL NEG_A ;求ACCA的补码;***双字节加法子程序,入口地址ACCB+ACCA,出口地址ACCB***D_ADDMOVF ACCALO,0 ;ACCB和ACCA低半字节相加ADDWF ACCBLOBTFSC STA TUS,C ;有进位否?INCF ACCBHI ;有,ACCB高字节加1,再加ACCAHIMOVF ACCAHI,0 ;ACCA、ACCB高半字节相加ADDWF ACCBHIRETURN ;子程序返回;************** ACCA取补子程序*****************NEG_ACOMF ACCALO ;ACCALO取反加1INCF ACCALOBTFSC STA TUS,Z ;低8位有进位吗?DECF ACCAHI ;有,ACCAHI减1,再取反COMF ACCAHI ;否则ACCAHI直接取反RETURN ;子程序返回;*********初始化子程序***************INITIALCLRF INTCON ;禁止总中断和外围中断MOVLW 0X51MOVWF ADCON0 ;选择AD通道为RA2,且打开A/D转换器;在工作状态,且使AD转换时钟为8Tosc MOVLW 0X80MOVWF ADCON1 ;转换结果右移,即ADRESH寄存器的高6;位为"0",且把RA2口设置为模拟量输入式;(注意后面要把RA5改成数据I/O方式,以;输出显示琐存信号)BCF PIR1,ADIF ;清除A/D转换标志BSF PIE1,ADIE ;A/D转换中断允许BSF INTCON,PEIE ;外围中断允许BSF IPR1,ADIP ;B口变位中断高优先级BSF RCON,7 ;使能中断优先级BSF TRIS A,2 ;设置RA2为输入方式BCF TRIS A,5 ;置RA5为输出方式,以输出锁存信号BCF TRISC,5BCF TRISC,3 ;设置SCK与SDO为输出方式MOVLW 0XC0MOVWF SSPSTA T ;设置SSPSTA T寄存器MOVLW 0X30MOVWF SSPCON1 ;设置S PI的控制方式,允许SSP方式,并;且时钟下降沿发送,与"74HC595当其;SCLK从低到高电平跳变时,串行输入数据;(DI)移入寄存器"的特点相应CLRF FLAGRETURN;*********软件延时子程序****************DELAYMOVLW 0XFFMOVWF DEYHAGAIN1 MOVLW 0XFFMOVWF DEYLAGAIN2 NOPDECFS Z DEYLGOTO AGAIN2DECFS Z DEYHGOTO AGAIN1RETURN;*************** A/D中断服务子程序*****************INTSERVEBCF PIR1,ADIF ;清除A/D转换标志MOVF ADRES H,WMOVWF INDF0 ;读取并存储A/D转换结果的高两位INCF FSR0LMOVF ADRESL,WMOVWF INDF0INCF FSR0L ;读取并存储A/D转换结果的低8位DECF TIMES,1 ;A/D转换次数减1MOVLW 0X02MOVWF DEYLOOP13 DECFS Z DEY,1GOTO LOOP13 ;给予一定的延时,保证两次A/D转换期间;2Tad的间隔时间和电容的采样时间BSF ADCON0,2 ;启动下一次A/D转换RETFIE ;中断返回;********** LED闪烁报警子程序*************ALARMMOVLW 0X01XORWF FLAG,1BTFSS FLAG,0CALL DISPLAY0 ;调用显“0”子程序NOPBTFSC FLAG,0CALL DISPDARK ;调用显“DARK”子程序RETURN;**********显全0子程序*************DISPLAY0TRANS MIT ;SPI发送显示子模块CLRF POR TA ;LACK送低电平,为锁存做准备MOVLW 0X08MOVWF TIMESLOOP80 MOVLW 0XC0 ;显示值为0,C0H为0的段码MOVWF SSPBUF ;启动发送WAITBTFSS PIR1,SSPIFGOTO WAIT ;等待发送结束BCF PIR1,SSPIF ;清除中断标志DECFS Z TIMESGOTO LOOP80 ;一次要发送完8个数据BSF POR TA,5 ;最后给一个锁存信号,代表一次显示任务完成RETURN;**********显示全DARK子程序*************DISPDARKTRANS MIT1 ;SPI发送显示子模块CLRF POR TA ;LACK送低电平,为锁存做准备MOVLW 0X08MOVWF TIMESLOOP8D MOVLW 0XFF ;显示值为0,FFH为DARK的段码MOVWF SSPBUF ;启动发送WAIT1BTFSS PIR1,SSPIFGOTO WAIT1 ;等待发送结束BCF PIR1,SSPIF ;清除中断标志DECFS Z TIMESGOTO LOOP8D ;一次要发送完8个数据BSF POR TA,5 ;最后给一个锁存信号,代表一次显示任务完成RETURN;***************主程序******************MAIN NOPCALL INITIAL ;初始化LOOPMOVLW 0X80 ;转换结果右移,及ADRESH寄存器的高6位为"0";且把RA2口设置为模拟量输入式(注意后面要把; RA5改成数据I/O方式,以输出显示琐存信号) MOVWF ADCON1MOVLW BEGFSRMOVWF FSR0L ;给出间接寻址时FSR的初值MOVLW 0X0AMOVWF TIMES ;每一轮A/D连续采样10次BSF INTCON,GIE ;总中断打开,及可以进行A/D转换中断BSF ADCON0,2 ;启动A/D转换LOOP1 MOVF TIMES,WBTFSS STA TUS,ZGOTO LOOP1 ;等待A/D转换中断BCF INTCON,GIE ;A/D转换次数到10次,关闭中断NOPCLRF ACCBHICLRF ACCBLO ;双精度加法的结果寄存器清0,为后面准备MOVLW 0X0AMOVWF TIMESMOVLW BEGFSRMOVWF FSR0LLOOP15 MOVF INDF0,WMOVWF ACCAHIINCF FSR0LMOVF INDF0,WMOVWF ACCALOINCF FSR0LCALL D_ADDDECFS Z TIMESGOTO LOOP15NOP ;计算得到10次A/D转换的和MOVLW 0X84MOVWF ADCON1 ;把RA5设成数字I/O,以输出显示锁存信号MOVLW 0X14MOVWF ACCAHICLRF ACCALOCALL D_SUB ;通过双精度减判断模拟量是否达到报警限;度(1400H=200H*0AH,200H与2.5V对应) BTFSS ACCBHI,7CALL ALARM ;若ACCBHI的最高位为1,则证明减法结;果为负,即直流电压值超过2.5V,则报警NOPBTFSC ACCBHI,7CALL DISPLAY0 ;若没有超过2.5V,则不报警,8个LED;同时显示0CALL DELAY;软件延时,使电压检测不要过于频繁GOTO LOOP ;重复检测输入的直流电压值END。

PIC单片机通讯例程

PIC单片机通讯例程

1. 单片机PIC1编程(发送部分)LIST P=16F877#INCLUDE P16F876.INC CBLOCK 0X24 ;保留三个字节作为显示用COUNT ;作计数器或暂存器用ENDCORG 0X0000 ;程序复位入口NOPSTARTGOTO MAINORG 0X20MAINMOVLW 0X30 ;以下将RAM内容初始化MOVWF FSR ;从30H单元开始MOVLW 0X30 ;将值30H赋给单元30HMOVWF COUNTINTRAMMOVF COUNT,0 ;将30H~7FH赋给单元30H~7FHMOVWF INDFINCF COUNT,1INCF FSR,1BTFSS COUNT,7GOTO INTRAMBSF STATUS,RP0 ;将SCI部件初始化MOVLW 0X19 ;将传输的波特率设为约9600 bpsMOVWF SPBRGMOVLW 0X04 ;选择异步高速方式传输8位数据MOVWF TXSTABCF STATUS,RP0MOVLW 0X80 ;允许同步串行口工作BSF STATUS,RP0BSF TRISC,7 ;将RC6、RC7设置为输入方式,断绝与外接电路的连接BSF TRISC,6BCF STATUS,RP0MOVLW 0X30 ;30H作为同步字符发送MOVWF FSRMOVF INDF,0MOVWF TXREG ;将待发送的数据写入发送缓冲器TXREGBSF STATUS,RP0BSF TXSTA,TXEN ;发送允许BCF STATUS,RP0BSF RCSTA,CREN ;接收数据允许LOOPTXBTFSS PIR1,RCIF ;等待PIC2的响应字节GOTO LOOPTXMOVF RCREG,0 ;读响应字节,清RCIFLOOPTX1BTFSS PIR1,TXIF ;发送下一字节GOTO LOOPTX1INCF FSRMOVF INDF,0MOVWF TXREGBTFSS FSR,7 ;30H~7FH单元的内容是否发送完?GOTO LOOPTX ;没有,继续下一字节的发送BSF STATUS,RP0 ;如果是,则停止发送BCF TXSTA,TXENBCF STATUS,RP0 ;数据发送完毕CALL LED ;调用显示子程序,将发送的数据显示出来2. 单片机PIC2编程(接收部分)LIST P=16F876#INCLUDE P16F876.INC CBLOCK 0X24COUNTENDCORG 0X0000NOPSTARTGOTO MAINMAINBSF STATUS,RP0 ;初始化程序同发送子程序MOVLW 0X19 ;波特率设置与PIC1相同MOVWF SPBRGMOVLW 0X04 ;异步高速传输MOVWF TXSTABCF STATUS,RP0MOVLW 0X80 ;串行口工作使能MOVWF RCSTABSF STATUS,RP0BSF TRISC,7 ;与外接电路隔离BSF TRISC,6BCF STATUS,RP0MOVLW 0X30 ;从30H单元开始存放发送来的数据MOVWF FSRBSF RCSTA,CREN ;接收允许BSF STATUS,RP0BSF TXSTA,TXEN ;发送允许BCF STATUS,RP0WAITGOTO WAITMOVF RCREG,0 ;读取数据MOVWF INDF ;将接收到的响应字节存入PIC2的RAMINCF FSRMOVWF TXREG ;发送响应字节LOOPTXBTFSS PIR1,TXIF ;等待写入完成GOTO LOOPTXBTFSS FSR,7 ;全部数据接收否?GOTO WAIT1 ;没有,继续接收其它数据BCF RCSTA,RCEN ;接收完,则关断接收和发送数据允许BSF STATUS,RP0BCF PIE1,TXENBCF STATUS,RP0CALL LED ;调用显示子程序,将接受到的数据显示出来END ;程序完单片机双机同步通信1. 单片机PIC1编程(主控发送)LIST P=16F876#INCLUDE P16F876.INC CBLOCK 0X24 ;保留三个字节作为显示用COUNT ;作计数器或暂存器用ENDCORG 0X0000 ;程序复位入口NOPSTARTGOTO MAINORG 0X0100MAINMOVWF FSR ;以下将从30H单元开始的RAM内容初始化MOVLW 0X30 ;将值30H赋给单元30HMOVWF COUNTINTRAMMOVF COUNT,0 ;将30H~7FH赋给单元30H~7FHMOVWF INDFINCF COUNT,1INCF FSR,1BTFSS COUNT,7GOTO INTRAMBSF STATUS,RP0 ;将SCI部件初始化MOVLW 0X19 ;将传输的波特率设为约9600 bpsMOVWF SPBRGMOVLW 0X94 ;选择同步高速方式传输8位数据MOVWF TXSTABCF STATUS,RP0MOVLW 0X80 ;允许同步串行口工作MOVWF RCSTABSF STATUS,RP0BSF TRISC,7 ;将RC6、RC7设置为输入方式,断绝与外接电路的连接BSF TRISC,6BSF STATUS,RP0MOVLW 0X30 ;将从30H单元开始的内容传送到PIC2MOVWF FSRMOVF INDF,0MOVWF TXREG ;将待发送的数据写入发送缓冲器TXREGBSF STATUS,RP0BSF TXSTA,TXEN ;发送允许TX1BTFSS PIR1,TXIF ;等待上一个数据写完GOTO TX1INCF FSR ;准备发送下一个数据MOVF INDF,0MOVWF TXREG ;将新的数据写入TXREGBTFSS FSR,7 ;判断所有30H~7FH单元的内容是否发送完毕?GOTO TX1 ;没有,则继续发送其它字节TX2BTFSS PIR1,TXIF ;等所有要求发送的数据已经发送完,再额外GOTO TX2 ;写一个字节到TXREG,使最后一个数据能够顺利发送MOVWF TXREGNOP ;延时几个微秒后,关发送允许NOPNOPNOPNOPBSF STATUS,RP0BCF TXSTA,TXENBCF STATUS,RP0CALL LED ;调用显示子程序,将发送的数据显示出来END ;程序完2. 单片机PIC2编程(从动接收)LIST P=16F876#INCLUDE P16F876.INC CBLOCK 0X24COUNTENDCORG 0X0000NOPORG 0X0100MAINBSF STATUS,RP0MOVLW 0X10 ;选择同步从动方式MOVWF TXSTABCF STATUS,RP0MOVLW 0X80 ;串行口使能MOVWF RCSTABSF STATUS,RP0BSF TRISC,7 ;关断与外部电路的联系BSF TRISC,6BCF STATUS,RP0MOVLW 0X30 ;从30H单元开始存放接收的数据MOVWF FSRBSF RCSTA,CREN ;接收允许WAITBTFSS PIR1,RCIF ;等待接收GOTO WAITMOVF RCREG,0 ;读取接收到的数据MOVWF INDF ;将接收到的数据存入PIC2的RAM INCF FSRBTFSS FSR,7 ;所有的数据是否已接收完?GOTO WAIT ;没有,继续接收其它字节NOP ;延时数微秒后,清接收允许位NOPNOPNOPBCF RCSTA,RCEN单片机与PC机通信1. PC机编程 PC采用Toubr C 进行编写。

PIC单片机串口通讯程序

PIC单片机串口通讯程序
PDF 文件使用 "pdfFactory Pro" 试用版本创建
BSF RCSTA,CREN ;接收允许 BSF STATUS,RP0 BSF TXSTA,TXEN ;发送允许 BCF STATUS,RP0 WAIT BTFSS PIR1,RCIF ;等待接收数据 GOTO WAIT MOVF RCREG,0 ;读取数据 MOVWF INDF ;将接收到的响应字节存入 PIC2 的 RAM INCF FSR MOVWF TXREG ;发送响应字节 LOOPTX BTFSS PIR1,TXIF ;等待写入完成 GOTO LOOPTX BTFSS FSR,7 ;全部数据接收否? GOTO WAIT1 ;没有,继续接收其它数据 BCF RCSTA,RCEN ;接收完,则关断接收和发送数据允许 BSF STATUS,RP0 BCF PIE1,TXEN BCF STATUS,RP0 CALL LED ;调用显示子程序,将接受到的数据显示出来 END ;程序完
PIC 单片机串口通讯程序
单片机串口通讯是一个常用的程序模块。PIC 单片机是一款常用的单片机。在网 上搜索到一个 PIC 单片机串口通讯程序。这个 PIC 单片机串口通讯程序站长没有 验证,应该是正确的。假如大家有更好的 PIC 单片机串口通讯程序,请向我t 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); /*波特率设置为 9 600 bps*/ outportb(port+1,0x00); outportb(port+3,0x03); /*8 位数据位,奇偶检验,1 位停止位*/ outportb(port+1,0x00); /*关中断*/ inportb(port+5); /*读一次线路状态寄存器,使其复位*/ { 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));

PIC 单片机C语言实现RS232 串口通信

PIC 单片机C语言实现RS232 串口通信
PIC PIC 单片机做 RS232 串口通信实验(附调试通过程序) 先介绍一下串口通信基本知识。目前较为常用的串口有 9 针串口(DB9)和 25 针串口(DB25)。 最为简单且常用的是三线制接法,即地、接收数据和发送数据三脚相连,本文只涉及到最为 基本的接法,且直接用 RS232 相连。串口引脚定义如图 1 所示。
图4 现在,你已经可以自由发挥来接收 PC 机发过来的数据了,只要发挥你的想象力,定义好 PC 机和单片机两端的 数据通信协议,你可以做出任何通过电脑来对单片机进行控制的程序,实现各种各样的数据 传输,远程控制功 能,比如通过 PC 机来控制液晶显示、控制步进电机的转动、控制蜂鸣器奏乐等等,您也可 以将本期所讲的知识 与前几期所讲的关联起来,完成功能更多,更实用的具体应用实例。因此,到本期的学习, 我们已经可以将单 片机与 PC 相连,借助 PC 机强大而灵活的功能,就可以为我们解决各类实际生产及应用型 问题提供了方便。这一 期的内容我们就介绍到这里,增强型 PIC 实验板更多的学习内容,我们将在以后几期陆续 为大家作介绍,祝大 家学习顺利。 附录程序二: 说明:该程序是我参照上面试验说明,根据我的实验板改动后的程序。 /*****************************************************/ /*硬件:PIC18F5480 */ /*功能:完成 232 串口通讯,每传送一位数据,LED 显示+1*/ /*作者: /*[注]:完成!! */ /*****************************************************/ #include"pic18f4580.h" //-----------------------------------------------constunsignedchardisplay_numb[10]={0x3f,0x06,0x5b,0

用pic单片机实现usb通讯

用pic单片机实现usb通讯

工程设计报告设计题目:实现与PC机的USB通讯(需Windows驱动)学院:电子工程学院专业:电子信息工程班级:学号:姓名:电子邮件:日期: 2011年 12月 30 日成绩:指导教师:西 安 电 子 科 技 大 学电 子 工 程 学 院工 程 设 计 任 务 书学生姓名 指导教师 宁贝佳 职称 讲师 学生学号 专业 电子信息工程 题目 实现与PC 机的USB 通讯(需Windows 驱动) 任务与要求任务:用MCU 控制USB 驱动芯片,实现目标板与PC 通讯 要求:∙ 掌握MCU 的原理∙ 设计电路,绘制原理图及PCB 版图 ∙ 在面包板上实现电路开始日期 2011年 10月31日 完成日期2011年 12月30日 工程设计所在单位 电子工程系…………………………装………………………………订………………………………线………………………………………………………………一、应用背景简述USB(universal serial bus)全名为通用串行总线,它作为一种通用新标准在许多场合都崭露头角。

以往单片机下载程序一般都是通过串口实现的,麻烦不易操作。

而且很多的计算机数据处理都要经过传感器将数据传回,并做AD转换,这个时候就要通过单片机做数据的初步处理并将数据发回计算机。

这个设计就是为解决这些问题简易性而设计的。

通过这个设计,单片机与PC机的通讯会变得更加轻松简便,由于USB有热插拔、传输速率快、支持多个外设同时工作的特点,使得它的应用十分灵活。

USB共有4种传输模式:控制传输、同步传输、中断传输、批量传输,以适应不同设备的需要,因而非常适合市场上的各种需求。

二、微处理器简介设计用到的微处理器是PIC16F877A,PIC16F877A单片机是8 位单片机,具有Flash program程序内存功能,可以重复烧写,适合开发设计。

并且它具有数据总线和指令总线分离的哈佛结构,该结构具有执行效率高和速度快等优点。

PIC单片机-测试例程汇总

PIC单片机-测试例程汇总

目录:一、端口的定义与while(1)的使用二、延时1、通过语句延时程序(带参数)2、通过语句延时程序(不带参数)3、C程序延时时间计算4、keil时间调试三、外设1、单按键检测与蜂鸣器发声(可控制发几声)2、I2C端口模拟3、DS18B20数字温度传感器(数码管显示)-------------------------------------------------------------------------------一、端口的定义与while(1)的使用#include "pic.h"#define uchar unsigned char//宏定义#define uint unsigned int//宏定义__CONFIG(0x3B31);//定义配置字void delay();//延时子函数void main(){TRISA=0x00;ADCON1=0xf7; //将PORTA和PORTE口作为IO用PORTA=0x00;while(1){RA5=1;//AN功能口电平不能改变delay();RA5=0;delay();}}void delay(){uint a;//定义局部变量for(a=10;a>0;a--){ }}//PORTA和PORTE口作为IO用的定义//While(1)在这里作为一个大循环用,如果后面加“;”号,则程序将停在While(1)不往下执行。

-----------------------------------------------------------------------------------------------------------------二、延时1、通过语句延时程序(带参数)#include "pic.h"#define uchar unsigned char//宏定义#define uint unsigned int//宏定义__CONFIG(0x3B31);//定义配置字void delay(uint x);//声明子函数void main(){TRISD2=0;while(1){RD2=1;delay(5);//可以改变程序延时时间,当前5.04mSRD2=0;delay(5);//可以改变程序延时时间,当前5.04mS}}void delay(uint x)//4M晶振{uint a,b;for(a=x;a>0;a--)//完整嵌套如下{for(b=110;b>0;b--){};//分号加亦可,不加亦可};//分号加亦可,不加亦可}//在延时程序的前后两个地方设置断点(Breakpoints),再打开Stopwatch,然后全速运行两次-----------------------------------------------------------2、通过语句延时程序(不带参数)#include "pic.h"#define uchar unsigned char//宏定义#define uint unsigned int//宏定义__CONFIG(0x3B31);//定义配置字void delay();//声明子函数void main(){TRISD2=0;while(1){RD2=1;delay();//延时1.05mSRD2=0;delay();//延时1.05mS}}void delay()//4M晶振{uint a,b;for(a=10;a>0;a--)//for嵌套for(b=10;b>0;b--);}//在延时程序的前后两个地方设置断点(Breakpoints),再打开Stopwatch,然后全速运行两次-----------------------------------------------------------3、C程序延时时间计算void delay(){uint i;for(i=0;i<20000;i++);}我们怎么来算呢,先将20000转成16进制,得到4E20,然后将高字节4E乘以6得到十进制468,再将468+2=470,然后将十进制470*十六进制20(即十进制32)=15040;所心这个延时函数总共要执行15040个周期,假设所用的晶振为12MHZ,则该段函数总延时:15.04ms。

PIC单片机应用开发典型模块_第五章程序

PIC单片机应用开发典型模块_第五章程序

(1)串行通讯程序应用#include "16f873.h"#include "int16cxx.h"#define ENABLE 1#define DISABLE 0#define TRUE 1#define FAULT 0#define RECEIVE_EN 0#define TRANSFER_EN 1#pragma bit IO1 @ PORTB.5#pragma bit IO2 @ PORTB.6#pragma bit IO3 @ PORTB.7#pragma bit C_EN @ PORTC.2#pragma origin = 0x4uns8 rc_temp,rxbuf[8],uchCRCHi,uchCRCLo,addr,txbuf[8],receive_count,dis_hz,dis_current; uns8 set_hz,set_run;uns16 dis_error,dis_running;bit receive_ok,transfer_ok,_8ms_count_ok;/* Table of CRC values for high-order byte */const char auchCRCHi[] = {0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,0x80, 0x41, 0x00, 0xC1, 0x81, 0x40} ;/* Table of CRC values for low-order byte */const char auchCRCLo[] = {0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06,0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD, 0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09, 0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A, 0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4, 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3, 0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3,0xF2, 0x32, 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4,0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A, 0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29,0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED, 0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60,0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67, 0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F, 0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68, 0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, 0xBE, 0x7E, 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5, 0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71,0x70, 0xB0, 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92,0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C,0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B, 0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B,0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C, 0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42,0x43, 0x83, 0x41, 0x81, 0x80, 0x40} ;interrupt server(void){uns8 temp8;int_save_registers // W, STA TUS (and PCLATH)char sv_FSR=FSR;if(T0IF){TMR0=100; //8ms interruptPS2=1; //prescale value=1:256PS1=1; //5000KHz/256=19.53125KHz,19.53125K/156=0.125KHz(8ms)PS0=1;_8ms_count_ok=ENABLE;T0IF=0;}if(INTF){INTF=0;}if(TMR1IF){TMR2IF=0;}if(RCIF){rc_temp=RCREG;if(receive_ok==FAULT){if(_8ms_count_ok)receive_count=0;if(receive_count<8)rxbuf[receive_count]=rc_temp;if(receive_count==7 && addr==rxbuf[0])receive_ok=TRUE;receive_count++;}_8ms_count_ok=DISABLE;TMR0=100; //timer0 reset,count againRCIF=0;}if(SSPIF && SSPIE){SSPIF=0;}FSR=sv_FSR;int_restore_registers}page1 uns16 crc16(uns8 *puchMsg,uns8 crc_count){uns8 uindex;uns16 temp16;uchCRCHi=0xff;uchCRCLo=0xff;while(crc_count){uindex=uchCRCHi ^ *puchMsg;puchMsg++;uchCRCHi=uchCRCLo ^ auchCRCHi[uindex];uchCRCLo=auchCRCLo[uindex];crc_count--;}temp16=(uns16)uchCRCHi << 8;temp16=temp16 | uchCRCLo;return temp16;}page0 void main(void){uns8 i;uns16 temp16;TRISA=0b11111111;TRISB=0b00011111; //RB7(IO3) RB6(IO2) RB5(IO1)->output TRISC=0b10111011; //RC7(RX) RC6(TX) RC2(C_EN)->output IO1=0;IO2=0;IO3=0;addr=0x06;dis_hz=79;dis_current=80;dis_error=87;dis_running=85; //bit2->0=stop,1=run//bit14->0=FR,1=RR_8ms_count_ok=DISABLE;receive_ok=FAULT;transfer_ok=TRUE;receive_count=0;C_EN=RECEIVE_EN;BRGH=1;SYNC=0;SPEN=1;TXIE=0;RCIE=1;TX9=0; //8 data bit transferSPBRG=64; // baud rate=20M/16(64+1)=19230TXEN=1;CREN=1; //receive enableT0CS=0; //TIMER0 clock=Fosc/4=20MHz/4=5MHzTMR0=100; //256-156PSA=0; //使用预定标PS2=1; //预定标值=1:256PS1=1; //5000KHz/256=19.53125KHz,19.53125K/156=0.125KHz(8ms) PS0=1;T0IE=1; //TIMER0 使能PEIE=1;GIE=1;rxbuf[0]=0x11;rxbuf[1]=0x03;rxbuf[2]=0x00;rxbuf[3]=0x6b;rxbuf[4]=0x00;rxbuf[5]=0x03;rxbuf[6]=0x01;rxbuf[7]=0x02;i=0;while(1){if(receive_ok==TRUE){temp16=crc16(rxbuf,6);if(rxbuf[6]==temp16.high8 && rxbuf[7]==temp16.low8){switch(rxbuf[1]){case 0x03:txbuf[0]=rxbuf[0];txbuf[1]=rxbuf[1];txbuf[2]=2; //byte counttxbuf[3]=0; //data high byteswitch(rxbuf[3]){case 0:txbuf[4]=set_hz; //set hzbreak;case 85:txbuf[4]=set_run; //set runbreak;case 78: //display Hztxbuf[4]=dis_hz; //data low bytebreak;case 79: //display currenttxbuf[4]=dis_current; //data low bytebreak;case 84: //display running statetxbuf[3]=dis_running.high8; //高字节txbuf[4]=dis_running.low8; //低字节break;case 86: //display error codetxbuf[3]=dis_error.high8; //高字节txbuf[4]=dis_error.low8; //低字节}temp16=crc16(txbuf,5);txbuf[5]=temp16.high8;txbuf[6]=temp16.low8;transfer_ok=FAULT;break;case 0x06:txbuf[0]=rxbuf[0];txbuf[1]=rxbuf[1];txbuf[2]=rxbuf[2];txbuf[3]=rxbuf[3];txbuf[4]=rxbuf[4];txbuf[5]=rxbuf[5];txbuf[6]=rxbuf[6];txbuf[7]=rxbuf[7];switch(rxbuf[3]){case 0: //set Hzset_hz=rxbuf[5];break;case 85: //set runset_run=rxbuf[5];}transfer_ok=FAULT;}}receive_ok=FAULT;}if(TXIF && TRMT && transfer_ok==FAULT){C_EN=TRANSFER_EN;TXREG=txbuf[i];i++;if(i==7 && txbuf[1]==3){transfer_ok=TRUE;i=0;}if(i==8 && txbuf[1]==6){transfer_ok=TRUE;i=0;}}if(TRMT)C_EN=RECEIVE_EN;}}(2)单片机双机异步通信发送程序(PIC单片机1)#include <pic.h>unsigned char send[8]; /*定义数组存储发送数据*/unsigned char k; /*定义全局变量*//*不带小数点的显示段码表*//*给数组赋初值子程序*/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设置为输入方式,对外部呈高阻状态*/ }/*主程序*/main(){sciint();/*SCI部件初始化*/di();/*中断禁止*/TXEN=1;/*发送允许*/CREN=1;/*接收数据允许*/for(k=0;k<8;k++){TXREG=send[k];/*发出1个字符*/while(1){if(TXIF==1)break;} /*等待写入完成*/while(1){if(RCIF==1)break;/*若收到响应字节,则终止等待*/}RCREG=RCREG;/*读响应字节,清RCIF*/}while(1){;}}(3)单片机双机异步通信接收程序(PIC单片机2)#include <pic.h>unsigned char receive[8]; /*定义数组存储接收数据*/unsigned char i; /*定义通用寄存器*//*SCI部件初始化子程序*/void sciint(){SPBRG=0X19; /*波特率设置与PIC1相同,为约9 600位/秒*/TXSTA=0X04; /*异步高速传输*/RCSTA=0X80; /*串行口工作使能*/TRISC6=1;TRISC7=1; /*将RC6、RC7设置为输入方式,对外部呈高阻状态*/ }/*主程序*/main(){sciint(); /*SCI部件初始化*/di(); /*中断禁止*/CREN=1; /*接收允许*/TXEN=1; /*发送允许*/for(i=0; i<8; k++){while(1){if(RCIF==1)break;} /*等待接收数据*/receive[k]=RCREG; /*读取接收数据,同时清RCIF*/TXREG=rece[k]; /*发送接收到的数据*/while(1){if(TXIF==1)break;} /*等待写入完成*/}while(1){;}}(4)单片机双机同步通信发送程序(PIC单片机1)#include <pic.h>unsigned char send[8]; /*定义数组存储发送数据*/unsigned char k; /*定义通用寄存器*//*给发送数组赋初值子程序*/void fuzhi(){for(k=0; k<8; k++){send[k]=k;} /*发送8个数据*/}/*SCI部件初始化子程序*/void sciint(){SPBRG=200; /*将传输的波特率设为约9600位/秒*/TXSTA=0X90; /*选择主控方式*/RCSTA=0X80; /*允许同步串行口工作*/TRISC6=1;TRISC7=1; /*将RC6、RC7设置为输入方式,对外部呈高阻状态*/ }/*主程序*/main(){fuzhi(); /*给发送数组赋发送初值*/sciint(); /*SCI部件初始化*/di(); /*中断禁止*/TXEN=1; /*发送允许*/while(1){for(k=0; k<8; k++){TXREG=send[k]; /*发出1个字符*/while(1){if(TXIF==1)break;} /*等待上一个数据写入完成*/}} /*循环发送*/}(5)单片机双机同步通信接收程序(PIC单片机2)#include <pic.h>unsigned char receive[8]; /*定义一个数组存储接收数据*/unsigned char k; /*定义通用寄存器*/unsigned int i;/*SCI部件初始化子程序*/void sciint(){TXSTA=0X10; /*选择同步从动方式*/RCSTA=0X90; /*串行口工作使能*/TRISC6=1;TRISC7=1; /*将RC6、RC7设置为输入方式对外部呈高阻状态*/ }/*主程序*/main(){sciint(); /*SCI部件初始化*/di(); /*中断禁止*/CREN=1; /*接收允许*/for(k=0;k<8;k++)receive[k]=0x03;while(1){while(1){CREN=1; /*允许连续接收*/while(1){if(RCIF==1) break;} /*等待接收数据*/k=0;receive[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;} /*等待接收数据*/receive[k]=RCREG; /*读取接收数据*/if(OERR==1){ /*如果有溢出错误,则处理*/CREN=0;CREN=1;}rece[k]=rece[k]&0x0F; /*屏蔽高位,防止干扰*/}CREN=0;for(i=65535; --i;)continue;for(i=65535; --i;)continue; /*给予一定时间的延时,再进行下一轮接收*/ }}(6)USB通讯模块程序//联合体的定义typedef union-eppes flags{struct flags{UCHAR timer: l; //定时器标志UCHAR bus reset: 1; //总线复位标志UCHAR suspend: 1; //总线挂起标志UCHAR setup_packet:1; //建立包标志UCHAR remote wakeup:l ; //远程唤醒标志UCHARin isr:1; //D12中断处理标志UCHAR control state:2; //控制状态标志UCHAR configuration: l ; //配置状态标志}bits;USHORT value}EPPFLAGS;void outportb(UCHAR addr, UCHAR dta){UCHAR xdata *ext address;ext address=addr;*ext address=dta;}UCHAR inportb(UCHAR addr){UCHAR c;UCHAR xdata *ext address;extaddress=addr;c=*extesaddress;return c;}//命令接口函数V oid SetAddressEn(UCHARA ddress,UCHAR Enable); //设置地址使能V oid Set EndpointEn(UCHAR Enable); //设置端点使能V oid SetMode(UCHAR Config,UCHAR ClkDiv); //设置模式USHORT ReadlnterruptRegister(void); //读中断寄存器UCHAR SelectEndpoint(UCHARE ndp); //选择端点UCHAR ReadLastTransactionStatus(UCHAR Endp); //读最后处理状态void SetEndpointStatus(UCHARb Endp,UCHAR Stalled); //设置端点状态void Send Resume(void); //发送恢复UCHAR ReadEndpoint(UCHARe ndp,UCHAR* buf,UCHAR len);//读端点缓冲区UCHAR WriteEndpoint(UCHARe ndp,U CHAR* buf,U CHARt en);//写端点缓冲区以上所有命令都是通过调用底层函数实现的。

PIC单片机485通信发送

PIC单片机485通信发送

#include <pic.h>#define uchar unsigned char#define uint unsigned int__CONFIG(WDTDIS & LVPDIS & HS & PWRTDIS & BORDIS);//设置配置位// WDTDIS : disable watchdog timer// LVPDIS : low voltage programming disabled// HS : high speed crystal/resonator// PWRTDIS : disable power up timer// BORDIS : disable brown out reset#define RE RC3 //接收允许控制位#define DE RC2 //发送允许控制位//----------------定义全局变量const uchar disp[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//共阳数码管段码表uchar rece_data;uint counter ;uchar sec;/**************************函数声明******************************************/ void USART_Init(void);void DelayUS(uchar delay);void DelayMS(uint delay);void Display(uchar chosebit,uchar data);void init();//-----------------------------------------------------------------void DelayUS(uchar delay){while(--delay);}//-------------------------void DelayMS(uint delay){uint i;for(;delay>0;delay--)for(i=0;i<453;i++);}//--------------------------------void USART_Init(void){SPBRG = 77; //高速波特率9600 12MHz SPBRG = 0x4D// SPBRG = 129; //高速波特率9600 20MHzTXSTA = 0x04;// TXSTA : CSRC TX9 TXEN SYNC -- BRGH TRMT TX9D// 0 0 0 0 1 0 0RCSTA = 0x80;// RCSTA: SPEN RX9 SREN CREN ADDEN FERR OERR RX9D// 1 0 0 0 0 0 0 0RCIE = 1; //开接收中断TXEN = 1;CREN = 1; //接收使能TRISC6 = 1; //设置为输入状态TRISC7 = 1;// TXIE = 1; //开发送中断TRISC3 = 0; //设置为输出状态TRISC2 = 0;RE = 0;DE = 0;// PEIE = 1; //开外设中断// GIE = 1; //开总中断}//-------------------------------------------void init(){TRISD = 0x00; //RD口为输出模式;PORTD = 0xFF; //灯全灭//OPTION寄存器:RBPU INTEDG T0CS T0SE PSA PS2 PS1 PS0// 前两位定时器0未用,T0CS 为定时器工作方式选择位,1为计数方式从T0CK1取脉冲,// 0 为定时方式,选择内部时钟;T0SE 为计数方式时边沿触发方式选择位;PSA为分频器//分频选择位;0:分频器分配给T0 ,1:分配给看门狗WDT;PS2 PS1 PS0 为分频比选择位;// OPTION = 0x08; //定时器0 为定时方式,分频器分频给看门狗,而不分配给定时器0,OPTION = 0x01;//定时器0为定时方式,公频器分频给定时器0;分频为1:4TMR0 = 106; //定时器赋初值,定时200us 12M且分频比为1:4INTCON = 0xE0; //采用中断方式;开总中断及定时器0的中断,同时清T0IF;//INTCON寄存器:GIE PEIE T0IE INTE RBIE T0IF INTF RBIF// GIE 总中断;1 开全局总中断,0 为关闭;PEIE 外围中断位;1 为允许;T0IE:T0溢出中断//允许位;1为允许溢出中断。

三.PIC单片机应用实例

三.PIC单片机应用实例

关于用PIC单片机红外遥控的编码与解码的问题一般常用的红外遥控器编码规则都差不多,基本上都同6221原理一样(可在网上找到)接收时:如果用54,57这类片子做的话有一定的难度(假如要做成实时控制的;比如说你还要驱动显示,驱动步进电机,在加上几个按键)原因就是这类片子没有中断例程如下(用来解6221;分频比为256)RF:BTFSC PORTB,2;;B2口用做接收口GOTO RF1BTFSS DOWNBIT;;检测下降沿标制CLRF RTCCOUNTBSF DOWNBIT;制下降沿标制BTFSS UPBIT;;检测上升沿标制RETLW 0BTFSC IDBIT;;检测码头标制GOTO RF3MOVLW 2AHSUBWF RTCCOUNT,0BTFSS STATUS,0GOTO RF2MOVLW 36HSUBWF RTCCOUNT,0BTFSC STATUS,0GOTO RF2BTFSC IDBITGOTO RF3MOVLW .8MOVWF LOOPMOVLW .3MOVWF LOOPCOUNTCLRF DATACOUNTBSF IDBITBSF DOWNBITBCF UPBITCLRF RTCCOUNTRETLW 0RF1:BTFSS DOWNBITRETLW 0BSF UPBITRETLW 0RF2:BCF DOWNBITBCF UPBITBCF IDBITCLRF RTCCOUNTRETLW 0 ;遥控接收RF3:MOVLW 02HSUBWF RTCCOUNT,0BTFSS STATUS,0GOTO RF4MOVLW 0CHSUBWF RTCCOUNT,0BTFSS STATUS,0GOTO RF4GOTO RF2RF4:MOVLW 08HSUBWF RTCCOUNT,0BTFSC STATUS,0BSF 3H,0MOVLW 07HSUBWF RTCCOUNT,0BTFSS STATUS,0BCF 3H,0RLF DATACOUNT,1BSF DOWNBITBCF UPBITCLRF RTCCOUNTDECFSZ LOOP,1RETLW 0MOVLW .8MOVWF LOOPDECFSZ LOOPCOUNTRETLW 0BSF RFBIT;;制接收完标制BCF DOWNBITBCF UPBITBCF IDBITCLRF RTCCOUNTRETLW 0//////////////////////////////////////////////////////////TIME:BTFSC TIMEPD1GOTO TIME1MOVF RTCC,0;;(MOVWF TIMEONEBSF TIMEPD1RETLW 0 ;定时查寻TIME1:MOVF RTCC,0SUBWF TIMEONE,0BTFSC STATUS,2RETLW 0BCF TIMEPD1INCF RTCCOUNT,1RETLW 0////////////////////////////////////////////////在这里我是用查询的方式来定时的(RTCCOUNT)只是在解码时不需要去追求时间精度;我是去查RTCC有没有发生跳变如有则表示时间过了256US---RTCCOUNT加一;这样做有一个好处---你不必去管RTCC具体的值是多少,(RTCC去做精确的时钟定时;在这个查询的子程序中你可以去判断键扫,显示刷新,驱动步进电机等等)相应的C代码如下:unsigned char rfcount,loop,rftime,//查询定时器k;bit rfbit, //接收完标制lowbit1,lowbit2,downbit,rfgobit;unsigned char dispcount[5];//结果#define rfin RC6//////////////////////////////////////////////////////////////////////////////// rf( )//遥控接收{if(rfbit==0){if((lowbit1==0)&&(rfin==0)){downbit=1;rftime=0;lowbit1=1;return;}if((lowbit1==1)&&(rfin==1)){lowbit2=1;return;}if((lowbit1==1)&&(lowbit2==1)&&(RC6==0)) {lowbit1=0;lowbit2=0;if((rftime>=40)&&(downbit==1))//遥控接收;{rfgobit=1;loop=0;rfcount=0;k=1;rftime=0;return;}rfcount=rfcount+1;loop=loop+1;if(rfcount>=31){rfgobit=0;downbit=0;rfcount=0;rfbit=1;loop=0;return;}if((rftime>=7)&&(rfgobit==1)){dispcount[k]=dispcount[k]|0x80;rftime=0;if(loop==8){k=k+1;loop=0;return;}dispcount[k]=dispcount[k]>>1;return;}if((rftime<5)&&(rfgobit==1)){dispcount[k]=dispcount[k]&0x7f;rftime=0;if(loop==8){k=k+1;loop=0;return;}dispcount[k]=dispcount[k]>>1;return;}}}}(查询子程序同汇编)假如用中断的话也可用时间查询的方法,只是接收口改用带中断的口线;RB4--RB7,CCP1,CCP2,都可以。

PIC单片机自学笔记之LCD与MAX485通信

PIC单片机自学笔记之LCD与MAX485通信

PIC单片机笔记之LCD与MAX485通信实验环境:Proteus编程语言:汇编编程环境:MPLAB IDE单片机:PIC16F877晶振:4MHz实验目的:该实验旨在熟悉用PIC单片机控制LCD液晶显示的编程,并利用PIC单片机自身的USART模块实现MAX485通信的仿真设计,熟悉串口通信的编程和设置。

实验效果如下面图片:图(1)系统总图图(2)液晶接线图部分程序源代码ORG 0X0000GOTO MAINORG 0X0004MOVWF BWSW APF STA TUS,0CLRF STA TUSMOVWF BSTA TUSMOVF FSR,0MOVWF BFSRMOVF PCLA TH,0MOVWF BPCH;***************************以上是中断现场保护CLRF PCLA THBTFSS INTCON,5GOTO NT0INTBTFSC INTCON,2GOTO T0INTNT0INT: MOVLW PIE1MOVWF FSRBTFSS INDF,4GOTO INTOUTBTFSC PIR1,4GOTO TXINT;******************以上是中断源判别INTOUT: CLRF STA TUSMOVF BFSR,0MOVWF FSRMOVF BPCH,0MOVWF PCLA THSW APF BSTA TUS,0MOVWF STA TUSSW APF BW,1SW APF BW,0RETFIE;***********************************以上是中断现场恢复T0INT: BCF INTCON,2MOVLW 0X14MOVWF TMR0DECFSZ TM0DGOTO INTOUTMOVLW .200MOVWF TM0DDECFSZ TM0D1GOTO INTOUTMOVLW .20MOVWF TM0D1BSF PORTC,3BCF RCSTA,4BANKSEL TXSTABSF TXSTA,5BCF STA TUS,RP0GOTO INTOUT;********************************定时器0中断函数TXINT: MOVF LEN1,0SUBWF LEN,0BTFSC STA TUS,CGOTO TEXITADDLW 1BTFSC STA TUS,ZGOTO TINT1ADDLW 1BTFSC STA TUS,ZGOTO TINT2MOVLW STC1ADDWF LEN,0MOVWF FSRMOVF INDF,0MOVWF TXDA TATSEND: INCF LENBANKSEL TXSTABSF TXSTA,0;停止位BCF STA TUS,RP0MOVF TXDA TA,0MOVWF TXREGGOTO INTOUT;**************************8TINT1: MOVF CRCH,0MOVWF TXDA TAGOTO TSENDTINT2: MOVF CRCL,0MOVWF TXDA TAGOTO TSENDTEXIT: CLRF LEN;发送结束处理BCF PORTC,3BANKSEL TXSTABCF TXSTA,5BCF STA TUS,RP0BSF RCSTA,4GOTO INTOUT;***************************usart发送中断处理函数TCRC: ADDWF PCLDT "\r"TXTB: ADDWF PCLDT "COME ON.BOY!";****************************MAIN: CLRF INTCONCLRF PIR1CLRF PIR2BANKSEL TRISAMOVLW 0XC0MOVWF TRISBCLRF TRISDMOVLW 0X80MOVWF TRISCMOVLW 0X0FMOVWF OPTION_REGMOVLW 0X64MOVWF TXSTAMOVLW .25MOVWF SPBRG;波特率9600MOVLW 0X30MOVWF PIE1CLRF PIE2BANKSEL PORTAMOVLW 0X90MOVWF RCSTAMOVLW .1MOVWF TM0DMOVWF TM0D1CLRF LENMOVLW .15MOVWF LEN1MOVLW .12MOVWF COM1CLRF COM0MOVLW STC1ADDWF COM0,0MOVWF FSRMOVF COM0,0CALL TXTBMOVWF INDFINCF COM0DECFSZ COM1GOTO $-8CLRF COM0CLRF COM1MOVF COM0,0CALL TCRCMOVWF CRCLINCF COM0,0CALL TCRCMOVWF CRCHMOVLW 0X14MOVWF TMR0MOVLW 0XE0MOVWF INTCONBSF PORTC,3GOTO MAIN1;*********LCDA TA存要写入数据(指令或数据)LCDWC: CALL LCDBSY;每次写入数据前要进行‘忙检测BCF PORTC,LCDRSGOTO $+3LCDWD: CALL LCDBSYBSF PORTC,LCDRSBCF PORTC,LCDRWBSF PORTC,LCDEMOVF LCDA TA,0MOVWF PORTDCALL DELAYBCF PORTC,LCDECALL DELAYMOVLW H'06'XORWF PORTCRETURN;*******‘忙’检测**********LCDBSY: MOVLW TRISDMOVWF FSRMOVLW H'FF'MOVWF INDFMOVWF H'FF'MOVWF PORTDBCF PORTC,LCDRSBSF PORTC,LCDRWBSF PORTC,LCDEMOVF PORTD,0MOVWF LCDA TA1BCF PORTC,LCDEBTFSC LCDA TA1,7GOTO $-9CLRF INDFRETURNLCDTB: ADDWF PCL;数字ASCII码表DT "0123456789";LCDTB1: ADDWF PCLDT "TaiFengLaiLiao...";待显示字符串DELAY: MOVLW D'20'MOVWF DLAY1NOPNOPNOPNOPDECFSZ DLAY1GOTO $-4RETURN;*******************************MAIN1: MOVLW H'01';LCD初始化设置MOVWF LCDA TACALL DELAYMOVLW H'0C'MOVWF LCDA TACALL LCDWCMOVLW H'06'MOVWF LCDA TACALL LCDWCMOVLW H'38'MOVWF LCDA TACALL LCDWCMOVLW H'90'MOVWF LCDA TACALL LCDWC;******************lcd显示字符串MAIN2: MOVF TEMP,0CALL LCDTB1MOVWF LCDA TACALL LCDWDINCF TEMPMOVLW D'16'XORWF TEMP,0BTFSS STA TUS,ZGOTO MAIN2 LCDIS: GOTO $END。

PIC单片机I2C通信程序

PIC单片机I2C通信程序
#define PORTAIT(adr,bit) ((unsigned)(&adr)*8+(bit)) //*绝对寻址位操作指令*/
static bit PORTA_4 @ PORTAIT(PORTA,4);
static bit BF @ PORTAIT(SSPSTAT,0);
static bit TXSTA_5 @ PORTAIT(TXSTA,5); //*定义PORTB 0位*//
CHECKACKSTAT();
SSPBUF=0X00; //器件字节地址
CHECKSSPIF();
CHECKACKSTAT();
SSPBUF=0x00; //初始化控制状态寄存器
CHECKSSPIF();
CHECKSSPIF();
CHECKACKSTAT();
SSPBUF=0X00; //初始化时间状态寄存器01
CHECKSSPIF();
CHECKACKSTAT();
SSPBUF=0X00; //初始化时间状态寄存器02
DELAY1(1);
time[3]=SSPBUF;
SSPIF=0;
ACKDT=0;
ACKEN=1; //发送应答信号
while(ACKEN=LAY1(1);
time[4]=SSPBUF;
SSPIF=0;
USART(0x69);
USART(0x6d);
USART(0x65);
USART(0x20);
USART(0x69);
USART(0x73);
USART(0x20);
USART(0x30);
USART(((time[3]&0xc0)>>4)+0x37);//year
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1. 单片机PIC1编程(发送部分)LIST P=16F877#INCLUDE P16F876.INC CBLOCK 0X24 ;保留三个字节作为显示用COUNT ;作计数器或暂存器用ENDCORG 0X0000 ;程序复位入口NOPSTARTGOTO MAINORG 0X20MAINMOVLW 0X30 ;以下将RAM内容初始化MOVWF FSR ;从30H单元开始MOVLW 0X30 ;将值30H赋给单元30HMOVWF COUNTINTRAMMOVF COUNT,0 ;将30H~7FH赋给单元30H~7FHMOVWF INDFINCF COUNT,1INCF FSR,1BTFSS COUNT,7GOTO INTRAMBSF STATUS,RP0 ;将SCI部件初始化MOVLW 0X19 ;将传输的波特率设为约9600 bpsMOVWF SPBRGMOVLW 0X04 ;选择异步高速方式传输8位数据MOVWF TXSTABCF STATUS,RP0MOVLW 0X80 ;允许同步串行口工作BSF STATUS,RP0BSF TRISC,7 ;将RC6、RC7设置为输入方式,断绝与外接电路的连接BSF TRISC,6BCF STATUS,RP0MOVLW 0X30 ;30H作为同步字符发送MOVWF FSRMOVF INDF,0MOVWF TXREG ;将待发送的数据写入发送缓冲器TXREGBSF STATUS,RP0BSF TXSTA,TXEN ;发送允许BCF STATUS,RP0BSF RCSTA,CREN ;接收数据允许LOOPTXBTFSS PIR1,RCIF ;等待PIC2的响应字节GOTO LOOPTXMOVF RCREG,0 ;读响应字节,清RCIFLOOPTX1BTFSS PIR1,TXIF ;发送下一字节GOTO LOOPTX1INCF FSRMOVF INDF,0MOVWF TXREGBTFSS FSR,7 ;30H~7FH单元的内容是否发送完?GOTO LOOPTX ;没有,继续下一字节的发送BSF STATUS,RP0 ;如果是,则停止发送BCF TXSTA,TXENBCF STATUS,RP0 ;数据发送完毕CALL LED ;调用显示子程序,将发送的数据显示出来2. 单片机PIC2编程(接收部分)LIST P=16F876#INCLUDE P16F876.INC CBLOCK 0X24COUNTENDCORG 0X0000NOPSTARTGOTO MAINMAINBSF STATUS,RP0 ;初始化程序同发送子程序MOVLW 0X19 ;波特率设置与PIC1相同MOVWF SPBRGMOVLW 0X04 ;异步高速传输MOVWF TXSTABCF STATUS,RP0MOVLW 0X80 ;串行口工作使能MOVWF RCSTABSF STATUS,RP0BSF TRISC,7 ;与外接电路隔离BSF TRISC,6BCF STATUS,RP0MOVLW 0X30 ;从30H单元开始存放发送来的数据MOVWF FSRBSF RCSTA,CREN ;接收允许BSF STATUS,RP0BSF TXSTA,TXEN ;发送允许BCF STATUS,RP0WAITGOTO WAITMOVF RCREG,0 ;读取数据MOVWF INDF ;将接收到的响应字节存入PIC2的RAMINCF FSRMOVWF TXREG ;发送响应字节LOOPTXBTFSS PIR1,TXIF ;等待写入完成GOTO LOOPTXBTFSS FSR,7 ;全部数据接收否?GOTO WAIT1 ;没有,继续接收其它数据BCF RCSTA,RCEN ;接收完,则关断接收和发送数据允许BSF STATUS,RP0BCF PIE1,TXENBCF STATUS,RP0CALL LED ;调用显示子程序,将接受到的数据显示出来END ;程序完单片机双机同步通信1. 单片机PIC1编程(主控发送)LIST P=16F876#INCLUDE P16F876.INC CBLOCK 0X24 ;保留三个字节作为显示用COUNT ;作计数器或暂存器用ENDCORG 0X0000 ;程序复位入口NOPSTARTGOTO MAINORG 0X0100MAINMOVWF FSR ;以下将从30H单元开始的RAM内容初始化MOVLW 0X30 ;将值30H赋给单元30HMOVWF COUNTINTRAMMOVF COUNT,0 ;将30H~7FH赋给单元30H~7FHMOVWF INDFINCF COUNT,1INCF FSR,1BTFSS COUNT,7GOTO INTRAMBSF STATUS,RP0 ;将SCI部件初始化MOVLW 0X19 ;将传输的波特率设为约9600 bpsMOVWF SPBRGMOVLW 0X94 ;选择同步高速方式传输8位数据MOVWF TXSTABCF STATUS,RP0MOVLW 0X80 ;允许同步串行口工作MOVWF RCSTABSF STATUS,RP0BSF TRISC,7 ;将RC6、RC7设置为输入方式,断绝与外接电路的连接BSF TRISC,6BSF STATUS,RP0MOVLW 0X30 ;将从30H单元开始的内容传送到PIC2MOVWF FSRMOVF INDF,0MOVWF TXREG ;将待发送的数据写入发送缓冲器TXREGBSF STATUS,RP0BSF TXSTA,TXEN ;发送允许TX1BTFSS PIR1,TXIF ;等待上一个数据写完GOTO TX1INCF FSR ;准备发送下一个数据MOVF INDF,0MOVWF TXREG ;将新的数据写入TXREGBTFSS FSR,7 ;判断所有30H~7FH单元的内容是否发送完毕?GOTO TX1 ;没有,则继续发送其它字节TX2BTFSS PIR1,TXIF ;等所有要求发送的数据已经发送完,再额外GOTO TX2 ;写一个字节到TXREG,使最后一个数据能够顺利发送MOVWF TXREGNOP ;延时几个微秒后,关发送允许NOPNOPNOPNOPBSF STATUS,RP0BCF TXSTA,TXENBCF STATUS,RP0CALL LED ;调用显示子程序,将发送的数据显示出来END ;程序完2. 单片机PIC2编程(从动接收)LIST P=16F876#INCLUDE P16F876.INC CBLOCK 0X24COUNTENDCORG 0X0000NOPORG 0X0100MAINBSF STATUS,RP0MOVLW 0X10 ;选择同步从动方式MOVWF TXSTABCF STATUS,RP0MOVLW 0X80 ;串行口使能MOVWF RCSTABSF STATUS,RP0BSF TRISC,7 ;关断与外部电路的联系BSF TRISC,6BCF STATUS,RP0MOVLW 0X30 ;从30H单元开始存放接收的数据MOVWF FSRBSF RCSTA,CREN ;接收允许WAITBTFSS PIR1,RCIF ;等待接收GOTO WAITMOVF RCREG,0 ;读取接收到的数据MOVWF INDF ;将接收到的数据存入PIC2的RAM INCF FSRBTFSS FSR,7 ;所有的数据是否已接收完?GOTO WAIT ;没有,继续接收其它字节NOP ;延时数微秒后,清接收允许位NOPNOPNOPBCF RCSTA,RCEN单片机与PC机通信1. PC机编程 PC采用Toubr C 进行编写。

程序如下:#include<stdio.h>#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); /*波特率设置为9 600 bps*/outportb(port+1,0x00);outportb(port+3,0x03); /*8位数据位,奇偶检验,1位停止位*/ outportb(port+1,0x00); /*关中断*/inportb(port+5); /*读一次线路状态寄存器,使其复位*/{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))。

相关文档
最新文档