標題: 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仿真工程文件可到本帖附件中下載)
2.png (115.96 KB, 下載次數: 132)
下載附件
2020-5-31 18:32 上傳
單片機源程序如下:
- /* 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)
2020-5-31 18:29 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者: 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://m.zg4o1577.cn/bbs/) |
Powered by Discuz! X3.1 |
主站蜘蛛池模板:
日韩精品一二区
|
午夜视频免费看
|
最新日韩av
|
蜜臀久久99精品久久久久久宅男
|
国产日产av
|
欧美一级做性受免费大片免费
|
亚洲亚洲人成综合网络
|
国产精品视频久久久
|
欧美日韩黄色片
|
欧美日韩一区二区三区
|
成人午夜小视频
|
黑人黄色一级片
|
久久精品
|
永久免费视频
|
欧美亚洲在线
|
日韩av在线不卡
|
五月天婷婷在线观看
|
亚洲人在线观看
|
亚洲成人欧美
|
日韩伦理在线播放
|
国产精品一区在线播放
|
麻豆av在线
|
福利视频免费
|
一区两区小视频
|
国产小视频在线
|
免费成人结看片
|
91午夜精品亚洲一区二区三区
|
日韩一二区
|
97免费在线
|
国产精品国产三级国产专区52
|
亚洲精品一区二区三区精华液
|
日本精品视频在线观看
|
欧美成人精品
|
国产精品一区在线播放
|
美女久久久久
|
在线播放黄色
|
精品视频在线观看
|
免费黄色大片
|
九九热在线视频观看
|
亚洲一级特黄
|
小sao货撅起屁股扒开c微博
|