本次设计是基于51单片微型计算机的按摩床控制系统。按摩床的控制系统由恒温加热模块,按键调节模块,LCD显示模块,PWM控制电机转动按摩模块,霍尔电路测速模块,PID精准控速模块,定时模块,报警模块组成。当启动按摩床时,系统会驱动电机进行按摩同时加热系统会开始加热按摩区域,通过按键来调节按摩频率和力度,以及按摩各部位温度的调节,和按摩时间的设定。温度过高或者按摩床工作不正常就会有蜂鸣器进行警报,或是设定时间到了则蜂鸣器提醒。从而完成整个按摩过程。
完整版 电路图和程序代码 下载地址
https://pan.baidu.com/s/1ynP7vicusPz9bDPensw_lw?pwd=8888
部分代码展示
#include <at24c02.h>
#include <ds18b20.h>
void i2c_init()
{
sda = 1;
nop();
scl = 1;
nop();
}
void start() //启动i2c
{
sda = 1;
scl = 1;
nop();//延时必须大于4.7us,此约为五微秒
sda = 0; //在scl为高电平时,sda一个下降沿为启动信号
nop();
}
//stop:
void stop() //停止i2c
{
sda = 0;
scl = 1;
nop();
sda = 1; //在scl为高电平时,sdasda一个上升沿为停止信号
nop();
}
//ack:
void ack() //应答信号0
{
uchar i = 0; //等待变量
scl = 1;//在scl为高电平期间等待应答
nop();
while((sda == 1) && i < 250)//若为应答0即退出,从机向主机发送应答信号
i++;//等待一段时间
scl = 0; //应答之后将scl拉低
nop();
}
//nack:
void nack() //非应答
{
scl = 1;//在scl为高电平期间,由主机向从机发送一个1,非应答信号
nop();
sda = 1;
scl = 0; //应答之后将scl拉低
nop();
}
//send byte:
void send_byte(uchar date)//写一个字节
{
uchar i, temp;
temp = date; //存入要写入的数据,即要发送到sda上的数据
for(i = 0; i < 8; i++)
{ //发送8位
temp <<= 1; //to CY 将数据的最高位移入到PSW中的CY位中
scl = 0;//只有在scl为低电平时,才允许sda上的数据变化
nop();
sda = CY; //将CY里的数据发送到sda数据线上
nop();//可以延时
scl = 1; //在scl为高电平时,不允许sda上的数据变化,使数据稳定
nop();
scl = 0;//允许sda数据线的数据变化,等待下一个数据的传输
nop();
}
//wait ack:发送完一个字节数据后要主机要等待从机的应答,第九位
scl = 0;//允许sda变化
nop();
sda = 1;//wait:ack,sda拉高等待应答,当sda=0时,表示从机的应答
nop();
}
//read: byte
uchar read1_byte() //读一个字节数据
{
uchar i, j, k;
scl = 0; //读之前先允许sda变化
nop(); //等待数据
for(i = 0; i < 8; i++)
{
scl = 1; //不允许sda变化
nop(); //使sda数据稳定后开始读数据
j = sda; //读出sda上的数据
k = (k << 1)| j; //将数据通过|运算存入k中
scl = 0;//允许sda变化等待下一位数据的到来
nop();
}
//delay();//可不用延时
return k;//返回读出的数据
}
//write:at24c02 在at24c02中的指定地址写入数据
void write_at24c02(uchar address, uchar date)
{
start(); //启动i2c
send_byte(write_c02);//写入期间地址和写操作
ack(); //从机应答0
send_byte(address); //写入写数据的单元地址
ack(); //ack0
send_byte(date); //在指定地址中写入数据
ack(); //从机应答0
stop(); //停止i2c
}
//read: at24c02 在at24c02的指定地址中读出写入的数据
uchar read_at24c02(address)
{
uchar dat;//用来存储读出的数据
start(); //启动i2c
send_byte(write_c02); //写入at24c02器件地址和写操作
ack(); //从机应答0
send_byte(address); //写入要读取AT24C02的数据的单元地址
ack(); //从机应答0
start(); //再次启动i2c
send_byte(read_c02); //写入AT24C02器件地址和读操作
ack();//从机应答‘0’
dat = read_byte();//读出指定地址中的数据
nack(); //主机发出非应答‘1’
stop(); //停止i2c
return dat; //返回读出的数据
}
unsigned char conver(unsigned char a,unsigned char b,unsigned char c)
{
if((a&0x0f)==0x0a) a=a+6;
if(a==b) a=c;
return a;
}