簡(jiǎn)介:本文主要介紹了C8051F005的DA驅(qū)動(dòng)程序(C語(yǔ)言)。
C8051F005的DA驅(qū)動(dòng)程序(C語(yǔ)言)
//-----------------------------------------------------------------------------
// Includes
//-----------------------------------------------------------------------------
#include // SFR declarations
#include
//-----------------------------------------------------------------------------
// 16-bit SFR Definitions for 'F00x
//-----------------------------------------------------------------------------
sfr16 DP = 0x82; // data pointer
sfr16 TMR3RL = 0x92; // Timer3 reload value
sfr16 TMR3 = 0x94; // Timer3 counter
sfr16 ADC0 = 0xbe; // ADC0 data
sfr16 ADC0GT = 0xc4; // ADC0 greater than window
sfr16 ADC0LT = 0xc6; // ADC0 less than window
sfr16 RCAP2 = 0xca; // Timer2 capture/reload
sfr16 T2 = 0xcc; // Timer2
sfr16 DAC0 = 0xd2; // DAC0 data
sfr16 DAC1 = 0xd5; // DAC1 data
//-----------------------------------------------------------------------------
// Function PROTOTYPES
//-----------------------------------------------------------------------------
void SYSCLK_Init (void);
//-----------------------------------------------------------------------------
// MAIN Routine
//-----------------------------------------------------------------------------
void main (void){
WDTCN = 0xde; // disable watchdog timer
WDTCN = 0xad;
SYSCLK_Init (); // initialize oscillator
REF0CN = 0x03; // Reference Control Register
//----------------------------------------------------------------------------
// DAC Configuration
//----------------------------------------------------------------------------
DAC0CN = 0x80; // DAC0 Control Register
DAC1CN = 0x80; // DAC1 Control Register
while(1)
{
DAC0L = 0xAB; // DAC0 Low Byte Register
DAC0H = 0x0C; // DAC0 High Byte Register
DAC1L = 0xAB; // DAC1 Low Byte Register
DAC1H = 0x0C; // DAC1 High Byte Register
}
}
//-----------------------------------------------------------------------------
// Initialization Subroutines
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// Oscillator Configuration
//-----------------------------------------------------------------------------
void SYSCLK_Init (void)
{
int i; // delay counter
OSCXCN = 0x67; // start external oscillator with
// 18.432MHz crystal
for (i=0; i < 256; i++) ; // XTLVLD blanking interval (>1ms)
while (!(OSCXCN & 0x80)) ; // Wait for crystal osc. to settle
OSCICN = 0x88; // select external oscillator as SYSCLK
// source and enable missing clock
// detector
}
C8051F005的AD驅(qū)動(dòng)程序(C語(yǔ)言)
//-----------------------------------------------------------------------------
// Includes
//-----------------------------------------------------------------------------
#include
#include
#include
//-----------------------------------------------------------------------------
// Function PROTOTYPES
//-----------------------------------------------------------------------------
#define uchar unsigned char
#define uint unsigned int
void SYSCLK_Init (void);
void delaynus(unsigned int q) ; //N us延時(shí)函數(shù)
void PORT_Init (void);
void SPI0_Init (void);
void LCD_Init(void);
void SendSPIByte(unsigned char ch);
void delaynms (unsigned int j);
void writecom(unsigned char com);
void writedata(unsigned char d);
void writechar(unsigned char ua);
void lcd_Net(void);
void Write_COM(uchar ins);
void SendSPIByte(uchar disdata);
void lcden(datad);
void LCD_set_xy( unsigned char x, unsigned char y );
void lcd_xhl(void);
void LCD_write_string(unsigned char n);
void lcd_adc(void);
void UART0_Init (void);
void ADC (void);
sbit lcdcs=P3^0;
//-----------------------------------------------------------------------------
// Global CONSTANTS
//-----------------------------------------------------------------------------
#define BAUDRATE 115200 // Baud rate of UART in bps
#define SYSCLK 11059200 // SYSCLK frequency in Hz
#define SAMPLE_RATE 50000 // Sample frequency in Hz
#define INT_DEC 4096 // integrate and decimate ratio
sfr16 DP = 0x82; // data pointer
sfr16 TMR3RL = 0x92; // Timer3 reload value
sfr16 TMR3 = 0x94; // Timer3 counter
sfr16 ADC0 = 0xbe; // ADC0 data
sfr16 ADC0GT = 0xc4; // ADC0 greater than window
sfr16 ADC0LT = 0xc6; // ADC0 less than window
sfr16 RCAP2 = 0xca; // Timer2 capture/reload
sfr16 T2 = 0xcc; // Timer2
sfr16 DAC0 = 0xd2; // DAC0 data
sfr16 DAC1 = 0xd5; // DAC1 data
unsigned char xdata ADC1Data[4];
unsigned int xdata ad_arr[50];
unsigned char datad ,comd,kk,sdf,ppca;
unsigned char virt_port,v,b,m;
unsigned char lcd_data_count;
unsigned char *lcdpoint;
unsigned char qqq;
unsigned char data8;
unsigned int i;
unsigned int AD_MAXT;
unsigned int AD_MINT;
long AD_VAL,AD_VAL_TEST;
unsigned char YYY;
long result;
long fff;
long hhh;
int j,w,z; // temperature in hundredths of a
unsigned int fff_int, fff_frac;
unsigned char p=0,a=0,s,d,f,g=0;
//-----------------------------------------------------------------------------
// MAIN Routine
//-----------------------------------------------------------------------------
void main(void){
WDTCN = 0xde; // disable watchdog timer
WDTCN = 0xad;
SYSCLK_Init ();
PORT_Init ();
UART0_Init() ; // initialize crossbar and GPIO
SPI0_Init ();
LCD_Init() ;
delaynms(100);
Write_COM(0x00);
delaynms(100);
delaynms(100);
Write_COM(0x01);
delaynms(100);
delaynus (100);
LCD_set_xy(0X00,0);
delaynus (200);
lcd_adc();
delaynus (200);
LCD_write_string(5);
delaynms (100);
while (1)
{
delaynms (100);
ADC ();
}
}
//-----------------------------------------------------------------------------
// Initialization Subroutines
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// ADC
//-----------------------------------------------------------------------------
void ADC (void)
{
AMX0CF = 0x60;// AMUX Configuration Register
AMX0SL = 0x00;// AMUX Channel Select Register
ADC0CN = 0x00;// ADC Control Register
REF0CN = 0x03;
ADC0CN |= 0x80;
AD_VAL=0;
AD_VAL_TEST = 0;
for( YYY = 0;YYY<50;YYY++)
{
ad_arr[YYY]=0;
}
YYY=0;
ADCINT = 0;
for(YYY= 0;YYY<50;YYY++) //AD_TIMES=50
{
ADBUSY = 1;
while (!ADCINT);
ADCINT = 0;
_nop_();
_nop_();
_nop_(); //*AD_POINTER = ADC0
ad_arr[YYY]=ADC0;
}
for(YYY=0;YYY<50;YYY++)// for(i = 0;i AD_VAL_TEST += ad_arr[YYY]; } AD_VAL = (int)(AD_VAL_TEST/50); _nop_(); _nop_(); _nop_(); _nop_(); hhh=AD_VAL*5; hhh=hhh*5; hhh=hhh*100; hhh=hhh/4096; ADC1Data[0]=hhh/1000; //將A/D轉(zhuǎn)化值存到顯示數(shù)組 ADC1Data[1]=(hhh-1000*ADC1Data[0])/100; ADC1Data[2]=(hhh-1000*ADC1Data[0]-100*ADC1Data[1])/10; ADC1Data[3]=hhh-1000*ADC1Data[0]-100*ADC1Data[1]-10*ADC1Data[2]; delaynus (100); LCD_set_xy(0X05,0); delaynus (200); for(qqq=0;qqq<4;qqq++) { data8=ADC1Data[qqq]; if(data8>=0x0a) data8 += 0x37; else data8 += 0x30; delaynms (200); writechar(data8); } AD_VAL=0; } //----------------------------------------------------------------------------- // PORT_Init //----------------------------------------------------------------------------- void PORT_Init (void) { XBR0 = 0x27; // XBAR0: Initial Reset Value XBR1 = 0x00; // XBAR1: Initial Reset Value XBR2 = 0x5c; // XBAR2: Initial Reset Value PRT0CF = 0x14; // Output configuration for P0 PRT1CF = 0x10; // Output configuration for P3 PRT3CF = 0x01; // Output configuration for P3 } //----------------------------------------------------------------------------- // SYSCLK_Init //----------------------------------------------------------------------------- void SYSCLK_Init (void) { // delaynms counter OSCXCN = 0x67; // start external oscillator with for (i=0; i < 256; i++) ; // XTLVLD blanking interval (>1ms) while (!(OSCXCN & 0x80)) ; // Wait for crystal osc. to settle OSCICN = 0x88; // select external oscillator as SYSCLK } //----------------------------------------------------------------------------- // SPI0_Init //----------------------------------------------------------------------------- void SPI0_Init (void) { SPI0CFG = 0x07; // data sampled on 1st SCK rising edge SPI0CFG|=0xC0; //CKPOL =1; SPI0CN = 0x03; // Master mode; SPI enabled; flags SPI0CKR = SYSCLK/2/2000000-1; // SPI clock <= 8MHz (limited by // EEPROM spec.) } //----------------------------------------------------------------------------- // UART0_Init //----------------------------------------------------------------------------- void UART0_Init (void) { SCON = 0x50; // SCON: mode 1, 8-bit UART, enable RX TMOD = 0x20; // TMOD: timer 1, mode 2, 8-bit reload TH1 = -(SYSCLK/BAUDRATE/16); // set Timer1 reload value for baudrate TR1 = 1; // start Timer1 CKCON |= 0x10; // Timer1 uses SYSCLK as time base PCON |= 0x80; // SMOD = 1 TI = 1; // Indicate TX ready } //----------------------------------------------------------------------------- // LCD_Init //----------------------------------------------------------------------------- void LCD_Init(void) //向LCD送命令 { // unsigned int xdata x; delaynms(100); datad=0x00; SendSPIByte(datad); delaynms(10); Write_COM(0x30); delaynms(10); Write_COM(0x30); delaynms(10); Write_COM(0x30); delaynms(10) ; Write_COM(0x28); delaynms(100); virt_port=0; SendSPIByte(virt_port); lcden(virt_port); Write_COM(0x01); delaynms(100); Write_COM(0x06); delaynms(10) ; Write_COM(0x0C); delaynms(500) ; } //----------------------------------------------------------------------------- // SendSPIByte //----------------------------------------------------------------------------- void SendSPIByte(unsigned char ch) { lcdcs=1; delaynus(100); SPIF = 0; SPI0DAT = ch; while (SPIF == 0); delaynus(100); lcdcs=0; delaynus(100); _nop_(); // 等待寫結(jié)束 } //----------------------------------------------------------------------------- // lcden //----------------------------------------------------------------------------- void lcden(datad) { datad|=0x08; SendSPIByte(datad); datad&=0xf7; SendSPIByte(datad); } //----------------------------------------------------------------------------- // delaynms //----------------------------------------------------------------------------- void delaynms (unsigned int uu) { unsigned int oo,ll; for (oo=0;oo for(ll=0;ll<1140;ll++); } } //----------------------------------------------------------------------------- // writechar //----------------------------------------------------------------------------- void writechar(unsigned char ua)
上一篇:一種嵌入式時(shí)鐘管理器的設(shè)計(jì)與實(shí)現(xiàn)
下一篇:51單片機(jī)頻率計(jì)數(shù)器課程設(shè)計(jì)
推薦閱讀最新更新時(shí)間:2025-05-21 19:43

設(shè)計(jì)資源 培訓(xùn) 開(kāi)發(fā)板 精華推薦
- 意法半導(dǎo)體推出用于匹配遠(yuǎn)距離無(wú)線微控制器STM32WL33的集成的匹配濾波芯片
- ESP32開(kāi)發(fā)板連接TFT顯示屏ST7789跳坑記
- 如何讓ESP32支持analogWrite函數(shù)
- LGVL配合FreeType為可變字體設(shè)置字重-ESP32篇
- 使用樹(shù)莓派進(jìn)行 ESP32 Jtag 調(diào)試
- ESP32怎么在SPIFFS里面存儲(chǔ)html,css,js文件,以及網(wǎng)頁(yè)和arduino的通訊
- ESP32 freeRTOS使用測(cè)試
- API調(diào)用小記(Touchdesigner和ESP32)
- 關(guān)于ESP32/8266使用async-mqtt-client庫(kù)的一些基本介紹
- (已驗(yàn)證)模塊-RDA5807+PAM8403收音機(jī)
- 來(lái)自多個(gè)輸入源的 LTC3622EDE 雙路輸出降壓型穩(wěn)壓器的典型應(yīng)用電路
- 使用 Richtek Technology Corporation 的 RT8063 的參考設(shè)計(jì)
- 【單片機(jī)】 N32G430C8L7開(kāi)發(fā)板
- MAXREFDES1080:采用MAX16820、降壓,恒定電流配置的5V / 1A LED驅(qū)動(dòng)器
- stm8l101f3p6最小系統(tǒng)
- LDK120M33R 3.3V低壓降穩(wěn)壓器典型應(yīng)用(可調(diào)版)電路
- 具有 6V 輸入 UVLO 的 LTC3633AEFE 3.3V/1.8V 順序降壓穩(wěn)壓器的典型應(yīng)用電路
- 【訓(xùn)練營(yíng)】【訓(xùn)練營(yíng)】仿生坦克
- TEA1995DB1294: TEA1995T GreenChip Dual SR Controller add-on board for resonant and multi-output flyback (TO-220 MOSFETs)
- 意法半導(dǎo)體的STM32U5通用MCU取得PSA 3級(jí)和SESIP3安全認(rèn)證
- TDK推出具有冗余功能和數(shù)字輸出接口新型雜散場(chǎng)補(bǔ)償傳感器
- 51實(shí)驗(yàn)4:總線法寫流水燈
- AVR單片機(jī)-nRF24L01發(fā)送接收程序
- 汽車電路圖的分類
- 萊迪思FPGA助力奧視威電子最新的演播室監(jiān)視器設(shè)計(jì)
- 如何利用視覺(jué)處理器在可視門鈴和智能零售設(shè)計(jì)中擴(kuò)展邊緣 AI 功能
- 微軟內(nèi)部 AI 硬件短缺,被迫實(shí)施配額制
- 基于STM32的多路電壓采集的設(shè)計(jì)與實(shí)現(xiàn)
- 座椅、天窗、電動(dòng)尾門應(yīng)用 國(guó)產(chǎn)車規(guī)級(jí)高壓霍爾效應(yīng)傳感器推薦
- 突發(fā)!又一車企車機(jī)“崩了”
- 寧德時(shí)代為陳立泉院士頒發(fā)“卓越貢獻(xiàn)獎(jiǎng)”
- 一文速覽吉利雷神 AI 電混 2.0 發(fā)布會(huì)重點(diǎn)
- 2025年1-4月ADAS供應(yīng)商裝機(jī)量排行榜:頭部集中與國(guó)產(chǎn)突圍并存
- 國(guó)內(nèi)飛行汽車無(wú)線通信測(cè)試成功,通信安全新突破
- SPAD席卷車載激光雷達(dá)市場(chǎng)
- 大聯(lián)大品佳集團(tuán)推出基于Microchip和ams OSRAM產(chǎn)品的10Base-T1S萬(wàn)級(jí)像素大燈方案
- 哈曼推出采用三星Neo QLED技術(shù)的全新顯示屏
- Syntiant推出超低功耗汽車AI創(chuàng)新技術(shù) 提升車輛安全性和用戶體驗(yàn)
- STM32串口DMA傳輸不能使用的問(wèn)題
- STM32定時(shí)器的預(yù)裝寄存器以及影子寄存器話題
- STM32串口IAP(YModem)
- stm32 Bootloader設(shè)計(jì)(YModem協(xié)議)
- 剖析Tesla全自動(dòng)駕駛之路:從 Autopilot 2.0 到 3.0的歷史進(jìn)程
- 磷酸鐵鋰將與錳酸鋰搶市場(chǎng)?
- 2023年全球電池儲(chǔ)能系統(tǒng)市場(chǎng)將高達(dá)85.4億美元
- 2018年中國(guó)大陸電競(jìng)顯示器市場(chǎng)出貨量走勢(shì)
- 博鰲開(kāi)幕,為何再次引發(fā)AI替代人類的虛驚
- 公有云又添新玩家:“紫光云”如何在云計(jì)算下半場(chǎng)下一盤大棋?