帮忙修改一个单片机按键程序程序

请51单片机C编程高手解答,帮忙做一下注释,个人初学单片机,不是很懂。-51单片机程序,C语言,万分
没有你要的?请搜索……
你现在正在浏览:
请51单片机C编程高手解答,帮忙做一下注释,个人初学单片机,不是很懂。 51单片机程序,C语言,万分
请51单片机C编程高手解答,帮忙做一下注释,个人初学单片机,不是很懂。
control=0x80;
while(busy==1);i&10;
checkkey();
readdata();
tem=tem*10;
temperature=(tem/
TL0=0xB0,0x34,0x35;
displayresult();
}}AD转换及滤波程序段:unsigned char AD(void){
unsigned char AD_void displaytem(void)!EOC);
AD_result=AD0809;void displayresult(void);void upwarn(void);
void downwarn(void);void normal(void);void main(){
TMOD=0x01;255;void displaytime(void);void checkkey(void);void checklimit(void);void displaylimit(void);unsigned char AD(void);i++)
tem+=AD();sbit UA=P1^7;sbit UD=P1^6;sbit DA=P1^4;sbit DD=P1^5、主函数及AD转换部分不是很懂unsigned char m=0;
displaytem();
return AD_}void readdata(){
long tem=0,0x36,0x37;sbit REQ=P1^1主要是头文件;
while(busy==0);
displaytime();
EA=1;sbit EOC=P1^3,0x32,0x33;
TR0=1,tt=0;bit UA0=1,DA0=1,UD0=1,DD0=1;unsigned char lcdnumber[]={0x30,0x31;void readdata();10)*100&#47,s=0;
while(,0x38,0x39};sbit busy=P1^0
建议您对照一下硬件电路和ad转换芯片的时序看吧
255;/P1^1置低电平
while(busy==1);i&10,等待检测P1_1脚不为0,
while(1)//等待AD0809
AD_result=AD0809;/&#47,一切从这里开始******************************************************************/
while(busy==0);///
REQ=1,0x33,0x34,0x39};sbit UA=P1^7;sbit UD=P1^6;/&#47,
PA=0xf4;bit UA0=1;//
void downwarn(void);
while(,DD0=1;打开中断总开关;
tem=tem*10;
temperature=(tem/void main(){
TMOD=0x01; ///&#47,允许中断
TR0=1;void checklimit(void);*****SBIT变量用于定义常数/判断busy,等待检测P1_1脚不为1;void normal(void);///计时器0中断允许
EA=1,就像给人起别名或绰号********************************************/sbit busy=P1^0;
displayresult();
}/void checkkey(void);高8位
ET0=1;/unsigned char lcdnumber[]={0x30;//sbit EOC=P1^3;启动,计时器0开始工作
control=0x80;10)*100/
return AD_}void readdata(){
long tem=0,0x31,0x32;/子程序定义,就像书的每一章节实际内容unsigned char AD(void){
unsigned char AD_
displaytem();void displaylimit(void);/结束主程序AD转换及滤波程序段:///*****声明程序用到的函数,类似书的目录*********************************************/void displaytime(void),0x37,0x38;void upwarn(void);/判断busy,0x35,0x36;中断配置
TL0=0xB0;/i++)
tem+=AD();sbit REQ=P1^1;control或0x80,逐位进行或比较,两个数的相同位只要一个为1,新数该位为1
REQ=0;/
checkkey();
readdata();/死循环;这里开始循环
displaytime();/返回循环开始处}/sbit DA=P1^4;sbit DD=P1^5!EOC);&#47,DA0=1;......
D接口的各I/O口的定义,函数定义等。void
main()是主函数;D转换函数和数据读取函数,不过while(1)中的一些函数没有写完整,因此不好确定你这个程序是怎么进行A/D转换的,包括单片机内部寄存器的初始化,各状态标志的定义,while(1)这是监控程序,简单的说就是一个死循环,里面有显示函数、键盘监视函数等。后面的A&#47,猜测应该是当有按键按下的时候就会启动(调用)A&#47,包括所用到的按键、显示我来简单解释一下吧,这是个典型的单片机程序实例。头文件是定义;D程序、A&#47
请教PIC单片机C语言编程高手,在把51.C移植成PIC.C时出现以下错误 Error [202] ...:
这个是你的赋值语句错了!语句在第104行处,你看一下就知道了,如果还不知道,把程序发来看一下。
基于mcs-51单片机的智能仪表有哪些 基于c语言编程的,那位好心人,高手帮帮我这个初学者。我没多少...:
搜索答案 基于mcs-51单片机的智能仪表有哪些 基于c语言编程的,那位好心人,高手帮帮我这个初学者...
求高手 用51单片机输出产生方波的程序:
手机版 我的知道 搜索答案 应《中华人民共和国网络安全法...要用C语言编写程序...
求一个用51单片机(AT89C51)做的心型流水灯(带电路图、编程代码)谢谢!求高手搭救:
求一个用51单片机(AT89C51)做的心型流水灯(带电路图、编程代码)谢谢!求高手搭救这个好做,我...
跪求51单片机C语言编程,4×4键盘控制LCD12864显示菜单,数据?具体程序 急急!谢谢各位高手...:
你把悬赏出高一点吧,网上很多高手,应该可以帮你。这玩意儿如果是自己写的估计没那么容易就这么简简单单的...
求教单片机高手。stc89c51单片机的2个定时器同时用或者定时器与中断同时用时怎么编程序。:
中断都打开,根据需要设置优先级就可以了
求助编程高手。用51单片机编写程序,最好附带上硬件电路图:
哈哈,看到要求,不是一般的麻烦啊
请汇编语言高手帮我分析以下延时程序所占的时钟周期:
搜索答案 请汇编语言高手帮我分析以下延时程序所占的时钟周期
解释下: ... ...
单片机高手进,时请问T89S51单片机有些人在编程,时候并没有直接说从哪个端口输入输出,而是用一些地...:
89S51单片机对端口读写(输入输出)操作方法 如:P1口,,P1地址 = 0x90 (不要问我为什...
也许你也感兴趣的内容还没有帐号? 赶紧
用户版块帖子
帮忙用stc15f104w写个小程序
UID:983579
在线时间50小时
M币360专家0
此帖悬赏结束最佳答案:50&M币,最佳答案获得者:play51mcu
想做个简单的电源时序器,自己用的。不知道用stc15f104w可不可靠呢。用其中一个io作为按键,共5路继电器输出。按一下按键开始,(等待1S)分别打开A(等待1S)打开B(等待1S)打开C(等待1S)打开D(等待1S)打开E再按一下逆序关闭,(等待1S)关闭E(等待1S)关闭D(等待1S)关闭C(等待1S)关闭B(等待1S)关闭A这样可以用吗?????程序中需要定义全部io口方便修改。包含整个工程文件。
UID:1976565
在线时间305小时
M币-175专家0
最佳答案奖励:+50&M币
#include &reg52.h&#include &intrins.h&#define uchar unsigned char#define uint&&unsigned int#define CLOCK&&&&&&&& &&&&// Hz#define TIME_PER_SEC&&200&&&&&&&& // Hz / 5ms#define MAX_TASK&&&&&&2 //-------------------------------------------------------------------uchar TaskDelay[MAX_TASK] ;/*******************************************************************/void Timer0_Init(void){ for ( i=0 ; i&MAX_TASK ; i++) TaskDelay = 0 ; TMOD |= ( ( TMOD & 0xf0 ) | 0x01 ) ; TH0&&= ( 65536 - ( CLOCK / TIME_PER_SEC / 12 ) ) / 256 ; TL0&&= ( 65536 - ( CLOCK / TIME_PER_SEC / 12 ) ) % 256 ;&&&& ET0&&= 1 ; TR0&&= 1 ;}/*******************************************************************/ void Timer0_Isr (void) interrupt 1 using 1{ TH0&&= ( 65536 - ( CLOCK / TIME_PER_SEC / 12 ) ) / 256 ; TL0&&= ( 65536 - ( CLOCK / TIME_PER_SEC / 12 ) ) % 256 ; for ( i=0 ; i&MAX_TASK ; i++)&&&&&& {&&&&&&if ( TaskDelay ) TaskDelay-- ;&&&& }} /*******************************************************************/sbit Key = P3^0 ;sbit R0&&= P3^1 ;sbit R1&&= P3^2 ;sbit R2&&= P3^3 ;sbit R3&&= P3^4 ;sbit R4&&= P3^5 ;void main (void){ uchar KeyState , R_S bit KeyDown , Lock&&; Timer0_Init(); EA = 1 ; while (1)&& {&&&&&&if ( !Lock )&&&&&&&&{&&&&&&&&&&&&if ( !TaskDelay[0] ) {&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&TaskDelay[0] = 10 ;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&KeyDown = 0 ;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&switch (KeyState)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& case 0 : if (!Key) KeyState = 1 ;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& case 1 : if (!Key) KeyState = 2 ; KeyDown = 1 ; &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& case 2 : if (Key)&&KeyState = 0 ;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&if ( KeyDown ) { Lock = 1 ; if (++R_State&2) R_State = 0 ; }&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& }&&&&&&&&}&&&& else {&&&&&&&&if ( !TaskDelay[1] ) {&&&&&&&&&&&&&&&&&&&&&&&&&&TaskDelay[1] = 200 ;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&if ( R_State == 1 ) &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& { &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&switch ( Time )&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& {&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&case 1 : R0 = 1 ;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&case 2 : R1 = 1 ;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&case 3 : R2 = 1 ;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&case 4 : R3 = 1 ;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&case 5 : R4 = 1 ; Lock = 0 ;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& }&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&if (Time & 6 ) Time++ ; &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& }&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&if ( R_State == 2 )&&&&&&&& &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& { &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&switch ( Time )&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& {&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&case 1 : R0 = 0 ; Lock = 0 ;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&case 2 : R1 = 0 ;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&case 3 : R2 = 0 ;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&case 4 : R3 = 0 ;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&case 5 : R4 = 0 ;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& }&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&if (Time & 1 ) Time-- ; &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& }&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&}&&&& &&&& if (R_State == 0 ) { if ( !TaskDelay[1] ) TaskDelay[1] = 1 ;
if ( Lock == 1 )&& { if ( !TaskDelay[0] ) TaskDelay[0] = 10 ; }}&&&& } }帮忙写个小程序(没意思)[ 此帖被play51mcu在 02:54重新编辑 ]
代码大神。。
UID:1527822
在线时间242小时
M币1902专家4
热心助人奖励:+1&M币
超级省事的方式按键取一个中断,1s就用delay把,多次调用,定时器都省了。
UID:1387893
在线时间149小时
M币1948专家6
热心助人奖励:+1&M币
这种程度 搂主都搞不定阿?
UID:592369
在线时间168小时
M币1231专家2
楼上用定时器真是高大上,我就直接delay了,反正电源时序器延时时间根本就没精度要求。只要不同时开就可以了
UID:592369
在线时间168小时
M币1231专家2
这编辑=重发帖,醉了
本文内容包含图片或附件,获取更多资讯,请
后查看;或者
成为会员获得更多权限
UID:592369
在线时间168小时
M币1231专家2
楼上用定时器真是高大上,我就直接delay了,反正电源时序器延时时间根本就没精度要求。只要不同时开就可以了——————更新就用delay写了一个,看附件,用8脚的STC15W204S,Delay1000ms()乱来的并不是一秒,自己凑数测试
#include &STC15W204S.h&#include &intrins.h&sbit INT0 = 0xB2;//CPU@11.0592MHz//STC15W204S SOP8int State = 0, OldState = 0, Mark = 0;void exint0() interrupt 0       //INT0中断入口{    if (Mark == 0)    {        State = !S    }}#define PinA P30#define PinB P31#define PinC P33#define PinD P54#define PinE P55#define Key P32     //无用,只是告诉你P32/INT0做了keyvoid Delay1000ms()       //@11.0592MHz{    unsigned char i, j,    _nop_();    _nop_();    i = 5;    j = 52;    k = 195;    do    {        do        {            while (--k);        } while (--j);    } while (--i);}void main(){    INT0 = 1;    IT0 = 1;                    //设置INT0的中断类型 (1:仅下降沿 0:上升沿和下降沿)    EX0 = 1;                    //使能INT0中断    EA = 1;    while (1)    {        if (State != OldState)        {            Mark = 1;   //运行的时候不让中断            if (State == 1)            {                PinA = 1;                Delay1000ms();                PinB = 1;                Delay1000ms();                PinC = 1;                Delay1000ms();                PinD = 1;                Delay1000ms();                PinE = 1;            }            if (State == 0)            {                PinA = 0;                Delay1000ms();                PinB = 0;                Delay1000ms();                PinC = 0;                Delay1000ms();                PinD = 0;                Delay1000ms();                PinE = 0;            }            Mark = 0;            OldState = S        }    }}
本文内容包含图片或附件,获取更多资讯,请
后查看;或者
成为会员获得更多权限
熱心會員需要奖励!
UID:1557766
在线时间933小时
M币10800专家4
熱心會員需要奖励!
UID:1264997
在线时间366小时
M币794专家2
回 play51mcu 的帖子
:#include &reg52.h&#include &intrins.h&#define uchar unsigned char#define uint  unsigned int#define CLOCK         0;   // Hz....... ( 06:57) for ( i=0 ; i&MAX_TASK ; i++) TaskDelay = 0 ;这句是什么意思啊大神
UID:1287122
在线时间327小时
你看看吧,这个是论坛里大侠写的,我把它转成HEX文件了,拿来直接用就可以了我也是用STm15F104W做的时序器,效果很不错的!
本文内容包含图片或附件,获取更多资讯,请
后查看;或者
成为会员获得更多权限
访问内容超出本站范围,不能确定是否安全
“新手上路”发帖需审核后才能显示(请认真发帖),达到数码9级后取消此限制
您目前还是游客,请
&回复后跳转到最后一页
Code by , Time now is:10-13 08:50, Total 0.153001(s) query 9,
Gzip enabled&单片机程序求大神帮改改-电子产品世界论坛
单片机程序求大神帮改改
下面是我的单片机汽车超声波测距报警系统程序。现在要求测距降到25厘米的时候蜂鸣器报警频率变高,通过改变方波控制,程序要怎么改啊?
#include &reg52.h&& & & && && && & //调用单片机头文件
#define uchar unsigned char&&//无符号字符型 宏定义& & & & 变量范围0~255
#define uint&&unsigned int& & & &&&//无符号整型 宏定义& & & & 变量范围0~65535
#include &intrins.h&
#include "eeprom52.h"
//数码管段选定义& && &0& &&&1& & 2& & 3& & 4& & 5& & & & 6& & & &&&7& & & && &8& & & && & 9& & & &
uchar code smg_du[]={0x28,0xee,0x32,0xa2,0xe4,0xa1,0x21,0xea,0x20,0xa0,
& & & & & & & & & & & & & & & && && & & &&&0x60,0x25,0x39,0x26,0x31,0x71,0xff};& & & &&&//断码
uchar dis_smg[8]& &={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8};
//数码管位选定义
sbit smg_we1 = P3^4;& & & && &&&//数码管位选定义
sbit smg_we2 = P3^5;
sbit smg_we3 = P3^6;
sbit smg_we4 = P3^7;
sbit c_send& &= P3^2;& & & & & & & & //超声波发射
sbit c_recive = P3^3;& & & & & & & & //超声波接收
sbit beep = P2^3;& &//蜂鸣器IO口定义
uchar smg_i = 3;& & //显示数码管的个位数
bit flag_300
& & & && && && &//距离
uint set_d;& & & && && && && & //距离
uchar flag_csb_& & //超声波超出量程
uint&&flag_time0;& && & //用来保存定时器0的时候的
uchar menu_1;& && && &&&//菜单设计的变量
/***********************1ms延时函数*****************************/
void delay_1ms(uint q)
& & & & uint i,j;
& & & & for(i=0;i&q;i++)
& & & & & & & & for(j=0;j&120;j++);
/***********************处理距离函数****************************/
void smg_display()
& & & & dis_smg[0] = smg_du[distance % 10];
& & & & dis_smg[1] = smg_du[distance / 10 % 10];
& & & & dis_smg[2] = smg_du[distance / 100 % 10] & 0 ;& & & &
/******************把数据保存到单片机内部eeprom中******************/
void write_eeprom()
& & & & SectorErase(0x2000);
& & & & byte_write(0x2000, set_d % 256);
& & & & byte_write(0x2001, set_d / 256);
& & & & byte_write(0x2058, a_a);& & & &
/******************把数据从单片机内部eeprom中读出来*****************/
void read_eeprom()
& & & & set_d&&= byte_read(0x2001);
& & & & set_d &&= 8;
& & & & set_d&&|= byte_read(0x2000);
& & & & a_a& && &= byte_read(0x2058);
/**************开机自检eeprom初始化*****************/
void init_eeprom()
& & & & read_eeprom();& & & & & & & & //先读
& & & & if(a_a != 1)& & & & & & & & //新的单片机初始单片机内问eeprom
& & & & & & & & set_d = 50;
& & & & & & & & a_a = 1;
& & & & & & & & write_eeprom();& & & && & //保存数据
& & & & }& & & &
/********************独立按键程序*****************/
uchar key_& & & &&&//按键值
void key()& & & &&&//独立按键程序
& & & & static uchar key_
& & & & key_can = 20;& && && && && && & //按键值还原
& & & & P2 |= 0x07;
& & & & if((P2 & 0x07) != 0x07)& & & & & & & & //按键按下
& & & & & & & & delay_1ms(1);& & & && && && & & & //按键消抖动
& & & & & & & & if(((P2 & 0x07) != 0x07) && (key_new == 1))
& & & & & & & & {& & & & & & & & & & & & & & & & & & & & & & & & //确认是按键按下
& & & & & & & & & & & & key_new = 0;
& & & & & & & & & & & & switch(P2 & 0x07)
& & & & & & & & & & & & {
& & & & & & & & & & & & & & & & case 0x06: key_can = 3;& & & && & //得到k2键值
& & & & & & & & & & & & & & & & case 0x05: key_can = 2;& & & && & //得到k3键值
& & & & & & & & & & & & & & & & case 0x03: key_can = 1;& & & && & //得到k4键值
& & & & & & & & & & & & }
& & & & & & & & }& & & & & & & & & & & &
& & & & else
& & & & & & & & key_new = 1;& & & &
/****************按键处理显示函数***************/
void key_with()
& & & & if(key_can == 1)& & & & & & & & //设置键
& & & & & & & & menu_1 ++;
& & & & & & & & if(menu_1 &= 2)
& & & & & & & & {
& & & & & & & & & & & & menu_1 = 0;
& & & & & & & & & & & & smg_i = 3;& & & & & & & & //只显示3位数码管
& & & & & & & & }
& & & & & & & & if(menu_1 == 1)
& & & & & & & & {
& & & & & & & & & & & & smg_i = 4;& & & && & //只显示4位数码管
& & & & & & & & }
& & & & if(menu_1 == 1)& & & & & & & & & & & & //设置报警
& & & & & & & & if(key_can == 2)
& & & & & & & & {
& & & & & & & & & & & & set_d ++ ;& & & & & & & & //加1
& & & & & & & & & & & & if(set_d & 400)
& & & & & & & & & & & & & & & & set_d = 400;
& & & & & & & & }
& & & & & & & & if(key_can == 3)
& & & & & & & & {
& & & & & & & & & & & & set_d -- ;& & & & & & & & //减1
& & & & & & & & & & & & if(set_d &= 1)
& & & & & & & & & & & & & & & & set_d = 1;
& & & & & & & & }
& & & & & & & & dis_smg[0] = smg_du[set_d % 10];& & & && && && && &//取小数显示
& & & & & & & & dis_smg[1] = smg_du[set_d / 10 % 10] ;& && && &//取个位显示
& & & & & & & & dis_smg[2] = smg_du[set_d / 100 % 10] & 0 //取十位显示
& & & & & & & & dis_smg[3] = 0x60;& & & && && && &//a
& & & & & & & & write_eeprom();& & & & & & & & & & & && & //保存数据
& & & & }& & & &
/****************报警函数***************/
void clock_h_l()
& & & & if(distance &= set_d)
& & & & & & & & value ++;&&//消除实际距离在设定距离左右变化时的干扰
& & & & & & & & if(value &= 2)
& & & & & & & & {
& & & & & & & & & & & & beep = ~ & & & && &//蜂鸣器报警& & & &
& & & & & & & & }
& & & & else
& & & & & & & & value = 0;
& & & & & & & & beep = 1;& & & & & & & & //取消报警
& & & & }& & & &
/***********************数码位选函数*****************************/
void smg_we_switch(uchar i)
& & & & switch(i)
& & & & & & & & case 0: smg_we1 = 0;&&smg_we2 = 1; smg_we3 = 1;&&smg_we4 = 1;
& & & & & & & & case 1: smg_we1 = 1;&&smg_we2 = 0; smg_we3 = 1;&&smg_we4 = 1;
& & & & & & & & case 2: smg_we1 = 1;&&smg_we2 = 1; smg_we3 = 0;&&smg_we4 = 1;
& & & & & & & & case 3: smg_we1 = 1;&&smg_we2 = 1; smg_we3 = 1;&&smg_we4 = 0;
& & & & }& & & &
/***********************数码显示函数*****************************/
void display()
& & & && &
& & & & i++;
& & & & if(i &= smg_i)
& & & & & & & & i = 0;& & & &
& & & & smg_we_switch(i);& & & & & & & &&&//位选
& & & & P1 = dis_smg[i];& & & & & & & &&&//段选& & & && && && &
/******************小延时函数*****************/
void delay()
& & & & _nop_(); & & & & & & & && && && && &//执行一条_nop_()指令就是1us
& & & & _nop_();
& & & & _nop_();
& & & & _nop_();
& & & & _nop_();
& & & & _nop_();
& & & & _nop_();
& & & & _nop_();
& & & & _nop_();&&
& & & & _nop_();
/*********************超声波测距程序*****************************/
void send_wave()
& & & & c_send = 1;& & & & & & & && && && && &//10us的高电平触发
& & & & delay();
& & & & c_send = 0;& & & &&&
& & & & TH0 = 0;& & & & & & & && && && &&&//给定时器0清零
& & & & TL0 = 0;
& & & & TR0 = 0;& & & & & & & & & & & & & & & && &//关定时器0定时
& & & & while(!c_recive);& & & & & & & && &//当c_recive为零时等待
& & & & TR0=1;
& & & & while(c_recive)& & & & & & & && && & //当c_recive为1计数并等待
& & & & & & & & flag_time0 = TH0 * 256 + TL0;
& & & & & & & & if((flag_time0 & 40000))& && &//当超声波超过测量范围时,显示3个888
& & & & & & & & {
& & & & & & & & & & & & TR0 = 0;
& & & & & & & & & & & & flag_csb_juli = 2;
& & & & & & & & & & & & distance = 888;
& & & & & & & & & & & && & & & & & & &
& & & & & & & & }
& & & & & & & & else
& & & & & & & & {
& & & & & & & & & & & & flag_csb_juli = 1;& & & &
& & & & & & & & }
& & & & if(flag_csb_juli == 1)
& & & & {& & & &
& & & & & & & & TR0=0;& & & & & & & & & & & & & & & & & & & & & & & & & & & &&&//关定时器0定时
& & & & & & & & distance =flag_time0;& & & & & & & & & & & &&&//读出定时器0的时间
& & & & & & & & distance *= 0.017;& && && && && &// 0.017 = 340M / 2 = 170M = 0.017M 算出来是米
& & & & & & & & if((distance & 500))& & & & & & & & & & & & & & & &&&//距离 = 速度 * 时间
& & & & & & & & {& & & &
& & & & & & & & & & & & distance = 888;& & & & & & & & & & & & & & & &&&//如果大于3.8m就超出超声波的量程
& & & & & & & & }
& & & & }&&
/*********************定时器0、定时器1初始化******************/
void time_init()& & & && &
& & & & EA&&= 1;& & & &&&& & & && &//开总中断
& & & & TMOD = 0X11;& & & && &//定时器0、定时器1工作方式1
& & & & ET0 = 0;& & & & & & & && &//关定时器0中断
& & & & TR0 = 1;& & & & & & & && &//允许定时器0定时
& & & & ET1 = 1;& & & & & & & && &//开定时器1中断
& & & & TR1 = 1;& & & & & & & && &//允许定时器1定时& & & &
/***************主函数*****************/
void main()
& & & & beep = 0;& & & & & & & &&&//开机叫一声& &
& & & & delay_1ms(150);
& & & & P0 = P1 = P2 = P3 = 0& & & && & //初始化单片机IO口为高电平
& & & & send_wave();& & & & //测距离函数
& & & & smg_display();& & & & //处理距离显示函数
& & & & time_init();& & & & //定时器初始化程序
& & & & init_eeprom();&&//开始初始化保存的数据
& & & & send_wave();& & & & //测距离函数
& & & & send_wave();& & & & //测距离函数
& & & & while(1)
& & & & {& & & & & & & && &
& & & & & & & & if(flag_300ms == 1)
& & & & & & & & {& & & & & & & &
& & & & & & & & & & & & flag_300ms = 0;
& & & & & & & & & & & & clock_h_l();& & //报警函数
& & & & & & & & & & & & if(beep == 1)
& & & & & & & & & & & & & & & & send_wave();& & & & //测距离函数
& & & & & & & & & & & & if(menu_1 == 0)
& & & & & & & & & & & & & & & & smg_display();& & & &&&//处理距离显示函数
& & & & & & & & }
& & & & & & & & key();& & & & & & & & & & & & & & & & & & & &&&//按键函数
& & & & & & & & if(key_can & 10)
& & & & & & & & {
& & & & & & & & & & & & key_with();& & & & & & & & & & & &&&//按键处理函数
& & & & & & & & }
/*********************定时器1中断服务程序************************/
void time1_int() interrupt 3
& & & && & & & & & & & & & & &&&//定时2ms中断一次
& & & & TH1 = 0xf8;
& & & & TL1 = 0x30;& &&&//2ms
& & & & display();& & & & & & & & //数码管显示函数
& & & & value++;
& & & & if(value &= 150)
& & & & & & & & value = 0;
& & & & & & & & flag_300ms = 1;
现在的测距是多少,先找到程序段在哪里,,,试着修改,,
移植程序必须自己要读懂程序,慢慢调试,,不要指望别人告诉你怎么修改
测距降到25厘米的时候蜂鸣器报警频率变高,通过改变方波控制。你说的已经很清楚了,先找到读取距离的函数,根据读取到的距离判断是否置位报警标志,一旦置位,改变蜂鸣器的输出频率。
一小段程序,用汇编最快最容易
思路都出来了
代码有那么难改没?
根据距离给定时器赋值把
就是改变蜂鸣器的输出频率不懂改、网上找到资料,加进去程序有错误改不出
毕竟懂的少,一直有问题
帮写作业?
匿名不能发帖!请先 [
Copyright (C) 《电子产品世界》杂志社 版权所有

我要回帖

更多关于 单片机程序 的文章

 

随机推荐