请问谁能帮我看懂这段单片机C程序? 谢谢

2024-12-22 19:36:27
推荐回答(1个)
回答1:

#include //使用标准51单片机寄存器头文件
#define uchar unsigned char //重新定义变量名,以后少打几个字
#define uint unsigned int //重新定义变量名,以后少打几个字
#define KEY P1 //定义P1口为KEY,估计作者P1口接了键盘
#define DISP P0 //估计作者P0口接了数码管,要看电气原理图才知道,这里只能猜
sbit LED=P2^0; //P2.0接了一个LED
sbit LED1=P2^1; //P2.1接了一个LED
sbit P14=P1^4;
sbit P15=P1^5;
sbit P16=P1^6;
sbit P17=P1^7; //都是定义IO口名字
uchar key[10]; //定义1个数组,存储键名用的。
uchar mima[4]={0x00,0x66,0x00,0x4F}; //定义数组,存储密码用
uchar cnt_key;
uchar cnt_mi;
uint i,m;
uchar wrong;
uchar f_5ms;
uchar cnt_5ms;
uchar cnt_1s;
uchar cnt_led;
uchar kk;
uchar tab[11]= //显示用的字模{0x00,0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
void delay(uint i);
void delay_led(void);
void delay_wrong(void);
void disp_mi(void);
void init_main(void);
void main(void);
void disp_led(void);
void get_key(void); //以上都是函数声明
void delay(uint i) //延时函数,延时时间由参数传递
{
while(--i);
}
//void disp_mi(void)
//{
//
//}
//***********************************
void init_main(void) //系统初始化函数
{
DISP=0; //猜测是显示,指示灯全亮,要看硬件原理图才知道
LED=0;
LED1=0;
// TMOD=0x01;
// TR0=1;
// ET0=1;
// TH0=0xec;
// TL0=0x78;
// EA=1;
cnt_5ms=0;
cnt_1s=0;
cnt_key=0;
cnt_mi=0; //初始化各个标志位
}
void main(void) //主函数
{
init_main(); //调用初始化函数
while(1) //函数死循环
{
get_key(); //猜测是取得键名,楼主的程序不完整,没有这个函数
// disp_mi();
while(kk==1){ //如果取得了键名
kk=0; //清除标志位
DISP=key[cnt_key]; //在数码管上显示出来
if(key[cnt_key]==mima[cnt_mi]) //如果按键等于预设密码
{
cnt_mi++; //判断密码是否相等用的计数
if(cnt_mi==4) //如果4个按键是密码
{
cnt_mi=0; //清计数
delay_led(); //显示延时,为了能看清数码管
}
}
else if(key[cnt_key]!=mima[cnt_mi]) //如果密码错
{
delay_wrong();// 显示密码错误,LED1 亮
}}
}
}
void delay_led(void) //延时函数
{
// cnt_led=20;
// while(cnt_led--)
// {
// if(f_5ms)
// {
// f_5ms=0;
// if(cnt_5ms++==200)
// {
// if(cnt_1s++==10)
// {LED=!LED;}
// }
// }
// }
for(m=20;m>0;m--)
{
LED=1;
delay(2000);
delay(2000);
delay(2000);
delay(2000);
delay(2000);
delay(2000);
delay(2000);
delay(2000);
delay(2000);
LED=0;
delay(2000);
delay(2000);
delay(2000);
delay(2000);
delay(2000);
delay(2000);
delay(2000);
delay(2000);
delay(2000);
}
}
void delay_wrong(void) //显示错误密码指示
{
for(m=20;m>0;m--)
{
LED1=1;
delay(2000);
delay(2000);
delay(2000);
LED1=0;
delay(2000);
delay(2000);
delay(2000);
}