センサースイッチゴミ箱の小さなプロジェクトの完了と問題解決——STC89C52RCシングルチップマイコンをベースに

センサースイッチゴミ箱の小さなプロジェクトの完了と問題解決——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();`
    }`

おすすめ

転載: blog.csdn.net/weixin_54882070/article/details/129419626
おすすめ