PIC16F877A串口通信C#温度实时曲线
- 格式:pdf
- 大小:333.92 KB
- 文档页数:12
#include<htc.h> //包含单片机内部资源预定义#include<stdio.h>__CONFIG(0x3b31);#define uchar unsigned char#define uint unsigned intuint led_ct=0;//led状态存储#define RXMAX 64 //长度64位unsigned char pRx,RxBuf[RXMAX];//就收缓存函数//延时函数void delay(uint x){uint a,b;for(a=x;a>0;a--)for(b=110;b>0;b--);}//初始化函数void init(){TRISA=0XFF;ADCON1=0x80;// ADCON0=0x41;TRISC=0XCF; //设置C口方向全为输出1100 0111 RC7 RC6串口模式必须设置为输出SPBRG=25; //设置波特率TXSTA=0X24; //使能串口发送,选择高速波特率RCSTA=0X90; //使能串口工作,连续接收RCIE=1; //使能接收中断GIE=1; //开放全局中断PEIE=1; //使能外部中断delay(10);}//接受中断函数void interrupt com(void){if(RCIE&&RCIF)//判断是否为串口接收中断{if(pRx<RXMAX) RxBuf[pRx++]=RCREG;RCIF=0;}}/*===================================命令代码处理函数===================================*//*等待pRx(接收字节数)到某个数目,最多等待200ms.return:0=ok,1=error*/ unsigned char delay4bytes(unsigned char n){unsigned char nms=0;while(pRx<n){nms++;if(nms>100) return 1;delay(2);}return 0;}//清除接受缓存区void clrRxBuf(void){while(pRx) RxBuf[pRx--]=0;RxBuf[0]=0;pRx=0;}uint getad0() //模拟通道1{uint i=0,a,adval0;for(a=0;a<30;a++){ADCON0=0x41; //0100 0001GO=1;delay(1);while(GO);adval0=ADRESH;//00000000 00000011adval0=adval0<<8|ADRESL;//00000011 11111111adval0=adval0/4;i=i+adval0;}adval0=i/30;return (adval0);}uint getad1()//模拟通道2{uint i=0,a,adval1;for(a=0;a<30;a++){ADCON0=0x49; //0100 1001GO=1;delay(1);while(GO);adval1=ADRESH;//00000000 00000011adval1=adval1<<8|ADRESL;//00000011 11111111adval1=adval1/4;i=i+adval1;}adval1=i/30;return (adval1);}uint getad2()//模拟通道3{uint i=0,a,adval2;for(a=0;a<30;a++){ADCON0=0x51; //0100 0001GO=1;delay(1);while(GO);adval2=ADRESH;//00000000 00000011adval2=adval2<<8|ADRESL;//00000011 11111111adval2=adval2/4;i=i+adval2;}adval2=i/30;return (adval2);}uint getad3()//数字通道1{uint adval3;if(RC1==1)adval3=0xAA;if(RC1==0)adval3=0x00;return (adval3);}uint getad4()//数字通道2{uint adval4;if(RC2==1)adval4=0xAA;if(RC2==0)adval4=0x00;return (adval4);}uint getad5()//数字通道3{uint adval5;if(RC3==1)adval5=0xAA;if(RC3==0)adval5=0x00;return (adval5);}void main(){int temp[6];init();while(1) //等待中断{led_ct++;if(led_ct<50) RC4=0;else if(led_ct<100) RC4=1; else led_ct=0;//依据led变量的状态,改变led控制脚if(pRx)//如果有接收字节{if(RxBuf[0]==0xab){if(!delay4bytes(2)){//等待接收到5个字节,如果超时则不处理,清除缓冲区if(RxBuf[1]==0x42){while(1){while(GO)ADCON0=0x41;delay(1);temp[0]=getad0();delay(10);while(GO)ADCON0=0x49;delay(1);temp[1]=getad1();delay(1);while(GO)ADCON0=0x51;delay(1);temp[2]=getad2();delay(1);temp[3]=getad3();delay(1);temp[4]=getad4();delay(1);temp[5]=getad5();delay(1);TXREG=79;delay(1);TXREG=75;delay(1);TXREG=temp[0];delay(1);TXREG=temp[1];delay(1);TXREG=temp[2];delay(1);TXREG=temp[3];delay(1);TXREG=temp[4];delay(1);TXREG=temp[5];delay(1);clrRxBuf(); delay(500);if(pRx)//如果有接收字节{if(RxBuf[0]==0xab){if(!delay4bytes(2)){//等待接收到5个字节,如果超时则不处理,清除缓冲区if(RxBuf[1]==0x43){// asm("goto 0");asm("ljmp 0");}}}}}}}}// clrRxBuf();}}}。
最新PIC16F877A单片机中文文献PIC16F877A单片机是microchip公司的产品,它采用14位的RISC指令系统,内部集成了A/D转换器、EEPROM、模拟比较器、带比较和捕捉功能的定时器/计数器、PWM输出、异步串行通信电路等。
1.程序存储器程序存储器和堆栈PIC16F877A单片机内部具有8K×14位的Flash程序存储器,程序存储器具有13位宽度的程序计数器地址范围:0000H-1FFFH。
由程序计数器提供13条地址线进行单元选择,每个单元宽14位,即PIC16F877A的指令字节宽度为14位,能够存放一条PIC单片机系统指令。
在系统上电或其他复位情况下,程序计数器均从0000H地址单元开始工作。
如果遇到调用子程序或系统发生事件中断时,将把当前程序断点处的地址送入8级×14位的堆栈区域进行保护。
堆栈是一个独立的存储区域,在调用的子程序或中断服务程序执行完后,再恢复断点地址。
通过14位程序总线,取出对应程序之灵的机器码,送入指令存储器,将组成的操作码和操作数进行有效分离。
如果操作数为地址,则进入地址复用器;如果操作数为数据,则进入数据复用器。
而操作码将在指令译码和控制单元中转化为相应的功能操作。
PIC的多数指令均是顺序执行,即使条件跳转也是隔行间接跳转。
具有大范围转移功能的指令只有两条:无条件GOTO语句和调用子程序CALL语句。
但它们受到2KB范围的约束。
所以必须将整个程序存储器以2KB为单位进行分页。
PIC16F877A单片机的上电复位地址是0000H,中端口地址是0004H,中断产生时PC指针会自动指向该地址。
在进行中断应用时,特别是涉及多个中断同时打开时,必须要逐个对中断标志进行判断。
编程时,在0000H-0003H单元内要放置一条GOTO跳转指令,跳转到主程序,以避开0004H存储器单元。
2.数据存储器数据存储器PIC单片机的数据存储器与传统的MCS-51单片机一样,在配置结构上可分为通用寄存器和特殊功能寄存器两大类。
PIC196F877A串口通信程序今天上午完成PIC16F877A 与上位机的串口通信程序!注意:使用MPLAB IDE C 语言编程时,自定义头文件要使用”“包含不能使用串口与单片机的连线原理图串口通信头文件#ifndef T232_H#define T232_H#include “main.h”//定义一帧的开始和结束#define FRAME_BEGIN 0x28//开始帧标志#define FRAME_END 0x29//结束帧标志void init_232() ;void send_str(const char *str) ;char get_char() ;void get_string(char *temp) ;void put_char(char temp) ;#endif串行通信子程序//基于TPDEM1,通过串口调试助手等串口观察软件观察程序,//将TPDEM1通过ICD2 配送的串口延长线与PC 的串口连接,设置PC 的串口为默认设置,如波特率9600,数据位8,无校验位,使用FIFO#include “t232.h”/**Function:init seriel port*/void init_232(){ INTCON=0; TRISC7=1; //RX 置输入TRISC6=0; //TX 清成输出RCSTA=0x90;//连续接受多位数据TXSTA=0x24; SPBRG=25; //9600=4000000/(16*(X+1))->X=25,high speed mode// INTCON=0xC0;//开GIE,外围中断PEIE //RCIE=1; //开接收中断}/**Fuction:send const string to seriel port/void send_str(const char *p){while((*p)!=/0){put_char(*p++) ;}}/Function:get charactor from serial port*/char get_char(){char temp ;while(!RCIF) ; /* set when register is not empty */temp = RCREG ; return RCREG; /* RXD9 and FERR are gone now */}。
PIC16F877学习开发板简介P S / 2 接 口 8路高亮LED 6位数码管 蜂 鸣 器 1 2 8 6 4 液 晶 I C S P PIC16F877A R S 2 3 2接口 红 外 接 收 IIC (24C02) U S B 口 P L 2 3 0 3 AD 电压调节D A C 0 8 3 2 电源切换开关 外接电源插硬件分布图一、资源模块介绍1. 八位LED 指示灯2. 六位数码管3. 4个独立按键4. 一体化红外接收头5. 蜂鸣器声音输出6. DS18B20温度传感器7. DS1302实时时钟电路8. 1602液晶显示模块9. 128*64液晶显示模块10. 4*4矩阵键盘扫描11. RS232串口模块可与PC通讯12. 一路A/D转换13. DAC0832 D/A转换14. 24C01 IIC EEPROM15. ICSP接口,可在线调试和编程二、实例(C语言)实验一:LED灯闪烁实验实验二:LED流水灯实验实验三:静态数码管实验实验四:动态数码管实验实验五:蜂鸣器实验实验六:独立按键实验实验七:矩阵键盘实验实验八:串口实验实验九:AD模数转换实验实验十:PS2键盘接口实验实验十一:DAC0832数模转换实验实验十二:HS0038红外接收一体头实验实验十三:AT24C02(I2C协议)实验实验十四:DS1302(SPI协议)实验实验十五:DS18B20温度传感器实验实验十六:lcd1602液晶实验实验十七:lcd12864液晶实验产品性能优点:1、支持ISP在线下载,直接把程序写到单片机中,不需要用户购买编程器,直接USB下载程序,初学者无需再购买任何仿真器或编程器等开发工具,只要有一台计算机(笔记本即可),就可以实践学习电子方面的知识。
2、 功能齐全,基本上涵盖了所有典型的外围接口电路,方便用户学习各样的硬件电路知识和软件编程,是市面上难见的多功能开发学习板。
3、配套光盘包含丰富的学习资料,其中包括:①学习板实验程序例程(C语言),注释详细,方便初学者学习阅读;②开发者多年积累的大量经典PIC单片机学习资料,使读者看完能有一想不到的收获。
PIC16F877A单片机是microchip公司的产品,它采用14位的RISC指令系统,内部集成了A/D转换器、EEPROM、模拟比较器、带比较和捕捉功能的定时器/计数器、PWM输出、异步串行通信电路等。
1.程序存储器程序存储器和堆栈PIC16F877A单片机内部具有8K×14位的Flash程序存储器,程序存储器具有13位宽度的程序计数器地址范围:0000H-1FFFH。
由程序计数器提供13条地址线进行单元选择,每个单元宽14位,即PIC16F877A的指令字节宽度为14位,能够存放一条PIC单片机系统指令。
在系统上电或其他复位情况下,程序计数器均从0000H地址单元开始工作。
如果遇到调用子程序或系统发生事件中断时,将把当前程序断点处的地址送入8级×14位的堆栈区域进行保护。
堆栈是一个独立的存储区域,在调用的子程序或中断服务程序执行完后,再恢复断点地址。
通过14位程序总线,取出对应程序之灵的机器码,送入指令存储器,将组成的操作码和操作数进行有效分离。
如果操作数为地址,则进入地址复用器;如果操作数为数据,则进入数据复用器。
而操作码将在指令译码和控制单元中转化为相应的功能操作。
PIC的多数指令均是顺序执行,即使条件跳转也是隔行间接跳转。
具有大范围转移功能的指令只有两条:无条件GOTO语句和调用子程序CALL语句。
但它们受到2KB范围的约束。
所以必须将整个程序存储器以2KB为单位进行分页。
PIC16F877A单片机的上电复位地址是0000H,中端口地址是0004H,中断产生时PC指针会自动指向该地址。
在进行中断应用时,特别是涉及多个中断同时打开时,必须要逐个对中断标志进行判断。
编程时,在0000H-0003H单元内要放置一条GOTO跳转指令,跳转到主程序,以避开0004H存储器单元。
2.数据存储器数据存储器PIC单片机的数据存储器与传统的MCS-51单片机一样,在配置结构上可分为通用寄存器和特殊功能寄存器两大类。
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 进行编写。
PIC16F877A-UART#include #define unchar unsigned char#define uint unsigned intunchar RC_label;//标志位起始位为1 结束位为0unchar caiji_label;//采集帧格式标志位正确为1 错误为0unchar data RC[100];//存储接收到的数据unchar data TX1[100];//存储自身参数unchar data TX2[100];//存储出错指示ERRORint RC_buff;//inti=0,j=0,k=0;////*****串口初始化**********void initRS232(){//设置TXSTACSRC=0;//TX9=0;//8 位数据发送TXEN=1;//发送使能SYNC=0;//选择异步模式BRGH=1;//高速TRMT=1;//发送寄存器空TX9D=0;////设置RCSTASPEN=1;//允许串口工作RX9=0;//接收8 位数据SREN=1;//CREN=1;//使能连续接收ADDEN=0;//FERR=0;//OERR=0;//无超速错误RX9D=0;//TRISC=0X80;//设置C 口SPBRG=0X19;//设置波特率为9600}//*******延时*********void delay(int i){for(i;--i;) continue;}//******中断初始化******void int_interrupt(void){GTE=1;//PEIE=1;//RCIE=1;//}//********中断服务子程序*********void interrupt receive(void){if(OERR==1)//判断有无超速错误{CREN=0;CREN=1;}if(RCIF==1){RC_buff=RCREG;if(RC_buff==0x2a)//判断是否是起始标志*{RC_label=1;}if(RC_buff==0x23)//判断是否是结束标志#{RC_label=0;}}if(RC_label==1)RC[k++]=RC_buff;//将接收到的数据存储在数组中else if(RC_label==0)k=0;if(RC[1]==0XFE&&RC[2]==0XC0&&RC[3]==0X34&&RC[5]==0X12)//判断数据采集帧格式是否正确caiji_label=1;elsecaiji_label=0;}//********参数发送子程序开始**********void TX_serve(void){TX1[ ]={0X2A,0XFD,0X26,0X30,0X31,0X32};//自身参数存储在TX1 中TX2[ ]={0X56,0X52,0X52,0X4F,0X52};//出错指示存储在TX2 中if(caiji_label==1)//如果数据采集帧格式正确则发送自身参数帧{for(j=0;j<6;j++){TXREG=TX1[j];。
基于PIC16F877的以太网通讯设计与应用以太网是当今最常用的局域网技术,它能够实现高速、稳定的数据传输。
在嵌入式系统中,以太网也广泛应用。
本文将介绍如何利用PIC16F877单片机设计实现以太网通讯功能,并探讨其在实际应用中的运用。
首先,需要用到的硬件是以太网芯片ENC28J60和PIC16F877单片机。
ENC28J60是一款非常流行的以太网芯片,它具有低功耗、小封装、支持SPI通讯等优势,适合用于嵌入式系统等场景。
而PIC16F877单片机是一款高性能、低功耗的微处理器,适用于各种应用,尤其擅长数据采集和控制。
以太网芯片ENC28J60采用SPI接口与PIC16F877单片机进行通讯。
具体实现过程如下:1.初始化以太网芯片在使用以太网芯片前,需要对其进行初始化。
初始化过程包括设置寄存器值、设置MAC地址、授权等操作。
2.建立连接建立连接是以太网通讯的关键。
建立连接包括获取IP地址、建立TCP连接、处理数据等步骤。
连接成功后,可以发送和接收数据。
3.发送数据发送数据是以太网通讯的核心部分。
在PIC16F877单片机中,需要将要发送的数据打包成一个数据帧,并通过SPI接口发送给ENC28J60芯片。
4.接收数据接收数据同样也很关键。
在PIC16F877单片机中,需要不断通过SPI接口接收ENC28J60芯片发送过来的数据。
接收到数据后,需要对其进行处理,并进行相应的操作。
除了上述步骤外,以太网通讯中还有许多其它的操作,比如数据加密、数据解密、数据压缩、数据解压缩等。
这些操作都需要PIC16F877单片机完成。
以太网通讯在实际应用中有着广泛的运用。
例如,在工业控制系统中,可以利用以太网通讯实现各个设备之间的数据交换和控制。
在智能家居系统中,可以利用以太网通讯实现各种家居设备之间的联动和远程控制。
总结起来,以太网通讯是当今最重要的局域网技术之一,利用PIC16F877单片机设计实现以太网通讯功能,能够实现高效、稳定、快速的数据传输。