标题:
MMA7361角度传感器STC源程序 LCD1602显示
[打印本页]
作者:
xyzzyxping
时间:
2020-7-7 15:08
标题:
MMA7361角度传感器STC源程序 LCD1602显示
51内核 STC 单片机角度传感器源程序,有需要的朋友拿走
单片机源程序如下:
/************* MMA7361 *************
************** 三轴电压采集 三轴电压采集点 分别为P0.0 P0.1 P0.2 如遇到问题请先仔细看资料 *************
//////////////////////// /***********************************************************************
/* LCD1602
LCD1602显示 rs P3^5 rw P3^6 ep P3^7 P0口 为数据输出口
***********************************************************************///////////////////////
//************** STC12 ADC电压采集测试程序 *************/
#include "stc8.h"
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int
uchar Vo,Vx,Vy; //A/D转换后换算的电压值
int v=0,g;
int i,e,h;
sbit rw=P3^6; //1602 IO口定义 这里用的数据口是P2口
sbit rs=P3^5;
sbit ep=P3^7;
uchar code asc[] = "0123456789";
unsigned char code d[] = {"MMA7361 X: . V"};
unsigned char code b[]= {"Y: . V Z: . V"};
/**************************** 延时函数 ***********************************/
void delay(unsigned int a)
{
while(a--);
}
/*----------------------------
Get ADC result
----------------------------*/
uchar GetADCResult(uchar ch)
{
ADC_CONTR = ADC_POWER | ADC_START | ch ;//0x00|0x00|ch|0x08:选择A/D输入通道,开始A/D转换
// 这么用语句的主要原因就是不能位寻址
// 通道选择在后3位所以直接用一个整数表示ch
//例如ch=6 那么对应的后三位就是110
_nop_(); //Must wait before inquiry ,
_nop_(); //设置ADC_CONTR寄存器后需加4个CPU时钟周期的延时,才能保证值被写入ADC_CONTR寄存器
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
while (!(ADC_CONTR & ADC_FLAG));//Wait complete flag
ADC_CONTR &= ~ADC_FLAG; //Close ADC 将标志位清零等待下次硬件置1
//也可以写成 ADC_CONTR= ADC_CONTR & ( ~ADC_FLAG)
Vo=ADC_RES*4.7*100/256; //Return ADC result(为显示整数,这里将电压值扩大了十倍)
return Vo;
// return ADC_RES;
}
/*************************************************************************************/
/*************************************************************************************/
/***************************** 1602 *******************************************/
bit lcd_busy() //查忙 这部很重要 否则有的显示容易出现乱码
{
bit result;
rs = 0;
rw = 1;
ep = 1;
delay(50);
result = (bit)(P0&0x80);
ep = 0;
return result; //返回值
}
void lcd_com(unsigned char com)// 地址
{
while(lcd_busy());
rs=0;
ep=0;
rw=0;
P0=com;
delay(50);
ep=1;
delay(50);
ep=0;
}
void lcd_date(unsigned char date)//采集输出数据
{
while(lcd_busy());
rs=1; //1是些数据 0是写指令
rw=0; // 1是读 0是写
ep=0; //E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令
P0=date;
delay(5);
ep=1;
delay(5);
ep=0;
}
void lcd_pos(unsigned char pos)
{
lcd_com(pos|0x80); //数据指针=80+地址变量
}
void init()//1602初始化
{
lcd_com(0x38);
delay(50);
lcd_com(0x38);
delay(50);
lcd_com(0x38);
delay(50);
lcd_com(0x0c);
delay(50);
lcd_com(0x06);
delay(50);
lcd_com(0x01);
}
/************************************************************************/
void main(void)
{
//三个采集通道 P10 P11 P12配置为高阻状态
P1M0=0X00;
P1M1=0X03;
TMOD=0x01; //选择定时器T0 在工作方式1上 即16位定时器
TH0=(65536-50000)/256; //11.592M晶振的一个机器周期接近1us 这里5W就是0.05s
TL0=(65536-50000)%256;
EA=1; //开启总中断
ET0=1; //开启定时器T0
TR0=1; // 启动定时器 使其开始计算
init(); //1602初始化
lcd_pos(0x00); //显示字母
i=0;
while(d[i]!='\0')
{
lcd_date(d[i]);
i++;
}
lcd_pos(0x40);
i=0;
while(b[i]!='\0')
{
lcd_date(b[i]);
i++;
}
while(1)
{
if(v==1)
{
lcd_pos(0x0B);
lcd_date(asc[Vo/100]);
lcd_pos(0x0D);
lcd_date(asc[Vo%100/10]);
lcd_date(asc[Vo%100%10]);
delay(1000);
}
if(v==2)
{
lcd_pos(0x42);
lcd_date(asc[Vo/100]);
lcd_pos(0x44);
lcd_date(asc[Vo%100/10]);
lcd_date(asc[Vo%100%10]);
delay(1000);
}
if(v==3)
{
lcd_pos(0x4b);
lcd_date(asc[Vo/100]);
lcd_pos(0x4d);
lcd_date(asc[Vo%100/10]);
lcd_date(asc[Vo%100%10]);
delay(1000);
}
}
}
void ADCt0() interrupt 1 using 0
{
TH0 = (65536-50000)/256;
TL0 = (65536-50000)%256;
e++;
if(e==6)
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有程序51hei提供下载:
MMA7361角度传感器.rar
(49.7 KB, 下载次数: 38)
2020-7-7 15:06 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
鼬先生
时间:
2021-3-28 23:32
有没有proteus的原理图啊?
作者:
shenyuqiu
时间:
2021-3-29 11:26
以前没接触过角度传感器,好资料
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1