首页 > 其他分享 >27 基于51单片机的方向盘模拟系统

27 基于51单片机的方向盘模拟系统

时间:2024-12-04 15:31:01浏览次数:6  
标签:27 CLK 51 阻值 beep 单片机 LCD P1 sbit

目录

一、主要功能

二、硬件资源

三、程序编程

四、实现现象


一、主要功能

基于STC89C52单片机,采用两个MPX4115压力传感器作为两路压力到位开关电路,
采用滑动变阻器连接数模转换器模拟重力加速度传感器电路;
一个按键控制LED灯的点亮与熄灭;两路压力值与加速度值通过LCD1602显示屏显示;
如果加速度的值3秒内没没有变化,或者两个压力传感器的差值大于50
(这里设置差值小于50表示双手同时抓住方向盘的到位开关了,如果大于50,则不是同时抓住,
因为仿真里没法同时按两个东西,所以采取差值替代。)
则蜂鸣器报价,且继电器断开,继电器控制的电机停止转动。
反之,不报警,继电器控制电机继续转动。

二、硬件资源

基于KEIL5编写C++代码,PROTEUS8.15进行仿真,全部资源在页尾,提供安装包。

编辑

三、程序编程

#include <REGX52.H>#include <intrins.h>#include <stdio.h>#include "Delay.h"#include "LCD1602.h"#define uchar unsigned char#define uint unsigned  intsbit beep = P2^5;			  //蜂鸣器引脚sbit CS=P1^0;                 //adc0832引脚sbit CLK=P1^1;
sbit DIO=P1^2;
sbit CS1=P1^3;                 //adc0832引脚sbit CLK1=P1^4;
sbit DIO1=P1^5;
sbit CS2   =  P1^6;        //ADC0832引脚定义sbit CLK2  =  P1^7;
sbit DIO2  =  P2^6;
sbit motor =  P2^7;
sbit key = P3^1;
sbit led = P3^0;
sbit key1 = P3^2;static int timerCount;typedef unsigned char u8;typedef unsigned int  u16;static uchar u,U,R ,u1,U1,R1,u2,U2,R2,lastResistance;      //定义变量static int number;static int resistanceChanged;static int flag = 0;void beep\_warning();void Time0\_Init()          //定时器初始化{
    TMOD = 0x01;    // 定时器0工作在模式1
    TH0 = 0xfa >> 8;
    TL0 = 0xfa & 0xFF;
    ET0 = 1;        // 开启定时器0中断
    TR0 = 1;        // 启动定时器0
    EA =0;
}void Time0_Int() interrupt 1 //中断程序{    static unsigned int timerCount = 0;
    TH0 = 0xfa >> 8;
    TL0 = 0xfa & 0xFF;
    timerCount++;    // 每隔三秒检查阻值是否发生变化
    if (timerCount >= 27)
    {
        timerCount = 0;             
		
        // 比较当前阻值与上一次的阻值是否相同
        if (R != lastResistance)
        {            // 阻值发生了变化
            resistanceChanged = 0;
        }        else
        {
            resistanceChanged = 1;
        }        // 更新上一次的阻值
        lastResistance = R;
    }
}uchar get\_AD\_Res()            //ADC0832启动读取函数 {
	uchar i, data1=0, data2=0;
	CS=0;
	
	CLK=0;DIO=1;\_nop\_();
	CLK=1;\_nop\_();
	
	CLK=0;DIO=1;\_nop\_(); 
	CLK=1;\_nop\_();
	
	CLK=0;DIO=0;\_nop\_();
	CLK=1;\_nop\_();
	
	CLK=0;DIO=1;\_nop\_(); 
	
	for(i=0; i<8; i++)
	{
		CLK=1;\_nop\_();
		CLK=0;\_nop\_();
		data1=(data1<<1)|(uchar)DIO; 
	}	
	for(i=0; i<8; i++)
	{
		data2=data2|(uchar)DIO<<i;
		CLK=1;\_nop\_();
		CLK=0;\_nop\_();
	}
	CS=1;	
	return(data1 == data2)?data1:0;
}uchar get\_AD\_Res1()            //ADC0832启动读取函数 {
	uchar i, data1=0, data2=0;
	CS1=0;
	
	CLK1=0;DIO1=1;\_nop\_();
	CLK1=1;\_nop\_();
	
	CLK1=0;DIO1=1;\_nop\_(); 
	CLK1=1;\_nop\_();
	
	CLK1=0;DIO1=0;\_nop\_();
	CLK1=1;\_nop\_();
	
	CLK1=0;DIO1=1;\_nop\_(); 
	
	for(i=0; i<8; i++)
	{
		CLK1=1;\_nop\_();
		CLK1=0;\_nop\_();
		data1=(data1<<1)|(uchar)DIO1; 
	}	
	for(i=0; i<8; i++)
	{
		data2=data2|(uchar)DIO1<<i;
		CLK1=1;\_nop\_();
		CLK1=0;\_nop\_();
	}
	CS1=1;	
	return(data1 == data2)?data1:0;
}uchar get\_AD\_Res2()            //ADC0832启动读取函数 {
	uchar i, data1=0, data2=0;
	CS2=0;
	
	CLK2=0;DIO2=1;\_nop\_();
	CLK2=1;\_nop\_();
	
	CLK2=0;DIO2=1;\_nop\_(); 
	CLK2=1;\_nop\_();
	
	CLK2=0;DIO2=0;\_nop\_();
	CLK2=1;\_nop\_();
	
	CLK2=0;DIO2=1;\_nop\_(); 
	
	for(i=0; i<8; i++)
	{
		CLK2=1;\_nop\_();
		CLK2=0;\_nop\_();
		data1=(data1<<1)|(uchar)DIO2; 
	}	
	for(i=0; i<8; i++)
	{
		data2=data2|(uchar)DIO2<<i;
		CLK2=1;\_nop\_();
		CLK2=0;\_nop\_();
	}
	CS2=1;	
	return(data1 == data2)?data1:0;
}void beep_warning() //报警并且电机转动{
 number = R1-R2;	if(number<=0)
	{
		number = ~(number-1);
	}	if(flag==0)
	{
		EA = 0;	if(number>50)
	{
		beep = 1; //报警
		motor = 1;//断开继电器
	}	else
	{
		beep = 0;
		motor = 0;
	}
 }	
	if(flag==1)
	{	if(resistanceChanged==1)
	{
		beep = 1; //报警
		motor = 1;//断开继电器
	}	else
	{
		beep = 0; 
		motor = 0;
	}
 }	LCD_ShowNum(2,10,resistanceChanged,3);
}void main()					  //主函数{	
	beep=0;			    //蜂鸣器关掉
	motor=0;         //启动继电器
	led = 0;	LCD_Init();         //显示屏初始化
	Time0\_Init();	LCD\_ShowString(1,1,"zuo:");	LCD\_ShowString(1,10,"you:");	LCD\_ShowString(2,1,"Vt:");	while(1)
	{
		u=get\_AD\_Res();
		U=(250*u)/128;     //此处将数字信号转化为模拟信号,要根据上拉电阻阻值来确定
		R=200*U/250;	    //重力
	
	  u1=get\_AD\_Res1();
		U1=(250*u1)/128;     //此处将数字信号转化为模拟信号,要根据上拉电阻阻值来确定
		R1=200*U1/250;	   //压力右
		
		u2=get\_AD\_Res2();
		U2=(250*u2)/128;     //此处将数字信号转化为模拟信号,要根据上拉电阻阻值来确定
		R2=200*U2/250;	   //压力左
	
	
	  LCD_ShowNum(1,5,R2,3); //第一行显示左压力
		LCD_ShowNum(1,14,R1,3); //第一行显示右压力
		LCD_ShowNum(2,4,R,3);  //第二行显示重力加速度
	  beep_warning(); //压力与重力处理报警函数
		
		if(!key)
		{
			led=~led;			while(!key);
		}		
		if(~key1)
		{
			EA=1;
			flag++;
			{				if(flag>1)
				{
					flag = 0;
				}
			}			while(~key1);
		}
	}
}

