序文
シリアルポートに関する最近の研究をまとめてみましょう。
参考リンク
[51 マイクロコントローラー] シリアル通信 - Zhihu (zhihu.com)
LEDデジタル管(Keil+Proteus)の静的表示と動的表示_プロテウスデジタル管表示 - CSDNブログ
74ls165 中国語情報まとめ (74ls165 ピン図と機能_動作原理と応用回路) - Electronic Enthusiasts Network (elecfans.com)
proteus でスイッチを描画する方法 - Baidu Experience (baidu.com)
C51マイコン実験第4弾 -----シリアル通信-CSDNブログ
BCD コード_Baidu 百科事典 (baidu.com)
出力は 8 個の外部 LED 発光ダイオードに接続され、ランニング ライトを点灯します。
実験要件: 8 つの発光ダイオードが点灯する流れを制御するプログラムを作成し、74LS164 の出力を使用して 8 つの外部 LED 発光ダイオードのインターフェイス回路を制御します。
74LS164 の 8 ピン(CLK 端子)は同期パルス入力端子、9 ピンは制御端子で、9 ピンが 0 のとき、RXD 端子からシリアルデータ入力端子(1、2 ピン)にシリアルデータが流れます。 9 番ピンが 1 のとき、1 番ピンと 2 番ピンの入力はオフになりますが、74LS164 の 8 ビットパラレル出力は許可されます。
シリアルポートが 8 ビットシリアルデータの送信を完了すると割り込みを申請し、割り込みサービスプログラムではマイコンは次の 8 ビットデータをシリアルポートに出力します。
つまり、74LS164 の 9 番ピンは 0 が入力、1 が出力であることを示しており、データを入力してから出力するというプログラムの考え方です。前述したように、流水ランプはシフトしています。ライブラリ関数を直接呼び出すことも、自分で記述することもできます。<< を使用すると、循環シフトがないことを意味するため、すべての LED をシフトしたくない場合は、最後にオフにする場合は、判断を追加する必要があります。 if(nSendByte==0)nSendByte=1;
#include<reg51.h>
#include<stdio.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit P1_0=P1^0;
uchar nSendByte;
void delay(uint i){//延时
uchar j;
for(;i>0;i--)
for(j=0;j<125;j++);
}
void main(){
SCON=0x00;//设置串行口为方式0
EA=1;//全局中断允许
ES=1;//允许串行口中断
nSendByte=1;//流水灯的初值0x01
SBUF=nSendByte;//向SBUF写入点亮数据,启动串行发送
P1_0=0;//允许串口向74LS164发送数据
while(1);
}
void port1() interrupt 4{//串行口中断服务程序
if(TI){//TI=1,1字节串行发送完毕
P1_0=1;//允许串口74LS164并行输出
SBUF=nSendByte;//向SBUF写入数据
delay(500);//延时(LED的持续时间)
P1_0=0;//允许串口向74LS164发送数据
nSendByte=_crol_(nSendByte,1);//流水灯
SBUF=nSendByte;//向SBUF写入数据
}
//软件清零
TI=0;
RI=0;
}
ここにあるコンポーネントのほとんどは表示されていますが、この 1 つだけ74LS164.IECを自分で追加する必要があります。 (現象は流水ランプです)
外部パラレル入力とシリアル出力を備えた同期シフトレジスタが LED を点灯します
実験要件: シリアルポートを 8 ビットパラレル入力およびシリアル出力同期シフトレジスタ 74LS165 に外部接続し、8 ビットパラレル入力ポートの回路を拡張して、74LS165 に接続された 8 つのスイッチのステータスを送信します。シリアルポートをマイクロコントローラーに読み取り、P2 ポートを介して対応するダイオードを駆動して点灯させます。
元の質問の要件はこのようなものではありませんが、実装が正しくありません。これは、ボタンの状態を読み取るためにメイン スイッチが常に押されており、2 つのボタンを同時に押すことができないことを意味します。これは、LED が完全に点灯するかすべて消灯することしかできないことを意味します。それを考慮していなかったのか、質問が間違っていたのかはわかりません。これを修正し、メイン スイッチを削除して、対応する LED ライトが点灯するようにしました。ボタンを押すと同期してオンとオフになります。 (これは書籍のコードとは異なります。メインボタンが削除されたため、コードを修正しました。)
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit P1_0=0x90;
uchar nRxByte;
void delay(uint i){//延时
uchar j;
for(;i>0;i--)
for(j=0;j<125;j++);
}
void main(){
SCON=0x10;
ES=1;//允许串行口中断
EA=1;//允许全局中断
while(1);
}
void port1() interrupt 4{
P1_0=0;//并行读入开关的状态
delay(1);
P1_0=1;//将开关的状态输出到串口中
nRxByte=SBUF;//接收的开关状态数据从SBUF读入到nRxByte单元中
P2=nRxByte;//读入的数据送到P2口
TI=0;//软件清零
RI=0;
}
ここでは新しいデバイスが使用されています74LS165。シリアル ポートが灰色でも接続に問題がない場合は、接続を検討してください。 LED を点灯させたい場合は、対応する抵抗の抵抗値をあまり高く設定できません。
拡大する
今になってふと気づいたのですが、彼が言いたかったのは、スイッチはボタンではないということだったので、なぜダメなのかと言うと、スイッチが入っていれば正常になるのですが、メインスイッチを閉じて、次に、スイッチ S1 ~ S7 を使用して、デジタル管の P2 およびディスプレイに対応する LED ライトを制御します。
必要なコンポーネントは7SEG-BCD です。
メインスイッチを閉じる
メインスイッチをオフにする
シングルチップマシンAとマシンBがシリアル通信を行う
実験要件: 2 台のマシンの RXD と TXD を相互接続するとします。マシン A の P1 ポートは 8 つのスイッチに接続され、マシン B の P1 ポートは 8 つの発光ダイオードに接続されます。マシン A は、送信のみ可能で受信はできないシンプレックス モードに設定されています。マシン A は、P1 ポートの 8 つのスイッチのステータスを読み取り、シリアル ポートを介してマシン B に送信する必要があります。マシン B は、マシン A の 8 つのスイッチの受信ステータス データを P1 ポートに送信し、P1 ポートの 8 つのライトが点灯します。 8つのスイッチの状態を表示するダイオード。
手順としては、マシン A が P1 スイッチのステータスを読み取り、マシン A がデータをマシン B に送信し、マシン B がデータを受信し、マシン B が受信したデータを P1 に入力して表示します。
//甲机
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
void main(){
uchar temp=0;
TMOD=0x20;//设置定时器T1为方式2
TH1=0xFD;//波特率9600
TL1=0xFD;
SCON=0x40;//串口初始化方式1发送,不接收
PCON=0x00;//SMOD=0
TR1=1;//启动T1
P1=0xFF;//读前先写1
while(1){
temp=P1;//读入P1口开关的状态数据
SBUF=temp;//数据送串行口发送
while(TI==0);//如果TI=0,表示没发送完,循环等待
TI=0;//软件清零
}
}
//乙机
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
void main(){
uchar temp=0;
TMOD=0x20;//设置定时器T1为方式2
TH1=0xFD;//波特率9600
TL1=0xFD;
SCON=0x50;//设置串口为方式1接收
PCON=0x00;//SMOD=0
TR1=1;//启动T1
while(1){
while(RI==0);//如果RI=0,表示没有接收到数据
RI=0;//软件清零
temp=SBUF;//读取到的数据存到temp中
P1=temp;//接收到的数据送P1口控制8个LED的亮灭
}
}
ここでは、以前に表示されなかったコンポーネントが使用されています スイッチ。
拡大する
コードを変更することなく、スイッチの状態だけを変えるという、とても感動的な実験でした。原理がわからなくても大丈夫ですので、制御変数の方法でゆっくり調整してみてください。
要約する
これは、この本の例を簡単に書き直したものです。マイクロコントローラーに関する 4 番目の実験については、このブログを参照してください。
このようにまとめて書いてありますが、デジタル管を通すことで点灯するのか、それともスイッチが直接制御してデジタル管が点灯するのかをどうやって他人に伝えるのでしょうか。
このデジタル管はカソードが共通であり、マイクロコントローラーなしで実装できますが、動作中に調整できない場合があり、それが直接的な消灯の原因となります。
右のLEDライトが点灯している場合はスイッチを2回連続で押しても問題ありませんが、右のLEDライトが消灯している場合はスイッチを2回連続で押すとデジタル管が消えてしまいます。どうやら低レベルから無レベルになったようですが、具体的な状況はわかりません。