|
300黑幣
本帖最后由 412489601 于 2016-10-24 16:45 編輯
求助修改現有程序實現:【1】啟動仿真5S后,數碼管個位和十位顯示AT89C51接收到74LS165發來的數據中高電平數量;
【2】當按鍵啟動鍵按下后,步進電機啟動(啟動后計時),直至某一時間手動改變74LS165接收端按鍵值,判斷之前的值和手動改變的值前后之間的運行時間,并且顯示在數碼管的百位和千位;
【3】當按鍵反向鍵按下后,步進電機運行5S后程序初始化;
【備注】:程序及仿真已上傳跪求大神多多指點
基本程序已上傳
#include<reg51.h>
#include<intrins.h>
/********************************************************************************************************
** Marcos define
*********************************************************************************************************/
#define uint unsigned int
#define uchar unsigned char
#define MotorTabNum 5
//IO設置
sbit QH = P3^0; //輸出端
sbit CLK74 = P3^1; //時鐘輸入端(上升沿有效)
sbit SPL = P3^2; //移位控制/置入控制(低電平有效)
//步進電機
sbit K1 = P3^5; // 啟動
sbit K2 = P3^7; // 反向
//數碼管
/*
sbit SMG1 = P2^0; //數碼管第一位定義
sbit SMG2 = P2^1; //數碼管第二位定義
sbit SMG3 = P2^2; //數碼管第三位定義
sbit SMG4 = P2^3; //數碼管第四位定義
*/
//74LS165
sbit FX = P2^4; // 方向
sbit MotorEn = P2^5; // 使能
sbit CLK = P2^6; // 脈沖
//電機狀態
unsigned char T0_NUM;
unsigned char g_MotorSt = 0; // 啟停
unsigned char g_MotorDir = 0; // 正反
//電機轉速
unsigned char MotorTab[6] = {12, 10, 8, 6, 4, 2};
//共陰極數碼管段值
//int table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};
signed char g_MotorNum = 0;
void delayms(xms);
void mDelay(unsigned int DelayTime); //延時函數
void T0_Init();
void KeyScan(void);
/********************************************************************************************************
* Function Name : read_int165
* Description : 接收數據
* Input : None
* Output : None
* Return : None
********************************************************************************************************/
uint read_int165(void)
{
uchar i = 0;
uint read_data = 0;
SPL = 0; //置數,讀入并行輸入口數據
_nop_();
SPL = 1; //移位,并口輸入被封鎖,串行轉換開始
_nop_();
for(i=0;i<16;i++) //16位數據
{
read_data <<= 1;
if(QH)
{
read_data|=QH;
}
CLK74=0; //下降沿
_nop_();
CLK74=1; //上升沿
_nop_();
}
return read_data;
}
/********************************************************************************************************
* Function Name : main
* Description : 主函數
* Input : None
* Output : None
* Return : None
********************************************************************************************************/
void main()
{
//初始化值
uint temp = 0;
uchar tempH = 0;
uchar tempL = 0;
CLK74=0;
T0_Init(); // 定時器0 初始化
MotorEn = 0;// L297 使能(只有使能,才能正常工作,否則停止)
FX = 1; //正反轉
while(1)
{
temp = read_int165();
// tempH = (uchar) (temp>>8);//獲取高8位,存放置tempH
// tempL = (uchar) temp; //獲取低8位,存放置tempL
// P0=tempH; //接收到的字節顯示在P0 端口,顯示的值與撥碼開關對應
// P1=tempL; //接收到的字節顯示在P1 端口,顯示的值與撥碼開關對應
KeyScan();//掃描按鍵
}
}
/********************************************************************************************************
* Function Name : T0_Init
* Description : 定時器初始化
* Input : None
* Output : None
* Return : None
********************************************************************************************************/
void T0_Init()
{
TMOD = 0x01;
TH0 = (65535-100)/256; // 1ms
TL0 = (65535-100)%256;
EA = 1;
ET0 = 1;
TR0 = 1;
}
/********************************************************************************************************
* Function Name : T0_time
* Description : 定時器中斷
* Input : None
* Output : None
* Return : None
********************************************************************************************************/
void T0_time() interrupt 1
{
TR0 = 0;
TH0 = (65535-100)/256;
TL0 = (65535-100)%256;
T0_NUM++;
if(T0_NUM >= MotorTab[g_MotorNum]) // 增加按鍵g_MotorNum++ 減小按鍵g_MotorNum--
{
T0_NUM = 0;
CLK=CLK^0x01; // 輸出脈沖
}
TR0 = 1;
}
/********************************************************************************************************
* Function Name : KeyScan
* Description : 按鍵控制
* Input : None
* Output : None
* Return : None
********************************************************************************************************/
void KeyScan(void)
{
if(K1==0 && K2==1) // 僅KEY1 按下
{
delayms(10); // 軟件延時消抖
if(K1==0 && K2==1)
{
MotorEn ^= 1;
TR0 = 1;
}
}
if(K1==1 && K2==0) // 僅KEY2 按下
{
delayms(5); // 軟件延時消抖
if(K1==1 && K2 == 0)
{
FX ^= 1; //改變方向
while(!K2);
}
}
}
/********************************************************************************************************
* Function Name : Display
* Description : 數碼管顯示
* Input : None
* Output : None
* Return : None
********************************************************************************************************/
/*void Display(void)
{
unsigned char B1,B2,B3,B4; //定義數碼管的每一位
B1=g_MotorNum/1000; //取g_MotorNum的千位
B2=g_MotorNum%1000/1000; //取g_MotorNum的百位
B3=g_MotorNum%100/10; //取g_MotorNum的十位
B4=g_MotorNum%10; //取g_MotorNum的個位
//顯示千位
P0=table[B1];
SMG1=0;
delayms(3);
SMG1=1;
//顯示百位
P0=table[B2];
SMG2=0;
delayms(3);
SMG2=1;
//顯示十位
P0=table[B3];
SMG3=0;
delayms(3);
SMG3=1;
//顯示個位
P0=table[B4];
SMG4=0;
delayms(3);
SMG4=1;
}*/
/********************************************************************************************************
* Function Name : delayms
* Description : 延時函數
* Input : None
* Output : None
* Return : None
********************************************************************************************************/
void delayms(xms)
{
unsigned int x,y;
for(x=xms;x>0;x--)
for(y=110;y>0;y--);
}
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
|
|