×
单片机 > 单片机程序设计 > 详情

PIC18F452+Proteus双机通信 串口通信 键盘更改波特率源程序

发布时间:2024-05-22 发布时间:
|

系统功能

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仿真工程文件可到本帖附件中下载)

单片机源程序如下:

  1. /* Main.c file generated by New Project wizard

  2. *

  3. * Created: 周日 十二月 22 2019

  4. * Processor: PIC18F452

  5. * Compiler:MPLAB C18

  6. */


  7. #include

  8. #include

  9. #include

  10. #include

  11. #include


  12. #define LCD1602EN PORTBbits.RB3 //定义LCD1602使全能端

  13. #define LCD1602RW PORTBbits.RB4 //定义LCD1602读写端

  14. #define LCD1602RS PORTBbits.RB5 //定义LCD1602寄存端(1是数据突破口,0是指令寄存器)

  15. #define DATAPORTPORTD //数据端口


  16. //*********方向位************

  17. #define ENTRIS TRISBbits.TRISB3

  18. #define RWTRIS TRISBbits.TRISB4

  19. #define RSTRIS TRISBbits.TRISB5

  20. #define DATATRIS TRISD


  21. void delay(void);

  22. void InitLCD1602(void) ;

  23. void LCD1602cmd(unsigned char LCDcmd);

  24. void LCD1602Write(unsigned char LCDdata);


  25. unsigned char x,y;

  26. int i,j1,j2,j3,j4,k,m;

  27. float temp,v,p;

  28. char res[2];


  29. void main()

  30. {

  31. TRISCbits.TRISC6=0; //设定RC6为TX端口

  32. TRISCbits.TRISC7=1;

  33. TRISC=0X80;

  34. SPBRG=0X19;


  35. //TRISD=0X00;

  36. TXSTA=0X20;

  37. RCSTA=0X90;


  38. InitLCD1602();

  39. //设置起始位置

  40. while (1){


  41. while (!DataRdyUSART());

  42. getsUSART(res,2);

  43. LCD1602cmd(0x80);

  44. LCD1602Write(res[0]);


  45. }


  46. }



  47. //A/D convertor采集子程序

  48. void ad_convertor( void )

  49. {


  50. OpenADC( ADC_FOSC_32 &

  51. ADC_RIGHT_JUST &

  52. ADC_5ANA_1REF&

  53. ADC_20_TAD ,

  54. ADC_CH0 &

  55. ADC_INT_OFF

  56. );

  57. //A/D 时钟源,晶振32分频率

  58. //A/D 转换结果右对齐

  59. //A/D 参考电压源,电源工作电压

  60. //通道选择

  61. //中断关闭,查询模式

  62. Delay10TCYx( 5 ); // Delay for 50TCY

  63. ConvertADC(); // Start conversion

  64. while( BusyADC() ); // Wait for completion

  65. temp = ReadADC(); // Read result

  66. CloseADC(); // Disable A/D converter

  67. //display the result

  68. }

  69. //***************************************************

  70. void InitLCD1602(void)

  71. {

  72. DATATRIS = 0x00; //设数据口、RS、RW为输出

  73. DATAPORT = 0x00; //赋初值


  74. ENTRIS = 0; //设E端口为输出

  75. RWTRIS = 0;

  76. RSTRIS = 0;


  77. LCD1602RW = 0; //赋初值

  78. LCD1602EN = 0; //赋初值

  79. LCD1602RS = 0; //赋初值


  80. LCD1602cmd(0x38); //设置为四线模式

  81. LCD1602cmd(0x01); //清屏

  82. LCD1602cmd(0x06); //设置为AC加1,显示不发生位移

  83. LCD1602cmd(0x0C); //设置为光标无,显示开,0x0f:光标有且闪烁,显示开


  84. Delay1KTCYx(2);

  85. }


  86. void LCD1602cmd(unsigned char LCDcmd)

  87. {


  88. LCD1602EN = 1; //E端拉高

  89. DATAPORT =LCDcmd; //对LCD的数据口PORTD口赋值

  90. LCD1602RS = 0; //是指令,还是数据

  91. LCD1602EN = 0; //E下降沿读取数据

  92. Delay1KTCYx(2); //2ms左右


  93. }


  94. void LCD1602Write(unsigned char LCDdata)

  95. {


  96. LCD1602EN = 1; //E端拉高

  97. DATAPORT =LCDdata; //对LCD的数据口PORTD口赋值

  98. LCD1602RS = 1; //是指令,还是数据

  99. LCD1602EN = 0; //E下降沿读取数据

  100. Delay1KTCYx(2); //2mus左右


  101. }



  102. void delay(void){

  103. for(x=255;x>0;

[1] [2]
PIC18F452Proteus双机通信串口通信波特率

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
基于arm的指纹识别门禁系统是如何设计的