一、源程序:
#include
#define uchar unsigned char
#define uint unsigned int
uchar T_H_N = 50;
uchar T_H_N0 = 50;
uchar T_N = 100;
uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67};
//定义引脚
sbit IN1 = P3^5;
sbit IN2 = P3^4;
sbit ENA = P3^3;
sbit K1 = P1^0;
sbit K2 = P1^1;
sbit K3 = P1^2;
sbit n = P2^2;
sbit e = P2^3;
//delay function.
void delay(uint y) //数据类型一致,且此处数据类型要足够大。如:此处为char,延时只能在char范围内。uchar范围0~255.
{
uint x;
for(x = y;x>0;x--);
}
//key scan
void Key_Scan()
{
if(K1 == 0)
{
delay(20);
while(!K1);
T_H_N++;
if(T_H_N >=99)
{
T_H_N =99;
}
}
if(K2 == 0)
{
delay(20);
while(!K2);
T_H_N--;
if(T_H_N <= 1)
{
T_H_N = 1;
}
} if(K3 == 0)
{
delay(15);
while(!K3);
IN1=~IN1;
IN2=~IN2;
}
}
//display.
void display()
{
n = 0;//第一位数码管显示“n”。
P0 = 0x37;
delay(5);
n = 1;
P0 = 0x48;
e = 0;//第二位数码管显示“=”。
delay(5);
e = 1;
}
//motor initial.
void motor_init()
{
ENA = 1;
IN1 = 1;
IN2 = 0;
}
//Timer initial.
void Timer0_init()
{
TMOD = 0x11; //定时器工作方式3.
TH0 = (65535-5000)/256; //装载初值。
TL0 = (65535-5000)%6;
EA = 1; //开总中断。
ET0 = 1; //开溢出计时。
TR0 = 1; //启动计时器0.
}
void main()
{
uchar ge,shi,bai;
Timer0_init();
motor_init();
while(1)
{
ge = T_H_N; //ge
shi = T_H_N/10; //shi
bai = T_H_N/100; //bai
delay(5);
P2 = 0x7f;
P0 = table[ge];
delay(5);
P2 = 0xff;
delay(5);
P2 = 0xbf;
P0 = table[shi];
delay(5);
P2 = 0xff;
delay(5);
P2 = 0xdf;
P0 = table[bai];
delay(5);
P2 = 0xff;
display();
Key_Scan();
}
}
//中断计时改变占空比。
void Timer0() interrupt 1
{
TR0 = 0;
TH0=(65536-50)/256;
TL0=(65536-50)%6;
T_H_N0--;
if(0 == T_H_N0)
{
ENA = 0;
T_H_N0 = 1;
}
T_N--;
if(0 == T_N)
{
ENA = 1;
T_N = 100;
T_H_N0 = T_H_N;
// z = 0;
}
}
二、心得体会
一、 通过这实验,了解并掌握了PWM法控制电机转速。对电路设计以 及软件编程有了更深入的了解。尤其对中断、中断计时/计数有了新的体验和体会。
二、 在这个实验中主要遇到三个问题:
1、对电路原理理解不够,编程时无从下手,不知如何实现目标。解决方案是仔细阅读文档,一步一步理解并实现要求功能。
2、编程中不细心导致出现很多差错,耽误很多时间:
(1)延时调用数据类型形参用的是uchar,实参却用大于255的数,导致调用出现随机数。
(2)在while语句中,忘了加“;”导致进入死循环,在按键查询过程中出错,并且花了很长时间才找到错误所在。
(3)在对每一位数码管赋值时,没有进行清零,导致数码显示错误。
3、仍未能使用寄存器对数码管操作,浪费P2引脚。
总而言之,虽然不细心导致错误很多,但是也因此学会如何简单调试程序,寻找出错误所在。以后编程一定要细心,不再重复犯错,设计也应更加合理。
以上是单片机实验报告一部分,因为在这次实验中自己暴露了很多问题,也由此学会一点调试程序,里面许多错误反应我当前编程水平。在此贴上,以此警醒自己,同时也留个纪念。希望我能继续努力,不断进步,再回首时希望自己不再菜鸟。加油!!!