informasi kontak saya
Surat[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Postingan blog yang ditulis oleh blogger CSDN lainnya cukup bagus. Jika Anda ingin mengetahui tentang port serial UART 51 mikrokontroler, Anda dapat mengklik dan melihat:
Komunikasi asinkronArtinya selang waktu antara dua karakter (8 bit) dalam komunikasi tidak tetap, namun selang waktu antar bit dalam satu karakter adalahstabil。
Komunikasi serial UART merupakan teknologi komunikasi yang paling umum digunakan untuk mikrokontroler. Biasanya digunakan untuk komunikasi antara mikrokontroler dengan komputer dan antar mikrokontroler.
Komunikasi dapat dibagi menjadi tipe dasarKomunikasi paralelDankomunikasi serial, Dalam komunikasi paralel, setiap bit data ditransmisikan secara bersamaan, dan komunikasi dapat diwujudkan dalam byte. Namun, beberapa jalur komunikasi memerlukan banyak sumber daya dan mahal. Misalnya, P0 = 0xFF yang digunakan sebelumnya; menetapkan nilai ke 8 port IO P0 sekaligus dan mengeluarkan sinyal pada waktu yang sama, mirip dengan 8 jalur yang dapat dilalui 8 mobil secara bersamaan. Bentuk ini paralel. Merupakan kebiasaan untuk menyebut P0, P1, P2 dan P3 sebagai empat set bus paralel dari 51 mikrokontroler.
Komunikasi serial ibarat sebuah jalur, hanya satu mobil yang dapat lewat dalam satu waktu.Jika satu byte data seperti 0xFF ingin dikirim, dengan asumsi sebuah mobil menarik data 1-bit, maka diperlukan lebih dari 8 mobil.interval waktu yang samaSeberangi jalur yang sama secara bergantian.
Perbedaan antara komunikasi sinkron dan komunikasi asinkron:
1. Komunikasi sinkron mengharuskan frekuensi jam dari ujung penerima konsisten dengan frekuensi jam dari ujung pengirim, dan ujung pengirim mengirimkan aliran bit terus menerus; komunikasi asinkron tidak memerlukan sinkronisasi jam akhir penerima dan jam akhir pengiriman Setelah pihak pengirim mengirimkan satu byte, ia dapat melewati interval waktu yang lama sebelum mengirim byte berikutnya.
2. Komunikasi sinkron memiliki efisiensi yang tinggi, sedangkan komunikasi asinkron memiliki efisiensi yang rendah.
3. Komunikasi sinkron lebih rumit, dan kesalahan yang diijinkan dari jam kedua belah pihak kecil; komunikasi asinkron sederhana, dan jam dari kedua belah pihak dapat memungkinkan kesalahan tertentu.
4. Komunikasi sinkron hanya cocok untuk point-to-multipoint, dan komunikasi asynchronous dapat digunakan untuk point-to-point.
Mikrokontroler STC89C52 memiliki dua pin yang khusus digunakan untuk komunikasi serial UART, satu adalah P3^0 dan yang lainnya adalah P3^1. Mereka juga memiliki nama lain yang disebut RXD (Receive Data) dan TXD (Transmit Data) masing-masing terdiri dari mereka disebut antarmuka serial. Seperti yang ditunjukkan pada gambar:
Komunikasi antara mikrokontroler dan mikrokontroler:
Pada gambar, GND mewakili titik acuan catu daya sistem mikrokontroler. TXD disebut pin transmisi serial, dan RXD adalah pin penerima serial.
Untuk berkomunikasi antara dua mikrokontroler, pertama-tama referensi catu daya harus sama, sehingga GND kedua mikrokontroler harus saling terhubung.Kemudian pin TXD MCU 1 dihubungkan dengan pin RXD MCU 2. Fungsinya MCU 1 mengirimkan informasi ke MCU 2. (Proses ini terbagi menjadi dua bagian. MCU 1mengirim sinyalProses dengan Mikrokontroler 2menerima sinyalProses) Dengan cara yang sama, pin TXD mikrokontroler 2 dihubungkan ke pin RXD mikrokontroler 1.
Diagram skematik ini mencerminkan proses dua mikrokontroler saling mengirim dan menerima informasi.
Ketika mikrokontroler 1 ingin mengirimkan data ke mikrokontroler 2 misalnya mengirimkan data 1 0xE4, dinyatakan dalam bentuk biner:
0b1110 0100, mikrokontroler 1 menghadapi beberapa masalah sebelum transmisi dimulai:
Misalkan saya mengirimkan bit terendah 0 terlebih dahulu, maka saya perlu mengatur port TXD mikrokontroler 1 ke level rendah.
Mikrokontroler umumnya level TTL atau CMOS. Untuk standar level TTL/CMOS:
Apa pun yang lebih besar dari 2,0 volt adalah level tinggi, sesuatu yang kurang dari 0,0 volt adalah level rendah, dan apa pun di antaranya bukanlah level tinggi atau level rendah. Logika di antara keduanya akan membingungkan dan dapat dinilai oleh perangkat tingkat yang tinggi, dapat juga dinilai sebagai tingkat yang rendah. Oleh karena itu, usahakan untuk tidak mengoperasikan sirkuit di area ini. Berada di zona ini dapat membuat produk Anda sukses atau gagal. Oleh karena itu, ketika mengembangkan produk, Anda perlu memeriksa lembar data perangkat dan voltase selama pengoperasian rangkaian untuk memastikan bahwa voltase tersebut sesuai.
1. Tingkat TTL:
Keluaran tingkat tinggi >2.4V, keluaran tingkat rendah <0.4V. Pada suhu kamar, keluaran tingkat tinggi umum adalah 3.5V dan keluaran tingkat rendah adalah 0.2V. Input minimum level tinggi dan level rendah: input level tinggi >=2.0V, input level rendah <=0.8V, margin kebisingan 0.4V.
2. Tingkat CMOS:
1tingkat logika Tegangannya mendekati tegangan suplai, dan level logika 0 mendekati 0V. Dan memiliki toleransi kebisingan yang luas.
Jadi inilah pertanyaannya:
Ketika informasi tidak dikirim atau diterima, port transmisi (TXD) mikrokontroler 1 akan berada pada level tinggi atau level rendah, atau tegangan port berada di antara keduanya. Tegangan port penerima (RXD) MCU 2 mengikuti tegangan port transmisi MCU 1. Bagaimana cara mengatur sinyal bahwa MCU 1 akan mulai mengirimkan informasi, yaitu bagaimana MCU 2 mengetahui bahwa MCU 1 telah mengirimkan informasi ke sana? Oleh karena itu perlu adanya standarisasi standar komunikasi.
Langkah 1: Ditetapkan bahwa ketika komunikasi tidak terjadi, tegangan port TXD dan RXD mikrokontroler tetap tinggi.
Langkah 2: Standarisasi metode transmisi data seperti yang ditunjukkan di bawah ini
Anda dapat melihat bahwa ini mendefinisikan 1 bit awal, 1 bit berhenti, ditambah 1 byte data yang akan dikirim, yang totalnya adalah 8 bit.Data sepuluh digit。
Transmisi data 0xE4 yang disebutkan di atas sebenarnya mentransmisikan 0 1110 0100 1. Transmisi 1 byte data dari MCU 1 ke MCU 2 sebenarnya mentransmisikan data 10-bit ini disebut bingkai data serial lengkap.
Dengan adanya start bit dan stop bit, mikrokontroler 2 port RXD mulai bersiap menerima data ketika mendeteksi level rendah. Dengan cara yang sama, jika mikrokontroler 1 ingin mengirim 1 byte data, pertama-tama mikrokontroler harus mengirimkan bit awal 0 (beri tahu mikrokontroler 2 untuk bersiap menerima), lalu kirim bit stop 1 (beri tahu mikrokontroler 2 a Byte transfer data selesai).Dan saat mengirimkan data, itu benarPertama rendah, lalu tinggiMemesan
Langkah 3: Anda perlu mengatur waktu yang diperlukan untuk mengirimkan 1 bit data secara seragam. Kecepatan waktu ini dinyatakan dengan baud rate (baud). Baud rate 1 berarti mentransmisikan 1 bit data dalam 1 detik, dan baud rate 9600 berarti mentransmisikan 9600 bit data dalam 1 detik.
Kemudian kita mendapatkan hasil transmisi 1 bitdurasi=1/baud., maka waktu untuk mengirimkan 1 frame data lengkap dapat diketahui10/baud,Interval waktu antar frame data bersifat arbitrer.
Ketika MCU 1 dan MCU 2 mengirimkan sinyal, baud ratenya harus diatur agar konsisten untuk mencapai komunikasi yang benar.
Pada tahun-tahun awal komputer desktop, biasanya terdapat antarmuka serial 9-pin. Antarmuka serial ini disebut antarmuka RS-232, yang terkait dengan komunikasi UART. sehingga Komunikasi dengan mikrokontroler semakin cenderung menggunakan port serial virtual USB.
Logika level yang digunakan RS232 adalah logika negatif, berbeda dengan level logika TTL/CMOS.
Oleh karena itu, port serial RS232 9-pin komputer tidak dapat dihubungkan langsung ke mikrokontroler. Chip konversi level MAX232 diperlukan untuk melengkapi gambar berikut:
Deskripsi pin RS232:
1. Deteksi pembawa DCD (Deteksi Pembawa Data) 2. Menerima data RXD 3. Mengirim data TXD
4. Terminal data siap untuk DTR (Terminal Data Siap) 5. Ground sinyal 6. DSR siap data(Set Data siap)
7. Permintaan untuk mengirim RTS (Meminta untuk mengirim) 8. Hapus dan kirim CTS(Jelas untuk Dikirim) 9. Dering prompt RI (Berdering)
Seperti yang ditunjukkan pada gambar di atas, pada kabel port serial RS232, komunikasi dapat diselesaikan selama pin 2, 3 dan 5 terhubung ke pin MAX232 yang sesuai.
Dengan berkembangnya teknologi, komunikasi port serial RS-232 banyak digunakan di industri. Namun dalam penerapan teknologi komersial, teknologi USB ke UART perlahan-lahan menggantikan port serial RS232.
Lalu bagaimana mewujudkan komunikasi antara mikrokontroler dan komputer seperti terlihat pada gambar
Ini adalah papan pengembangan dalam hal ini yang menggunakan chip USB ke port serial CH340T untuk mencapai fungsi ini.
Port mikrokontroler TXD menggunakan tutup jumper untuk terhubung ke USB-TX dan terhubung ke port CH340 pin 4 RXD secara bersamaan
Port mikrokontroler RXD menggunakan tutup jumper untuk terhubung ke USB-RX dan terhubung ke pin ke-3 TXD CH340.
Anda dapat melihat bahwa terdapat dioda 4148 yang dihubungkan secara seri antara USB-RX dan pin ketiga TXD CH340, karena mikrokontroler STC89C52 memerlukan start dingin saat mengunduh program. Cukup klik unduh terlebih dahulu lalu hidupkan.
yang disebutAwal yang dingin Mengacu pada proses startup mikrokontroler dari mati hingga hidup; sedangkan hot start berarti mikrokontroler selalu dihidupkan. Perbedaan antara cold start dan hot start adalah: pada saat cold start, nilai-nilai pada RAM internal mikrokontroler merupakan besaran acak, sedangkan pada saat hot start, nilai-nilai pada RAM internal mikrokontroler tidak akan diubah dan tetap sama seperti sebelum startup.
Pada saat dinyalakan, mikrokontroler akan mendeteksi terlebih dahulu apakah perlu mendownload program meskipun VCC mikrokontroler dikendalikan oleh saklar, karena pin 3 CH340T merupakan pin keluaran, jika tidak ada seperti itu. dioda, mikrokontroler berikutnya dari sakelar akan mati ketika daya dimatikan. Pin 3 CH340T dihubungkan ke pin P3.0 (RXD) mikrokontroler. Arus akan mengalir ke rangkaian tahap berikutnya melalui pin ini dan mengisi kapasitor tahap selanjutnya, menghasilkan tegangan tertentu pada tahap berikutnya. Tegangan ini Meskipun nilainya hanya sekitar 2 ~ 3V, hal ini dapat mempengaruhi start dingin normal. Setelah menambahkan dioda, di satu sisi tidak mempengaruhi komunikasi, di sisi lain dapat menghilangkan efek buruk tersebut.
Saya belajar dari manual mikrokontroler bahwa P3.0 adalah port IO kuasi-dua arah.
Bagian kotak merah adalah port IO kuasi-dua arah , ketika bit keluaran internal tingkat rendah, melalui gerbang NOT, basis transistor berada pada tingkat tinggi, transistor dihidupkan (tegangan di kedua ujung CE hampir sama dalam konduksi jenuh), dan IO port mikrokontroler mengeluarkan tingkat rendah, terlepas dari apakah tombol eksternal ditekan atau dimunculkan, port IO tetap rendah. Artinya, tidak dikendalikan oleh sinyal eksternal.
Ketika keluaran internal tingkat tinggi, setelah melewati gerbang NOT, basis transistor menjadi sangat rendah, dan transistor tidak menghantarkan arus (resistansi di kedua ujung CE sangat besar, dan resistansi R dapat diabaikan dibandingkan dengan itu). Saat ini, output dari port IO berada pada level tinggi. Saat tombol ditekan, port IO di-ground, dan port IO mengeluarkan level rendah.
Dari sini terlihat bahwa hanya kapanOutput port IO tingkat tinggiKapan,Output dari port IO dikendalikan oleh sirkuit eksternal。
Oleh karena itu, kita mengetahui bahwa output internal P3.0 selalu tinggi ketika digunakan sebagai port RXD.Port P3.1TXD berfungsi sebagai pemancar dan nyaTingkat keluaran internalDapat diubah ke atas atau ke bawah sesuai kebutuhan.
Dan: untuk level TTL
Terminal keluaran: level tinggi >= 2.4V, level rendah <= 0.4V;
Ujung penerima: level tinggi >=2.0V, level rendah <=0.8V.
Untuk tingkat COM
Terminal keluaran: level tinggi = Vcc, level rendah = GND (Vcc adalah tegangan catu daya);
Penerimaan akhir: level tinggi >=0,7Vcc, level rendah <=0,2Vcc.
Masih terdapat perbedaan tegangan antara tingkat logika ujung penerima dan tingkat logika ujung keluaran. Hal ini mungkin disebabkan oleh gangguan penurunan tegangan yang dihasilkan selama transmisi sinyal atau adanya rangkaian proteksi, sehingga penambahan dioda tidak akan terjadi menyebabkannya. Tegangan yang ditransmisikan berada dalam area logis yang membingungkan.
Gunakan port IO untuk mensimulasikan komunikasi serial UART
Program atas:
- # include<reg52.h>
-
- sbit PIN_RXD = P3^0; //接受引脚定义
- sbit PIN_TXD = P3^1; //发送引脚定义
-
- bit RxdorTxd = 0; //指示当前状态为接受还是发送
- bit RxdEnd = 0; //接受结束标志
- bit TxdEnd = 0; //发送结束标志
- unsigned char RxdBuf = 0; //接收缓冲区
- unsigned char TxdBuf = 0; //发送缓冲器
-
- void ConfigUART(unsigned int baud);
- void StartTXD(unsigned char dat);
- void StartRXD();
-
-
- void main()
- {
- EA = 1; //打开总中断
- ConfigUART(9600); //配置波特率为9600
-
- while(1)
- {
- while(PIN_RXD); //等待接收引脚出现低电平,即起始位
- StartRXD(); //启动接收
- while(!RxdEnd); //等待接受完成
- StartTXD(RxdBuf +1);//接受到的整数+1后,发送回去
- while(!TxdEnd); //等待发送结束
- }
- }
-
- /* 串口配置函数,baud-通信波特率 */
- void ConfigUART(unsigned int baud)
- {
- TMOD &= 0xF0; //清零T0的控制位
- TMOD |= 0x02; //配置T0为模式2
- TH0 = 256 - (11059200/12)/baud; //计数T0的重载值
- }
-
- /* 启动串行接受 */
- void StartRXD()
- {
- TL0 = 256 - ((256-TH0) >> 1);//接受启动时T0定时为半个波特率周期
- ET0 = 1; //使能T0中断
- TR0 = 1; //启动T0
- RxdEnd = 0; //清零接受结束标志
- RxdorTxd = 0; //设置当前状态为接受 1位发送
-
- }
-
- /* 启动串行发送,dat-待发送字节数据 */
- void StartTXD(unsigned char dat)
- {
- TxdBuf = dat; //待发送数据保存到发送缓冲器
- TL0 = TH0; //T0计算初值为重载值
- ET0 = 1; //使能T0中断
- TR0 = 1; //启动T0
- PIN_TXD = 0; //发送起始位
- TxdEnd = 0; //清零发送结束标志
- RxdorTxd = 1; //设置当前状态为发送
- }
-
- /*T0中断服务函数,处理串行发送和接收 */
- void interruptTimer0() interrupt 1
- {
- static unsigned char cnt = 0;
-
- if(RxdorTxd)
- {
- cnt++;
- if(cnt <= 8) //低位在先一次发送8bit数据位
- {
- PIN_TXD = TxdBuf & 0x01;
- TxdBuf >>= 1;
- }
- else if(cnt == 9) //发送停止位
- {
- PIN_TXD = 1;
- }
- else //发送结束
- {
- cnt = 0; //复位bit计数器
- TR0 = 0; //关闭T0
- TxdEnd = 1; //置发送结束标志
- }
- }
-
- else //串行接收处理
- {
- if(cnt == 0) // 处理起始位
- {
- if(!PIN_RXD) //起始位为0时,清零接收缓冲器,准备接受数据位
- {
- RxdBuf = 0;
- cnt++;
- }
- else //起始位为1(不为0)时,中止接收
- {
- TR0 = 0; //关闭T0
- }
- }
- else if(cnt <= 8) //处理8位数据位
- {
- RxdBuf >>= 1; //低位在先,所以将之前接收的位向右移
- if(PIN_RXD) //接收脚为1时,缓冲器最高位置1
- { //而为0时不处理即仍保持位移后的0
- RxdBuf |= 0x80;
- }
- cnt++;
- }
- else //停止位处理
- {
- cnt = 0; //复位bit计数器
- TR0 = 0; //关闭T0
- if(PIN_RXD) //停止位为1时,方认为数据有效
- {
- RxdEnd = 1; //置接收结束标志
- }
- }
- }
-
- }
Peta logika kerja
Program ini menggunakan timer 0 untuk mensimulasikan komunikasi serial UART. Perhatikan bahwa ini hanyalah aProgram simulasi. Program ini mengimplementasikan komunikasi antara komputer dan mikrokontroler. Hasil komunikasinya adalah mengirimkan data yang dikirimkan oleh komputer ke mikrokontroler, dan mikrokontroler menambahkan 1 pada data tersebut dan mengirimkannya kembali ke komputer. Gunakan asisten debugging port serial yang disertakan dengan STC-ISP untuk menunjukkan hasil ini.
Pertama pastikan portnya sama. Gambar di atas semuanya COM3, baud rate 9600, check bit NO, data bit 8, dan stop bit 1. (Yang diset disini adalah komputer). parameter port serial)
Lihatlah hasilnya: komunikasi normal dapat dilakukanTimer 0 mensimulasikan komunikasi serial_bilibili_bilibili
Jelaskan secara singkat logika kerja program ini: untukKirim modulMisalnya, kirim 0xAA =1010 1010 dimulai dari bit terendah
Yaitu TxdBuf = 1010 1010Lihat programnya
- if(RxdorTxd)
- {
- cnt++;
- if(cnt <= 8) //低位在先一次发送8bit数据位
- {
- PIN_TXD = TxdBuf & 0x01;
- TxdBuf >>= 1;
- }
- else if(cnt == 9) //发送停止位
- {
- PIN_TXD = 1;
- }
- else //发送结束
- {
- cnt = 0; //复位bit计数器
- TR0 = 0; //关闭T0
- TxdEnd = 1; //置发送结束标志
- }
- }
PertamaMasukkan interupsi cnt = 1
PIN_TXD = TxdBuf & 0x01, yaitu hasil AND dari 1010 1010 0000 0001 adalah menetapkan bit terendah 0xAA ke port pengirim untuk mengaktifkan level yang sesuai. Terlihat tegangan yang masuk ke port TXD interupsi pertama kali berada pada level rendah, dan proses ini akan terus berlanjut hingga terjadi interupsi kedua.
Kemudian TxdBuff digeser satu bit ke kanan yaitu TxdBuf = 0101 0101
Kemudiankedua kalinyamengganggu
cnt = 2
PIN_TXD = 1 Kali ini level port pengirim berada pada level tinggi
TxdBuf = 0010 1010
Kemudian kali ketiga dan keempat sampaiyang ke 8 kalinya
cnt = 8
Level yang diatur oleh PIN_TXD = 1 adalah level tinggi, yaitu bit 1 tertinggi dari data yang dikirimkan.
Saat ini TxdBuf = 0x00
Setelah ituyang ke 9 kalinyaMemasuki interupsi Memasuki interupsi ke-9 berarti bit data baru saja dikirim dan saatnya bersiap untuk mengirim bit stop.
Oleh karena itu, PIN_TXD = 1, port pengirim langsung ditetapkan ke level tinggi.
Interupsi kesepuluh terakhir menyatakan bahwa bit stop juga telah dikirim.Oleh karena itu, cnt reset diberi nilai 0, TR0 diberi nilai 0, timer 0 dimatikan, TXDEnd = 1, flag akhir transmisi disetel ke 1, dan transmisi bingkai data lengkap selesai.
Setelah itumodul penerima: Tadi kita kirim 0xAA. Untuk fungsi ini nilainya adalah hasil penjumlahan 1 pada data yang diterima, jadi data yang diterima adalah: 0xA9 =1010 1001
- void StartRXD()
- {
- TL0 = 256 - ((256-TH0) >> 1);//接受启动时T0定时为半个波特率周期
- ET0 = 1; //使能T0中断
- TR0 = 1; //启动T0
- RxdEnd = 0; //清零接受结束标志
- RxdorTxd = 0; //设置当前状态为0接收 1为发送
-
- }
- else //串行接收处理
- {
- if(cnt == 0) // 处理起始位
- {
- if(!PIN_RXD) //起始位为0时,清零接收缓冲器,准备接受数据位
- {
- RxdBuf = 0;
- cnt++;
- }
- else //起始位为1(不为0)时,中止接收
- {
- TR0 = 0; //关闭T0
- }
- }
- else if(cnt <= 8) //处理8位数据位
- {
- RxdBuf >>= 1; //低位在先,所以将之前接收的位向右移
- if(PIN_RXD) //接收脚为1时,缓冲器最高位置1
- { //而为0时不处理即仍保持位移后的0
- RxdBuf |= 0x80;
- }
- cnt++;
- }
- else //停止位处理
- {
- cnt = 0; //复位bit计数器
- TR0 = 0; //关闭T0
- if(PIN_RXD) //停止位为1时,方认为数据有效
- {
- RxdEnd = 1; //置接收结束标志
- }
- }
- }
Terlihat bahwa proses pengiriman dan penerimaan sebenarnya serupa. Untuk penerimaan data, saya menandai interupsi pertama dimulai dari yang ke-0 terutama untuk bekerja sama dengan cnt agar mudah dipahami.
Seperti yang ditunjukkan pada gambar, Anda dapat melihat bahwa waktu yang diperlukan untuk memasukkan interupsi untuk ke-0 kalinya adalah setengah dari waktu interupsi yang telah ditentukan sebelumnya. Hal ini karena ketika mengkonfirmasi apakah suatu level sinyal adalah 0 atau 1, jika levelnya paling awal Kesalahan atau gangguan dapat terjadi pada saat pengambilan sampel, sehingga titik pengambilan sampel umumnya ditetapkan pada titik tengah waktu transmisi sinyal, dan level sinyal di sana dianggap sebagai sinyal yang ditransmisikan dalam periode waktu tersebut. Oleh karena itu, modul penerima hanya perlu mengatur waktu interupsinya menjadi setengah dari waktu asli ketika menerima bit awal untuk pertama kalinya, untuk memastikan bahwa semua titik pengumpulan sinyal berikutnya berada di titik pusat.
Mari kita lihat bagaimana program ini diatur: TL0 = 256 - ((256-TH0) >> 1); //Waktu terima T0 adalah setengah periode baud rate saat memulai
256-TH0 adalah waktu interupsi yang telah ditentukan sebelumnya, kami berharap waktu interupsi menjadi setengah dari waktu interupsi sebelumnya. Operasi program adalah menggesernya ke kanan sebanyak 1 bit dari 8. Menggesernya ke kanan sebanyak 1 adalah 0000 0100 = 4. Terlihat bahwa operasi menggeser ke kanan sebanyak 1 bit adalah mengubah angka menjadi setengah dari nilai aslinya. Begitu pula hasil pergeseran ke kiri sebanyak 1 bit adalah 0001 0000 =16 yang berarti mengalikan bilangan aslinya dengan 2
Mulai analisis proses program
Ketika RxdorTxd adalah 0, masukkan fungsi lain, yaituke-0 kalinya Memasuki interupsi, titik awal modul penerima dalam domain waktu adalah titik tengah bit awal. Tentukan terlebih dahulu apakah tegangan port benar-benar rendah, dan jika tidak, matikan interupsinya. Kenapa melakukan ini?
Karena ini adalah modul penerima, tegangan RXD tidak dikontrol oleh mikrokontroler, dalam hal ini dikontrol oleh komputer yang mengontrol tegangan terminal TXD CH340T. Tegangan RXD mikrokontroler mengikuti ujung CH340TXD. Bagi pihak penerima, informasi yang diterima mungkin terganggu dan perlu dikonfirmasi kembali.
Jika ya, cnt++, maka cnt=1. RxdBuf = 0; hapus buffer penerimaan ke 0
Setelah itu1(sebenarnya yang kedua kalinya)Kelas dua Masukkan interupsi cnt = 1 dan masukkan fungsi else if() untuk mentransfer data ke buffer langkah demi langkah. Proses selanjutnya tidak akan dijelaskan secara detail, jika pembaca berminat bisa melaluinya sendiri sesuai logika program. Lihat apakah data benar-benar dapat disimpan dalam variabel buffer dalam bit rendah terlebih dahulu dan kemudian dalam bit tinggi. Karena pada postingan blog sebelumnya, fungsinya menggunakan metode shift kiri untuk menyimpan data bit tinggi terlebih dahulu. Pendekatan ini cukup melengkapi cara kerja lainnya.
Pada titik ini, program menggunakan timer 0 untuk mensimulasikan komunikasi serial UART.
Tiga tipe dasar komunikasi
Komunikasi simpleks: Hanya satu pihak yang diperbolehkan mengirimkan informasi ke pihak lain, dan pihak lain tidak dapat mengirimkan informasi kembali, seperti remote control TV, siaran radio, dll.
Komunikasi setengah dupleks: Data dapat dikirim antara dua pihak, dan hanya satu pihak yang dapat mengirimkannya ke pihak lain pada saat yang bersamaan. Program simulasi port serial di atas juga dapat dipahami sebagai komunikasi setengah dupleks
Komunikasi full-duplex: data dapat dikirim sekaligus menerima data, dan keduanya dilakukan secara bersamaan, seperti komunikasi telepon kita.
Komunikasi serial simulasi port IO pada dasarnya menunjukkan inti dari komunikasi serial, tetapi program mikrokontroler perlu terus-menerus mendeteksi dan memindai data yang diterima oleh port IO mikrokontroler, yang memakan banyak waktu berjalan mikrokontroler. Oleh karena itu, terdapat modul UART di dalam mikrokontroler 51, yang dapat menerima data secara otomatis. Cukup beri tahu setelah menerimanya dengan benar, Anda perlu mengkonfigurasi register fungsi khusus dengan benar.
Daftar kontrol serial SCON
Kasus ini hanya memperkenalkan mode 1, yaitu pengaturan SM1 = 1 dan SM0 = 0 adalah mode 1. Mode ini adalah format bingkai data yang digunakan dalam simulasi komunikasi serial sebelumnya: 1 bit awal, 8 bit data, dan 1 bit berhenti.
Komunikasi serial analog menggunakan timer 0 untuk mengekspresikan baud rate. Pemancar baud rate modul UART STC89C52 hanya dapat dihasilkan oleh timer T1 atau timer T2, tetapi tidak dengan timer T0.
Saat menggunakan timer T2, register konfigurasi tambahan diperlukan.
Kode program:
- # include<reg52.h>
-
- void ConfigUART(unsigned int baud);
-
- void main()
- {
- EA = 1;
- ConfigUART(9600); //配置波特率为9600
- while(1);
-
- }
- /* 串口配置函数,baud-通信波特率 */
- void ConfigUART(unsigned int baud)
- {
- SCON = 0x50; //0x50= 0101 0000 配置串口为模式1
- TMOD &= 0x0F; //清零T1的控制位
- TMOD |= 0x20; //0x20 = 0010 0000 配置T1的为模式2自动重载模式
- TH1 = 256 - (11059200/12/32)/baud; //计算T1的重载值
- TL1 = TH1; //设置初值
- ET1 = 0; //禁止T1中断
- ES = 1; //启动串口中断
- TR1 = 1; //启动T1定时器
- }
-
- /*UART中断服务函数 */
- void interruptUART() interrupt 4
- {
- if(RI) //接收到字节
- {
- RI = 0; //软件清0接收中断标志
- SBUF = SBUF+1;//接收的数据+1,左边是发送SBUF,右边是接收SBUF
-
- }
- if(TI)
- {
- TI = 0; //软件清0发送中断标志位
- }
-
- }
Lihatlah video hasilnya:Dilengkapi dengan modul komunikasi serial_bilibili_bilibili
Terlihat bahwa komunikasi normal dapat tercapai tanpa masalah, kemudian diberikan penjelasan singkat tentang konten yang relevan dalam program:
Rumus perhitungan nilai reload timer T1 adalah:
TH1 = TL1 = 256 - nilai osilator kristal/12/2/16/baud rate maka nya
Waktu interval interupsi = nilai osilator kristal/12/2/16/laju baud = nilai osilator kristal/12*(1/laju baud)*(1/32)
Nilai osilator kristal/12 berarti jumlah siklus mesin dalam 1 detik, (1/baud rate) berarti waktu yang dibutuhkan untuk mengirimkan 1 bit data
Nilai osilator kristal/12* (1/baud rate) berarti berapa banyak mesin prosesor yang diperlukan untuk mengirimkan 1 bit data
Dengan cara yang sama, nilai osilator kristal/12*(1/baud rate)*(1/32) waktu interupsi ini = 1/32 waktu untuk mengirimkan 1 bit data
Artinya, transfer 1 bit data dibagi menjadi 32 interval waktu.
Hasil perhitungannya adalah 3, yaitu interval interupsi = 3 siklus mesin.
Karena metode pengambilan sampel sinyal pada modul port serial adalah mengumpulkan satu sinyal sebanyak 16 kali, dan mengeluarkan level sinyal sebanyak 7, 8, dan 9 kali. Jika dua dari tiga kali merupakan level tinggi, maka data dianggap menjadi 1 .Jika levelnya 0 dua kali, bit ini dianggap 0. Dengan cara ini, jika data salah dibaca karena gangguan yang tidak terduga, kebenaran data akhir masih dapat dijamin.
Gambar di bawah ini berasal dari postingan blog yang direkomendasikan terutama untuk kemudahan penjelasan.: Rumus perhitungan baud rate
SMOD dikendalikan oleh power register PCON. Secara default, SMOD adalah 0. Menggantikannya ke dalam rumus di atas adalah rumus solusi nilai awal sebelumnya.
TH1 = TL1 = 256 - nilai osilator kristal/12/2/16/baud rate
Ketika nilai register tertinggi diatur ke 1 PCON |= 0x80; yaitu SMOD diatur ke 1, baud rate dapat digandakan, seperti yang ditunjukkan pada rumus di atas.
Saat ini, nilai awal T1 menjadi: TH1 = TL1 = 256 - nilai osilator kristal/12/16/baud rate
Satu hal yang perlu diperhatikan di sini adalah itu: Jika ingin menggunakan register PCON untuk mengontrol laju gelombang menjadi dua kali lipat, rumus nilai awalnya masih perlu ditulis sebagai
TH1 = TL1 = 256 - nilai osilator kristal/12/2/16/baud rate adil
Nilai isi ulang saat ini adalah TH1=256 - (11059200/12/32)/baud =256-(11059200/12/16)/(2*buad) baud*2=4800*2=9600, 9600 adalah nilai tingkat baud program saat ini
Jika perusahaan reload nilai awal Anda menulis TH1 = TL1 = 256 - nilai osilator kristal/12/16/baud rate, maka baud rate-nya saat ini masih 4800, bukan 9600.Anda menggunakan perangkat lunak komunikasi serial untuk mengatur baud rate komunikasi ke 9600 dan mengirimkannyaHasilnya salah。
Tonton videonya:Tingkat baud terkait_bilibili_bilibili
Terlihat interval waktu baud rate 9600 hanya 3 siklus mesin, dan interval waktu 14400 adalah 2 siklus mesin. Terlihat bahwa jika baud rate-nya lebih tinggi, interval waktunya mungkin kurang dari 1 siklus mesin. Oleh karena itu, ada mode kerja lain, yaitu ConfigUART(9600) setelah bit tertinggi PCON disetel ke 1; baud rate saat ini adalah 19200, tetapi interval waktunya adalah interval waktu baud rate asli 9600, yaitu 3 siklus mesin.
Perlu diingat bahwa masih banyak perbedaan cara kerja modul komunikasi serial simulasi timer 0 dan modul komunikasi serial. Modul komunikasi serial menyelesaikan satu input dan output, dan hanya memasuki dua interupsi komunikasi serial. Sekali sebagai respons terhadap RI yang disetel ke 1, satu kali sebagai respons terhadap TI yang disetel ke 1, dan kemudian dibersihkan oleh perangkat lunak. Tidak lagi memperhatikan proses transmisi, hanya fokus pada apakah transmisi sudah selesai, dan mengirimkan sinyal saat transmisi sudah selesai.
Sirkuit pengirim dan penerima komunikasi serial secara fisik memiliki dua register SBUF yang identik, dan alamatnya juga 0x99, tetapi satu digunakan untuk buffer pengiriman dan yang lainnya digunakan untuk buffer penerima. Artinya ada dua kamar, dan nomor rumah kedua kamar itu sama. Yang satu boleh masuk tetapi tidak boleh yang lain keluar tetapi tidak boleh masuk. Dengan cara ini, komunikasi UART full-duplex dapat dicapai tanpa interferensi satu sama lain. Namun secara logis, hanya SBUF yang dioperasikan setiap kali, dan mikrokontroler secara otomatis memilih apakah akan menerima SBUF atau mengirim SBUF berdasarkan apakah ia melakukan operasi "baca" atau "tulis" pada SBUF tersebut.
Langkah-langkah dasar program komunikasi serial:
1. Konfigurasikan port serial ke mode 1.
2. Konfigurasikan timer T1 ke mode 2, yaitu mode instalasi ulang otomatis.
3. Hitung nilai awal TH1 dan TL1 berdasarkan baud rate. Jika perlu, Anda dapat menggunakan PCON untuk menggandakan baud rate.
4. Buka register pengatur waktu TR1 dan biarkan pengatur waktu berjalan.Catatan: Saat menggunakan interupsi port serial, interupsi timer 1 tidak dapat diaktifkan lagi, kecuali Anda menggunakan interupsi port serial timer 2.