系统功能
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
#include
#include
#include
#include
#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显示。
上一篇:PIC单片机FFT音乐频谱Proteus仿真程序
下一篇:基于PIC16F877单片机的简易数字电压表设计及proteus仿真
推荐阅读最新更新时间:2024-11-05 13:02
设计资源 培训 开发板 精华推荐
- E18 zigbee
- NSI45090JDT4G可调恒流LED灯串驱动器的典型应用
- 使用 ROHM Semiconductor 的 BA15BC0WFP-E2 的参考设计
- LT1171CQ、5V/2.5A 升压转换器的典型应用
- MIC2095-2YMT限流配电开关典型应用
- ADA4505-2ARMZ-RL 血糖仪中使用的四极黄油值滤波器的典型应用电路
- 使用 ROHM Semiconductor 的 BD4845 的参考设计
- 使用 ON Semiconductor 的 CS8120YTHA5 的参考设计
- DS21403C,基于 TC64X/TC64XB 风扇控制器的评估板
- LTC3880EUJ 演示板,DCR 检测演示板,输入电压范围:6.5V 至 24V,VOUT0:0.5V 至 4V @ 20A,VOUT1:0.5V 至 5V @ 20A,PMBU 受控,使用 DC1613A 工作