📄 test.c
字号:
#include <reg52.h>
/******led 接口描述******/
//P0--->(a-g,dot) 显示
//选择使能控制段
//P2^3--->使能左第一个数码管 P2^2--->左第二个数码管
//P2^1--->左第三个数码管 P2^0--->左第四个数码管
/* 晶振采用11.0592M,产生的PWM的频率约为91Hz */
sbit P3_0=P3^0; //过热保护信号接入点
sbit en1=P1^0; //M1的使能
sbit en2=P1^1; //M2的使能
sbit s1=P1^2;//M1
sbit s2=P1^3;
sbit s3=P1^4;//M2
sbit s4=P1^5;
/*********显示数据表 对应0-9 ,a-f*************/
unsigned char code table[16]={0x3f,6,0x5b,0x4f,
0x66,0x6d,0x7d,7,0x7f,0x6f,0x77,
0x7c,0x58,0x5e,0x79,0x71};
/**********显示选择表***********************/
unsigned char code digit[4]={0xf8,0xf4,0xf2,0xf1};
/*****定义一个数组变量用于存放将要显示的值*******/
unsigned char d[4]={0,0,0,0}; //随意放入一些初始值
/*****定义一个全局变量 number******/
unsigned char number; //number 表示第几个显示 0-3
unsigned char f;//全局变量 用于判断翻转
unsigned char wind; //风类计数
unsigned char t;//用于PWM计数
unsigned char m1;//用于计数对应风类
/******按键接口描述********/
//左第一 二 三 四 个按键分别对应于 P2.7 P2.6 P2.5 P2.4
//左第一个按键键值为1
//左第二个按键键值为2
//左第三个按键键值为3
//左第四个按键键值为4
void delay1(const unsigned int DELAY);
/******延时DELAY个ms子程序********/
void delay1(const unsigned int DELAY)
{
unsigned int x,y;
for(x=0;x<=DELAY;x++)
{for(y=0;y<120;y++);}
}
/******延时程序********/
void delay (dy)
{
while(--dy);
}
/******读取按键子程序 getkey()*************/
unsigned char getkey (void)
{ unsigned char k,tem,keytem;
keytem=0;
tem=P2 & 0xf0; //第一次读取按键值
if(tem!=0xf0) //判断有无按键按下
{
for(k=0;k<40;k++)
delay(250); //延时一段时间
tem=P2 & 0xf0; //再次读取按键值
if(tem!=0xf0)
{ if(tem==0x70) keytem=1; //表示左第一个按键按下
else if(tem==0xb0) keytem=2; //表示左第二个按键按下
else if(tem==0xd0) keytem=3; //表示左第三个按键按下
else if(tem==0xe0) keytem=4; //表示左第四个按键按下
}
}
while(tem!=0xf0) tem=P2 & 0xf0; //等待按键释放
return(keytem); //返回按键值
}
/******停止M1 M2 TR2********/ //TR1负责M1 TR2负责M2
void stop()
{
s1=0;
s2=0;
s3=0;
s4=0;
TR2=0;
delay(500);
}
/*****M2正反转********/
void rotate()
{
stop();
TR2=1;
if(f)
{
s3=0;
s4=1;
}
else
{
s3=1;
s4=0;
}
}
/********定时器0中断服务程序***************/
void timer0(void) interrupt 1
{
TR0=0; //停止定时器0
TH0=(65536-1000)/256; //通过定时器定时延时大约1ms左右
TL0=(65536-1000)%256;
number=(number+1)%4;
P2=digit[number]; //选择第number个数码管显示
P0=table[d[number]]; //查表显示要显示的值
TR0=1; //启动定时器0
}
/******定时器0初始化函数**********/
void Init_Timer0 (void)
{
TMOD=0x01; //
TH0=(65536-1000)/256; //通过定时器定时延时大约1ms左右
TL0=(65536-1000)%256;
EA=1;
ET0=1;
TR0=1;
}
/******定时器1初始化函数**********/
void Init_Timer1 (void)
{
t=0;
if(wind==1) m1=4;
else if(wind==2) m1=8;
else m1=2;
en1=0;
TMOD=0x11; //
TH1=(65536-1000)/256; //通过定时器定时延时大约1ms左右
TL1=(65536-1000)%256;
EA=1;
ET1=1;
TR1=1;
s1=1;
s2=0;//设置M1初值
}
/********定时器1中断服务程序***************/ //用于PWM
void timer1(void) interrupt 3
{
TR1=0; //停止定时器1
TH1=(65536-1000)/256; //通过定时器定时延时大约1ms左右
TL1=(65536-1000)%256;
if(t<m1) en1=1; /* 产生电机1的PWM信号 */
else en1=0;
t++;
if(t>=10) t=0; /* 1个PWM信号由10次中断产生 */
TR1=1; //启动定时器1
}
/******定时器2初始化函数**********/
void Init_Timer2 (void)
{
T2CON = 0x04; //设置寄存器,使定时器2工作在可编程时钟输出状态
T2MOD = 0x02;
RCAP2H=(65536-3000)/256;//自动重载高8位,
RCAP2L=(65536-3000)%256;//低8位;
EA=1;
ET2=1;
TR2=1;//开定时器2
}
/********定时器2中断服务程序***************/ //用于正反转
//定时器工作于16位自动重装模式
void timer2(void) interrupt 5 //硬件的规定
{TR2=0;
TF2=0; //人为清零(必须)
rotate(); //M2正反转
f=~f; //取反
TR2=1; //启动定时器2
}
/********主函数************/
//效果就是用定时器服务程序的实现数码管动态..
//..显示且按键后对应的数码管数据加1
/*************************/
void main (void)
{
unsigned char keyboard; //存放按键值
unsigned char time; //定时计数
unsigned char timesum;//定时总数
unsigned char sway; //摇头指示
unsigned char count;//倒计数
wind=0;
time=0;
sway=0;
while(1)
{
keyboard=getkey();
if (keyboard==1) //按键设定风速
{
wind++;
if(wind>3) //默认按键3次以上设为3
wind=3;
}
else if(keyboard==2) //按键2设定定时时间
{ time++;
if(time>6) //默认定时6次以上设为6
time=6;
}
else if(keyboard==3) //按键3控制摇头
{
sway=1;//摇头指示成立
}
else if(keyboard==4) //确认键
{
d[0]=wind;
if(time==0) //对于定时的初始处理
{
d[1]=0;
d[2]=0;
d[3]=8;
}
else
{
d[1]=time; //显示定时次数
d[2]=time; //显示定时的总时间
timesum=10*time;
}
Init_Timer0(); //定时器初始化
Init_Timer1(); //定时器1初始化 开始PWM
if(sway==1)
{
Init_Timer2();//定时器2初始化 控制正反转
}
for(count=timesum;count>=0;count--)
{
d[2]=count/10; //倒计时十位
d[3]=count%10; //倒计时个位
delay1(1000); //每延时1s更改倒计时数
}
if((time!=0)&&(count==0))//有定时功能 且定时结束时
{
stop();//电机M1 M2停转 TR2=0 定时器2也停止?
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -