?? test.c
字號:
/*
; CH375/CH372 Bulk Data Test
; U2(AT89C51) Program
; 本程序測試數據傳輸的正確性,可以用于長時間連續測試,對應的計算機端的測試程序為TEST.EXE
; 方法: 下傳隨機長度的隨機數據包,被單片機接收并將數據按位取反后返回,最終由計算機程序接收后比較數據是否正確
;
; Website: http://winchiphead.com
; Email: tech@winchiphead.com
; Author: W.ch 2003.09
*/
// MCS-51單片機C語言的示例程序,用于其它單片機時一般只要修改前面幾個接口子程序及硬件定義
#pragma NOAREGS
#include <reg52.h>
#include <string.h>
#include <absacc.h>
#include <INTRINS.H>
#include "CH375INC.H" // 頭文件,在網上下載的CH372或者CH375評估板資料中有
#define uchar unsigned char
#define DELAY_2us(); _nop_(); _nop_();
#define DELAY_3us(); _nop_(); _nop_(); _nop_();
#define DELAY_5us(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
unsigned char volatile xdata CH375_CMD_PORT _at_ 0xC001; // CH375命令端口的I/O地址
unsigned char volatile xdata CH375_DAT_PORT _at_ 0xC000; // CH375數據端口的I/O地址
//晶體為11.0592MHZ
uchar mucTime5ms;
uchar mucTime100ms;
uchar mucTime1s;
//uchar mucTime60s;
uchar muc1msDelay;
uchar muc100msDelay;
uchar muc1sDelay;
uchar muc60sDelay;
/*
// 延時2微秒,不精確
void delay2us( )
{
unsigned char i;
for ( i = 2; i != 0; i -- ); // 根據單片機的時鐘選擇初值
}
// 延時1微秒,不精確,因為MCS51單片機較慢所以實際上無需延時
//void delay1us( )
//{
// unsigned char i;
// for ( i = 1; i != 0; i -- );
//}
/*
// 延時50毫秒,不精確
void Delay50ms( )
{
unsigned char i, j;
for ( i=200; i!=0; i-- ) for ( j=250; j!=0; j-- );
}
*/
//定時器0中斷延時n*1ms,最大值為256ms
void delay_ms(uchar n)
{
for(muc1msDelay=0;muc1msDelay<n;);
}
/*
//定時器0延時n*100ms,最大值為25600ms=25.6s
void delay_100ms(uchar n)
{
for(muc100msDelay=0;muc100msDelay<n;);
}
/*
//定時器0延時n*1s,最大值為256s=約4.27分鐘
void delay_1s(uchar n)
{
for(muc1sDelay=0;muc1sDelay<n;);
}
*/
// 基本操作
void CH375_WR_CMD_PORT( unsigned char cmd )
{
// 向CH375的命令端口寫入命令,周期不小于4uS,如果單片機較快則延時
//delay2us();
DELAY_2us()
CH375_CMD_PORT=cmd;
//delay2us();
DELAY_2us()
}
void CH375_WR_DAT_PORT( unsigned char dat )
{
// 向CH375的數據端口寫入數據,周期不小于1.5uS,如果單片機較快則延時
CH375_DAT_PORT=dat;
}
unsigned char CH375_RD_DAT_PORT( void )
{
// 從CH375的數據端口讀出數據,周期不小于1.5uS,如果單片機較快則延時
// delay1us(); // 因為MCS51單片機較慢所以實際上無需延時
return( CH375_DAT_PORT );
}
// CH375初始化子程序
void CH375_Init(void)
{
unsigned char i;
//Delay50ms( ); // 延時50ms
delay_ms(60);
//硬件復位
CH375_WR_CMD_PORT(CMD_RESET_ALL);
//Delay50ms( ); // 延時50ms
delay_ms(60);
// 測試CH375是否正常工作,可選操作,通常不需要
CH375_WR_CMD_PORT( CMD_CHECK_EXIST ); // 測試CH375是否正常工作
CH375_WR_DAT_PORT( 0x55 ); // 寫入測試數據
i = ~ 0x55; // 返回數據應該是測試數據取反
if ( CH375_RD_DAT_PORT( ) != i ) { // CH375不正常
for ( i=80; i!=0; i-- ) {
CH375_WR_CMD_PORT( CMD_RESET_ALL ); // 多次重復發命令,執行硬件復位
CH375_RD_DAT_PORT( );
}
CH375_WR_CMD_PORT( 0 );
//Delay50ms( ); // 延時50ms
delay_ms(60);
}
// 設置USB工作模式, 必要操作
CH375_WR_CMD_PORT( CMD_SET_USB_MODE );
CH375_WR_DAT_PORT( 2 ); // 設置為使用內置固件的USB設備方式
for ( i=100; i!=0; i-- ) { // 等待操作成功,通常需要等待10uS-20uS
if ( CH375_RD_DAT_PORT( ) == CMD_RET_SUCCESS ) break;
}
// if ( i==0 ) { CH372/CH375存在硬件錯誤 };
// 下述啟用中斷,假定CH375連接在INT0
//IT0 = 0; // 置外部信號為低電平觸發
//IE0 = 0; // 清中斷標志
//EX0 = 1; // 允許CH375中斷
EA=0;
IT1 = 1; // 置外部信號為低電平觸發
IE1 = 0; // 清中斷標志
EX1 = 1; // 允許CH375中斷
EA=1;
}
void init(void)
{
//定時器0工作在方式1,作為16位定時器
//定時器1工作在方式2,作為波特率發生器
TMOD=0x21;
TL0=-(4608%256);//5ms中斷一次
TH0=-(4608/256);
TL1=0xE8; //串口波特率為1200,晶體為11.0592MHZ
TH1=0xE8;
SCON=0x50;//串口工作方式一,允許接收
PCON=0;
IE=0x16; //允許串行口中斷,定時器0中斷,外中斷1
TCON=0x54; //外部中斷1為下降沿觸發,啟動定時器0,1
EA=1;
mucTime5ms=0; //5毫秒計數器
mucTime100ms=0; //100毫秒計數器
mucTime1s=0; //秒計數器
}
//晶體為11.0592MHZ
void time0(void) interrupt 1 using 1
{
//TL0=0x00; //定時器0時常數為50mS
//TH0=0x4C;
TL0=-(4608%256);//5ms中斷一次
TH0=-(4608/256);
mucTime5ms++;
muc1msDelay+=5;
if(mucTime5ms>=20)
{
mucTime5ms=0;
mucTime100ms++;
muc100msDelay++;
if(mucTime100ms>=10)
{
mucTime100ms=0;
//mucTime1s++;
muc1sDelay++;
/*if(mucTime1s>=60)
{
mucTime1s=0;
mucTime60s++;
}*/
}
}
}
unsigned char data buffer[ 64 ];
// CH375中斷服務程序,使用寄存器組1
//void mCh375Interrupt(void) interrupt 0 using 1
void mCh375Interrupt(void) interrupt 2 using 1
{
unsigned char InterruptStatus;
unsigned char i, length;
CH375_WR_CMD_PORT( CMD_GET_STATUS ); // 獲取中斷狀態并取消中斷請求
InterruptStatus = CH375_RD_DAT_PORT( ); // 獲取中斷狀態
switch ( InterruptStatus ) { // 分析中斷狀態處理
case USB_INT_EP2_OUT: { // 批量端點下傳成功
CH375_WR_CMD_PORT( CMD_RD_USB_DATA ); // 從當前USB中斷的端點緩沖區讀取數據塊,并釋放緩沖區
length = CH375_RD_DAT_PORT( ); // 首先讀取后續數據長度
for ( i = 0; i < length; i ++ ) buffer[ i ] = CH375_RD_DAT_PORT( ); // 接收數據包
// 測試數據正確性,將接收到的命令包數據取反后返回給PC機
CH375_WR_CMD_PORT( CMD_WR_USB_DATA7 ); // 向USB端點2的發送緩沖區寫入數據塊
CH375_WR_DAT_PORT( length ); // 首先寫入后續數據長度,回傳剛接收到的數據長度
for ( i = 0; i < length; i ++ ) CH375_WR_DAT_PORT( ~ buffer[ i ] ); // 數據取反后返回,由計算機應用程序測試數據是否正確
break;
}
case USB_INT_EP2_IN: { // 批量數據發送成功
CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); // 釋放當前USB緩沖區
break;
}
default: { // 其它中斷,未用到,解鎖后退出即可
CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); // 釋放當前USB緩沖區
break;
}
}
}
/*
main( ) {
Delay50ms( ); // 延時等待CH375初始化完成,如果單片機由CH375提供復位信號則不必延時
CH375_Init(); // 初始化CH375
EA = 1; // 允許中斷
while ( 1 ); // 以下指令開始工作循環,等待PC機命令進行操作
}
*/
void main(void)
{
init();
delay_ms(50);
CH375_Init(); // 初始化CH375
EA=1;
while(1)
{
;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -