找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3663|回复: 9
收起左侧

求大神教我如何写这个程序?89c52单片机按键控制继电器

[复制链接]
ID:402168 发表于 2019-3-12 18:55 | 显示全部楼层 |阅读模式
c51单片机程序 实现一个按键闭合继电器25秒之后断开;接着闭合另一个继电器3分钟然后断开接着打开一个外接3.3v的led灯1分钟,单片机上有3.3v的接口,只需要延时1分钟就行了,然后蜂鸣器响,结束!单片机上有蜂鸣器


最小系统的

最小系统的
IMG_6307.JPG

这个是原理图

这个是原理图
截图03.jpg
截图07.jpg
回复

使用道具 举报

ID:10947 发表于 2019-3-13 11:19 | 显示全部楼层
你自己的逻辑都清楚了,应该挺容易了吧;
先检测按键是否按下,然后一个个顺序执行;
有开发板就应该有例程吧,看看按键检测的例程,IO口控制的例程;
继电器 蜂鸣器 LED都是控制IO口的输出。
回复

使用道具 举报

ID:402168 发表于 2019-3-13 16:20 | 显示全部楼层
lfc315 发表于 2019-3-13 11:19
你自己的逻辑都清楚了,应该挺容易了吧;
先检测按键是否按下,然后一个个顺序执行;
有开发板就应该有例 ...

这个 不太会,小白一个
回复

使用道具 举报

ID:213173 发表于 2019-3-13 17:11 | 显示全部楼层
这个程序很简单,按键按下开始计时,按顺序工作300秒结束,等待按键再次按下。
给你写一个程序,端口根据实际电路自行重新定义,定时时间也可以自行修改。
  1. #include<reg51.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int

  4. sbit Key=P3^0;
  5. sbit Relay1=P2^0;
  6. sbit Relay2=P2^1;
  7. sbit LED=P2^2;
  8. sbit Buzzer=P2^3;
  9. uchar Cnt50ms=0;
  10. uint Cnt1s=0;
  11. bit sign=0;       
  12. /****延时程序*****/
  13. void delay(uint t)
  14. {
  15.         while(t--);
  16. }
  17. /****定时器初始化程序*****/
  18. void Timer0Init()        //50毫秒@11.0592MHz
  19. {
  20.         TMOD= 0x01;                //设置定时器模式
  21.         TL0 = 0x00;                //设置定时初值
  22.         TH0 = 0x4C;                //设置定时初值
  23.         TR0 = 1;                //定时器0开
  24.         EA=1;                        //开总中断
  25.         ET0=1;                        //开定时器0中断
  26. }
  27. /****主程序*******/
  28. void main()
  29. {
  30.         Timer0Init();
  31.         while(1)
  32.         {
  33.                 if(Key==0)
  34.                 {
  35.                         delay(10000);//延时消抖
  36.                         if((Key==0)&&(sign==0))
  37.                         {
  38.                                 sign=1;//按键自锁 启动定时器计时
  39.                         }
  40.                 }
  41.         }
  42. }
  43. /****中断服务程序*******/
  44. void timer0() interrupt        1//50毫秒@11.0592MHz
  45. {
  46.         TL0 = 0x00;                //设置定时初值
  47.         TH0 = 0x4C;                //设置定时初值
  48.         if(sign==1)
  49.         {
  50.                 Cnt50ms++;
  51.                 if(Cnt50ms>=20)
  52.                 {
  53.                         Cnt50ms=0;
  54.                         Cnt1s++;
  55.                 }
  56.                 if(Cnt1s<25)
  57.                 {
  58.                         Relay1=0;
  59.                 }
  60.                 if(Cnt1s>=25)
  61.                 {
  62.                         Relay1=1;
  63.                         Relay2=0;
  64.                 }
  65.                 if(Cnt1s>=205)
  66.                 {
  67.                         Relay2=1;
  68.                         LED=0;
  69.                 }
  70.                 if(Cnt1s>=265)
  71.                 {
  72.                         LED=1;
  73.                         Buzzer=0;
  74.                 }
  75.                 if(Cnt1s>=300)
  76.                 {
  77.                         sign=0;
  78.                         Cnt50ms=0;
  79.                         Cnt1s=0;
  80.                         Buzzer=1;
  81.                 }
  82.         }
  83. }
复制代码

评分

参与人数 1黑币 +12 收起 理由
电子黑火药 + 12 很给力!

查看全部评分

回复

使用道具 举报

ID:402168 发表于 2019-3-13 18:08 | 显示全部楼层
wulin 发表于 2019-3-13 17:11
这个程序很简单,按键按下开始计时,按顺序工作300秒结束,等待按键再次按下。
给你写一个程序,端口根据 ...

谢谢 我研究一下
回复

使用道具 举报

ID:402168 发表于 2019-3-13 18:56 | 显示全部楼层
wulin 发表于 2019-3-13 17:11
这个程序很简单,按键按下开始计时,按顺序工作300秒结束,等待按键再次按下。
给你写一个程序,端口根据 ...

大神 我测试过了 ,很完美,就是我的晶振是12M的,然后led灯一端接3.3v的vcc一端接P2.2电压不够 只微微的发亮。不知道有什么解决的办法不,然后如果要两个按键控制单独分别控制一样的程序的话 需要加那些语句呀?
回复

使用道具 举报

ID:402168 发表于 2019-3-13 19:03 | 显示全部楼层
谢谢 大神 很完美,如果再加一个按键,两个独立按键 能够独立的执行 上面一样的程序 怎么做呀/
回复

使用道具 举报

ID:213173 发表于 2019-3-14 14:22 | 显示全部楼层
电子黑火药 发表于 2019-3-13 19:03
谢谢 大神 很完美,如果再加一个按键,两个独立按键 能够独立的执行 上面一样的程序 怎么做呀/

程序已经改为两个按键控制与单独分别控制一样,定时器与12MHz晶振配套。至于LED亮度不足可能改变供电电压不易,只能减小限流电阻或换用超高亮LED。
  1. #include<reg51.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int

  4. sbit Key1=P3^0;
  5. sbit Key2=P3^1;
  6. sbit Relay1=P2^0;
  7. sbit Relay2=P2^1;
  8. sbit LED=P2^2;
  9. sbit Buzzer=P2^3;
  10. uchar Cnt50ms=0;
  11. uint Cnt1s=0;
  12. bit sign=0;        
  13. /****延时程序*****/
  14. void delay(uint t)
  15. {
  16.         while(t--);
  17. }
  18. /****定时器初始化程序*****/
  19. void Timer0Init()                //50毫秒@12.000MHz
  20. {
  21.         TMOD= 0x01;                //设置定时器模式
  22.         TL0 = 0xB0;                //设置定时初值
  23.         TH0 = 0x3C;                //设置定时初值
  24.         TR0 = 1;                        //定时器0开始计时
  25.         EA=1;         //开总中断
  26.         ET0=1;        //开定时器0中断
  27. }
  28. /*
  29. void Timer0Init()        //50毫秒@11.0592MHz
  30. {
  31.         TMOD= 0x01;                //设置定时器模式
  32.         TL0 = 0x00;                //设置定时初值
  33.         TH0 = 0x4C;                //设置定时初值
  34.         TR0 = 1;                        //定时器0开
  35.         EA=1;                        //开总中断
  36.         ET0=1;                        //开定时器0中断
  37. }*/
  38. /****主程序*******/
  39. void main()
  40. {
  41.         Timer0Init();
  42.         while(1)
  43.         {
  44.                 if((Key1==0)||(Key2==0))
  45.                 {
  46.                         delay(10000);//延时消抖
  47.                         if((Key1==0)||(Key2==0)&&(sign==0))
  48.                         {
  49.                                 sign=1;//按键自锁 启动定时器计时
  50.                         }
  51.                 }
  52.         }
  53. }
  54. /****中断服务程序*******/
  55. void timer0() interrupt 1
  56. {
  57. //        TL0 = 0x00;    //设置定时初值50毫秒@11.0592MHz
  58. //        TH0 = 0x4C;    //设置定时初值50毫秒@11.0592MHz
  59.         TL0 = 0xB0;                //设置定时初值50毫秒@12.000MHz
  60.         TH0 = 0x3C;                //设置定时初值50毫秒@12.000MHz
  61.         if(sign==1)
  62.         {
  63.             Cnt50ms++;
  64.             if(Cnt50ms>=20)
  65.             {
  66.                     Cnt50ms=0;
  67.                     Cnt1s++;
  68.             }
  69.             if(Cnt1s<25)
  70.             {
  71.                     Relay1=0;
  72.             }
  73.             if(Cnt1s>=25)
  74.             {
  75.                     Relay1=1;
  76.                     Relay2=0;
  77.             }
  78.             if(Cnt1s>=205)
  79.             {
  80.                     Relay2=1;
  81.                     LED=0;
  82.             }
  83.             if(Cnt1s>=265)
  84.             {
  85.                     LED=1;
  86.                     Buzzer=0;
  87.             }
  88.             if(Cnt1s>=300)
  89.             {
  90.                     sign=0;
  91.                     Cnt50ms=0;
  92.                     Cnt1s=0;
  93.                     Buzzer=1;
  94.             }
  95.         }
  96. }
复制代码



回复

使用道具 举报

ID:483991 发表于 2019-3-14 15:47 | 显示全部楼层
少一些求拜,多去看看别人的例子,多敲代,多调试才会进步
回复

使用道具 举报

ID:402168 发表于 2019-3-27 15:03 | 显示全部楼层
wulin 发表于 2019-3-14 14:22
程序已经改为两个按键控制与单独分别控制一样,定时器与12MHz晶振配套。至于LED亮度不足可能改变供电电压 ...

大神两个按键分开的话,按键1控制两个继电器跟之前的一样,然后按键2控制3个继电器,比之前多一个继电器其他的和之前的一样,这个代码怎么分开呀,加一个判断吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表