『壹』 誰有51單片機霍爾感測器測速程序要完整的能用的,C語言寫的謝謝大蝦還有就是下面計數器二進制轉換成十
這個很簡單 TL1放的是計數器初值的低8位,TH1放的是高8位,所以把這兩個要組合成一個數那就需要把高8位的左移8次扒宏,然後加上低8位的就是計數器初值了,至於你說的2進制轉10進制,其實不用轉的毀豎,在內存當中的值是一樣的,只是代碼的表示纖此大方式不一樣而已。
『貳』 51單片機,利用0和1兩個數字組成16種模式,並用四個開關控制數碼顯示一位密碼求程序設計
以下是使用51單片機(如STC89C52)和4個開關來控敏搭槐制數碼管顯示一位密碼的簡單示例代碼。假設使用的是共陰數碼管,並且數碼管的引腳連接到了單片機的P0口。
#include <reg52.h> // 引入單片機寄存器定義頭文件// 數碼管顯示的密碼模式,共16種,每種模式使用4位二進製表示unsigned char password[16] = { 0x3F, // 0b00111111, 模式0
0x06, // 0b00000110, 模式1
0x5B, // 0b01011011, 模式2
0x4F, // 0b01001111, 模式3
0x66, // 0b01100110, 模式4
0x6D, // 0b01101101, 模式5
0x7D, // 0b01111101, 模式6
0x07, // 0b00000111, 模橋友式7
0x7F, // 0b01111111, 模式8
0x6F, // 0b01101111, 模式9
0x77, // 0b01110111, 模式10
0x7C, // 0b01111100, 模式11
0x39, // 0b00111001, 模式12
0x5E, // 0b01011110, 模式13
0x79, // 0b01111001, 模式14
0x71 // 0b01110001, 模式15};void main() { unsigned char i = 0; // 密碼模式的索引
while (1) { // 讀取四個枝豎開關的狀態,每個開關對應一個二進制位
unsigned char switchValue = (P1 & 0x0F); // 根據開關狀態選擇密碼模式
i = switchValue; // 設置數碼管顯示的密碼模式
P0 = password[i]; // 簡單延時
for (unsigned int j = 0; j < 1000; j++);
}
}
以上代碼通過讀取四個開關(連接到P1口的低4位)的狀態來選擇密碼模式,並將選擇的密碼模式通過P0口設置到數碼管上顯示。
『叄』 求用51單片機控制ADXL345測量角度的程序,通過ADXL345感測器,用51單片機控制,測量傾角的程序!
//***************************************
// GY-29 ADXL345 IIC測試程序
// 使用單片機STC89C51
// 晶振:11.0592M
// 顯示:LCD1602
// 編譯環境 Keil uVision2
// 參考宏晶網站24c04通信程序
// 時間:2011年3月1日
// QQ:531389319
//****************************************
#include <REG51.H>
#include <math.h> //Keil library
#include <stdio.h> //Keil library
#include <INTRINS.H>
#define uchar unsigned char
#define uint unsigned int
#define DataPort P0 //LCD1602數據埠
sbit SCL=P1^0; //IIC時鍾引腳定義
sbit SDA=P1^1; //IIC數據引腳定義
sbit LCM_RS=P2^0; //LCD1602命令埠
sbit LCM_RW=P2^1; //LCD1602命令埠
sbit LCM_EN=P2^2; //LCD1602命令埠
#define SlaveAddress 0xA6 //定義器件在IIC匯流排中的從地址,根據ALT ADDRESS地址引腳不同修改
//ALT ADDRESS引腳接地時地址為0xA6,接電源時地址為0x3A
typedef unsigned char BYTE;
typedef unsigned short WORD;
BYTE BUF[8]; //接收數據緩存區
uchar ge,shi,,qian,wan; //顯示變數
int dis_data; //變數
int data_xyz[3];
void delay(unsigned int k);
void InitLcd(); //初始化lcd1602
void Init_ADXL345(void); //初始化ADXL345
void WriteDataLCM(uchar dataW);
void WriteCommandLCM(uchar CMD,uchar Attribc);
void DisplayOneChar(uchar X,uchar Y,uchar DData);
void conversion(uint temp_data);
void Single_Write_ADXL345(uchar REG_Address,uchar REG_data); //單個寫入數據
uchar Single_Read_ADXL345(uchar REG_Address); //單個讀取內部寄存器數據
void Multiple_Read_ADXL345(); //連續的讀取內部寄存器數據
//------------------------------------
void Delay5us();
void Delay5ms();
void ADXL345_Start();
void ADXL345_Stop();
void ADXL345_SendACK(bit ack);
bit ADXL345_RecvACK();
void ADXL345_SendByte(BYTE dat);
BYTE ADXL345_RecvByte();
void ADXL345_ReadPage();
void ADXL345_WritePage();
//-----------------------------------
//*********************************************************
void conversion(uint temp_data)
{
wan=temp_data/10000+0x30 ;
temp_data=temp_data%10000; //取余運算
qian=temp_data/1000+0x30 ;
temp_data=temp_data%1000; //取余運算
=temp_data/100+0x30 ;
temp_data=temp_data%100; //取余運算
shi=temp_data/10+0x30 ;
temp_data=temp_data%10; //取余運算
ge=temp_data+0x30;
}
/*******************************/
void delay(unsigned int k)
{
unsigned int i,j;
for(i=0;i<k;i++)
{
for(j=0;j<121;j++)
{;}}
}
/*******************************/
void WaitForEnable(void)
{
DataPort=0xff;
LCM_RS=0;LCM_RW=1;_nop_();
LCM_EN=1;_nop_();_nop_();
while(DataPort&0x80);
LCM_EN=0;
}
/*******************************/
void WriteCommandLCM(uchar CMD,uchar Attribc)
{
if(Attribc)WaitForEnable();
LCM_RS=0;LCM_RW=0;_nop_();
DataPort=CMD;_nop_();
LCM_EN=1;_nop_();_nop_();LCM_EN=0;
}
/*******************************/
void WriteDataLCM(uchar dataW)
{
WaitForEnable();
LCM_RS=1;LCM_RW=0;_nop_();
DataPort=dataW;_nop_();
LCM_EN=1;_nop_();_nop_();LCM_EN=0;
}
/***********************************/
void InitLcd()
{
WriteCommandLCM(0x38,1);
WriteCommandLCM(0x08,1);
WriteCommandLCM(0x01,1);
WriteCommandLCM(0x06,1);
WriteCommandLCM(0x0c,1);
}
/***********************************/
void DisplayOneChar(uchar X,uchar Y,uchar DData)
{
Y&=1;
X&=15;
if(Y)X|=0x40;
X|=0x80;
WriteCommandLCM(X,0);
WriteDataLCM(DData);
}
/**************************************
延時5微秒(STC90C52RC@12M)
不同的工作環境,需要調整此函數,注意時鍾過快時需要修改
當改用1T的MCU時,請調整此延時函數
**************************************/
void Delay5us()
{
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
}
/**************************************
延時5毫秒(STC90C52RC@12M)
不同的工作環境,需要調整此函數
當改用1T的MCU時,請調整此延時函數
**************************************/
void Delay5ms()
{
WORD n = 560;
while (n--);
}
/**************************************
起始信號
**************************************/
void ADXL345_Start()
{
SDA = 1; //拉高數據線
SCL = 1; //拉高時鍾線
Delay5us(); //延時
SDA = 0; //產生下降沿
Delay5us(); //延時
SCL = 0; //拉低時鍾線
}
/**************************************
停止信號
**************************************/
void ADXL345_Stop()
{
SDA = 0; //拉低數據線
SCL = 1; //拉高時鍾線
Delay5us(); //延時
SDA = 1; //產生上升沿
Delay5us(); //延時
}
/**************************************
發送應答信號
入口參數:ack (0:ACK 1:NAK)
**************************************/
void ADXL345_SendACK(bit ack)
{
SDA = ack; //寫應答信號
SCL = 1; //拉高時鍾線
Delay5us(); //延時
SCL = 0; //拉低時鍾線
Delay5us(); //延時
}
/**************************************
接收應答信號
**************************************/
bit ADXL345_RecvACK()
{
SCL = 1; //拉高時鍾線
Delay5us(); //延時
CY = SDA; //讀應答信號
SCL = 0; //拉低時鍾線
Delay5us(); //延時
return CY;
}
/**************************************
向IIC匯流排發送一個位元組數據
**************************************/
void ADXL345_SendByte(BYTE dat)
{
BYTE i;
for (i=0; i<8; i++) //8位計數器
{
dat <<= 1; //移出數據的最高位
SDA = CY; //送數據口
SCL = 1; //拉高時鍾線
Delay5us(); //延時
SCL = 0; //拉低時鍾線
Delay5us(); //延時
}
ADXL345_RecvACK();
}
/**************************************
從IIC匯流排接收一個位元組數據
**************************************/
BYTE ADXL345_RecvByte()
{
BYTE i;
BYTE dat = 0;
SDA = 1; //使能內部上拉,准備讀取數據,
for (i=0; i<8; i++) //8位計數器
{
dat <<= 1;
SCL = 1; //拉高時鍾線
Delay5us(); //延時
dat |= SDA; //讀數據
SCL = 0; //拉低時鍾線
Delay5us(); //延時
}
return dat;
}
//******單位元組寫入*******************************************
void Single_Write_ADXL345(uchar REG_Address,uchar REG_data)
{
ADXL345_Start(); //起始信號
ADXL345_SendByte(SlaveAddress); //發送設備地址+寫信號
ADXL345_SendByte(REG_Address); //內部寄存器地址,請參考中文pdf22頁
ADXL345_SendByte(REG_data); //內部寄存器數據,請參考中文pdf22頁
ADXL345_Stop(); //發送停止信號
}
//********單位元組讀取*****************************************
uchar Single_Read_ADXL345(uchar REG_Address)
{ uchar REG_data;
ADXL345_Start(); //起始信號
ADXL345_SendByte(SlaveAddress); //發送設備地址+寫信號
ADXL345_SendByte(REG_Address); //發送存儲單元地址,從0開始
ADXL345_Start(); //起始信號
ADXL345_SendByte(SlaveAddress+1); //發送設備地址+讀信號
REG_data=ADXL345_RecvByte(); //讀出寄存器數據
ADXL345_SendACK(1);
ADXL345_Stop(); //停止信號
return REG_data;
}
//*********************************************************
//
//連續讀出ADXL345內部加速度數據,地址范圍0x32~0x37
//
//*********************************************************
void Multiple_read_ADXL345(void)
{ uchar i;
ADXL345_Start(); //起始信號
ADXL345_SendByte(SlaveAddress); //發送設備地址+寫信號
ADXL345_SendByte(0x32); //發送存儲單元地址,從0x32開始
ADXL345_Start(); //起始信號
ADXL345_SendByte(SlaveAddress+1); //發送設備地址+讀信號
for (i=0; i<6; i++) //連續讀取6個地址數據,存儲中BUF
{
BUF[i] = ADXL345_RecvByte(); //BUF[0]存儲0x32地址中的數據
if (i == 5)
{
ADXL345_SendACK(1); //最後一個數據需要回NOACK
}
else
{
ADXL345_SendACK(0); //回應ACK
}
}
ADXL345_Stop(); //停止信號
Delay5ms();
}
//*****************************************************************
//初始化ADXL345,根據需要請參考pdf進行修改************************
void Init_ADXL345()
{
Single_Write_ADXL345(0x31,0x0B); //測量范圍,正負16g,13位模式
Single_Write_ADXL345(0x2C,0x08); //速率設定為12.5 參考pdf13頁
Single_Write_ADXL345(0x2D,0x08); //選擇電源模式 參考pdf24頁
Single_Write_ADXL345(0x2E,0x80); //使能 DATA_READY 中斷
Single_Write_ADXL345(0x1E,0x00); //X 偏移量 根據測試感測器的狀態寫入pdf29頁
Single_Write_ADXL345(0x1F,0x00); //Y 偏移量 根據測試感測器的狀態寫入pdf29頁
Single_Write_ADXL345(0x20,0x05); //Z 偏移量 根據測試感測器的狀態寫入pdf29頁
}
//***********************************************************************
//顯示x軸
void display_x()
{ float temp;
dis_data=(BUF[1]<<8)+BUF[0]; //合成數據
if(dis_data<0){
dis_data=-dis_data;
DisplayOneChar(2,0,'-'); //顯示正負符號位
}
else DisplayOneChar(2,0,' '); //顯示空格
temp=(float)dis_data*3.9; //計算數據和顯示,查考ADXL345快速入門第4頁
conversion(temp); //轉換出顯示需要的數據
DisplayOneChar(0,0,'X'); //第0行,第0列 顯示X
DisplayOneChar(1,0,':');
DisplayOneChar(3,0,qian);
DisplayOneChar(4,0,'.');
DisplayOneChar(5,0,);
DisplayOneChar(6,0,shi);
DisplayOneChar(7,0,'g');
}
//***********************************************************************
//顯示y軸
void display_y()
{ float temp;
dis_data=(BUF[3]<<8)+BUF[2]; //合成數據
if(dis_data<0){
dis_data=-dis_data;
DisplayOneChar(2,1,'-'); //顯示正負符號位
}
else DisplayOneChar(2,1,' '); //顯示空格
temp=(float)dis_data*3.9; //計算數據和顯示,查考ADXL345快速入門第4頁
conversion(temp); //轉換出顯示需要的數據
DisplayOneChar(0,1,'Y'); //第1行,第0列 顯示y
DisplayOneChar(1,1,':');
DisplayOneChar(3,1,qian);
DisplayOneChar(4,1,'.');
DisplayOneChar(5,1,);
DisplayOneChar(6,1,shi);
DisplayOneChar(7,1,'g');
}
//***********************************************************************
//顯示z軸
void display_z()
{ float temp;
dis_data=(BUF[5]<<8)+BUF[4]; //合成數據
if(dis_data<0){
dis_data=-dis_data;
DisplayOneChar(10,1,'-'); //顯示負符號位
}
else DisplayOneChar(10,1,' '); //顯示空格
temp=(float)dis_data*3.9; //計算數據和顯示,查考ADXL345快速入門第4頁
conversion(temp); //轉換出顯示需要的數據
/*
DisplayOneChar(10,0,'Z'); //第0行,第10列 顯示Z
DisplayOneChar(11,0,':');
DisplayOneChar(11,1,qian);
DisplayOneChar(12,1,'.');
DisplayOneChar(13,1,);
DisplayOneChar(14,1,shi);
DisplayOneChar(15,1,'g');
*/
}
//*********************************************************
//******主程序********
//*********************************************************
void main()
{
uchar devid;
float Roll,Pitch,Q,T,K;
delay(500); //上電延時
InitLcd(); //液晶初始化ADXL345
Init_ADXL345(); //初始化ADXL345
devid=Single_Read_ADXL345(0X00);//讀出的數據為0XE5,表示正確
while(1) //循環
{
Init_ADXL345(); //初始化ADXL345
Multiple_Read_ADXL345(); //連續讀出數據,存儲在BUF中
data_xyz[0]=(BUF[1]<<8)+BUF[0]; //合成數據
data_xyz[1]=(BUF[3]<<8)+BUF[2]; //合成數據
data_xyz[2]=(BUF[5]<<8)+BUF[4]; //合成數據
//分別是加速度X,Y,Z的原始數據,10位的
Q=(float)data_xyz[0]*3.9;
T=(float)data_xyz[1]*3.9;
K=(float)data_xyz[2]*3.9;
Q=-Q;
Roll=(float)(((atan2(K,Q)*180)/3.14159265)+180); //X軸角度值
Pitch=(float)(((atan2(K,T)*180)/3.14159265)+180); //Y軸角度值
conversion(Roll); //轉換出顯示需要的數據X軸,或者Y軸
DisplayOneChar(9,1,'A');
DisplayOneChar(10,1,':');
DisplayOneChar(11,1,);
DisplayOneChar(12,1,shi);
DisplayOneChar(13,1,ge);
delay(200); //延時
}
}
『肆』 拉線位移感測器原理及信號輸出方式介紹
隨著科學技術的的不斷進步,人們的生活發生了很大的變化,大家的住房比以前更高了並且更加的牢固了,還有路也修的四通八達,現在人們想去都特別方便了,有汽車、火車、高鐵、飛機等等,很多種交通工具可以供大家選擇。可以說,人們的生活發生了翻天覆地的變化。那麼,大家知不知道這些建築機械上面的直線導軌系統的組成呢?大家了解拉線位移感測器嗎?下面小編給大家介紹一下吧。
備指
拉線位移感測器輸出方式
拉線位移感測器的信號輸出方式分為數字信號輸出和模擬信號輸出,數字輸出型可以選擇增量旋轉編碼器、絕對值編碼器等,輸出信號為方波ABZ信號或格雷碼信號,行程最大可以做到15000毫米,線性精度最大0.01%,分辨力根據配置不同最大可以達到0.001毫米/脈沖。
拉線位移感測器模擬輸出型可以選擇精密電位器、霍爾編碼器、絕對值編碼器等,輸出信號可以為RS485,dp匯流排,4-20毫安、0-5伏、0-10伏、串列SSI和電阻信號等,最大行程可以達到15000毫米。BEN絕對值拉線位移感測器輸出信號:SSI、4-20MA、profibus-dp、DEVicenet、並行、二進制碼、BiSS、ISI、CANopen、Endat及Hiperface等。
拉線位移感測器原理
拉線位移感測器的功能是把機械運動轉換成可以計量,記錄或傳送的電信號。拉線位移感測器由可拉伸的不銹鋼繩繞在一個有螺紋的輪轂上,此輪轂與一個精密旋轉感應器連接在一起,感應器可以是增量編碼器,絕對(獨立)編碼器,混合或導電塑料旋轉電位計,同步器或解析器。
操作上,拉繩式位移感測器安裝在固定位置上,拉繩縛在移動物體上。拉繩直線運動和移動物體運動軸線對准。運動發生時,拉繩伸展和收縮。一個內部彈簧保證拉繩的張緊度不變。帶螺紋的輪轂帶動精密旋轉感應器旋轉,輸出一個與拉繩移動距離成比例的電信號。測量輸出信號可以得出運動物體的位移、方向或速率。
常用參數有測量行程、輸出信號模式、線性度、重復性、解析度、線徑規格、出線口拉力、最大往返速度、重量、輸入電阻值、功率、工作電壓、工作溫度、震動、防護等級等。
拉線位移感測器的應用
拉線位移感測器特別適合直線導軌系統,液壓氣缸系統、仿告配試驗機、伸縮系統(叉車、壓機、升降機、彎管機、折彎機等),起重機或纜繩絞車,水庫大壩保護系統,閘門開度控制系統、試驗機壓力機械、液壓萬能實驗機械,倉儲位置定位,壓力機械,造紙機械,紡織機械,金屬板材機械,包裝機械,印刷機械,水平控制儀,建築機械,水平控制儀、建築機械、工業機器人、射出機、木工機械、電梯、空氣壓縮機/油壓機、高度機、X-Y軸及其它長度位移等相關尺寸測量和位置控制,特別適合電液伺服液壓萬能試驗機的控制。完全可以替代光柵尺,其它應用場合可以定製,完全可以實現低成本的高精度測量。
通過小編給大家詳細的介紹,相信大家應該對拉線位移感測器有了一定的了解。拉線位移感測器是一款安裝尺寸小、結構緊湊、測量行程大、精度高的感測器,主要運用於一些大型建築機械等等。所以拉線位移感測器對於我們的日常生活還是有很大的作用的,拉線位移感測器使我們的生活更加的方友橘便,也為我們的出行提高了安全。當然,拉線位移感測器還有很多的功能,這需要大家進一步去了解。
土巴兔在線免費為大家提供「各家裝修報價、1-4家本地裝修公司、3套裝修設計方案」,還有裝修避坑攻略!點擊此鏈接:【https://www.to8to.com/yezhu/zxbj-cszy.php?to8to_from=seo__m_jiare&wb】,就能免費領取哦~
『伍』 51單片機,用匯編語言編寫程序,10秒內對外部脈沖進行計數,並數出外部脈沖頻率。求高手編寫程序。
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP T0ISR
ORG 0030H
MAIN:
MOV TMOD,#51H
MOV TH0,#HIGH(65536-50000)
MOV TL0,#LOW(65536-50000)
MOV TH1,#0
MOV TL1,#0
SETB TR0
SETB TR1
SETB ET0
SETB EA
CLR A
MOV R2,#0
LOOP:
SJMP $
T0ISR:
CLR TR0
MOV TH0,#HIGH(65536-50000)
MOV TL0,#LOW(65536-50000)
SETB TR0
INC A
CJNE A,#20,T0E
MOV A,#0
INC R2
CJNE R2,#10,T0E
MOV R2,#0
MOV R1,TH1
MOV R0,TL1
MOV B,#10
LCALL DIV16
MOV P1,R0
T0E:
RETI
;R1:R0/B=R1:R0
DIV16:
MOV R7,#08H
MOV B,#6
DIV1:
CLR C
MOV A,R0
RLC A
MOV R0,A
MOV A,R1
RLC A
MOV R1,A
CLR C
SUBB A,B
JC DIV2
MOV R1,A
INC R7
DIV2:
DJNZ R7,DIV1
RET
END
『陸』 拉線位移感測器產生電壓信號,用STC12C5A60S2單片機讀取信號,然後將位移值保存,怎樣用c編程啊
XPS系列拉繩位移感測器,結構小巧,安裝空間尺寸小。測量行程長(100~100000mm),精度高(0.25~0.1%FS),防護等級IP65。外殼和線輪均經過防腐處理,牽引繩為不銹鋼外敷特氟龍,可以在惡劣的環境下工作。可選輸出方式有:電阻型、電壓型、電流型、增量脈沖型、絕對脈沖型、RS485、SSI(可實現雙路輸出)。
拉繩位移感測器
星宇「evernew」XPS系列拉繩位移感測器/編碼器是直線位移感測器在結構上的精巧集成,充分結合了角度感測器和直線位移感測器的優點,成為一款結構緊湊、測量行程長、安裝空間尺寸小、具有高精度測量的優良感測器,為解決最常見的卡線問題,本產品在結構設計上匠心獨具的精巧設計以及採用全套數控精密加工的完美設計及加工工藝,真正解決的拉繩感測器長久以來的卡線問題,該系列產品具有很大的選擇空間,行程從100mm至100000mm不等,具有模擬電流、電壓和脈沖A、B、Z相,RS485,SSI等數字輸出,滿足大行程.高精度各種信號需求,為廣大客戶所採用。
星宇「evernew」系列產品鄭重承諾,自購買之日起十五日內,如確認產品不能達到雙方約定的標准,無法正常工作,我公司承諾全額退款
應用范圍:
倉儲位置定位、水庫大壩保護,閘門開度控制、壓力機械、造紙機械、紡織機械、金屬板材機械、包裝機械、印刷機械、水平控制儀、建築機械、工業機器人、射出機、木工機械、電梯、空氣壓縮機/油壓機、高度機、X-Y軸及其它長度位移、液位等相關尺寸量測和位置控制。
相關產品廠家推薦 上海星宇高科 xyzsensor.cn
『柒』 位移感測器位移變化時的產生的電壓信號經A/D轉換成數字信號傳入單片機然後通過LCD顯示出位移數據的程序
#include <reg52.h>
#include <absacc.h>
#define uchar unsigned char
#define uint unsigned int
#define WX XBYTE[0x38ff]
#define DX XBYTE [0x58ff]
#define AD_IN1 XBYTE [0x78ff]
sbit EOC=P3^3;
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar m;
void delay(uint n)
{
uint i,j;
for(i=0;i<n;i++)
for(j=0;j<110;j++);
}
void display(uint numn)
{
uchar ge,shi,;
ge=numn%10;
shi=numn%100/10;
=numn/100;
WX=0x20;
DX=table[];
delay(5);
WX=0x10;
DX=table[shi];
delay(5);
WX=0x08;
DX=table[ge];
delay(5);
}
void main()
{
EA=1;
EX1=1;
IT1=0;
AD_IN1=0;
while(1)
{
display(m);
}
}
void ads() interrupt 2
{
m=AD_IN1;
AD_IN1=0;
}
數碼滾世鄭管現實大頌位移數字信號。 如果精度不夠,你可以自己調返缺整。
多多交流。
『捌』 基於51單片機轉速測量的程序,望高手幫我解釋一下。
#include <reg51.h>
#include <INTRINS.H>
#define FOSC 11.0592
unsigned int speed;
unsigned char key;
unsigned char led_table[10]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xff,0xf6};
long speed_count,speed_count1;
unsigned char speed_check;
unsigned int second_flag;
unsigned char speed_table[4];
unsigned char speed_table1[10];
//定時器頻率1000Hz
void timer1_init(void)
{
EA=0;
TMOD=0x10;
//TH1=1000*FOSC/12/256;
//TL1=(unsigned int)(1000*FOSC/12)%256;
TH1=254;
TL1=51;
TR1=1;
TCON|=0X04; //外部中斷下降觸發
EX1=1; //允許外部中斷
ET1=1;
EA=1;
}
void int1_routine(void) interrupt 2
{
speed_count++;
P1^=0X02;
}
void timer1_routine(void) interrupt 3
//void timer1_routine(void)
{
TH1=254;
//TH1=0xf0;
TL1=51;
//speed_count++;
second_flag++;
}
void main(void)
{
unsigned int i,j,k;
// unsigned char sum;
unsigned speed_table[3];
long time_id;
timer1_init();
speed=0;
P2=0x0f;
P0=0xf0;
P3=0x08;
key=0;
P1=0x00;
speed_check=0;
while(1)
{
//P1^=0XFE;
j=1;
//speed=1234;
speed_table[0]=speed/1000;
speed_table[1]=speed%1000/100;
speed_table[2]=speed%100/10;
speed_table[3]=speed%10;
for(i=0;i<4;i++)
{
P2=j^0xff;
j<<=1;
P0=(led_table[speed_table[i]])&0xfe;
for(k=0;k<250;k++) ;
}
//speed=speed_count;
if(second_flag>=1000) /*中斷1000次進入 */
{
second_flag=0;
time_id++;
speed_table1[time_id%10]=speed_count;/*外部中斷量轉存(是很聰明的方法學習了)*/
speed_count=0;
speed=(speed_table1[0]+speed_table1[1]+speed_table1[2]+speed_table1[3]+speed_table1[4]+speed_table1[5]+speed_table1[6]+speed_table1[7]+speed_table1[8]+speed_table1[9])*6; /*(10X6)10秒的外部中斷量乘以6就是轉速了*/
//speed=speed/2+(speed_table[0]+speed_table[1]+speed_table[2])*6;
}
}
}
『玖』 拉線位移感測器信號如何處理才能與單片機相連
濾波,濾除干擾信號,根據感測器的輸出的范圍,如果輸出太小,要經過放大處理,再與單片機的adc相連。
『拾』 求用51單片機控制同時控制兩個4相小功率步進電機,使電機正反轉,加速,減速的匯編程序。。跪求
實驗源程序碰態
P55A equ 288h ;8255A口輸出
P55C equ 28ah ;8255C口輸入
P55CTRL equ 28bh ;8255控制口
DATA SEGMENT
BUF db 0
MES DB 'K0-K6 ARE SPEED CONTROL',0AH,0DH
DB '老吵吵K6 IS THE LOWEST SPEED',0AH,0DH
DB 'K0 IS THE LOWEST SPEED',0AH,0DH
DB '侍侍K7 IS THE DIRECTION CONTROL',0AH,0DH
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,CS
MOV DS,AX
MOV AX,DATA
MOV DS,AX
MOV DX,OFFSET MES
MOV AH,09H
INT 21H
MOV DX,P55CTRL
MOV AL,8BH
OUT DX,AL ;8255C輸入,A輸出
MOV BUF,33H
OUT1:
MOV AL,BUF
MOV DX,P55A
OUT DX,AL
MOV AH,1
INT 16H
JE IN1 ;有無鍵按下
MOV AH,4CH
INT 21H
IN1:
MOV DX,P55C
IN AL,DX ;讀開關狀態
TEST AL,01H
JNZ K0
TEST AL,02H
JNZ K1
TEST AL,04H
JNZ K2
TEST AL,08H
JNZ K3
TEST AL,10H
JNZ K4
TEST AL,20H
JNZ K5
TEST AL,40H
JNZ K6
STOP:
MOV DX,P55A
MOV AL,0FFH
JMP OUT1
K0:
MOV BL,10H
SAM:
TEST AL,80H ;K7是否為
JZ ZX0
JMP NX0
K1:
MOV BL,18H
JMP SAM
K2:
MOV BL,20H
JMP SAM
K3:
MOV BL,40H
JMP SAM
K4:
MOV BL,80H
JMP SAM
K5:
MOV BL,0C0H
JMP SAM
K6:
MOV BL,0FFH
JMP SAM
ZX0:
CALL DELAY
MOV AL,BUF
ROR AL,1 ;循環右移
MOV BUF,AL
JMP OUT1
NX0:
CALL DELAY
MOV AL,BUF
ROL AL,1 ;循環左移
MOV BUF,AL
JMP OUT1
DELAY PROC NEAR
DELAY1:
MOV CX,05A4H
DELAY2:
LOOP DELAY2
DEC BL
JNZ DELAY1
RET
DELAY ENDP
CODE ENDS
END START