求单片机高手给我详细解释这个程序 越详细越好

求单片机高手给我详细解释这个程序 越详细越好,第1张

#include"reg51.h"

#define uint unsigned int

#define uchar unsigned char

uchar PWM=0x7f//设置初始脉宽调制值为128

sbit ENA=P3^4//电机启动控制位 

void INTT0()interrupt 0//外部中断0中断处理函数,低电平触发,实现对脉宽PWM的增加

{

if(PWM<=255)

{

PWM++

}

else

PWM=0xff

}

void INTT1()interrupt 2//外部中断0中断处理函数,低电平触发,实现对脉宽PWM的减少

{

if(PWM>0)

{

PWM--

}

else

PWM=0x00

}

void timer0()interrupt 1//定时器0中断处理函数

{

TR1=0

TH0=0xfe//重装定时器0初值

TL0=0x66

TH1=PWM//重装定时器1初值

TR1=1//启动定时器1

ENA=0//启动电机

}

void timer1()interrupt 3//定时器1中断处理函数

{

TR1=0

ENA=1

}

void INT_init(void)

{

TMOD=0x21//定时器1工作于模式2(自动重装方式),定时器0工作于模式1(16位定时)

TH0=0xfc//设置定时器0,定时初值,12MHz约定时900多us

TL0=0x66

TH1=PWM//设置定时器1,定时初值,12MHz约定时128us

TL1=0

EA=1//总中断允许

EX0=1//允许外部中断0

EX1=1//允许外部中断1

ET0=1//允许定时器0中断

ET1=1//允许定时器1中断

TR0=1//启动定时器0

}

void main(void)

{

INT_init()

while(1)

}

#include <AT89X51.H>

unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00}//定义显示用的段码

unsigned char dispbitcode[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}//定义显示用的位码

unsigned char dispbuf[8]={0,0,16,0,0,16,0,0}//定义显示缓冲区

unsigned char dispbitcnt//定义显示的位

unsigned char second//定义秒

unsigned char minite//定义分钟

unsigned char hour//定义小时

unsigned int tcnt//定义定时累加器

unsigned char mstcnt//定义毫秒累加器

unsigned char i,j

void main(void) //主函数

{

TMOD=0x02//设置定时器工作模式

TH0=0x06//设置初值

TL0=0x06

TR0=1 //开定时器

ET0=1//开定时器中断

EA=1//开总中断

while(1)

{

if(P0_0==0) //判断P00口的按键是否按下

{

for(i=5i>0i--)

for(j=248j>0j--)//延时消抖

if (P0_0==0) //判断按键真的按下了

{

second++//秒加1

if(second==60) //秒加到60?

{

second=0//秒清零

}

dispbuf[0]=second%10//取秒的个位放在显示缓冲

dispbuf[1]=second/10//取秒的十位放在显示缓冲

while(P0_0==0)//等待,知道按键松开

}

}

if(P0_1==0) //p01的按键按下,设置分钟,请参考秒的程序,一样的

{

for(i=5i>0i--)

for(j=248j>0j--)

if(P0_1==0)

{

minite++

if(minite==60)

{

minite=0

}

dispbuf[3]=minite%10

dispbuf[4]=minite/10

while(P0_1==0)

}

}

if(P0_2==0) //p02的按键按下,设置小时,请参考秒的程序,一样的

{

for(i=5i>0i--)

for(j=248j>0j--)

if(P0_2==0)

{

hour++

if(hour==24)

{

hour=0

}

dispbuf[6]=hour%10

dispbuf[7]=hour/10

while(P0_2==0)

}

}

}

}

void t0(void) interrupt 1 using 0 //定时器中断函数

{

mstcnt++ //累加器加一

if(mstcnt==8) //计时满8毫秒?

{

mstcnt=0//累加器清零

P1=dispcode[dispbuf[dispbitcnt]]//送显示段码

P3=dispbitcode[dispbitcnt]//送显示位码

dispbitcnt++//显示位加1

if(dispbitcnt==8) //8位都显示完了?

{

dispbitcnt=0//从第一位开始显示

}

}

tcnt++ //累加器加一

if(tcnt==4000) //记满1秒

{

tcnt=0//累加器清零

second++//秒加一

if(second==60) //秒满60?

{

second=0//秒清零

minite++//分钟加一

if(minite==60) //分钟满60

{

minite=0//分钟清零

hour++//小时加1

if(hour==24) //小时满24

{

hour=0//小时清零

}

}

}

dispbuf[0]=second%10//将时分秒的个位与十位分开,装在显示区

dispbuf[1]=second/10

dispbuf[3]=minite%10

dispbuf[4]=minite/10

dispbuf[6]=hour%10

dispbuf[7]=hour/10

}

}

其实这个程序不难,仔细想想,有不懂的再问我吧


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/8090705.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-13
下一篇2023-04-13

发表评论

登录后才能评论

评论列表(0条)

    保存