四、实现现象

具体动态效果看B站演示视频:

B站演示视频

基于51单片机的方向盘模拟系统

全部资料(源程序、仿真文件、安装包、演示视频):

百度网盘分享

标签:27,CLK,51,阻值,beep,单片机,LCD,P1,sbit
From: https://blog.csdn.net/zcb849644371/article/details/144127399

相关文章

  • 28 基于51单片机的两路电压检测(ADC0808)
    目录一、主要功能二、硬件资源三、程序编程四、实现现象一、主要功能基于51单片机,通过ADC0808获取两路电压,通过LCD1602显示二、硬件资源基于KEIL5编写C++代码,PROTEUS8.15进行仿真,全部资源在页尾,提供安装包。编辑三、程序编程#include <REGX52.H>#include "int......
  • 27 基于51单片机的方向盘模拟系统
    目录一、主要功能二、硬件资源三、程序编程四、实现现象一、主要功能基于STC89C52单片机,采用两个MPX4115压力传感器作为两路压力到位开关电路,采用滑动变阻器连接数模转换器模拟重力加速度传感器电路;一个按键控制LED灯的点亮与熄灭;两路压力值与加速度值通过LCD1602......
  • 用rman备份数据库时,报错:ORA-27037: unable to obtain file status,检查过期归档日志
    现象:在测试机上测试备份集的可用性的时候,我用rman恢复了一个数据库,是不完全恢复,也就是用一个0级备份,恢复数据文件,用一个归档日志文件备份恢复控制文件和归档日志文件,再recoverdatabase,然后再用resetlogs方式open数据库。此时,我将测试数据库当作一个生产库做实验,应该给数据库......
  • 【054B】基于51单片机电子指南针(LCD12864)【Keil程序+报告+原理图】
    ☆、设计硬件组成:51单片机最小系统+HMC5883L罗盘传感器+LCD12864液晶显示+DS1302时钟芯片+按键设置+蜂鸣器。1、本设计采用STC89C52、AT89C52、AT89S52作为主控芯片,LCD12864实时显示信息,DS1302作为时钟来源;2、LCD12864实时显示方向角度,方位,时间,以及指针式罗盘等信息;3、......
  • 代码随想录算法训练营第三十八天|leetcode322. 零钱兑换、leetcode279.完全平方数、le
    1leetcode322.零钱兑换题目链接:322.零钱兑换-力扣(LeetCode)文章链接:代码随想录视频链接:动态规划之完全背包,装满背包最少的物品件数是多少?|LeetCode:322.零钱兑换_哔哩哔哩_bilibili思路:感觉跟之前的方法思路差不多,就是对dp初始化的时候,我开始弄错了,应该初始成无限大,对dp[0......
  • 【力扣】3274. 检查棋盘方格颜色是否相同
    一、题目给你两个字符串coordinate1和coordinate2,代表8x8国际象棋棋盘上的两个方格的坐标。以下是棋盘格的参考图:如果这两个方格颜色相同,返回true,否则返回false。坐标总是表示有效的棋盘方格。坐标的格式总是先字母(表示列),再数字(表示行)。示例:输入:coordinate1......
  • 51c自动驾驶~合集39
    我自己的原文哦~  https://blog.51cto.com/whaosoft/12707676#DiffusionDrive大幅超越所有SOTA!地平线DiffusionDrive:生成式方案或将重塑端到端格局?近年来,由于感知模型的性能持续进步,端到端自动驾驶受到了来自工业界和学术界的广泛关注,端到端自动驾驶算法直接从原始传感器......
  • 51c~TensorRT~合集1
    我自己的原文哦~  https://blog.51cto.com/whaosoft/11744302一、TensorRT-LLM~最佳部署实践TensorRT-LLM(LargeLanguageModel)部署实践的详细介绍TRT-LLM简单再介绍TensorRT-LLM的介绍前几篇中已提到,就不过多赘述了。这里列一个TensorRT-LLM的功能和定位:trt-llm功能......
  • 51c大模型~合集82
    我自己的原文哦~  https://blog.51cto.com/whaosoft/12709440#ChatGPT两岁,OpenAI10亿用户计划曝光ChatGPT已经2岁了!OpenAI下一个目标瞄准十亿用户,预计明年放出AI智能体产品。就在生日这天,马斯克还送上了大礼:阻止OpenAI全面盈利的一份诉状书。两年过去了...ChatGPT自诞......
  • STM32单片机芯片与内部01 GPIO-通用输出与输入-架构、内部、介绍、功能
    目录一、GPIO架构1、GPIO简介2、架构(1)、二极管保护与上下拉电阻(2)P-MOS与N-MOS推挽与开漏(3)、输出数据寄存器(4)、复用功能输出(5)、输入数据寄存器(6)、复用功能输入(7)、模拟输入与输出二、GPIO工作模式1、输入模式(上拉、下拉、浮空)2、输出模式(推挽/开漏,上拉/下拉)3、复用......