01-定时器控制LED灯每隔一秒亮灭
代码:
#include "reg52.h"
sbit led1 = P3^6;
void main()
{
int cnt = 0;//定义一个累积变量
led1 = 1;//初始化灯的状态为灭 翻转为亮
//1.配置TMOD定时器0的工作模式 0 1 16位重载
TMOD = 0x01;
//2.设定初值
TL0 = 0x00;
TH0 = 0xDC;
//3.开始计时
TR0 = 1;
//4.检测是否爆表,如果爆表每累积到1ms翻转led灯的状态 这里要用循环不断检测
while(1)
{
if(TF0 == 1)
{
TF0 = 0;
cnt++;//变量++
TL0 = 0x00;//将计数清0
TH0 = 0xDC;
if(cnt == 100)//加到100次则为1ms 并翻转led的状态
{
cnt = 0;
led1 = !led1;
}
}
}
}
02-按位运算
03-利用定时器开发PWM的舵机
代码:
#include "reg52.h"
sbit sg90_con = P1^1;
int jd;
int cnt = 0;
void Delay2000ms() //@11.0592MHz
{
unsigned char i, j, k;
i = 15;
j = 2;
k = 235;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void Time0Init()
{
//1. 配置定时器0工作模式位16位计时
TMOD = 0x01;
//2. 给初值,定一个0.5出来
TL0=0x33;
TH0=0xFE;
//3. 开始计时
TR0 = 1;
TF0 = 0;
//4. 打开定时器0中断
ET0 = 1;
//5. 打开总中断EA
EA = 1;
}
void Delay300ms() //@11.0592MHz
{
unsigned char i, j, k;
i = 3;
j = 26;
k = 223;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void main()
{
Delay300ms();//让硬件稳定一下
Time0Init(); //初始化定时器
jd = 1; //初始角度是0度,0.5ms,溢出1就是0.5,高电平
cnt = 0;
sg90_con = 1;//一开始从高电平开始
//每隔两秒切换一次角度
while(1){
jd = 3; //90度 1.5ms高电平
cnt = 0;
Delay2000ms();
jd = 1; //0度
cnt = 0;
Delay2000ms();
}
}
void Time0Handler() interrupt 1
{
cnt++; //统计爆表的次数. cnt=1的时候,报表了1
//重新给初值
TL0=0x33;
TH0=0xFE;
//控制PWM波
if(cnt < jd){
sg90_con = 1;
}else{
sg90_con = 0;
}
if(cnt == 40){//爆表40次,经过了20ms
cnt = 0; //当100次表示1s,重新让cnt从0开始,计算下一次的1s
sg90_con = 1;
}
}
04-超声波测距
代码:
#include "reg52.h"
#include "intrins.h"
sbit D5 = P3^7;//根据原理图(电路图),设备变量led1指向P3组IO口的第7口
sbit D6 = P3^6;//根据原理图(电路图),设备变量led2指向P3组IO口的第6口
sbit Tirg = P1^5;
sbit Echo = P1^6;
void Timer0Init(void)
{
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0; //设置定时初值
TH0 = 0; //设置定时初值
}
void Delay10us() //@11.0592MHz
{
unsigned char i;
i = 2;
while (--i);
}
void Tirg10us()
{
Tirg = 0;
Tirg = 1;
Delay10us();
Tirg = 0;
}
void main()
{
double time;
double dis;
Timer0Init();
while(1)
{
//1.给Tirg一个10us的高电平
Tirg10us();
//2.Echo信号,由低电平跳转到高电平,表示开始发送波
while(Echo == 0);
// 打开定时器
TR0 = 1;
//3.Echo,由高电平跳转回低电平,表示波回来了
while(Echo == 1);
// 停止定时器
TR0 = 0;
//4.计算时间
time = (TH0 * 256 + TL0) * 1.085;
//5.计算距离
dis = time * 0.017;
if(dis < 10)
{
D6 = 0;D5 = 1;
}
else
{
D5 = 0;D6 = 1;
}
//定时器数据清零,以便下次测距
TL0 = 0; //设置定时初值
TH0 = 0; //设置定时初值
}
}
04-垃圾桶项目完结:
代码:
#include "reg52.h"
#include "intrins.h"
sbit D5 = P3^7;//灯5
sbit D6 = P3^6;//灯6
sbit Tirg = P1^5;//超声波发
sbit Echo = P1^6;//超声波收
sbit Sg90 = P1^1;//舵机
sbit SW1 = P2^1;//按键1
sbit vibrate = P3^2;//震动传感器
sbit beep = P2^0;//蜂鸣器
int jd; //舵机角度变量
int cnt = 0; //定义一个累积变量
int vibrate_mark = 0; //外部中断检测震动传感器标志位
//初始化定时器0
void Time0Init()
{
//1.配置TMOD定时器0的工作模式 0 1 16位重载
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
//2.设定初值
TL0 = 0x33;
TH0 = 0xFE;
//3.开始计时
TR0 = 1;
//4.检测是否爆表,如果爆表每累积到1ms翻转led灯的状态 这里要用循环不断检测
//5.使能Time0的中断ET0 = 1;
ET0 = 1;
//6.使能总的中断EA = 1;
EA = 1;
}
//初始化定时器1
void Time1Init(void)
{
TMOD &= 0x0F; //设置定时器模式
TMOD |= 0x10; //设置定时器模式
TL1 = 0; //设置定时初值
TH1 = 0; //设置定时初值
}
//延时函数
void Delay10us() //@11.0592MHz
{
unsigned char i;
i = 2;
while (--i);
}
void Delay150ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
i = 2;
j = 13;
k = 237;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void Delay2000ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
i = 15;
j = 2;
k = 235;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
//给超声波10us的高电平触发
void Tirg10us()
{
Tirg = 0;
Tirg = 1;
Delay10us();
Tirg = 0;
}
//定义产生波测距函数
double juli()
{
double time;
//定时器数据清零,以便下次测距
TL1 = 0; //设置定时初值
TH1 = 0; //设置定时初值
//1.给Tirg一个10us的高电平
Tirg10us();
//2.Echo信号,由低电平跳转到高电平,表示开始发送波
while(Echo == 0);
// 打开定时器
TR1 = 1;
//3.Echo,由高电平跳转回低电平,表示波回来了
while(Echo == 1);
// 停止定时器
TR1 = 0;
//4.计算时间
time = (TH1 * 256 + TL1) * 1.085;
//5.计算距离
return time * 0.017;
}
//开盖亮灯
void openstartLight()
{
D6 = 0;D5 = 1;
}
//关盖灭灯
void closestartLight()
{
D5 = 0;D6 = 1;
}
//舵机角度初始化
void SG90Init_0(){
jd = 1;
cnt = 0;
Sg90 = 1;
}
//控制舵机
void SG90_open()
{
int n = 0;
jd = 3;//1.5ms高电平 135度
cnt = 0;
beep = 0;
for(n=0;n<3;n++)
Delay150ms();
beep = 1;
Delay2000ms();
}
//控制舵机
void SG90_close()
{
jd = 1;//0.5ms高电平 45度
cnt = 0;
Delay150ms();
}
//外部中断初始化
void EXT()
{
EX0 = 1;
IT0 = 0;
}
//主函数
void main()
{
double dis;
Time0Init();
Time1Init();
EXT();
SG90Init_0();
while(1){
//超声波测距
dis = juli();
if(dis < 10 || SW1 == 0 || vibrate_mark == 1){
//开盖
openstartLight();
//舵机关闭
SG90_open();
vibrate_mark = 0;
}
else{
//关盖
closestartLight();
//舵机开启
SG90_close();
}
}
}
//定时器0的外部中断
void Time0Handler() interrupt 1
{
cnt++;//变量++
TL0 = 0x33;
TH0 = 0xFE;
if(cnt < jd){
Sg90 = 1;
}
else{
Sg90 = 0;
}
if(cnt == 40){
cnt = 0;
Sg90 = 1;
}
}
//外部中断0
void EX0_Handle() interrupt 0
{
vibrate_mark = 1;
}