标题: PIC18F452+Proteus双机通信 串口通信 键盘更改波特率源程序 [打印本页]
作者: LOULOULOU 时间: 2020-5-31 18:32
标题: PIC18F452+Proteus双机通信 串口通信 键盘更改波特率源程序
1.1 系统功能
1、实现双机之间的通信
(1)在主机上通过4*4键盘上的键值“1”“2”“3”设定波特率(2400、4800、9600),发给从机,两者正常通信;
(2)从机将采集到的压力信号传到主机,主机通过LCD显示在第一行,我们可以观察到主机的LCD显示的数和从机的保持一致。
(3)主机通过获取按键“5”“6”“7”,改变从机的ADC采样率分别为“10s”“20s”“30s”,由于ADC采样率不易直接观察改变,可将采样率的值通过从机的三个不同颜色的小灯显示。
2、从机通过ADC采样获取压力传感器模拟输出端口的电压值,并将电压值转化为压力值,通过自身的LCD显示;
3、
主机获得从机采集的压力值之后,和初始设定的压力值(我设置的是10-12为正常)进行对比,若在设定的压力值之间,LCD第二行显示“
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- /* Main.c file generated by New Project wizard
- *
- * Created: 周日 十二月 22 2019
- * Processor: PIC18F452
- * Compiler: MPLAB C18
- */
- #include <p18f452.h>
- #include <delays.h>
- #include <usart.h>
- #include <adc.h>
- #include <math.h>
- #define LCD1602EN PORTBbits.RB3 //定义LCD1602使全能端
- #define LCD1602RW PORTBbits.RB4 //定义LCD1602读写端
- #define LCD1602RS PORTBbits.RB5 //定义LCD1602寄存端(1是数据突破口,0是指令寄存器)
- #define DATAPORT PORTD //数据端口
- //*********方向位************
- #define ENTRIS TRISBbits.TRISB3
- #define RWTRIS TRISBbits.TRISB4
- #define RSTRIS TRISBbits.TRISB5
- #define DATATRIS TRISD
- void delay(void);
- void InitLCD1602(void) ;
- void LCD1602cmd(unsigned char LCDcmd);
- void LCD1602Write(unsigned char LCDdata);
- unsigned char x,y;
- int i,j1,j2,j3,j4,k,m;
- float temp,v,p;
- char res[2];
- void main()
- {
- TRISCbits.TRISC6=0; //设定RC6为TX端口
- TRISCbits.TRISC7=1;
- TRISC=0X80;
- SPBRG=0X19;
-
- //TRISD=0X00;
- TXSTA=0X20;
- RCSTA=0X90;
-
- InitLCD1602();
- //设置起始位置
- while (1){
-
- while (!DataRdyUSART());
- getsUSART(res,2);
- LCD1602cmd(0x80);
- LCD1602Write(res[0]);
-
- }
-
- }
-
-
- // A/D convertor采集子程序
- void ad_convertor( void )
- {
- OpenADC( ADC_FOSC_32 &
- ADC_RIGHT_JUST &
- ADC_5ANA_1REF &
- ADC_20_TAD ,
- ADC_CH0 &
- ADC_INT_OFF
- );
- // A/D 时钟源,晶振32分频率
- // A/D 转换结果右对齐
- // A/D 参考电压源,电源工作电压
- // 通道选择
- // 中断关闭,查询模式
- Delay10TCYx( 5 ); // Delay for 50TCY
- ConvertADC(); // Start conversion
- while( BusyADC() ); // Wait for completion
- temp = ReadADC(); // Read result
- CloseADC(); // Disable A/D converter
- //display the result
- }
- //***************************************************
- void InitLCD1602(void)
- {
- DATATRIS = 0x00; //设数据口、RS、RW为输出
- DATAPORT = 0x00; //赋初值
-
- ENTRIS = 0; //设E端口为输出
- RWTRIS = 0;
- RSTRIS = 0;
-
- LCD1602RW = 0; //赋初值
- LCD1602EN = 0; //赋初值
- LCD1602RS = 0; //赋初值
-
- LCD1602cmd(0x38); //设置为四线模式
- LCD1602cmd(0x01); //清屏
- LCD1602cmd(0x06); //设置为AC加1,显示不发生位移
- LCD1602cmd(0x0C); //设置为光标无,显示开,0x0f:光标有且闪烁,显示开
- Delay1KTCYx(2);
- }
- void LCD1602cmd(unsigned char LCDcmd)
- {
-
- LCD1602EN = 1; //E端拉高
- DATAPORT =LCDcmd; //对LCD的数据口PORTD口赋值
- LCD1602RS = 0; //是指令,还是数据
- LCD1602EN = 0; //E下降沿读取数据
- Delay1KTCYx(2); //2ms左右
-
- }
- void LCD1602Write(unsigned char LCDdata)
- {
-
- LCD1602EN = 1; //E端拉高
- DATAPORT =LCDdata; //对LCD的数据口PORTD口赋值
- LCD1602RS = 1; //是指令,还是数据
- LCD1602EN = 0; //E下降沿读取数据
- Delay1KTCYx(2); //2mus左右
-
- }
-
-
- void delay(void){
- for(x=255;x>0;x--)
- for(y=255;y>0;y--);
- }
复制代码
NORMAL”,低于最小压力值显示“LOW”,高于最高压力值显示“HIGH”。并且将
这三个状态通过不同颜色的LED显示。
全部资料51hei下载地址:
双机按键通信.rar
(140.95 KB, 下载次数: 116)
作者: qiu4466 时间: 2020-6-2 07:34
支持,顶一下
作者: 迁就 时间: 2020-6-9 09:49
谢谢谢分享
作者: EVIL_L 时间: 2020-6-9 22:41
谢谢分享
作者: fq2007 时间: 2020-6-12 08:39
这个很不错,支持楼主
作者: LOULOULOU 时间: 2020-11-13 16:43
谢谢!
作者: 某单片机菜鸟 时间: 2021-7-5 20:54
谢谢楼主分享,我们学校的老师给了一个类似的题目,不过是温度测量,这篇文档对我有很大作用
作者: kkscan0821 时间: 2022-5-25 06:59
开始的时候以为没有代码,只有仿真,之后发现是8.几的版本,源码也在仿真工程环境下,谢谢楼主分享,思路很有借鉴意义
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |