PIC串口通信程序

合集下载

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单片机中断系统详细汇总

PIC单片机中断系统详细汇总
详细描述
随着物联网、人工智能等技术的发展,中断系统与其他系 统的融合成为未来的发展方向。
在物联网和人工智能应用中,设备需要实时响应各种事件 ,如传感器数据变化、网络数据包到达等。因此,将中断 系统与操作系统、网络协议栈等其他系统进行融合,可以 实现更高效的事件处理和资源调度,提高系统的实时性和 可靠性。
串行通信中断的配置
需要设置串行通信的波特率、数据位、停止位、奇偶 校验等参数,以及中断触发方式。
串行通信中断的应用
在RS-232、RS-485、SPI等串行通信协议中广泛应 用。
外部事件中断
外部事件中断
01
用于实现外部事件触发中断,例如按键按下、传感器触发等。
外部事件中断的配置
02
需要设置外部事件的检测方式、触发条件以及中断处理程序。
中断的作用:提高CPU的效率,实现对外部事件的实时响应 和处理。
PIC单片机的中断源
外中断
由外部硬件设备产生的中断,例如定 时器溢出、串口接收数据等。
内中断
由单片机内部硬件产生的中断,例如 比较器匹配、捕获比较器等。
中断优先级和向量
中断优先级
用于标识不同中断的优先级,优先级高的中断会优先得到处理。
中断处理程序执行
一旦PIC单片机响应中断,它会跳转 到相应的中断向量表地址,执行中断 处理程序。
中断返回和清除
中断返回
中断处理程序执行完毕后,PIC单片机会自动返回到被中断的程序继续执行。
中断清除
某些中断源在响应后会自行清除中断标志位,而有些则需要手动清除。
03
PIC单片机中断系统的应用
定时器中断
中断处理程序应遵循一定的编写规范,以确 保程序正确、稳定地运行。例如,应避免在 中断处理程序中进行耗时的操作,以减小对 系统性能的影响。

PIC18串口通讯程序举例

PIC18串口通讯程序举例
PIC18 串口通讯程序举例
#include <p18cxxx.h> #pragmaconfigOSC=HS,OSCS=OFF #pragmaconfigPWRT=OFF,BOR=OFF #pragmaconfigWDT=OFF #pragmaconfigDEBUG=ON #pragmaconfigLVP=OFF volatile unsigned charreceiver_buffer; void usart_isr(void); #pragma code low_vector=0x18 void low_interrupt (void) {_asm
回复 1 说明 620213 该程序是为客户做培训的时候做的例子,经 ICD2 原装 DEMO 板上测试通过, 接收到 PC 机的 0x55 后就点 D 灯并发送 0x55 到 PC
回复 2 PIC18 串口通讯程序举例 620214 #pragma code low_vector=0x18 void low_interrupt (void) {_asm goto usart_isr**************** _endasm } #pragma code 中断里直接跳转有隐患,编译程序在结束中 断时,会恢复 status 和 bsr,跳转过去后恢复 结果不对。
回复 3 楼上多虑了 620215 这是用 MPLAB C18 写的程序,中断入口就 是要求放一个 GOTO 跳转指令,中断服务函 数用关键词定义,如程序中的:
#pragma interruptlow usart_isr void usart_isr (void) {receiver_buffer=RCREG;} C18 编译器检测到 interrupt 或 interruptlow 关键词,会为该中断函数产生保护现场及恢 复现场的代码的。

PIC之ICSP详解

PIC之ICSP详解

PIC之ICSP详解PIC之ICSP详解ICSP,全称In-Circuit Serial Programming,在线串行编程。

这行英文和ICSP这四个字母,一般使用时都带有TM标记的,也就是说,这是MICROCHIP的商标。

也是MC独有的吧。

呵呵。

从名字可以看出来,ICSP是一种编程方法,也就是说是一种烧写手段。

这种手段可以在线烧写——即不需要将芯片取下就可以在板子上烧写。

而这种烧写方法使用串行的数据。

在线烧写其实也不是什么新闻了,大家熟悉的TI的DSP,一向可以使用JTAG口进行烧写,那就是标准的在线烧写。

MC的ICSP,使用起来极为方便,应用ICSP进行烧写,只需要使用芯片上的5个脚就可以,其中包括VDD VSS,这两个电源一定要供上。

然后就是VPP编程电压,这个是肯定的,对FLASH进行烧写,当然需要高一点的电压。

随后就是输入的数据和时钟两个脚。

一般是PORTB口的RB6和RB7——当然,那些不分PORT只有GPIO的芯片请参看DATASHEET找到相应的ICSP口——那么也就是说,其实,真正的和烧写数据有关的就两个脚。

标准的串行的风格呢,呵呵。

其原理,MICROCHIP官方没有说的太多,只是对每一种芯片都给了一个Programming Specification。

上面详细给出了通过ICSP方式连接芯片时,对芯片内存储空间操作的各指令的具体形式。

从那些文档中推断,我们可以简单的认为在PIC芯片中,烧写模式下,FLASHROM和外部接口之间有一个“处理接口”,该接口从外部通过串行方式接收命令,移位译码后进行外部设备需要的操作,随后如需要结果的话就把结果同样串行输出。

当然实际上这个所谓的接口可能只是一块电路。

但是可以肯定的是,FLASH并不是暴露在外直接和外界连接的,而是先要连到ICSP模块,然后才能连上外界。

这就有个好处,就是加密安全性的问题。

因为FLASHROM并不是直接和外界相连,所以外界如果要读取FLASHROM内部的内容,正常情况下就必须通过ICSP模块。

PIC单片机之RS232串口通信篇

PIC单片机之RS232串口通信篇

PIC单片机之RS232串口通信篇大家是否觉得这样一个单片机系统似乎缺少点什么呢?不错,本期我们将介绍单片机与电脑通讯,使单片机与PC 机能够联机工作。

单片机除了需要控制外围器件完成特定的功能外,在很多应用中还要完成单片机和单片机之间、单片机和外围器件之间,以及单片机和微机之间的数据交换和指令的传输,这就是单片机的通信。

单片机的通信方式可以分为并行通信和串行通信。

并行方式传送一个字节的数据至少需要8 条数据线。

一般来讲单片机与打印机等外围设备连接时,除8条数据线外,还要状态、应答等控制线,当传送距离过远时电线要求过多,成本会增加很多。

单片机的串行通信方法较为多样,传统的串行通信方式是通过单片机自带的串行口进行RS232 方式的通信。

串行通信是以一位数据线传送数据的位信号,即使加上几条通信联络控制线,也比并行通信用的线少。

因此,串行通信适合远距离数据传送,如大型主机与其远程终端之间,处于两地的计算机之间,采用串行通信就非常经济。

串行通信又分为异步传送和同步传送两种基本方式。

异步通讯:异步通信传输的数据格式一般由1个起始位、7 个或8 个数据位、1 到2 个停止位和一个校验位组成。

它用一个起始位表示字符的开始,用停止位表示字符的结束。

其每帧的格式如图1 所示。

在一帧格式中,先是一个起始位0,然后是8个数据位,规定低位在前,高位在后,接下来是奇偶校验位(可以省略),最后是停止位1。

用这种格式表示字符,则字符可以一个接一个地传送。

在异步通讯中,通信双方采用独立的时钟,起始位触发双方同步时钟。

在异步通信中CPU 与外设之间必须有几项约定,即每一帧位数,字符格式和波特率。

字符格式的规定是双方能够在对同一种0 和1 的数据串理解成同一种意义。

原则上字符格式可以由通讯的双方自由制定,但从通用、方便的角度出发,一般还是使用一些标准为好,如采用ASCII 标准。

同步通讯:在同步通讯中所传输的数据格式是由多个数据组成,每帧有一个或两个同步字符作为起始位以触发同步时钟开始发送或接收。

PIC学习笔记

PIC学习笔记

1. 串行异步通信将TXSTA寄存器的TXEN 位置 1 可使能EUSART 的发送器电路。

清零TXSTA 寄存器的SYNC 位可将EUSART配置为异步操作。

将RCSTA寄存器的SPEN 位置 1 可使能EUSART 并自动将TX/CK I/O 引脚配置为输出。

如果需要中断,将PIE1寄存器的TXIE中断允许位置1。

如果INTCON 寄存器的GIE 和PEIE位也置1,则立即产生中断TXREG中有数据,而且串口还在传数据,这是TXIF才被清零,其他时间都为1TSR 寄存器为空时,TRMT 位置1,当有字符从TXREG传送到TSR寄存器时,该位清零TRISC = 0; //设置IO通道,0->输出1->输入PORTC = 0; //IO口赋值操作//串口初始化函数void InitUart(void){//配置发送状态7=内部时钟6=8位数据5=使能发送4=异步2=高速(重要)TXSTA = 0b10100110;//1=使能串口RCSTA = 0b10000000;//波特率设置4=16位波特率(与TXSTA 第2位对应)BAUDCON = 0b00001000;SPBRG = 103;//4MHz 9600 Baud//TXIE = 1; //允许串口中断}//串口发送数据void SendUart(unsigned char dat){TXREG = dat;while(!TRMT);}串口接收:自动波特率检测:总结:波特率必须准确,虽然只用发送功能,但是接受寄存器RCSTA也需设置,使能串口。

PWM:标准PWM 模式会在CCPx 引脚上产生高达10位分辨率的脉宽调制(PWM)信号。

由下列寄存器控制周期、占空比和分辨率:•PRx 寄存器•TxCON 寄存器•CCPRxL 寄存器•CCPxCON 寄存器对应位清零将放弃PWM控制权引脚需设置为输出配置CCPTMRSx 寄存器的CxTSEL<1:0>位可以选择要使用的Timer2/4/6 定时器。

pic单片机modbus的c程序

pic单片机modbus的c程序

pic单片机modbus的c程序对于PIC单片机的Modbus C程序,通常涉及到串口通信和Modbus协议的实现。

在这个C程序中,你需要首先初始化串口通信模块,然后实现Modbus协议的各个功能码,比如读取保持寄存器、写单个寄存器等。

以下是一个简单的示例来实现Modbus的读保持寄存器功能码:c.#include <pic.h>。

#include <stdio.h>。

// 初始化串口。

void initSerial() {。

// 设置波特率。

SPBRG = 25; // 9600波特率。

TXSTAbits.BRGH = 1; // 高波特率模式。

// 启用串口。

RCSTAbits.SPEN = 1; // 使能串口。

TXSTAbits.TXEN = 1; // 使能发送。

RCSTAbits.CREN = 1; // 使能接收。

}。

// Modbus读保持寄存器功能码处理函数。

void modbusReadHoldingRegisters() {。

// 读取寄存器的逻辑代码。

// ...}。

void main() {。

initSerial(); // 初始化串口。

while(1) {。

// 接收Modbus请求。

// 解析Modbus请求功能码。

// 根据功能码调用相应的处理函数。

// 发送响应数据。

}。

}。

在实际的程序中,你还需要根据具体的硬件和Modbus协议的要求来完善串口通信的初始化和Modbus功能码的实现。

同时,还需要考虑到单片机的性能和资源限制,以及错误处理、超时处理等情况。

希望这个简单的示例能够帮助你开始编写PIC单片机的Modbus C程序。

PIC单片机与触摸屏串行通信MODBUS协议

PIC单片机与触摸屏串行通信MODBUS协议

PIC单片机与触摸屏串行通信MODBUS协议技术分类:嵌入式系统微处理器与DSP | 2006-02-12来源:CE china工控中经常需要观察系统的运行状态或者修改运行参数。

触摸屏能够直观、生动地显示运行参数和运行状态,而且通过触摸屏画面可以直接修改系统运行参数,人机交互性好。

单片机广泛应用于工控领域中,与触摸屏配合,可组成良好的人机交互环境。

触摸屏和单片机通信,需要根据触摸屏采用的通信协议为单片机编写相应的通信程序。

Modbus协议是美国Modicon公司推出的一种有效支持控制器之间以及控制器经由网络(例如以太网)和其它设备之间进行通信的协议。

本文以PIC16F877单片机和人机电子有限公司的eView MT510T 型触摸屏为例,介绍其通信程序的开发过程。

1 系统结构实现触摸屏与单片机的通讯,主要是解决通讯协议的问题。

本文使用开放的Modbus 通讯协议,以触摸屏作主站,单片机作从站。

eView触摸屏本身支持Modbus通讯协议,如果单片机也支持Modbus协议,就可以进行通信了。

触摸屏与单片机之间采用的RS-232C兼容接口直接连接,传输速率设置为9600kb/s。

图1为该系统的电路图。

将PIC16F877单片机RC6、RC7口设置为异步串行通信模式,经过MAX232芯片将TTL 电平转换为RS232电平,再与eView触摸屏PLC[RS-232]接口相连,即完成了硬件连接。

eView 触摸屏PLC[RS-232]接口的管脚2为TXD,管脚3为RXD。

2 Modbus通信协议介绍Modbus通信协议是一种串行的主从通信协议,网络里仅有一台设置可作为主机(称Master),其它设备作为从机(称Slaver),主机不需编号,从机必须编号。

协议定义了主机查询及从机应答的信息帧格式。

通信时,主机首先向从机发出请求信息,符合相应地址码的从机接收通讯命令,并除去地址码,读取信息,如果没有出错,则执行相应的任务,然后把执行结果返给主机。

PIC单片机I2C从模式程序

PIC单片机I2C从模式程序

//I2C从模式(适用用于PIC16F1705/1708/1709)//函数初始化与主体函数,经过反复检验,程序OK,程序贴出来帮助和我同样曾经迷惑的人们. //如有疑问可以联系我,QQ:370886719 ………给更多的人照亮道路void i2c_slave_init(void){ANSA4=0;ANSA2=0;WPUAbits.WPUA2 = 0;WPUAbits.WPUA4 = 0;RA4PPS=0X10; //CLKRA2PPS=0X11; //SDASSP1CON1bits.SSPM0 = 0;SSP1CON1bits.SSPM1 = 1;SSP1CON1bits.SSPM2 = 1;SSP1CON1bits.SSPM3 = 0; // I2C slave mode ,7bit addressSSP1CON1bits.CKP = 1; // enable clocSSP1STAT =0;SSP1MSK=0XFE; //允许数据地址匹配SSPCON2bits.SEN=1;SSPCON3bits.SDAHT=1;SSPCON3bits.SBCDE = 1; // Enable slave bus collision detect interrupts//SSPCON3bits.AHEN=1; ////////////////////////////////SSPCON3bits.DHEN=1; /////////////////////////////SSPCON3bits.BOEN=1;PIR1bits.SSP1IF = 0; // Clear the serial port interrupt flagPIR2bits.BCL1IF = 0; // Clear the bus collision interrupt flagPIE2bits.BCL1IE = 1; // Enable bus collision interruptsPIE1bits.SSP1IE = 1;//Enabe interrupt MSSPINTCONbits.PEIE = 1;INTCONbits.GIE = 1;}#include"proc.h"//#include <stdio.h>//#include <stdlib.h>//#define RX_BUF_LEN 16#define while_delay 10000u8i2c_address,word_address,array_receive_x[32]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,1 9,20,21,22,23,24,25,26,27,28,29,30,31};u8array_receive_y[32]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27, 28,29,30,31};u8 Register_flow[5]={10,1,2,3,4};u8 Register_temp[9]={36,1,2,3,4,5,6,7,8};u8 Register[17];u8 i2c_counter,RX_BUF_LEN,TX_BUF_LEN;bit read_temp_F,receive_data_end_F;/***********************************************************************/void i2c_slave_tx(void){u16 timercounter;PIR2bits.BCL1IF = 0; // Clear the bus collision interrupt flag//asm("nop");asm("nop");asm("nop");asm("nop");if(SSP1STATbits.R_nW ==0)//Read operation.{PIR1bits.SSP1IF = 0;i2c_address = SSP1BUF;//i2c_counter = word_address; //得到要发送的数据地址i2c_counter = 0;if(read_temp_F==0){TX_BUF_LEN=5; //发送5个温度相关数据给上位机while(i2c_counter < TX_BUF_LEN){SSP1BUF=Register_flow[i2c_counter]; //send datatimercounter=while_delay;while( PIR1bits.SSP1IF == 0){timercounter--;if(timercounter==0){return;}}//waiting for ~`ACKPIR1bits.SSP1IF = 0;asm("nop");asm("nop");asm("nop");asm("nop");if(SSP1CON2bits.ACKSTAT == 1) //主机没有应答{return ; //NOACK}else{i2c_counter++;//ACK}}SSP1IF = 0;}else //协议切换,发送流量传感器数据给上位机{TX_BUF_LEN=9; //发送5个温度相关数据给上位机while(i2c_counter < TX_BUF_LEN){while( PIR1bits.SSP1IF == 0){timercounter--;if(timercounter==0){return;}}//waiting for ~`ACKPIR1bits.SSP1IF = 0;asm("nop");asm("nop");asm("nop");asm("nop");if(SSP1CON2bits.ACKSTAT == 1) //主机没有应答{return ; //NOACK}else{i2c_counter++;//ACK}}SSP1IF = 0;read_temp_F=0;}}}/*****************************************************************/void i2c_salve_rx(void) //master writer{if(SSP1STATbits.R_nW ==0){PIR1bits.SSP1IF = 0;i2c_address = SSP1BUF;// timercounter=while_delay;/*while(PIR1bits.SSP1IF == 0){timercounter--;if(timercounter==0){timercounter=while_delay;return ;}} //waiting for send ~ACKPIR1bits.SSP1IF = 0;*///word_address = SSP1BUF;// i2c_address = SSP1BUF;asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");word_address=0;return ;}if(SSP1STATbits.R_nW ==0 && SSP1STATbits.D_nA==1){/****************************************************************/if(Register[0]==0xd0) //读温度模式{read_temp_F=1;RX_BUF_LEN=0;SSP1CON1bits.CKP=1;return;}/****************************************************************/if(Register[0]==0xc0) //{RX_BUF_LEN=3;read_temp_F=0;}/***************************************************************/switch (Register[0]){case 0xe0: read_temp_F=0;RX_BUF_LEN=17;if(word_address>0 && word_address<=16){*(array_receive_x+word_address-1)=*(Register+word_address);}break;case 0xe1: read_temp_F=0;RX_BUF_LEN=17;if(word_address>0 && word_address<=16){*(array_receive_x+word_address+16-1)=*(Register+word_address);}break;case 0xe2: read_temp_F=0;RX_BUF_LEN=17;if(word_address>0 && word_address<=16){*(array_receive_y+word_address-1)=*(Register+word_address);}break;case 0xe3: read_temp_F=0;RX_BUF_LEN=17;if(word_address>0 && word_address<=16){*(array_receive_y+word_address+16-1)=*(Register+word_address);}break;}word_address++;/**************************************************************/if(word_address>=RX_BUF_LEN){word_address=0;if(Register[0]==0xe3){receive_data_end_F=1; //所有完整的数据都已经收到}}asm("nop");asm("nop");asm("nop");asm("nop");return;}}。

PIC单片机串口通讯程序

PIC单片机串口通讯程序

PIC单片机串口通讯程序单片机串口通讯是一个常用的程序模块。

PIC单片机是一款常用的单片机。

在网上搜索到一个PIC单片机串口通讯程序。

这个PIC单片机串口通讯程序站长没有验证,应该是正确的。

假如大家有更好的PIC单片机串口通讯程序,请向我推荐。

1. 单片机PIC1编程(发送部分)LIST P=16F877#INCLUDE P16F876.INCCBLOCK 0X24 ;保留三个字节作为显示用COUNT ;作计数器或暂存器用ENDCORG 0X0000 ;程序复位入口NOPSTART GOTO MAINORG 0X20MAIN MOVLW 0X30 ;以下将RAM内容初始化MOVWF FSR ;从30H单元开始MOVLW 0X30 ;将值30H赋给单元30HMOVWF COUNTINTRAM MOVF 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 ;允许同步串行口工作MOVWF RCSTABSF 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 ;接收数据允许LOOPTX BTFSS PIR1,RCIF ;等待PIC2的响应字节GOTO LOOPTXMOVF RCREG,0 ;读响应字节,清RCIFLOOPTX1 BTFSS PIR1,TXIF ;发送下一字节GOTO LOOPTX1INCF FSRMOVF INDF,0MOVWF TXREGBTFSS FSR,7 ;30H~7FH单元的内容是否发送完?GOTO LOOPTX ;没有,继续下一字节的发送BSF STATUS,RP0 ;如果是,则停止发送BCF TXSTA,TXENBCF STATUS,RP0 ;数据发送完毕CALL LED ;调用显示子程序,将发送的数据显示出来END ;程序完2. 单片机PIC2编程(接收部分)LIST P=16F876#INCLUDE P16F876.INCCBLOCK 0X24COUNTENDCORG 0X0000NOPSTART GOTO MAINMAIN BSF 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,RP0WAIT BTFSS PIR1,RCIF ;等待接收数据GOTO WAITMOVF RCREG,0 ;读取数据MOVWF INDF ;将接收到的响应字节存入PIC2的RAM INCF FSRMOVWF TXREG ;发送响应字节LOOPTX BTFSS PIR1,TXIF ;等待写入完成GOTO LOOPTXBTFSS FSR,7 ;全部数据接收否?GOTO WAIT1 ;没有,继续接收其它数据BCF RCSTA,RCEN ;接收完,则关断接收和发送数据允许BSF STATUS,RP0BCF PIE1,TXENBCF STATUS,RP0CALL LED ;调用显示子程序,将接受到的数据显示出来END ;程序完PIC单片机双机同步通信1. 单片机PIC1编程(主控发送)LIST P=16F876#INCLUDE P16F876.INCCBLOCK 0X24 ;保留三个字节作为显示用COUNT ;作计数器或暂存器用ENDCORG 0X0000 ;程序复位入口NOPSTART GOTO MAINORG 0X0100MAIN MOVLW 0X30MOVWF FSR ;以下将从30H单元开始的RAM内容初始化MOVLW 0X30 ;将值30H赋给单元30HMOVWF COUNTINTRAM MOVF COUNT,0 ;将30H~7FH赋给单元30H~7FH MOVWF 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 ;发送允许BCF STATUS,RP0TX1 BTFSS PIR1,TXIF ;等待上一个数据写完GOTO TX1INCF FSR ;准备发送下一个数据MOVF INDF,0MOVWF TXREG ;将新的数据写入TXREGBTFSS FSR,7 ;判断所有30H~7FH单元的内容是否发送完毕?GOTO TX1 ;没有,则继续发送其它字节TX2 BTFSS PIR1,TXIF ;等所有要求发送的数据已经发送完,再额外GOTO TX2 ;写一个字节到TXREG,使最后一个数据能够顺利发送MOVWF TXREGNOP ;延时几个微秒后,关发送允许NOPNOPNOPNOPBSF STATUS,RP0BCF TXSTA,TXENBCF STATUS,RP0CALL LED ;调用显示子程序,将发送的数据显示出来END ;程序完2. 单片机PIC2编程(从动接收)LIST P=16F876#INCLUDE P16F876.INCCBLOCK 0X24COUNTENDCORG 0X0000NOPSTART GOTO MAINORG 0X0100MAIN BSF 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 ;接收允许WAIT BTFSS PIR1,RCIF ;等待接收GOTO WAITMOVF RCREG,0 ;读取接收到的数据MOVWF INDF ;将接收到的数据存入PIC2的RAMINCF FSRBTFSS FSR,7 ;所有的数据是否已接收完?GOTO WAIT ;没有,继续接收其它字节NOP ;延时数微秒后,清接收允许位NOPNOPNOPBCF RCSTA,RCENCALL LED ;调用显示子程序,将接受到的数据显示出来END ;程序完PIC单片机与PC机通过串口通信1. PC机编程PC采用Toubr C 进行编写。

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

使用MCC学习PIC单片机–MSSP主同步串行端口(SPI主模式)

使用MCC学习PIC单片机–MSSP主同步串行端口(SPI主模式)

使用MCC学习PIC单片机–MSSP主同步串行端口(SPI主模式)串行外设接口(SPI)总线是以全双工模式工作的同步串行数据通信总线。

可以使用MSSP外设实现SPI主、从通信。

本帖介绍SPI主模式。

MCC界面:对照数据手册上的SPI信号时序图,理解各个设定的参数对SPI通信的影响。

时钟信号SCKSPI通信时由SPI主机提供时钟。

MCC设置上,先选择时钟源,再填入分频值,MCC就会自动计算出SPI时钟频率,显示在页面上。

根据空闲时时钟的电平和SDO上数据的采样(数据有效)边沿,确定了四种时钟模式:-空闲时为L,下降沿采样/数据有效-空闲时为H,上升沿采样/数据有效-空闲时为L,上升沿采样/数据有效-空闲时为H,下降沿采样/数据有效要想正常通信,主机和从机的时钟模式需要设置相同。

数据信号SDI/SDOSPI物理上为全双工接口,有单独的输入SDI和输出SDO引脚。

信号要交叉相连,即主机的SDI/SDO分别与从机的SDO和SDI相连。

这样才能形成数据移位的环路。

SDO时序需要与选定的时钟模式一致,由外设模块自动保证。

主机SDI的采样时刻,可以选择在数据中间采样(与SCK采样边沿相同),可以选择在数据末端采样。

从机选择信号对于SPI主机,需要采用IO口来控制从机的选通(输出低有效)。

可以容易实现单主机多从机的通信。

多从机的方式,有普通的多从机并联方式,也可以菊花链连接。

MCC代码初始化void SPI1_Initialize(void);发送1字节数据,返回值为回读数据。

uint8_t SPI1_Exchange8bit(uint8_t data);发送数据块,返回值为实际发送数据长度uint8_t SPI1_Exchange8bitBuffer(uint8_t*dataIn,uint8_t bufLen,uint8_t *dataOut);判断缓冲区中是否接收新数据,尚未读取bool SPI1_IsBufferFull(void);判断是否有写冲突。

PIC16f串口通信程序

PIC16f串口通信程序

#include <pic.h>#define INIT_OSC() OSCCON = 0x77unsigned char error=0x00; //错误数据帧,丢弃bit Q=0; //一次数据帧接收完成标志位unsigned char data;void interrupt isr(void) //接收中断处理{unsigned char Temp;if(RCIF&&RCIE){if(FERR)//监测是否有帧错误{error=RCREG;}if(OERR){CREN=0 ;CREN=1 ; //接收模块被复位重置,OERR清零}data=RCREG; //保存每一次接收到的数据Q=1;}if(T0IF) //TIME0{T0IF = 0;}else{if(RBIF ){Temp = PORTB;RBIF = 0;}}}void usart_init() //串口初始化{INIT_OSC();//InitPort();INTCON=0 ; // 关闭所有的中断TRISC6=0 ;//TX脚输出TRISC7=1 ;//RX脚输入RC6=1;RC7=1;//SPBRG=51;//波特率9600,6M时钟SPBRG=51;//波特率9600,8M时钟BRGH=1; //高速波特率SYNC=0;SPEN=1; //异步串口工作方式TXEN=1; //USART工作于发送器方式TXIE=0; //发送不需要中断处理RCIE=1; //接收需要中断处理CREN=1; //激活接收器PEIE = 1;GIE = 1;}void putch(unsigned char byte) //发送一个字节的数据{unsigned int t=0;TXREG = byte;for(t=0;t<50000;t++){if(TRMT==1){asm("nop");break;}}}void main() //将上位机发送的数据通过串口显示{unsigned int t=0; unsigned char x=0;usart_init();for(x=0;x<5;x++){for(t=0;t<10000;t++) {;}for(t=0;t<10000;t++) {;}}while(1){if(Q==1){putch(data);Q=0;}}}。

PIC16F877A串口通信C#温度实时曲线

PIC16F877A串口通信C#温度实时曲线

PIC16F877A串口通信C#温度实时曲线__77A串口通信C#温度实时曲线、RS232串口通信上位机界面下位机电路图,可以仿真利用虚拟端口仿真效果__77A串口通信C#温度实时曲线、RS232串口通信上位机C#源程序//包含画图程序using System;using System.Collections.Generic;using .cnponentModel;using System.Data;using System.Drawing;using System.Drawing.Drawing2D;using System.Text;using System.Windows.Forms;using System.IO.Ports;namespace CommPort{public partial class Form2 : Form{private int txd;private int rxd;public float pon;//存?放¤?数y据Y的?变?量? private int n;private float x1, x2, y1, y2,y11, y21 ;//画-线?的?坐?标¨private Pen Mypen1;//画-笔¨private Pen Mypen2;//private Graphics grfx;public Point ptlist;//存?放¤?坐?标¨圆2点?__77A串口通信C#温度实时曲线、RS232串口通信// Random rm = new Random();//随?机¨数y产¨生¨器//Timer mytimer = new Timer();//定§时器public Form2(){InitializeComponent();}private void Form1_Load(object sender, EventArgs e) {txd = 0;//接¨收?字?符¤?个?数y计?数y变?量?rxd = 0;//发¤é送¨字?符¤?个?数y计?数y变?量?//count = 0;ptlist = new Point(0, this.pictureBox1.Height);x1 = ptlist.X;x2 = ptlist.X;y1 =ptlist.Y;Mypen1 = new Pen(Color.Blue,1);Mypen2 = new Pen(Color.Red, 2);//y2 =ptlist.Y;string[] ports = System.IO.Ports.SerialPort.GetPortNames();//获?取¨?当前计?算?机¨的?串?行D端?口¨名?称?数y组¨,ê?存?在¨数y组¨里¤?mycomm.ReadTimeout = 32;//设¨¨置?读¨取¨?操¨作未完¨成¨时发¤é生¨超?时之?前的?毫¨秒?数y。

PIC单片机在线串行编程(ICSP)和低电压编程(LVP)

PIC单片机在线串行编程(ICSP)和低电压编程(LVP)

PIC单片机在线串行编程(ICSP)和低电压编程(LVP)前言:呵呵,不是论文。

刚开始研究PIC,因为想自己做个开发板。

除了如何让板子工作外,如何下程序就最关键了。

所以搜罗了些资料,经过一番研究,终于懂得了一些,拿出来分享一下。

有些前辈们在网上早就写过的资料,摘了一些。

特此感谢啊!副言:因为想做PIC16F877和16F887的板子,所以只对这两个做了研究,但是貌似其他的型号的PIC单片机的在线编程和这个一样!正文:ICSP,全称In-Circuit Serial Programming,在线串行编程。

这行英文和ICSP这四个字母,一般使用时都带有TM标记的,也就是说,这是MICROCHIP的商标。

也是MicroChip 独有的吧。

呵呵!ICSP分高电压在线串行编程(High-voltage In Circuit Serial Programing)和低电压在线串行编程(low-voltage ICSP)两种方法。

低电压编程和高电压编程只是略微有一些不同(详见下文)。

硬件连接方式:MicroChip的ICSP,只需要使用芯片上的5个脚就可以,其中包括VDD、VSS(GND),,然后就是VPP编程电压和输入的数据和时钟两个脚。

一般是端口B口的RB6(PGC,也叫ICSPCLK)和RB7(PGD,也叫ICSPDAT)。

若要对芯片的Flash和其他内存等进行编程,要使单片机工作到“编程/校验模式”。

编程器可以通过以下两种方法单片机工作到“编程/校验模式”。

第一种,VPP优先,时序图如下:说明:首先,保持和为低电平。

在此期间,先将从低电平(VIL)拉高到编程电压(VIHH,大约13V),然后将拉高,为芯片供电。

接下来,就可以通过和对芯片编程了。

不管芯片内的配置字(Configuration Word)如何配置,都可以使单片机工作到“编程校验模式”。

第二种,优先,时序图如下:说明:这种方法在板上已经为芯片提供电源时非常有用。

PLC与PIC单片机多机通信的应用

PLC与PIC单片机多机通信的应用

技术创新《微计算机信息》2012年第28卷第10期120元/年邮局订阅号:82-946《现场总线技术应用200例》网络与通信PLC 与PIC 单片机多机通信的应用Application of PLC and Multiple PIC microcontroller communication(运城学院)杨德畅福善沈俊霞YANG De CHANG Fu-shan SHEN Jun-xia摘要:为了提高养殖场自动化程度及参数测量的准确性,采用了西门子S7-200系列PLC 和PIC 单片机多机通信的方法。

西门子PLC 作为主机,控制养殖场内的设备,多个PIC 单片机采集器作为从机,采集场内的温度、湿度和空气质量参数。

PLC 与PIC 单片机通过RS-485自由通信协议实现串口通信。

经过实际应用,证明该系统工作可靠,测量参数准确性较高,完全满足养殖场自动化系统的要求。

关键词:养殖;控制系统;可编程控制器;PIC 单片机;通信协议中图分类号:TP271.5文献标识码:AAbstract:In order to improve the degree of automation farms and parameters measurement accuracy,the Siemens s7-200PLC and multiple PIC microcontroller communication method are used.Siemens PLC as host,control these equipments in farm.Multiple PIC microcontroller as slave,collect the temperature,humidity and air quality parameters.PLC and PIC microcontroller through the RS-485free communication protocol realize serial interface communication.By practical application,to prove that this system reliable work,the measuring parameters accuracy is higher,fully meet the requirements of the farms automation system.Keywords:Breed;Control system;PLC;PIC microcontroller;Communication protocol文章编号:1008-0570(2012)10-0330-02引言随着人们生活水平的提高,养殖场规模的不断扩大,因此对养殖场的自动控制系统要求也在不断提高。

PIC单片机SPI程序汇编

PIC单片机SPI程序汇编
TEMP2 EQU 24H
COUNT1 EQU 82H
COUNT2 EQU 0FFH
ORG 00H
NOP
GOTO MAIN
MAIN
CALL INITIAL
LOOP
CALL OUT166
CALL DELAY
CALL DELAY
CALL OUT166
CALL DELAY
GOTO LOOP3
RETURN
END
BCF STATUS,RP0
BCF STATUS,RP1
BTFSS PIR1,3 ;查看接收是否完成(0为未完,1为完成。)
GOTO LOOP2
BCF STATUS,RP0
BCF STATUS,RP1
MOVLW 0FFH
XORWF TEMP2,1 ;temp2翻转。
CALL DELAY
CALL DELAY
CALL DELAY
CALL DELAY
CALL DELAY
CALL DELAY
CALL DELAY
CALL OUT164
CALL DELAY
CALL DELAY
CALL DELAY
CALL DELAY
CALL DELAY
CALL DELAY
;典型的3个引脚是:SDO(串行数据输出),SDI(串行数据输入),SCK(串行时钟) 模块的主要寄存器:SSPCON(同步串口控制寄存器),SSPSTAT(同步串行接口状态寄存器))
STATUS EQU 03H
PORTB EQU 06H
PORTC EQU 07H
CALL DELAY

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。

dsPIC33F串口通讯中断接收发送数据UART

dsPIC33F串口通讯中断接收发送数据UART

dsPIC33F串口通讯中断接收发送数据UART/*功能描述: 串行通讯程序,DSP 中断收到8 个数据后,将收到的8 个数据以中断发送方式返送回发送方。

* */#include”p30f6014.h”//ds30f6014头文件unsignedintreceive[8]; // 接收数据数组unsignedintsend[8];// 发送数据数组unsignedintreceive_count=0;// 接收数据个数计数unsignedintsend_count=0;// 发送数据个数计数unsignedint*pointer;// 发送指针unsignedintReceiveflag;// =1,接收到8 个数据/* 函数名: Uart_Initial()功能描述: 232 串行通讯初始化子程序,设置中断优先级* */voidUart_Initial(){IFS0bits.U1TXIF=0;//复位发送中断标志位IFS0bits.U1RXIF=0;//复位接收中断标志位IPC2bits.U1RXIP=1;//收中断优先级:1 级IPC2bits.U1TXIP=1; U1MODE=0x8000; //UART 使能,8 位数据,无奇偶校验U1STA=0x0000;//当一个字符被传输到发送移位寄存器(发送缓冲器中//至少还有一个字符)产生中断,当接收到一个字符时,//中//断标志位置位U1BRG=0X34;//U1BRG=Fcy/(16*波特率)-1,此处波特率为9600}/* 函数名:__attribute__((__interrupt__)) _U1RXInterrupt()功能描述: 中断子程序:232 接收中断* */void __attribute__((__interrupt__)) _U1RXInterrupt() {while(U1STAbits.URXDA==1){IFS0bits.U1RXIF=0;receive[receive_count]=U1RXREG;// 接收数据并存储send[receive_count]=receive[receive_count];receive_count++;// 接收计数器加1if(receive_count>7)// 如果已经接收到8 个数据{receive_count=0;// 接收计数器清0Receiveflag=1;// 置接收到数据标志}}}/* 函数名:__attribute__((__interrupt__)) _U1TXInterrupt()功能描述: 中断子程序:232 发送中断* */void __attribute__((__interrupt__)) _U1TXInterrupt() {IFS0bits.U1TXIF=0;if(send_count>7)//如果发送数据个数大于7{send_count=0;//。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
void initial(void)
{
ADCON1=0X07; //将A、E端口设置为通用I/O口
TRISA=0X00; //A口设置为输出
PORTA=0X00; //端口A置低电平
TRISC=0x80; //RC端口RC6、RC7分别为输出和输入
RCREG=0; //接收缓冲寄存器清0
}
/**************************************************
*函数功能:延时微秒级程序 *
*入口:j *
switch(PORTB)
{ case 0xE7: jz=12;break; //若RB4为低电平,则键C按下
case 0xD7: jz=13;break; //若RB5为低电平,则键D按下
case 0xB7: jz=14;break; //若RB6为低电平,则键E按下
{
usart_set(); //串行通信接收数据设置
jianpan_saomiao(); //调用键盘扫描程序
if(mark==1) //有键按下时
{
TXREG=a[jz]; //将按键值发送到发送寄存器
switch(PORTB)
{ case 0xEE: jz=0;break; //若RB4为低电平,则键0按下
case 0xDE: jz=1;break; //若RB5为低电平,则键1按下
case 0xBE: jz=2;break; //若RB6为低电平,则键2按下
case 0xDD: jz=5;break; //若RB5为低电平,则键5按下
case 0xBD: jz=6;break; //若RB6为低电平,则键6按下
case 0x7D: jz=7;break; //若RB7为低电平,则键7按下
}
case 0xBB: jz=10;break; //若RB6为低电平,则键A按下
case 0x7B: jz=11;break; //若RB7为低电平,则键B按下
}
PORTB=0XF7; //将RB3设置输出低电平,扫描矩阵键盘第四行
PORTB=0XFB; //将RB2设置输出低电平,扫描矩阵键盘第三行
switch(PORTB)
{ case 0xEB: jz=8;break; //若RB4为低电平,则键8按下
case 0xDB: jz=9;break; //若RB5为低电平,则键9按下
*出口:无 *
**************************************************/
void Delay_us(uchar j)
{
while(--j); //通过设置j的值可设置延时时间长短
mark=0; //清除按键按下的标志位
}
}
}
/**************************************************
*函数功能:键盘扫描 *
void usart_set(void)
{
SPBRG=0x1A; //设置波特率9600,系统时钟4MHZ
TXSTA=0b00100100; //异步方式、高波特率,发送不使能
RCSTA=0b10010000; //设置连续接收数据
RCIE=1; //开放usart的接收中断
#include<pic.h> //包含PIC16F877A内部寄存器的定义文件
__CONFIG(0X1832); //芯片配置字,看门狗关,上电延时开,
//掉电检测关,低压编程关,加密,4M晶体HS振荡
}
}
/**************************************************
*函数功能:主函数 *
*入口:无 *
/**************************************************************
** 文件名:usart_tongxin.c **
** 功 能:实现单片机串行通信的收发功能。两片单片机通信,
case 0x7E: jz=3;break; //若RB7为低电平,则键3按下
}
PORTB=0XFD; //将RB1设置输出低电平,扫描矩阵键盘第二行
switch(PORTB)
{ case 0xED: jz=4;break; //若RB4为低电平,则键4按下
0x6f,0x77,0x7C,0x39,0x5E,0x79,0x71,0x76};//共阴数码管显示0~F段码值
uchar jz,k,mark; //定义无符号通用寄存器
/**************************************************
}
/**************************************************
*函数功能:中断服务程序 *
*入口:无 *
*出口:无 *
PORTB=0XF0; //R0~RB3设置为低电平,R4~RB5设置为高电平
INTCON=0xC0; //总中断和外设中断使能
}
/**************************************************
*函数功能:串行通信接收数据设置 *
{
if(PORTB!=0XF0) //判断是否有键按下
{
Delay_us(150); //延时消抖动
if(PORTB!=0XF0) //再次判断是否有键按下
{
mark=1; //有键按下时,自定义标志位
PORTB=0XFE; //将RB0设置输出低电平,扫描矩阵键盘第一行
TRISD=0x00; //端口D设置为输出 清零
PORTC=0X00; //端口C初始设置为低电平
TRISB=0XF0; //R0~RB3设置为输出,R4~RB5设置为输入
#define uchar unsigned char //定义无符号字符类型
#define uint unsigned int //定义无符号整形类型
void jianpan_saomiao(); //函数申明
uchar a[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,
**************************************************/
void interrupt usart()
{
if(RCIF==1) //接收到数据产生中断
{
PORTD=RCREG; //显示收到的数据,通过D口显示
单片机1键盘按键按下,单片机2显示单片机1按下的按键
值,单片机2 键盘按键按下,单片机1显示单片机2按下的
按键值。 **
**************************************************************/
*函数功能:端口初始化 *
*入口:无 *
*出口:无 *
**************************************************/
*入口:无 *
*出口:无 *
**************************************************/
void jianpan_saomiao()
case 0x77: jz=15;break; //若RB7为低电平,则键F按下
}
PORTB=0XF0; //对端口清零
while(PORTB!=0XF0); //等待键释放
}
}
}
*出口:无 *
**************************************************/
void main()
{
initial(); //端口和中断使能初始化
while(1)
*入口:无 *
*出口:无 *
**************************************************/
相关文档
最新文档