目录
电机模块L9110S、循迹模块、红外避障模块、超声波模块、测速模块、OLED屏、蓝牙模块、4G,模块、语音模块SU-03T
蓝牙控制小车、WiFi控制小车、4G控制小车、小车的避障、跟随、循迹
单片机中一般都有两块存储区域,ROM和RAM,程序代码存储在ROM中,程序要用的变量存储在RAM中。而“code”的作用就是将其修饰过的变量存储在ROM中而非RAM。 在单片机中,RAM空间都比较小,是比较宝贵的,当存放在RAM中的数据过多时,会导致编译不成功。

L0110S模块的A、B分别控制着两个电机,如果需要控制四个电机,则需要两个L0110S模块



#include "reg52.h"
#include <intrins.h>
sbit left_con1A = P1^1;
sbit left_con2A = P1^2;
sbit right_con1A = P1^3;
sbit right_con2A = P1^4;
void Delay2000ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
i = 15;
j = 2;
k = 235;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
//两个电机反转,前进
void goForward()
{
left_con1A = 1;
left_con2A = 0;
right_con1A = 1;
right_con2A = 0;
}
//两个电机正转,后退
void goBack()
{
left_con1A = 0;
left_con2A = 1;
right_con1A = 0;
right_con2A = 1;
}
//两个电机不转,停止
void goStop()
{
left_con1A = 0;
left_con2A = 0;
right_con1A = 0;
right_con2A = 0;
}
//左电机不转,右电机反转,左转
void goLeft()
{
left_con1A = 0;
left_con2A = 0;
right_con1A = 1;
right_con2A = 0;
}
//左电机反转,右电机不转,右转
void goRight()
{
left_con1A = 1;
left_con2A = 0;
right_con1A = 0;
right_con2A = 0;
}
void main()
{
while(1){
goForward();
Delay2000ms();
goBack();
Delay2000ms();
goLeft();
Delay2000ms();
goRight();
Delay2000ms();
goStop();
Delay2000ms();
}
}
#include "reg52.h"
#include <intrins.h>
#include <string.h>
sfr AUXR = 0x8E;
sbit left_con1A = P1^1;
sbit left_con2A = P1^2;
sbit right_con1A = P1^3;
sbit right_con2A = P1^4;
sbit led1 = P3^7;
char mybuf[24] ;
void Delay1000ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
i = 8;
j = 1;
k = 243;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void uartInit()
{
AUXR = 0x01;
PCON &= 0x7F; //配置波特率正常
SCON = 0x50; //配置串口选择工作方式1,允许串口接收数据
//配置定时器1为8位自动重装模式
TMOD &= 0x0F;
TMOD |= 0x20;
//给定时器1,9600波特率初值
TH1 = 0xFD; //定时器1初值
TL1 = 0xFD; //定时器1重装值
ET1 = 0; //不允许定时器1产生中断
TR1 = 1; //开启定时器1
EA = 1; //开启总中断
ES = 1; //开启串口中断
}
void sendByte(char mydata)
{
SBUF = mydata; //向串口发送一帧信息
while(!TI); //等待硬件置位
TI = 0; //TI软件清0
}
void sendString(char *str)
{
while(*str != '\0'){
sendByte(*str);
str++;
}
}
//两个电机反转,前进
void goForward()
{
left_con1A = 1;
left_con2A = 0;
right_con1A = 1;
right_con2A = 0;
}
//两个电机正转,后退
void goBack()
{
left_con1A = 0;
left_con2A = 1;
right_con1A = 0;
right_con2A = 1;
}
//两个电机不转,停止
void goStop()
{
left_con1A = 0;
left_con2A = 0;
right_con1A = 0;
right_con2A = 0;
}
//左电机不转,右电机反转,左转
void goLeft()
{
left_con1A = 0;
left_con2A = 0;
right_con1A = 1;
right_con2A = 0;
}
//左电机反转,右电机不转,右转
void goRight()
{
left_con1A = 1;
left_con2A = 0;
right_con1A = 0;
right_con2A = 0;
}
void main()
{
uartInit();
while(1){
sendString("jiangxiaoya\r\n"); //发送心跳包,确保串口通信没有中断
Delay1000ms();
}
}
void myUart() interrupt 4
{
static int i = 0;
char tmp;
//接收数据后,RI硬件置位产生的中断
if(RI){
RI = 0; //RI软件清0
//获取从pc端接收到的数据
tmp = SBUF;
if(tmp == 'f' || tmp == 'b' || tmp == 'l' || tmp == 'r' || tmp == 's'){
i = 0;
}
mybuf[i] = tmp;
i++;
//forward
if(mybuf[0] == 'f' && mybuf[1] == 'o'){
goForward();
memset(mybuf,'\0',24);
}
//forward
if(mybuf[0] == 'b' && mybuf[1] == 'a'){
goBack();
memset(mybuf,'\0',24);
}
//left
if(mybuf[0] == 'l' && mybuf[1] == 'e'){
goLeft();
memset(mybuf,'\0',24);
}
//right
if(mybuf[0] == 'r' && mybuf[1] == 'i'){
goRight();
memset(mybuf,'\0',24);
}
//stop
if(mybuf[0] == 's' && mybuf[1] == 't'){
goStop();
memset(mybuf,'\0',24);
}
if(i == 24){
i = 0;
}
}
//发送数据后,TI硬件置位产生的中断
if(TI);
}
#include "reg52.h"
#include <intrins.h>
#include <string.h>
sfr AUXR = 0x8E;
sbit left_con1A = P1^1;
sbit left_con2A = P1^2;
sbit right_con1A = P1^3;
sbit right_con2A = P1^4;
sbit led1 = P3^7;
char mybuf[24] ;
char leftSpeed;
char rightSpeed;
int cntLeft = 0;
int cntRight = 0;
void Delay1000ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
i = 8;
j = 1;
k = 243;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
//左电机反转
void goLeftForward()
{
left_con1A = 1;
left_con2A = 0;
}
//左电机不转
void goLeftStop()
{
left_con1A = 0;
left_con2A = 0;
}
//右电机反转
void goRightForward()
{
right_con1A = 1;
right_con2A = 0;
}
//右电机不转
void goRightStop()
{
right_con1A = 0;
right_con2A = 0;
}
//前进
void goForward()
{
leftSpeed = 18;
rightSpeed = 20;
}
//停止
void goStop()
{
leftSpeed = 0;
rightSpeed = 0;
}
//左转
void goLeft()
{
leftSpeed = 10;
rightSpeed = 20;
}
//右转
void goRight()
{
leftSpeed = 20;
rightSpeed = 10;
}
void Timer0Init(void) //1毫秒@11.0592MHz
{
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
//定时器初值为1ms
TL0 = 0x66;
TH0 = 0xFC;
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1;
EA = 1;
}
void Timer1Init(void) //1毫秒@11.0592MHz
{
AUXR |= 0x40; //定时器时钟1T模式
TMOD &= 0x0F; //设置定时器模式
TMOD |= 0x10; //设置定时器模式
//定时器初值为1ms
TL1 = 0xCD;
TH1 = 0xD4;
TF1 = 0; //清除TF1标志
TR1 = 1; //定时器1开始计时
ET1 = 1;
EA = 1;
}
void main()
{
Timer0Init();
Timer1Init();
while(1){
Delay1000ms();
goForward();
Delay1000ms();
goLeft();
Delay1000ms();
goRight();
}
}
//定时器0的中断函数
void Time0Handler() interrupt 1
{
cntLeft++;
TL0 = 0x66;
TH0 = 0xFC;
if(cntLeft < leftSpeed)
{
goLeftForward();
}else{
goLeftStop();
}
if(cntLeft == 20){
cntLeft = 0;
}
}
void Time1Handler() interrupt 3
{
cntRight++;
TL1 = 0x66;
TH1 = 0xFC;
if(cntRight < rightSpeed)
{
goRightForward();
}else{
goRightStop();
}
if(cntRight == 20){
cntRight = 0;
}
}
#include "reg52.h"
#include <intrins.h>
#include <string.h>
sfr AUXR = 0x8E;
sbit left_con1A = P1^1;
sbit left_con2A = P1^2;
sbit right_con1A = P1^3;
sbit right_con2A = P1^4;
sbit tracingLeft = P1^5;
sbit tracingRight = P1^6;
char leftSpeed;
char rightSpeed;
int cntLeft = 0;
int cntRight = 0;
//左电机反转
void goLeftForward()
{
left_con1A = 1;
left_con2A = 0;
}
//左电机不转
void goLeftStop()
{
left_con1A = 0;
left_con2A = 0;
}
//右电机反转
void goRightForward()
{
right_con1A = 1;
right_con2A = 0;
}
//右电机不转
void goRightStop()
{
right_con1A = 0;
right_con2A = 0;
}
//前进
void goForward()
{
leftSpeed = 17;
rightSpeed = 20;
}
//停止
void goStop()
{
leftSpeed = 0;
rightSpeed = 0;
}
//左转
void goLeft()
{
leftSpeed = 5;
rightSpeed = 20;
}
//右转
void goRight()
{
leftSpeed = 20;
rightSpeed = 5;
}
void Timer0Init(void) //1毫秒@11.0592MHz
{
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
//定时器初值为1ms
TL0 = 0x66;
TH0 = 0xFC;
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1;
EA = 1;
}
void Timer1Init(void) //1毫秒@11.0592MHz
{
AUXR |= 0x40; //定时器时钟1T模式
TMOD &= 0x0F; //设置定时器模式
TMOD |= 0x10; //设置定时器模式
//定时器初值为1ms
TL1 = 0xCD;
TH1 = 0xD4;
TF1 = 0; //清除TF1标志
TR1 = 1; //定时器1开始计时
ET1 = 1;
EA = 1;
}
void tracingMode()
{
if(tracingLeft == 0 && tracingRight == 0){ //
goForward();
}
if(tracingLeft == 0 && tracingRight == 1){
goRight();
}
if(tracingLeft == 1 && tracingRight == 0){
goLeft();
}
if(tracingLeft == 1 && tracingRight == 1){
goStop();
}
}
void main()
{
Timer0Init();
Timer1Init();
while(1){
tracingMode();
}
}
//定时器0的中断函数
void Time0Handler() interrupt 1
{
cntLeft++;
TL0 = 0x66;
TH0 = 0xFC;
if(cntLeft < leftSpeed)
{
goLeftForward();
}else{
goLeftStop();
}
if(cntLeft == 20){
cntLeft = 0;
}
}
void Time1Handler() interrupt 3
{
cntRight++;
TL1 = 0x66;
TH1 = 0xFC;
if(cntRight < rightSpeed)
{
goRightForward();
}else{
goRightStop();
}
if(cntRight == 20){
cntRight = 0;
}
}
#include "reg52.h"
#include <intrins.h>
#include <string.h>
sfr AUXR = 0x8E;
sbit left_con1A = P1^1;
sbit left_con2A = P1^2;
sbit right_con1A = P1^3;
sbit right_con2A = P1^4;
sbit followLeft = P2^1;
sbit followRight = P2^2;
char leftSpeed;
char rightSpeed;
int cntLeft = 0;
int cntRight = 0;
//左电机反转
void goLeftForward()
{
left_con1A = 1;
left_con2A = 0;
}
//左电机不转
void goLeftStop()
{
left_con1A = 0;
left_con2A = 0;
}
//右电机反转
void goRightForward()
{
right_con1A = 1;
right_con2A = 0;
}
//右电机不转
void goRightStop()
{
right_con1A = 0;
right_con2A = 0;
}
//前进
void goForward()
{
leftSpeed = 17;
rightSpeed = 20;
}
//停止
void goStop()
{
leftSpeed = 0;
rightSpeed = 0;
}
//左转
void goLeft()
{
leftSpeed = 8;
rightSpeed = 20;
}
//右转
void goRight()
{
leftSpeed = 20;
rightSpeed = 10;
}
void Timer0Init(void) //1毫秒@11.0592MHz
{
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
//定时器初值为1ms
TL0 = 0x66;
TH0 = 0xFC;
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1;
EA = 1;
}
void Timer1Init(void) //1毫秒@11.0592MHz
{
AUXR |= 0x40; //定时器时钟1T模式
TMOD &= 0x0F; //设置定时器模式
TMOD |= 0x10; //设置定时器模式
//定时器初值为1ms
TL1 = 0xCD;
TH1 = 0xD4;
TF1 = 0; //清除TF1标志
TR1 = 1; //定时器1开始计时
ET1 = 1;
EA = 1;
}
void followMode()
{
if(followLeft == 0 && followRight == 0){ //
goForward();
}
if(followLeft == 0 && followRight == 1){
goRight();
}
if(followLeft == 1 && followRight == 0){
goLeft();
}
if(followLeft == 1 && followRight == 1){
goStop();
}
}
void main()
{
Timer0Init();
Timer1Init();
while(1){
followMode();
}
}
//定时器0的中断函数
void Time0Handler() interrupt 1
{
cntLeft++;
TL0 = 0x66;
TH0 = 0xFC;
if(cntLeft < leftSpeed)
{
goLeftForward();
}else{
goLeftStop();
}
if(cntLeft == 20){
cntLeft = 0;
}
}
void Time1Handler() interrupt 3
{
cntRight++;
TL1 = 0x66;
TH1 = 0xFC;
if(cntRight < rightSpeed)
{
goRightForward();
}else{
goRightStop();
}
if(cntRight == 20){
cntRight = 0;
}
}
#include "reg52.h"
#include <intrins.h>
sbit left_con1A = P1^1;
sbit left_con2A = P1^2;
sbit right_con1A = P1^3;
sbit right_con2A = P1^4;
sbit Trig = P2^3;
sbit Echo = P2^4;
sbit sg90 = P2^5;
int angle;
int angleBack;
int cnt = 0;
void Delay100ms() //@11.0592MHz
{
unsigned char i, j;
i = 180;
j = 73;
do
{
while (--j);
} while (--i);
}
void Delay300ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
i = 3;
j = 26;
k = 223;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void Delay500ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
i = 4;
j = 129;
k = 119;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void Delay10us() //@11.0592MHz
{
unsigned char i;
i = 2;
while (--i);
}
//两个电机反转,前进
void goForward()
{
left_con1A = 1;
left_con2A = 0;
right_con1A = 1;
right_con2A = 0;
}
//两个电机正转,后退
void goBack()
{
left_con1A = 0;
left_con2A = 1;
right_con1A = 0;
right_con2A = 1;
}
//两个电机不转,停止
void goStop()
{
left_con1A = 0;
left_con2A = 0;
right_con1A = 0;
right_con2A = 0;
}
//左电机不转,右电机反转,左转
void goLeft()
{
left_con1A = 0;
left_con2A = 0;
right_con1A = 1;
right_con2A = 0;
}
//左电机反转,右电机不转,右转
void goRight()
{
left_con1A = 1;
left_con2A = 0;
right_con1A = 0;
right_con2A = 0;
}
void timer0Init()
{
//设置定时器0为16为计时模式
TMOD &=0xF0;
TMOD |=0x01;
//设置定时器0定时时间为0.5ms
TH0 = 0xFE;
TL0 = 0x33;
TR0 = 1; //定时器0开始计时
TF0 = 0; //不执行定时器0爆表时导致的中断
ET0 = 1; //定时器0中断开关
EA = 1; //总中断开关
}
void timer1Init()
{
//设置定时器1为16为计时模式
TMOD &= 0x0F;
TMOD |= 0x10;
TH1 = 0x00;
TL1 = 0x00;
}
void ultrasonicStart()
{
Trig = 0;
Trig = 1;
Delay10us();
Trig = 0;
}
double getDistance()
{
double time = 0;
//定时器1清0
TH1 = 0x00;
TL1 = 0x00;
ultrasonicStart();
while(Echo == 0); //当Echo引脚从低电平跳到高电平时开启定时器1
TR1 = 1;
while(Echo == 1); //当Echo引脚从高电平跳到低电平时关闭定时器1
TR1 = 0;
time = (TH1*256 + TL1) * 1.085; //微秒
return (time * 0.017);
}
void sg90Left()
{
angle = 5; //180°
if(angleBack != angle){
cnt = 0;
}
angleBack = angle;
Delay100ms();
}
void sg90Middle()
{
angle = 3; //90°
if(angleBack != angle){
cnt = 0;
}
angleBack = angle;
Delay100ms();
}
void sg90Right()
{
angle = 1; //0°
if(angleBack != angle){
cnt = 0;
}
angleBack = angle;
Delay100ms();
}
void main()
{
double leftDistance;
double rightDistance;
double middleDistance;
timer0Init();
timer1Init();
sg90Middle();
Delay500ms();
while(1){
sg90Middle();
Delay300ms();
middleDistance = getDistance();
if(middleDistance > 35){
goForward();
}else{
goStop();
sg90Left();
Delay300ms();
leftDistance = getDistance();
sg90Middle();
Delay300ms();
sg90Right();
Delay300ms();
rightDistance = getDistance();
if(leftDistance < 15 && rightDistance < 15){
goBack();
Delay500ms();
goStop();
}else{
if(leftDistance > rightDistance){
goLeft();
Delay500ms();
goStop();
}
if(rightDistance > leftDistance){
goRight();
Delay500ms();
goStop();
}
}
}
}
}
//定时器0的中断函数
void Time0Handler() interrupt 1
{
TH0 = 0xFE;
TL0 = 0x33;
cnt++;
//控制占空比
if(cnt < angle){
sg90 = 1;
}else{
sg90 = 0;
}
if(cnt == 40){ //每个周期为20ms
cnt = 0;
sg90 = 1;
}
}
#include "reg52.h"
#include <intrins.h>
#include <string.h>
#include <stdio.h>
sfr AUXR = 0x8E;
sbit left_con1A = P1^1;
sbit left_con2A = P1^2;
sbit right_con1A = P1^3;
sbit right_con2A = P1^4;
sbit Tachometer = P3^2; //测速模块产生下降沿,让外部中断0产生中断
sbit scl = P2^6;
sbit sda = P2^7;
char mybuf[24];
int signal;
unsigned int cnt;
unsigned int speedCnt = 0;
unsigned int speed;
char speedMsg[24];
void Delay5us() //@11.0592MHz
{
}
//两个电机反转,前进
void goForward()
{
left_con1A = 1;
left_con2A = 0;
right_con1A = 1;
right_con2A = 0;
}
//两个电机正转,后退
void goBack()
{
left_con1A = 0;
left_con2A = 1;
right_con1A = 0;
right_con2A = 1;
}
//两个电机不转,停止
void goStop()
{
left_con1A = 0;
left_con2A = 0;
right_con1A = 0;
right_con2A = 0;
}
//左电机不转,右电机反转,左转
void goLeft()
{
left_con1A = 0;
left_con2A = 0;
right_con1A = 1;
right_con2A = 0;
}
//左电机反转,右电机不转,右转
void goRight()
{
left_con1A = 1;
left_con2A = 0;
right_con1A = 0;
right_con2A = 0;
}
//串口初始化
void uartInit()
{
AUXR = 0x01;
PCON &= 0x7F; //配置波特率正常
SCON = 0x50; //配置串口选择工作方式1,允许串口接收数据
//配置定时器1为8位自动重装模式
TMOD &= 0x0F;
TMOD |= 0x20;
//给定时器1,9600波特率初值
TH1 = 0xFD; //定时器1初值
TL1 = 0xFD; //定时器1重装值
ET1 = 0; //不允许定时器1产生中断
TR1 = 1; //开启定时器1
EA = 1; //开启总中断
ES = 1; //开启串口中断
}
//定时器0初始化,初值为1ms
void Time0Init()
{
TMOD &=0xF0;
TMOD |=0x01;
//1ms
TL0 = 0x66;
TH0 = 0xFC;
TR0 = 1;
ET0 = 1;
EA =1;
}
//外部中断0初始化
void int0Init()
{
EX0 = 1;
EA = 1;
IT0 = 1; //下降沿触发外部中断0
}
//IIC起始信号
void IIC_start()
{
sda = 0;
scl = 1;
sda = 1;
Delay5us();
sda = 0;
Delay5us();
scl = 0;
}
//IIC终止信号
void IIC_stop()
{
scl = 0;
sda = 0;
scl = 1;
Delay5us();
sda = 1;
Delay5us();
sda = 0;
}
//IIC的ACK应答信号
char IIC_ack()
{
char flag;
scl = 0;
sda = 1; //在时钟脉冲9期间释放数据线
Delay5us(); //延时5微秒后,为读取sda数据做准备
scl = 1;
Delay5us();
flag = sda; //读取数据线,0为应答
Delay5us();
scl = 0;
Delay5us();
return flag;
}
//IIC发送一个字节
void IIC_sendByte(char myData)
{
int i;
for ( i = 0; i < 8; i++){
//发生数据翻转,选择即将发送的是0还是1
scl = 0;
sda = myData & 0x80; //获取需要发送字节的最高位到SDA
Delay5us(); //数据建立时间
//开始发送数据
scl = 1;
Delay5us(); //数据发送时间
scl = 0; //发送完毕拉低,等待下1bit数据的传输
Delay5us();
myData = myData << 1;
}
}
//OLED写入一条指令
void oledWriteCmd(char writeCmd)
{
IIC_start();
IIC_sendByte(0x78); //选择一个OLED屏,写模式
IIC_ack();
IIC_sendByte(0x00); //写入命令,D/C位为0
IIC_ack();
IIC_sendByte(writeCmd);
IIC_ack();
IIC_stop();
}
//OLED写入一个数据
void oledWriteData(char writeData)
{
IIC_start();
IIC_sendByte(0x78); //选择一个OLED屏,写模式
IIC_ack();
IIC_sendByte(0x40); //写入命令,D/C位为0
IIC_ack();
IIC_sendByte(writeData);
IIC_ack();
IIC_stop();
}
//OLCD初始化
void oledInit()
{
oledWriteCmd(0xAE);
oledWriteCmd(0x00);
oledWriteCmd(0x10);
oledWriteCmd(0x40);
oledWriteCmd(0xB0);
oledWriteCmd(0x81);
oledWriteCmd(0xFF);
oledWriteCmd(0xA1);
oledWriteCmd(0xA6);
oledWriteCmd(0xA8);
oledWriteCmd(0x3F);
oledWriteCmd(0xC8);
oledWriteCmd(0xD3);
oledWriteCmd(0x00);
oledWriteCmd(0xD5);
oledWriteCmd(0x80);
oledWriteCmd(0xD8);
oledWriteCmd(0x05);
oledWriteCmd(0xD9);
oledWriteCmd(0xF1);
oledWriteCmd(0xDA);
oledWriteCmd(0x12);
oledWriteCmd(0xDB);
oledWriteCmd(0x30);
oledWriteCmd(0x8D);
oledWriteCmd(0x14);
oledWriteCmd(0xAF);
}
void olceClean()
{
int i,j;
for(i=0;i<8;i++){
oledWriteCmd(0xB0 + i); //选择PAGE
//选择PAGE的第0列开始显示
oledWriteCmd(0x00);
oledWriteCmd(0x10);
for(j = 0;j < 128; j++){
oledWriteData(0); //写入字符0
}
}
}
//OLED的字符构造点阵
const unsigned char code oledFont[]=
{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,// 0
0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x30,0x00,0x00,0x00,//! 1
0x00,0x10,0x0C,0x06,0x10,0x0C,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//" 2
0x40,0xC0,0x78,0x40,0xC0,0x78,0x40,0x00,0x04,0x3F,0x04,0x04,0x3F,0x04,0x04,0x00,//# 3
0x00,0x70,0x88,0xFC,0x08,0x30,0x00,0x00,0x00,0x18,0x20,0xFF,0x21,0x1E,0x00,0x00,//$ 4
0xF0,0x08,0xF0,0x00,0xE0,0x18,0x00,0x00,0x00,0x21,0x1C,0x03,0x1E,0x21,0x1E,0x00,//% 5
0x00,0xF0,0x08,0x88,0x70,0x00,0x00,0x00,0x1E,0x21,0x23,0x24,0x19,0x27,0x21,0x10,//& 6
0x10,0x16,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//' 7
0x00,0x00,0x00,0xE0,0x18,0x04,0x02,0x00,0x00,0x00,0x00,0x07,0x18,0x20,0x40,0x00,//( 8
0x00,0x02,0x04,0x18,0xE0,0x00,0x00,0x00,0x00,0x40,0x20,0x18,0x07,0x00,0x00,0x00,//) 9
0x40,0x40,0x80,0xF0,0x80,0x40,0x40,0x00,0x02,0x02,0x01,0x0F,0x01,0x02,0x02,0x00,//* 10
0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x1F,0x01,0x01,0x01,0x00,//+ 11
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xB0,0x70,0x00,0x00,0x00,0x00,0x00,//, 12
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,//- 13
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00,//. 14
0x00,0x00,0x00,0x00,0x80,0x60,0x18,0x04,0x00,0x60,0x18,0x06,0x01,0x00,0x00,0x00,/// 15
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,//0 16
0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//1 17
0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,//2 18
0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,//3 19
0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,//4 20
0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,//5 21
0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,//6 22
0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,//7 23
0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,//8 24
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,//9 25
0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,//: 26
0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x60,0x00,0x00,0x00,0x00,//; 27
0x00,0x00,0x80,0x40,0x20,0x10,0x08,0x00,0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x00,//< 28
0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x00,//= 29
0x00,0x08,0x10,0x20,0x40,0x80,0x00,0x00,0x00,0x20,0x10,0x08,0x04,0x02,0x01,0x00,//> 30
0x00,0x70,0x48,0x08,0x08,0x08,0xF0,0x00,0x00,0x00,0x00,0x30,0x36,0x01,0x00,0x00,//? 31
0xC0,0x30,0xC8,0x28,0xE8,0x10,0xE0,0x00,0x07,0x18,0x27,0x24,0x23,0x14,0x0B,0x00,//@ 32
0x00,0x00,0xC0,0x38,0xE0,0x00,0x00,0x00,0x20,0x3C,0x23,0x02,0x02,0x27,0x38,0x20,//A 33
0x08,0xF8,0x88,0x88,0x88,0x70,0x00,0x00,0x20,0x3F,0x20,0x20,0x20,0x11,0x0E,0x00,//B 34
0xC0,0x30,0x08,0x08,0x08,0x08,0x38,0x00,0x07,0x18,0x20,0x20,0x20,0x10,0x08,0x00,//C 35
0x08,0xF8,0x08,0x08,0x08,0x10,0xE0,0x00,0x20,0x3F,0x20,0x20,0x20,0x10,0x0F,0x00,//D 36
0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x20,0x23,0x20,0x18,0x00,//E 37
0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x00,0x03,0x00,0x00,0x00,//F 38
0xC0,0x30,0x08,0x08,0x08,0x38,0x00,0x00,0x07,0x18,0x20,0x20,0x22,0x1E,0x02,0x00,//G 39
0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,0x20,0x3F,0x21,0x01,0x01,0x21,0x3F,0x20,//H 40
0x00,0x08,0x08,0xF8,0x08,0x08,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//I 41
0x00,0x00,0x08,0x08,0xF8,0x08,0x08,0x00,0xC0,0x80,0x80,0x80,0x7F,0x00,0x00,0x00,//J 42
0x08,0xF8,0x88,0xC0,0x28,0x18,0x08,0x00,0x20,0x3F,0x20,0x01,0x26,0x38,0x20,0x00,//K 43
0x08,0xF8,0x08,0x00,0x00,0x00,0x00,0x00,0x20,0x3F,0x20,0x20,0x20,0x20,0x30,0x00,//L 44
0x08,0xF8,0xF8,0x00,0xF8,0xF8,0x08,0x00,0x20,0x3F,0x00,0x3F,0x00,0x3F,0x20,0x00,//M 45
0x08,0xF8,0x30,0xC0,0x00,0x08,0xF8,0x08,0x20,0x3F,0x20,0x00,0x07,0x18,0x3F,0x00,//N 46
0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x10,0x20,0x20,0x20,0x10,0x0F,0x00,//O 47
0x08,0xF8,0x08,0x08,0x08,0x08,0xF0,0x00,0x20,0x3F,0x21,0x01,0x01,0x01,0x00,0x00,//P 48
0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x18,0x24,0x24,0x38,0x50,0x4F,0x00,//Q 49
0x08,0xF8,0x88,0x88,0x88,0x88,0x70,0x00,0x20,0x3F,0x20,0x00,0x03,0x0C,0x30,0x20,//R 50
0x00,0x70,0x88,0x08,0x08,0x08,0x38,0x00,0x00,0x38,0x20,0x21,0x21,0x22,0x1C,0x00,//S 51
0x18,0x08,0x08,0xF8,0x08,0x08,0x18,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00,//T 52
0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00,//U 53
0x08,0x78,0x88,0x00,0x00,0xC8,0x38,0x08,0x00,0x00,0x07,0x38,0x0E,0x01,0x00,0x00,//V 54
0xF8,0x08,0x00,0xF8,0x00,0x08,0xF8,0x00,0x03,0x3C,0x07,0x00,0x07,0x3C,0x03,0x00,//W 55
0x08,0x18,0x68,0x80,0x80,0x68,0x18,0x08,0x20,0x30,0x2C,0x03,0x03,0x2C,0x30,0x20,//X 56
0x08,0x38,0xC8,0x00,0xC8,0x38,0x08,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00,//Y 57
0x10,0x08,0x08,0x08,0xC8,0x38,0x08,0x00,0x20,0x38,0x26,0x21,0x20,0x20,0x18,0x00,//Z 58
0x00,0x00,0x00,0xFE,0x02,0x02,0x02,0x00,0x00,0x00,0x00,0x7F,0x40,0x40,0x40,0x00,//[ 59
0x00,0x0C,0x30,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x06,0x38,0xC0,0x00,//\ 60
0x00,0x02,0x02,0x02,0xFE,0x00,0x00,0x00,0x00,0x40,0x40,0x40,0x7F,0x00,0x00,0x00,//] 61
0x00,0x00,0x04,0x02,0x02,0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//^ 62
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,//_ 63
0x00,0x02,0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//` 64
0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x19,0x24,0x22,0x22,0x22,0x3F,0x20,//a 65
0x08,0xF8,0x00,0x80,0x80,0x00,0x00,0x00,0x00,0x3F,0x11,0x20,0x20,0x11,0x0E,0x00,//b 66
0x00,0x00,0x00,0x80,0x80,0x80,0x00,0x00,0x00,0x0E,0x11,0x20,0x20,0x20,0x11,0x00,//c 67
0x00,0x00,0x00,0x80,0x80,0x88,0xF8,0x00,0x00,0x0E,0x11,0x20,0x20,0x10,0x3F,0x20,//d 68
0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x1F,0x22,0x22,0x22,0x22,0x13,0x00,//e 69
0x00,0x80,0x80,0xF0,0x88,0x88,0x88,0x18,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//f 70
0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x6B,0x94,0x94,0x94,0x93,0x60,0x00,//g 71
0x08,0xF8,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20,//h 72
0x00,0x80,0x98,0x98,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//i 73
0x00,0x00,0x00,0x80,0x98,0x98,0x00,0x00,0x00,0xC0,0x80,0x80,0x80,0x7F,0x00,0x00,//j 74
0x08,0xF8,0x00,0x00,0x80,0x80,0x80,0x00,0x20,0x3F,0x24,0x02,0x2D,0x30,0x20,0x00,//k 75
0x00,0x08,0x08,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//l 76
0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x20,0x3F,0x20,0x00,0x3F,0x20,0x00,0x3F,//m 77
0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20,//n 78
0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00,//o 79
0x80,0x80,0x00,0x80,0x80,0x00,0x00,0x00,0x80,0xFF,0xA1,0x20,0x20,0x11,0x0E,0x00,//p 80
0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x0E,0x11,0x20,0x20,0xA0,0xFF,0x80,//q 81
0x80,0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x20,0x20,0x3F,0x21,0x20,0x00,0x01,0x00,//r 82
0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x33,0x24,0x24,0x24,0x24,0x19,0x00,//s 83
0x00,0x80,0x80,0xE0,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x1F,0x20,0x20,0x00,0x00,//t 84
0x80,0x80,0x00,0x00,0x00,0x80,0x80,0x00,0x00,0x1F,0x20,0x20,0x20,0x10,0x3F,0x20,//u 85
0x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,0x00,0x01,0x0E,0x30,0x08,0x06,0x01,0x00,//v 86
0x80,0x80,0x00,0x80,0x00,0x80,0x80,0x80,0x0F,0x30,0x0C,0x03,0x0C,0x30,0x0F,0x00,//w 87
0x00,0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x31,0x2E,0x0E,0x31,0x20,0x00,//x 88
0x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,0x80,0x81,0x8E,0x70,0x18,0x06,0x01,0x00,//y 89
0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x21,0x30,0x2C,0x22,0x21,0x30,0x00,//z 90
0x00,0x00,0x00,0x00,0x80,0x7C,0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x3F,0x40,0x40,//{ 91
0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,//| 92
0x00,0x02,0x02,0x7C,0x80,0x00,0x00,0x00,0x00,0x40,0x40,0x3F,0x00,0x00,0x00,0x00,//} 93
0x00,0x06,0x01,0x01,0x02,0x02,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//~ 94
};
//OLED显示一个字符
void oledShowByte(char rows,char columns,char oledByte)
{
unsigned int i;
//显示字符的上半部分
oledWriteCmd(0xb0+(rows*2-2)); //选择行
//选择列
oledWriteCmd(0x00+(columns&0x0f));
oledWriteCmd(0x10+(columns>>4));
//显示数据
for(i=((oledByte-32)*16);i<((oledByte-32)*16+8);i++){
oledWriteData(oledFont[i]);
}
//显示字符的上半部分
oledWriteCmd(0xb0+(rows*2-1)); //选择行
//选择列
oledWriteCmd(0x00+(columns&0x0f));
oledWriteCmd(0x10+(columns>>4));
//显示数据
for(i=((oledByte-32)*16+8);i<((oledByte-32)*16+8+8);i++){
oledWriteData(oledFont[i]);
}
}
//OLED显示一个字符串
void oledShowString(char rows,char columns,char *str)
{
while(*str != '\0'){
oledShowByte(rows,columns,*str);
str++;
columns += 8;
}
}
void main()
{
uartInit();
Time0Init();
int0Init();
oledInit();
olceClean(); //清屏函数
oledWriteCmd(0x20); //设置内存
oledWriteCmd(0x02); //选择页寻址模式
while(1){
if(signal == 1){
sprintf(speedMsg,"speed:%dcm/s ",speed);
olceClean();
oledShowString(2,5,speedMsg);
signal = 0;
}
}
}
//定时器0产生的中断的处理函数
void Time0Handle() interrupt 1
{
cnt++;
TL0 = 0x66;
TH0 = 0xFC;
//每过一秒统计一次产生了多少次下降沿,让main函数向串口发送当前小车速度
if(cnt == 1000){
cnt = 0;
signal = 1;
speed = speedCnt;
speedCnt = 0;
}
}
//外部中断0产生的中断的处理函数
void int0Handle() interrupt 0
{
speedCnt++; //每产生一个下降沿让标志位+1
}
//串口产生的中断的处理函数
void myUart() interrupt 4
{
static int i = 0;
char tmp;
//接收数据后,RI硬件置位产生的中断
if(RI){
RI = 0; //RI软件清0
//获取从pc端接收到的数据
tmp = SBUF;
if(tmp == 'f' || tmp == 'b' || tmp == 'l' || tmp == 'r' || tmp == 's'){
i = 0;
}
mybuf[i] = tmp;
i++;
//forward
if(mybuf[0] == 'f' && mybuf[1] == 'o'){
goForward();
memset(mybuf,'\0',24);
}
//forward
if(mybuf[0] == 'b' && mybuf[1] == 'a'){
goBack();
memset(mybuf,'\0',24);
}
//left
if(mybuf[0] == 'l' && mybuf[1] == 'e'){
goLeft();
memset(mybuf,'\0',24);
}
//right
if(mybuf[0] == 'r' && mybuf[1] == 'i'){
goRight();
memset(mybuf,'\0',24);
}
//stop
if(mybuf[0] == 's' && mybuf[1] == 't'){
goStop();
memset(mybuf,'\0',24);
}
if(i == 24){
i = 0;
}
}
//发送数据后,TI硬件置位产生的中断
if(TI);
}
#include "reg52.h"
#include <intrins.h>
#define BZ 1
#define XJ 2
#define GS 3
sfr AUXR = 0x8E;
//sg90
sbit sg90 = P2^5;
//ultrasonic
sbit Trig = P2^3;
sbit Echo = P2^4;
//oled
sbit scl = P2^6;
sbit sda = P2^7;
//car
sbit left_con1A = P1^1;
sbit left_con2A = P1^2;
sbit right_con1A = P1^3;
sbit right_con2A = P1^4;
//循迹
sbit tracingLeft = P1^5;
sbit tracingRight = P1^6;
//跟随
sbit followLeft = P2^1;
sbit followRight = P2^2;
//su-03t
sbit A25 = P0^1;
sbit A26 = P0^2;
sbit A27 = P0^3;
int angle;
int angleBack;
int cnt = 0;
double leftDistance;
double rightDistance;
double middleDistance;
//OLED的字符构造点阵
const unsigned char code oledFont[]=
{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,// 0
0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x30,0x00,0x00,0x00,//! 1
0x00,0x10,0x0C,0x06,0x10,0x0C,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//" 2
0x40,0xC0,0x78,0x40,0xC0,0x78,0x40,0x00,0x04,0x3F,0x04,0x04,0x3F,0x04,0x04,0x00,//# 3
0x00,0x70,0x88,0xFC,0x08,0x30,0x00,0x00,0x00,0x18,0x20,0xFF,0x21,0x1E,0x00,0x00,//$ 4
0xF0,0x08,0xF0,0x00,0xE0,0x18,0x00,0x00,0x00,0x21,0x1C,0x03,0x1E,0x21,0x1E,0x00,//% 5
0x00,0xF0,0x08,0x88,0x70,0x00,0x00,0x00,0x1E,0x21,0x23,0x24,0x19,0x27,0x21,0x10,//& 6
0x10,0x16,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//' 7
0x00,0x00,0x00,0xE0,0x18,0x04,0x02,0x00,0x00,0x00,0x00,0x07,0x18,0x20,0x40,0x00,//( 8
0x00,0x02,0x04,0x18,0xE0,0x00,0x00,0x00,0x00,0x40,0x20,0x18,0x07,0x00,0x00,0x00,//) 9
0x40,0x40,0x80,0xF0,0x80,0x40,0x40,0x00,0x02,0x02,0x01,0x0F,0x01,0x02,0x02,0x00,//* 10
0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x1F,0x01,0x01,0x01,0x00,//+ 11
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xB0,0x70,0x00,0x00,0x00,0x00,0x00,//, 12
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,//- 13
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00,//. 14
0x00,0x00,0x00,0x00,0x80,0x60,0x18,0x04,0x00,0x60,0x18,0x06,0x01,0x00,0x00,0x00,/// 15
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,//0 16
0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//1 17
0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,//2 18
0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,//3 19
0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,//4 20
0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,//5 21
0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,//6 22
0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,//7 23
0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,//8 24
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,//9 25
0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,//: 26
0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x60,0x00,0x00,0x00,0x00,//; 27
0x00,0x00,0x80,0x40,0x20,0x10,0x08,0x00,0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x00,//< 28
0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x00,//= 29
0x00,0x08,0x10,0x20,0x40,0x80,0x00,0x00,0x00,0x20,0x10,0x08,0x04,0x02,0x01,0x00,//> 30
0x00,0x70,0x48,0x08,0x08,0x08,0xF0,0x00,0x00,0x00,0x00,0x30,0x36,0x01,0x00,0x00,//? 31
0xC0,0x30,0xC8,0x28,0xE8,0x10,0xE0,0x00,0x07,0x18,0x27,0x24,0x23,0x14,0x0B,0x00,//@ 32
0x00,0x00,0xC0,0x38,0xE0,0x00,0x00,0x00,0x20,0x3C,0x23,0x02,0x02,0x27,0x38,0x20,//A 33
0x08,0xF8,0x88,0x88,0x88,0x70,0x00,0x00,0x20,0x3F,0x20,0x20,0x20,0x11,0x0E,0x00,//B 34
0xC0,0x30,0x08,0x08,0x08,0x08,0x38,0x00,0x07,0x18,0x20,0x20,0x20,0x10,0x08,0x00,//C 35
0x08,0xF8,0x08,0x08,0x08,0x10,0xE0,0x00,0x20,0x3F,0x20,0x20,0x20,0x10,0x0F,0x00,//D 36
0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x20,0x23,0x20,0x18,0x00,//E 37
0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x00,0x03,0x00,0x00,0x00,//F 38
0xC0,0x30,0x08,0x08,0x08,0x38,0x00,0x00,0x07,0x18,0x20,0x20,0x22,0x1E,0x02,0x00,//G 39
0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,0x20,0x3F,0x21,0x01,0x01,0x21,0x3F,0x20,//H 40
0x00,0x08,0x08,0xF8,0x08,0x08,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//I 41
0x00,0x00,0x08,0x08,0xF8,0x08,0x08,0x00,0xC0,0x80,0x80,0x80,0x7F,0x00,0x00,0x00,//J 42
0x08,0xF8,0x88,0xC0,0x28,0x18,0x08,0x00,0x20,0x3F,0x20,0x01,0x26,0x38,0x20,0x00,//K 43
0x08,0xF8,0x08,0x00,0x00,0x00,0x00,0x00,0x20,0x3F,0x20,0x20,0x20,0x20,0x30,0x00,//L 44
0x08,0xF8,0xF8,0x00,0xF8,0xF8,0x08,0x00,0x20,0x3F,0x00,0x3F,0x00,0x3F,0x20,0x00,//M 45
0x08,0xF8,0x30,0xC0,0x00,0x08,0xF8,0x08,0x20,0x3F,0x20,0x00,0x07,0x18,0x3F,0x00,//N 46
0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x10,0x20,0x20,0x20,0x10,0x0F,0x00,//O 47
0x08,0xF8,0x08,0x08,0x08,0x08,0xF0,0x00,0x20,0x3F,0x21,0x01,0x01,0x01,0x00,0x00,//P 48
0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x18,0x24,0x24,0x38,0x50,0x4F,0x00,//Q 49
0x08,0xF8,0x88,0x88,0x88,0x88,0x70,0x00,0x20,0x3F,0x20,0x00,0x03,0x0C,0x30,0x20,//R 50
0x00,0x70,0x88,0x08,0x08,0x08,0x38,0x00,0x00,0x38,0x20,0x21,0x21,0x22,0x1C,0x00,//S 51
0x18,0x08,0x08,0xF8,0x08,0x08,0x18,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00,//T 52
0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00,//U 53
0x08,0x78,0x88,0x00,0x00,0xC8,0x38,0x08,0x00,0x00,0x07,0x38,0x0E,0x01,0x00,0x00,//V 54
0xF8,0x08,0x00,0xF8,0x00,0x08,0xF8,0x00,0x03,0x3C,0x07,0x00,0x07,0x3C,0x03,0x00,//W 55
0x08,0x18,0x68,0x80,0x80,0x68,0x18,0x08,0x20,0x30,0x2C,0x03,0x03,0x2C,0x30,0x20,//X 56
0x08,0x38,0xC8,0x00,0xC8,0x38,0x08,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00,//Y 57
0x10,0x08,0x08,0x08,0xC8,0x38,0x08,0x00,0x20,0x38,0x26,0x21,0x20,0x20,0x18,0x00,//Z 58
0x00,0x00,0x00,0xFE,0x02,0x02,0x02,0x00,0x00,0x00,0x00,0x7F,0x40,0x40,0x40,0x00,//[ 59
0x00,0x0C,0x30,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x06,0x38,0xC0,0x00,//\ 60
0x00,0x02,0x02,0x02,0xFE,0x00,0x00,0x00,0x00,0x40,0x40,0x40,0x7F,0x00,0x00,0x00,//] 61
0x00,0x00,0x04,0x02,0x02,0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//^ 62
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,//_ 63
0x00,0x02,0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//` 64
0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x19,0x24,0x22,0x22,0x22,0x3F,0x20,//a 65
0x08,0xF8,0x00,0x80,0x80,0x00,0x00,0x00,0x00,0x3F,0x11,0x20,0x20,0x11,0x0E,0x00,//b 66
0x00,0x00,0x00,0x80,0x80,0x80,0x00,0x00,0x00,0x0E,0x11,0x20,0x20,0x20,0x11,0x00,//c 67
0x00,0x00,0x00,0x80,0x80,0x88,0xF8,0x00,0x00,0x0E,0x11,0x20,0x20,0x10,0x3F,0x20,//d 68
0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x1F,0x22,0x22,0x22,0x22,0x13,0x00,//e 69
0x00,0x80,0x80,0xF0,0x88,0x88,0x88,0x18,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//f 70
0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x6B,0x94,0x94,0x94,0x93,0x60,0x00,//g 71
0x08,0xF8,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20,//h 72
0x00,0x80,0x98,0x98,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//i 73
0x00,0x00,0x00,0x80,0x98,0x98,0x00,0x00,0x00,0xC0,0x80,0x80,0x80,0x7F,0x00,0x00,//j 74
0x08,0xF8,0x00,0x00,0x80,0x80,0x80,0x00,0x20,0x3F,0x24,0x02,0x2D,0x30,0x20,0x00,//k 75
0x00,0x08,0x08,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//l 76
0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x20,0x3F,0x20,0x00,0x3F,0x20,0x00,0x3F,//m 77
0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20,//n 78
0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00,//o 79
0x80,0x80,0x00,0x80,0x80,0x00,0x00,0x00,0x80,0xFF,0xA1,0x20,0x20,0x11,0x0E,0x00,//p 80
0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x0E,0x11,0x20,0x20,0xA0,0xFF,0x80,//q 81
0x80,0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x20,0x20,0x3F,0x21,0x20,0x00,0x01,0x00,//r 82
0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x33,0x24,0x24,0x24,0x24,0x19,0x00,//s 83
0x00,0x80,0x80,0xE0,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x1F,0x20,0x20,0x00,0x00,//t 84
0x80,0x80,0x00,0x00,0x00,0x80,0x80,0x00,0x00,0x1F,0x20,0x20,0x20,0x10,0x3F,0x20,//u 85
0x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,0x00,0x01,0x0E,0x30,0x08,0x06,0x01,0x00,//v 86
0x80,0x80,0x00,0x80,0x00,0x80,0x80,0x80,0x0F,0x30,0x0C,0x03,0x0C,0x30,0x0F,0x00,//w 87
0x00,0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x31,0x2E,0x0E,0x31,0x20,0x00,//x 88
0x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,0x80,0x81,0x8E,0x70,0x18,0x06,0x01,0x00,//y 89
0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x21,0x30,0x2C,0x22,0x21,0x30,0x00,//z 90
0x00,0x00,0x00,0x00,0x80,0x7C,0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x3F,0x40,0x40,//{ 91
0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,//| 92
0x00,0x02,0x02,0x7C,0x80,0x00,0x00,0x00,0x00,0x40,0x40,0x3F,0x00,0x00,0x00,0x00,//} 93
0x00,0x06,0x01,0x01,0x02,0x02,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//~ 94
};
void Delay5us() //@11.0592MHz
{
}
void Delay10us() //@11.0592MHz
{
unsigned char i;
i = 2;
while (--i);
}
void Delay100ms() //@11.0592MHz
{
unsigned char i, j;
i = 180;
j = 73;
do
{
while (--j);
} while (--i);
}
void Delay300ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
i = 3;
j = 26;
k = 223;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void Delay500ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
i = 4;
j = 129;
k = 119;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
//sg90
void timer0Init()
{
//设置定时器0为16为计时模式
TMOD &=0xF0;
TMOD |=0x01;
//设置定时器0定时时间为0.5ms
TH0 = 0xFE;
TL0 = 0x33;
TR0 = 1; //定时器0开始计时
TF0 = 0; //不执行定时器0爆表时导致的中断
ET0 = 1; //定时器0中断开关
EA = 1; //总中断开关
}
void sg90Left()
{
angle = 5; //180°
if(angleBack != angle){
cnt = 0;
}
angleBack = angle;
Delay100ms();
}
void sg90Middle()
{
angle = 3; //90°
if(angleBack != angle){
cnt = 0;
}
angleBack = angle;
Delay100ms();
}
void sg90Right()
{
angle = 1; //0°
if(angleBack != angle){
cnt = 0;
}
angleBack = angle;
Delay100ms();
}
//ultrasonic
void timer1Init()
{
//设置定时器1为16为计时模式
TMOD &= 0x0F;
TMOD |= 0x10;
TH1 = 0x00;
TL1 = 0x00;
}
void ultrasonicStart()
{
Trig = 0;
Trig = 1;
Delay10us();
Trig = 0;
}
double getDistance()
{
double time = 0;
//定时器1清0
TH1 = 0x00;
TL1 = 0x00;
ultrasonicStart();
while(Echo == 0); //当Echo引脚从低电平跳到高电平时开启定时器1
TR1 = 1;
while(Echo == 1); //当Echo引脚从高电平跳到低电平时关闭定时器1
TR1 = 0;
time = (TH1*256 + TL1) * 1.085; //微秒
return (time * 0.017);
}
//oled
//IIC起始信号
void IIC_start()
{
sda = 0;
scl = 1;
sda = 1;
Delay5us();
sda = 0;
Delay5us();
scl = 0;
}
//IIC终止信号
void IIC_stop()
{
scl = 0;
sda = 0;
scl = 1;
Delay5us();
sda = 1;
Delay5us();
sda = 0;
}
//IIC的ACK应答信号
char IIC_ack()
{
char flag;
scl = 0;
sda = 1; //在时钟脉冲9期间释放数据线
Delay5us(); //延时5微秒后,为读取sda数据做准备
scl = 1;
Delay5us();
flag = sda; //读取数据线,0为应答
Delay5us();
scl = 0;
Delay5us();
return flag;
}
//IIC发送一个字节
void IIC_sendByte(char myData)
{
int i;
for ( i = 0; i < 8; i++){
//发生数据翻转,选择即将发送的是0还是1
scl = 0;
sda = myData & 0x80; //获取需要发送字节的最高位到SDA
Delay5us(); //数据建立时间
//开始发送数据
scl = 1;
Delay5us(); //数据发送时间
scl = 0; //发送完毕拉低,等待下1bit数据的传输
Delay5us();
myData = myData << 1;
}
}
//OLED写入一条指令
void oledWriteCmd(char writeCmd)
{
IIC_start();
IIC_sendByte(0x78); //选择一个OLED屏,写模式
IIC_ack();
IIC_sendByte(0x00); //写入命令,D/C位为0
IIC_ack();
IIC_sendByte(writeCmd);
IIC_ack();
IIC_stop();
}
//OLED写入一个数据
void oledWriteData(char writeData)
{
IIC_start();
IIC_sendByte(0x78); //选择一个OLED屏,写模式
IIC_ack();
IIC_sendByte(0x40); //写入命令,D/C位为0
IIC_ack();
IIC_sendByte(writeData);
IIC_ack();
IIC_stop();
}
//OLCD初始化
void oledInit()
{
oledWriteCmd(0xAE);
oledWriteCmd(0x00);
oledWriteCmd(0x10);
oledWriteCmd(0x40);
oledWriteCmd(0xB0);
oledWriteCmd(0x81);
oledWriteCmd(0xFF);
oledWriteCmd(0xA1);
oledWriteCmd(0xA6);
oledWriteCmd(0xA8);
oledWriteCmd(0x3F);
oledWriteCmd(0xC8);
oledWriteCmd(0xD3);
oledWriteCmd(0x00);
oledWriteCmd(0xD5);
oledWriteCmd(0x80);
oledWriteCmd(0xD8);
oledWriteCmd(0x05);
oledWriteCmd(0xD9);
oledWriteCmd(0xF1);
oledWriteCmd(0xDA);
oledWriteCmd(0x12);
oledWriteCmd(0xDB);
oledWriteCmd(0x30);
oledWriteCmd(0x8D);
oledWriteCmd(0x14);
oledWriteCmd(0xAF);
}
//OLED清屏函数
void olceClean()
{
int i,j;
for(i=0;i<8;i++){
oledWriteCmd(0xB0 + i); //选择PAGE
//选择PAGE的第0列开始显示
oledWriteCmd(0x00);
oledWriteCmd(0x10);
for(j = 0;j < 128; j++){
oledWriteData(0); //写入字符0
}
}
}
//OLED显示一个字符
void oledShowByte(char rows,char columns,char oledByte)
{
unsigned int i;
//显示字符的上半部分
oledWriteCmd(0xb0+(rows*2-2)); //选择行
//选择列
oledWriteCmd(0x00+(columns&0x0f));
oledWriteCmd(0x10+(columns>>4));
//显示数据
for(i=((oledByte-32)*16);i<((oledByte-32)*16+8);i++){
oledWriteData(oledFont[i]);
}
//显示字符的上半部分
oledWriteCmd(0xb0+(rows*2-1)); //选择行
//选择列
oledWriteCmd(0x00+(columns&0x0f));
oledWriteCmd(0x10+(columns>>4));
//显示数据
for(i=((oledByte-32)*16+8);i<((oledByte-32)*16+8+8);i++){
oledWriteData(oledFont[i]);
}
}
//OLED显示一个字符串
void oledShowString(char rows,char columns,char *str)
{
while(*str != '\0'){
oledShowByte(rows,columns,*str);
str++;
columns += 8;
}
}
//car
//两个电机反转,前进
void goForward()
{
left_con1A = 1;
left_con2A = 0;
right_con1A = 1;
right_con2A = 0;
}
//两个电机正转,后退
void goBack()
{
left_con1A = 0;
left_con2A = 1;
right_con1A = 0;
right_con2A = 1;
}
//两个电机不转,停止
void goStop()
{
left_con1A = 0;
left_con2A = 0;
right_con1A = 0;
right_con2A = 0;
}
//左电机不转,右电机反转,左转
void goLeft()
{
left_con1A = 0;
left_con2A = 0;
right_con1A = 1;
right_con2A = 0;
}
//左电机反转,右电机不转,右转
void goRight()
{
left_con1A = 1;
left_con2A = 0;
right_con1A = 0;
right_con2A = 0;
}
//循迹模式
void tracingMode()
{
if(tracingLeft == 0 && tracingRight == 0){
goForward();
}
if(tracingLeft == 0 && tracingRight == 1){
goRight();
}
if(tracingLeft == 1 && tracingRight == 0){
goLeft();
}
if(tracingLeft == 1 && tracingRight == 1){
goStop();
}
}
//跟随模式
void followMode()
{
if(followLeft == 0 && followRight == 0){ //
goForward();
}
if(followLeft == 0 && followRight == 1){
goRight();
}
if(followLeft == 1 && followRight == 0){
goLeft();
}
if(followLeft == 1 && followRight == 1){
goStop();
}
}
//避障模式
void avoidMode()
{
sg90Middle();
Delay300ms();
middleDistance = getDistance();
if(middleDistance > 35){
goForward();
}else{
goStop();
sg90Left();
Delay300ms();
leftDistance = getDistance();
sg90Middle();
Delay300ms();
sg90Right();
Delay300ms();
rightDistance = getDistance();
if(leftDistance < 15 && rightDistance < 15){
goBack();
Delay500ms();
goStop();
}else{
if(leftDistance > rightDistance){
goLeft();
Delay500ms();
goStop();
}
if(rightDistance > leftDistance){
goRight();
Delay500ms();
goStop();
}
}
}
}
void main()
{
int mark = 0;
timer0Init();
timer1Init();
sg90Middle();
Delay500ms();
oledInit();
olceClean();
oledShowString(2,5,"haozige");
while(1){
if(A25 == 0 && A26 == 1 && A27 == 1){
if(mark != GS){
olceClean();
oledShowString(2,5,"genshuai");
}
mark = GS;
followMode();
}
if(A25 == 1 && A26 == 0 && A27 == 1){
if(mark != BZ){
olceClean();
oledShowString(2,5,"bizhang");
}
mark = BZ;
avoidMode();
}
if(A25 == 1 && A26 == 1 && A27 == 0){
if(mark != XJ){
olceClean();
oledShowString(2,5,"xunji");
}
mark = XJ;
tracingMode();
}
}
}
//定时器0的中断函数
void Time0Handler() interrupt 1
{
TH0 = 0xFE;
TL0 = 0x33;
cnt++;
//控制占空比
if(cnt < angle){
sg90 = 1;
}else{
sg90 = 0;
}
if(cnt == 40){ //每个周期为20ms
cnt = 0;
sg90 = 1;
}
}
说在前面这部分我本来是合为一篇来写的,因为目的是一样的,都是通过独立按键来控制LED闪灭本质上是起到开关的作用,即调用函数和中断函数。但是写一篇太累了,我还是决定分为两篇写,这篇是调用函数篇。在本篇中你主要看到这些东西!!!1.调用函数的方法(主要讲语法和格式)2.独立按键如何控制LED亮灭3.程序中的一些细节(软件消抖等)1.调用函数的方法思路还是比较清晰地,就是通过按下按键来控制LED闪灭,即每按下一次,LED取反一次。重要的是,把按键与LED联系在一起。我打算用K1来作为开关,看了一下开发板原理图,K1连接的是单片机的P31口,当按下K1时,P31是与GND相连的,也就是说,当我按下去时
本人是音乐爱好者,从小就特别喜欢那个随着音乐跳动的方框效果,就是这个:arduino上一大把对,我忍你很久了,我就想用mpy做,全网没有,行我自己研究。果然兴趣是最好的老师,我之前有篇博客专门讲音频,有兴趣的可以回顾一下。提到可视化频谱,必然绕不开fft,大学学过这玩意,当时一心玩,老师讲的一个字都么听进去,网上教程简略扫了一下,大该就是把时域转频域的工具,我大mpy居然没有fft函数,奶奶的,先放着。音频信息如何收集?第一种傻瓜式的ADC,模拟转数字,原始粗暴,第二种,I2S库,我之前博客有讲过,数据是PCM编码。然后又去学PCM编码,一学豁然开朗,舒服,以代码为例:audio_in=I2S
目录SPI总线SPI总线概述 SPI总线分类SPI优点及缺点SPI接口硬件原理SPI四种工作模式 74HC595应用74HC595芯片概述74HC595封装及管脚功能74HC595工作原理 编辑 74HC595串行转并行点亮LED灯 程序实现 Proteus运行结构示意图SPI总线SPI总线概述 SPI(SerialPeripheralinterface):串行外围设备接口 用途:用来在微控制器与外围设备芯片之间实现数据交换 特点:高速、全双工、同步 SPI总线分类四线制全双工SPI(同时收发)MISO 主机输入/从机输出MOSI 主机输出/从机输入SCLK 串行时钟CS或
文章目录1简介2绪论2.1课题背景与目的3系统设计详细设计描述3.2硬件部分温度测量电路其他电路部分3.3软件部分主程序子系统程序温湿度程序流程键盘显示子程序3.4实现效果3.5部分相关代码4最后1简介Hi,大家好,这里是丹成学长,今天向大家介绍一个单片机项目基于单片机的智能温控农业大棚系统大家可用于课程设计或毕业设计单片机-嵌入式毕设选题大全及项目分享:https://blog.csdn.net/m0_71572576/article/details/1254090522绪论2.1课题背景与目的近年来我国的温室控制取得了长足的进步,首先在温室群控制方面,进行了初步的探索和理论研究,其次在温室
一、概述在之前的一篇博文中,记录了AT24C01、AT24C02芯片的读写驱动,先将之前的相关文章include一下:1.IIC驱动:4位数码管显示模块TM1637芯片C语言驱动程序2.AT24C01/AT24C02读写:AT24C01/AT24C02系列EEPROM芯片单片机读写驱动程序本文记录分享AT24C04、AT24C08、AT24C16芯片的单片机C语言读写驱动程序。二、芯片对比介绍型号容量bit容量byte页数字节/页器件寻址位可寻址器件数WordAddress位数/字节数备注AT24C044k5123216A2A149/1WordAddress使用P0位AT24C088k1024
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录一、设计原理1.DS1302介绍2.闹钟音乐播放原理二、程序设计1.DS1302.h2.ds1302.c3.music.h4.main.c三、电路图四、运行结果1.proteus仿真2.开发板实验五、总结六、附件提示:以下是本篇文章正文内容,下面案例可供参考一、设计原理1.DS1302介绍DS1302是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.0V~5.5V。该芯片采用普通32.768kHz晶振,DS1302工作时功耗很
目录一、原理部分1、什么是串行通信(1)并行通信与串行通信(2)串行通信的制式(3)串行通信的主要方式 2、配置串口(1)SCON和PCON:串行口1的控制寄存器(2)SBUF:串行口数据缓冲寄存器 (3)AUXR:辅助寄存器编辑(4)ES、PS:与串行口1中断相关的寄存器(5)波特率设置 3、串口框架编写二、程序案例一、原理部分1、什么是串行通信(1)并行通信与串行通信微控制器与外部设备的数据通信,根据连线结构和传送方式的不同,可以分为两种:并行通信和串行通信。并行通信:数据的各位同时发送与接收,每个数据位使用一条导线,这种方式传输快,但是需要多条导线进行信号传输。串行通信:数据一位一
1、单片机控制液晶显示模块1602LCD的显示。液晶显示器(LiquidCrystalDisplay,LCD)具有省电、体积小、抗干扰能力强等优点,LCD显示器分为字段型、字符型和点阵图形型。(1)字段型。以长条状组成字符显示,主要用于数字显示,也可用于显示西文字母或某些字符,广泛用于电子表、计算器、数字仪表中。(2)字符型。专门用于显示字母、数字、符号等。一个字符由5、7或5、10的点阵组成,在单片机系统中已广泛使用(3)点阵图形型。广泛用于图形显示,如笔记本电脑、彩色电视和游戏机等。它是在平板上排列的多行列的矩阵式的晶格点,点大小与多少决定了显示的清晰度。引脚包括8条数据线、3条控制线和3
在日常的生活和工作中,住宅与部门的安全防范、单位的文件档案、财务报表以及一些个人资料的保存多以加锁的办法来解决。若使用传统的机械式钥匙开锁,人们常需携带多把钥匙, 使用极不方便, 且钥匙丢失后安全性即大打折扣。在安全技术防范领域,具有防盗报警功能的电子密码锁逐渐代替了传统的机械式密码锁,电子密码锁具有安全性高、成本低、功耗低、易操作等优点。本文主要介绍运用51单片机设计数字密码锁的方法。本设计采用自上而下的数字系统设计方法,将数字密码锁系统分解为若干子系统,并且进一步细划为若干模块,然后用C语言来设计这些模块,通过KEIL软件编译,并且进行实机调试。调试结果表明:该数字密码锁能够效验4位十进制
第一次发博客,以及第一次坐智能小车,可能有很多瑕疵和不足。一、项目时间:2022.11.19~11.22二、实现效果:小车进行循迹行驶三、使用模块:STM32F103RCT6核心板*1L298N电机驱动模块*2TCRT5000L五路红外循迹传感器模块*1DC3V-6V黄色直流减速电机-TT*4锂电池组电源12V*2OLED屏幕-四针*1LM2596降压模块(新款DC-DC可调稳压电源模块)*1DC-DC12V装3.3v5v12v电源模块 四、基础使用方式:OLED显示循迹模块反馈状态【例如:10001】电机驱动1【采用左右轮倒转实现拐弯】电机驱动2【1块控制左轮,一块控制右轮】循迹模式【转角力