?? c8051f410.c
字號:
//-----------------------------------------------------------------------------
// 包含文件
//-----------------------------------------------------------------------------
#include <c8051f410.h> // SFR 聲明
#include "stdio.h" // printf() and getchar()
#include <intrins.h>
//-----------------------------------------------------------------------------
// 16-bit SFR Definitions for 'F41x
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// 函數原型
//-----------------------------------------------------------------------------
void SYSCLK_Init (void);
void PORT_Init (void);
void UART0_Init (void);
void AIN1(void);
void Timer_Init(void);
void UART0_Init (void);
//-----------------------------------------------------------------------------
// 全局常量
//-----------------------------------------------------------------------------
#define SYSCLK 24500000 // 系統時鐘頻率 Hz
#define BAUDRATE 9600 // UART波特率 bps
//------------------------------------------------------------------------------
//全局變量
//-----------------------------------------------------------------------------
int SSS;
long hhh;
int i,j,w,z;
unsigned char s,d,f;
int aaa,bbb,oo;
//-------------------------------------------------------------------------------
//主程序
//-----------------------------------------------------------------------------
void main (void)
{
unsigned int mm;
PCA0MD &= ~0x40; // WDTE = 0 (clear watchdog timer enable)禁止看門狗
SYSCLK_Init ();
PORT_Init ();
Timer_Init();
UART0_Init();
AIN1();
EIE1 = 0x08; //允許AD0INT轉換結束標志(該位為1表示完成了一次數據轉換)的中斷請求
EA=1; //開放總中斷源
while(1)
{
while(AD0INT==0); //為0則等待AD數據轉換結束
AD0INT=0;
mm=(ADC0H<<8)+ADC0L;
mm=mm&0x7ff;
printf("mm=%d\n",mm); //通過UART輸出數據mm
EIE1&=~0x08; //禁止AD0INT轉換結束標志的中斷請求(即EIE1各位都清零)
EA=0; //禁止所有中斷
for (i=0;i<125;i++)
for (j=0;j<250;j++);
EIE1 |= 0x08; //允許AD0INT轉換結束標志(該位為1表示完成了一次數據轉換)的中斷請求
EA=1; //開放總中斷源
}
}
//-----------------------------------------------------------------------------
// 子程序初始化
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// IO口初始化子程序
//-----------------------------------------------------------------------------
//
// 配置數據交叉開關和通用IO口
//
void PORT_Init(void)
{ P1MDIN &= 0xBF; //把P1口的P16引腳配置為模擬輸入
P1SKIP |= 0x47; //使交叉開關跳過P10,P11,P12和P16
XBR1 = 0x40; //使能交叉開關
XBR0 = 0x01; //UART使能,使TX0,RX0連到端口引腳P04和P05
P0MDOUT = 0x10; //P04(TX0)推挽輸出,P05開漏輸出
}
//-----------------------------------------------------------------------------
// 系統時鐘初始化子程序
//-----------------------------------------------------------------------------
//void SYSCLK_Init(void)
//{
// OSCICN = 0x87; //使用內部振蕩器,不分頻24.5MHz
//}
void SYSCLK_Init (void)
{
OSCICN = 0x87; // 選擇內部振蕩器作為系統時鐘SYSCLK
// 內部振蕩器不分頻24.5MHz
}
//-----------------------------------------------------------------------------
// ADC0初始化
//-----------------------------------------------------------------------------
void AIN1(void)
{ ADC0MX = 0x0E; //選擇P16作為模擬輸入通道
ADC0CF = 0xC0; //ADC轉換時鐘=0.9MHz,執行1次轉換
ADC0CN = 0x81; //使能ADC0,定時器3溢出啟動ADC0轉換,轉換數據右對齊
//ADC0CN = 0x90; //使能ADC0,寫AD0BUSY為1啟動轉換,轉換數據右對齊
REF0CN = 0x13; //IDA1輸出為P01,選擇內部電壓基準2.2V
}
//-----------------------------------------------------------------------------
// 定時器初始化子程序
//----------------------------------------------------------------------------
//void Timer_Init(void)
//{
// TMR3CN = 0x24; //定時器3允許,允許定時器3低字節中斷,16位自動重裝載工作方式
// TMR3RLH = 0x80; //定時器3重載寄存器的高字節值
//}
void Timer_Init(void)
{
TMR3CN =0x24;
TMR3RLH =0x80;
}
//-----------------------------------------------------------------------------
// UART0初始化
//-----------------------------------------------------------------------------
void UART0_Init (void)
{
SCON0 = 0x10; // SCON0: 波特率可編程的8位UART
// level of STOP bit is ignored 停止位的邏輯電平被忽略
// RX enabled 允許UART接收
// ninth bits are zeros 8位UART方式中第9發送位未用
// clear RI0 and TI0 bits RI0位和TI0位必須用軟件清零
if (SYSCLK/BAUDRATE/2/256 < 1) {
TH1 = -(SYSCLK/BAUDRATE/2);
CKCON &= ~0x0B; // T1M = 1; SCA1:0 = xx 定時器1使用系統時鐘
CKCON |= 0x08;
} else if (SYSCLK/BAUDRATE/2/256 < 4) {
TH1 = -(SYSCLK/BAUDRATE/2/4);
CKCON &= ~0x0B; // T1M = 0; SCA1:0 = 01 定時器1使用系統時鐘
CKCON |= 0x09;
} else if (SYSCLK/BAUDRATE/2/256 < 12) {
TH1 = -(SYSCLK/BAUDRATE/2/12);
CKCON &= ~0x0B; // T1M = 0; SCA1:0 = 00定時器1使用系統時鐘12分頻做時鐘
} else {
TH1 = -(SYSCLK/BAUDRATE/2/48);
CKCON &= ~0x0B; // T1M = 0; SCA1:0 = 10定時器1使用系統時鐘48分頻做時鐘
CKCON |= 0x02;
}
TL1 = TH1; // init Timer1 定時器1高低字節數據寄存器
TMOD &= ~0xf0; // TMOD: timer 1 in 8-bit autoreload自動重裝載的8位計數器/定時器
TMOD |= 0x20;
TR1 = 1; // START Timer1 啟動定時器1
TI0 = 1; // Indicate TX0 ready
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -