センサースイッチゴミ箱の小さなプロジェクトの完了と問題解決——STC89C52RCシングルチップマイコンをベースに
以下の5つのステップに分かれています。
01コード_ステアリングギア
注:ステアリングギアを手で回すことはできないため、ステアリングギアが損傷する可能性があります(これが原因でステアリングギアを壊してしまいました。使用したステアリングギアが低すぎる可能性があります)
組み立て後、コードは正常に実行できますが、カバーを開くとステアリング ギアが「ぴくぴく」動きます。
`voi`d openDusbin()`
`{
`
`char n;`
`jd = 3; //90度 1.5ms高电平`
`//舵机开盖`
`cnt = 0;`
`beep = 0;`
`for(n=0; n<2; n++)`
`Delay150ms();`
`beep = 1;`
`Delay2000ms();`
}`
cntが0に戻ると「ピクピク」
解決:
判定するフラグを作成する必要があるので、最後の角度を保存する変数を作成します **char jd_bak; **カバーを閉じて jd_back=jd; も追加します。
`void openDusbin()`
`{
`
`char n;`
`jd = 3; //90度 1.5ms高电平`
`//舵机开盖`
`if(jd_bak != jd) {
//如果上一次角度不等于本次角度则执行,否则不执行`
`cnt = 0;`
`beep = 0;`
`for(n=0; n<2; n++)`
`Delay150ms();`
`beep = 1;`
`Delay2000ms();`
`}`
`jd_bak = jd;`
`}`
02 Code_Distance スイッチカバー - 超音波距離測定、カバーを開けるボタンを追加、振動センサー
`sbit SW1 = P2^1;`
`sbit Trig = P1^5;`
`sbit Echo = P1^6;`
`sbit vibrate = P3^2;`
`void main()`
`{
`
`double dis;`
`Time0Init();`
`Time1Init();`
`EX0_Init();`
`//舵机的初始位置`
`initSG90_0();`
`while(1) {
`
`//超声波测距`
`dis = get_distance();`
`if(dis < 10 || SW1 ==0 || mark_vibrate ==1) {
//如果小于10cm,或者SW1按键被按下`
`//开盖,灯状态,D5亮`
`openStatusLight();`
`//舵机关盖`
`openDusbin();`
`mark_vibrate = 0;`
`} else {
`
`//灌溉,灯状态,D5灭`
`closeStatusLight();`
`closeDusbin();`
`}`
`}`
`}`
振動センサーは敏感ではありません。使用されるソフトウェア遅延は CPU カウントと同等です。クエリ方式では、レベル変化が速すぎて不安定な場合があり、CPU を逆さまにカウントすると検出できなくなります。振動センサーの最適化: 外部割り込み 0 を追加します。振動が発生すると、外部割り込みによって直ちにフラグが設定され、CPU が再度チェックします。
`void EX0_Init()`
`{
`
`//打开外部中断`
`EX0 = 1;`
`//低电平触发`
`IT0 = 0;`
`}`
割り込みハンドラ
`char mark_vibrate = 0;`
`void Ex0_Handler() interrupt 0`
`{
`
`mark_vibrate = 1;`
`}`
05 code_ distance スイッチ カバー - カバーを開くブザーを追加します
`sbit beep = P2^0;`
`if`(jd_bak != jd) {
`
`cnt = 0;`
`beep = 0;`
`for(n=0; n<2; n++)`
`Delay150ms();`
`beep = 1;`
`Delay2000ms();`
}`
`for(n=0; n<2; n++)`
`Delay150ms();`
`beep = 1;`
`Delay2000ms();`
}`