欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

27 基于 51 微控制器-III 的方向盘模拟系统。

最编程 2024-10-03 19:08:27
...
#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);
		}
	}
}

推荐阅读