专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
51单片机
帮忙改一下程序
2019-07-15 13:47
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
51单片机
3229
3
1119
单片机
是天祥的TX-1C STC89C52
外接HC-SR501模块红外传感器
程序里的键盘按键那一块始终不对
请大神帮忙改一下
TX-1C型单片机实验板原理图.pdf
下载积分: 积分 -1 分
1015.98 KB, 下载次数: 14, 下载积分: 积分 -1 分
程序 (2).docx
下载积分: 积分 -1 分
15.72 KB, 下载次数: 8, 下载积分: 积分 -1 分
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
w1240250765
1楼-- · 2019-07-15 18:33
我把程序再放到这里
#include <reg52.h> //调用单片机头文件
#define uchar unsigned char //无符号字符型 宏定义 变量范围0~255
#define uint unsigned int //无符号整型 宏定义 变量范围0~65535
// 红外热释电传感器 平时为0 有输出为1
sbit beep = P2^3; //蜂鸣器定义
sbit red = P1^0; //红 {MOD}发光二极管定义
sbit green = P1^1; //绿 {MOD}发光二极管定义
sbit yellow = P1^2; //黄 {MOD}发光二极管定义
sbit hw = P2^0; //红外热释传感器定义
bit flag_300ms = 0;
uchar flag_alarm ; //报警标志位
uchar flag_bufang ; //布防标志位
uchar flag_bufang_en ; //布防标志位使能
uchar temp;
uint flag_value; //用做定时器的变量
/***********************1ms延时函数*****************************/
void delay_1ms(uint q)
{
uint i,j;
for(i=0;i<q;i++)
for(j=0;j<120;j++);
}
/********************独立按键程序*****************/
uchar key_can; //按键值
void key() //独立按键程序
{
static uchar key_new;
key_can = 20; //按键值还原
P3=0xfe;
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay_1ms(1);
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xde:key_can==1;
break;
case 0xbe:key_can==2;
break;
case 0x7e:key_can==3;
break;
}
}
}
}
/******************对应不同按键处理**********************/
void key_with()
{
if(key_can == 1) //按键紧急报警
{
flag_alarm = 1; //报警标志位 ;
}
if(key_can == 2) //布防按键
{
flag_bufang_en = 1;
}
if(key_can == 3) //取消报警 把变量清零
{
flag_alarm = 0;
flag_bufang = 0;
flag_bufang_en = 0;
flag_value = 0;
beep = 1;
red = 1; //关闭红灯
green = 1; //关闭绿灯
yellow = 1; //关闭黄灯
}
}
/*************定时器0初始化程序***************/
void time_init()
{
EA = 1; //开总中断
TMOD = 0X01; //定时器0工作方式1
ET0 = 1; //开定时器0中断
TR0 = 1; //允许定时器0定时
}
/******************红外报警处理**********************/
void hongwai_dis()
{
if(flag_bufang_en == 1) //准备开始布防
{
green = ~green; //绿灯闪
}
if(flag_bufang == 1) //确认布防
{
green = 0; //如果延时布防成功 绿灯长亮
if(hw == 1) //红外有输出
{
flag_alarm = 1;
}
}
if(flag_alarm == 1) //报警
{
red = ~red; //红灯报警
beep = ~beep; //蜂鸣器报警
}
}
/******************主程序**********************/
void main()
{
time_init(); //定时器初始化程序
beep = 0; //开机叫一声
delay_1ms(200);
P0 = P1 = P2 = P3 = 0xff; //初始化单片机IO口为高电平
while(1)
{
key();
yellow = ~hw; //红外热释电指示灯 有输出就亮黄灯
if(key_can < 10)
{
key_with(); //按键设置函数
}
if(flag_300ms == 1)
{
flag_300ms = 0;
hongwai_dis(); //红外报警函数
}
}
}
/*************定时器0中断服务程序***************/
void time0_int() interrupt 1
{
static uint value;
TH0 = 0x3c;
TL0 = 0xb0; // 50ms
value ++;
if(value % 6 == 0)
{
flag_300ms = 1;
}
if(flag_bufang_en == 1)
{
flag_value ++; // 400 * 50ms = 20000ms = 20秒
if(flag_value >= 400) //20秒
{
flag_bufang = 1;
flag_bufang_en = 0;
flag_value = 0;
}
}
}
加载中...
chenwei6991627
2楼-- · 2019-07-15 19:00
精彩回答 2 元偷偷看……
加载中...
jing2345
3楼-- · 2019-07-15 22:26
可以发一下原理图吗
加载中...
一周热门
更多
>
相关问题
【东软载波ESF0654 PDS开发板活动】开箱
1 个回答
东软载波ESF0654 PDS开发板外部中断
1 个回答
东软载波ESF0654 PDS开发板高级控制定时器AD16C4T
1 个回答
用串口调试助手为什么只能在hex模式接收发送而在文本模式不行
9 个回答
触摸芯片SC02B/SC04B在地砖灯的设计方案
1 个回答
东软载波ESF0654 PDS开发板串口USART0代码分享
1 个回答
普通32位单片机使用linux的应用代码
5 个回答
东软载波ESF0654 PDS开发板AT24C04的调试
9 个回答
相关文章
51单片机与蓝牙模块连接
0个评论
51单片机的硬件结构
0个评论
基于51单片机的无线遥控器制作
0个评论
51单片机 AD转换
0个评论
51单片机数码管递增显示
0个评论
如何实现对单片机寄存器的访问
0个评论
基于51单片机的指纹密码锁
0个评论
×
关闭
采纳回答
向帮助了您的网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
51单片机
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
关闭
您已邀请
15
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
#include <reg52.h> //调用单片机头文件
#define uchar unsigned char //无符号字符型 宏定义 变量范围0~255
#define uint unsigned int //无符号整型 宏定义 变量范围0~65535
// 红外热释电传感器 平时为0 有输出为1
sbit beep = P2^3; //蜂鸣器定义
sbit red = P1^0; //红 {MOD}发光二极管定义
sbit green = P1^1; //绿 {MOD}发光二极管定义
sbit yellow = P1^2; //黄 {MOD}发光二极管定义
sbit hw = P2^0; //红外热释传感器定义
bit flag_300ms = 0;
uchar flag_alarm ; //报警标志位
uchar flag_bufang ; //布防标志位
uchar flag_bufang_en ; //布防标志位使能
uchar temp;
uint flag_value; //用做定时器的变量
/***********************1ms延时函数*****************************/
void delay_1ms(uint q)
{
uint i,j;
for(i=0;i<q;i++)
for(j=0;j<120;j++);
}
/********************独立按键程序*****************/
uchar key_can; //按键值
void key() //独立按键程序
{
static uchar key_new;
key_can = 20; //按键值还原
P3=0xfe;
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay_1ms(1);
temp=P3;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xde:key_can==1;
break;
case 0xbe:key_can==2;
break;
case 0x7e:key_can==3;
break;
}
}
}
}
/******************对应不同按键处理**********************/
void key_with()
{
if(key_can == 1) //按键紧急报警
{
flag_alarm = 1; //报警标志位 ;
}
if(key_can == 2) //布防按键
{
flag_bufang_en = 1;
}
if(key_can == 3) //取消报警 把变量清零
{
flag_alarm = 0;
flag_bufang = 0;
flag_bufang_en = 0;
flag_value = 0;
beep = 1;
red = 1; //关闭红灯
green = 1; //关闭绿灯
yellow = 1; //关闭黄灯
}
}
/*************定时器0初始化程序***************/
void time_init()
{
EA = 1; //开总中断
TMOD = 0X01; //定时器0工作方式1
ET0 = 1; //开定时器0中断
TR0 = 1; //允许定时器0定时
}
/******************红外报警处理**********************/
void hongwai_dis()
{
if(flag_bufang_en == 1) //准备开始布防
{
green = ~green; //绿灯闪
}
if(flag_bufang == 1) //确认布防
{
green = 0; //如果延时布防成功 绿灯长亮
if(hw == 1) //红外有输出
{
flag_alarm = 1;
}
}
if(flag_alarm == 1) //报警
{
red = ~red; //红灯报警
beep = ~beep; //蜂鸣器报警
}
}
/******************主程序**********************/
void main()
{
time_init(); //定时器初始化程序
beep = 0; //开机叫一声
delay_1ms(200);
P0 = P1 = P2 = P3 = 0xff; //初始化单片机IO口为高电平
while(1)
{
key();
yellow = ~hw; //红外热释电指示灯 有输出就亮黄灯
if(key_can < 10)
{
key_with(); //按键设置函数
}
if(flag_300ms == 1)
{
flag_300ms = 0;
hongwai_dis(); //红外报警函数
}
}
}
/*************定时器0中断服务程序***************/
void time0_int() interrupt 1
{
static uint value;
TH0 = 0x3c;
TL0 = 0xb0; // 50ms
value ++;
if(value % 6 == 0)
{
flag_300ms = 1;
}
if(flag_bufang_en == 1)
{
flag_value ++; // 400 * 50ms = 20000ms = 20秒
if(flag_value >= 400) //20秒
{
flag_bufang = 1;
flag_bufang_en = 0;
flag_value = 0;
}
}
}
一周热门 更多>