C8051F020单片机初始化程序和编译步骤PDF.pdf

合集下载

C8051F020单片机初始化程序和编译步骤

C8051F020单片机初始化程序和编译步骤

C8051F020单片机初始化程序和编译步骤2011-02-15 12:20:06| 分类:默认分类| 标签:|字号大中小订阅C8051F020编程步骤一、编程步骤:1、看门狗设置2、系统初始化3、端口初始化4、对应功能初始化(如:串口,定时器,I2C,SPI,PCA,DAC/ADC,中断等等)5、功能函数或中断函数(如需要)6、包含的头文件7、项目说明二、对应功能初始化要点:1、Uart:(1)串口工作模式由SCON设定(2)定时器工作方式设定TMOD (3)波特率TH 载入值设定(4)启动TR1 (5)时钟基准CKCON (6)波特率加倍设定PCON(7)开中断使能TI2、Time:(1)工作方式设定TMOD (2)定时器时钟基准CKCON (3)启动/停止TCON设定TRn3、Interrupt:(1)中断允许IE (2)触发方式设定(上下沿,电平)(3)对应控制位允许设定,如ES串口允许C8051F020单片机初始化程序; $INCLUDE (C8051F020.inc) /C8051F020单片机功能强大,初始化也比较繁杂,为了便于初始化各功能模块,我们编了此程序可看着“说明”初始化。

ORG SYS_INIT;※▲◆●◎★☆△;◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆;■-- <1> --电源管理; PCON ; POWER CONTROL;■-- <2> --系统时钟和振荡器; OSCXCN ; EXTERNAL OSCILLA TOR CONTROL; OSCICN ; INTERNAL OSCILLA TOR CONTROL;■-- <3> --复位及看门狗管理; RSTSRC ; RESET SOURCE; WDTCN ; W A TCHDOG TIMER CONTROL;■-- <4> --FLASH存储器编程和安全管理; FLSCL ; FLASH MEMORY TIMING PRESCALER; PSCTL ; PROGRAM STORE R/W CONTROL; FLACL ; FLASH ACESS LIMIT;■-- <5> --中断控制; IE ; INTERRUPT ENABLE; EIE1 ; EXTERNAL INTERRUPT ENABLE 1; EIE2 ; EXTERNAL INTERRUPT ENABLE 2; IP ; INTERRUPT PRIORITY; EIP1 ; EXTERNAL INTERRUPT PRIORITY REGISTER 1; EIP2 ; EXTERNAL INTERRUPT PRIORITY REGISTER 2; P3IF ; PORT 3 EXTERNAL INTERRUPT FLAGS;■-- <6> --端口IO初始化及交叉开关设置; XBR0 ; DIGITAL CROSSBAR CONFIGURA TION REGISTER 0; XBR1 ; DIGITAL CROSSBAR CONFIGURA TION REGISTER 1; XBR2 ; DIGITAL CROSSBAR CONFIGURA TION REGISTER 2; P0MDOUT ; PORT 0 OUTPUT MODE CONFIGURA TION; P1MDOUT ; PORT 1 OUTPUT MODE CONFIGURA TION; P2MDOUT ; PORT 2 OUTPUT MODE CONFIGURA TION; P3MDOUT ; PORT 3 OUTPUT MODE CONFIGURA TION; P74OUT ; PORTS 4 - 7 OUTPUT MODE;■-- <7> --外部RAM和片内XRAM; EMI0CN ; EXTERNAL MEMORY INTERFACE CONTROL; EMI0CF ; EXTERNAL MEMORY INTERFACE (EMIF) CONFIGURA TION ; EMI0TC ; EXTERNAL MEMORY;■-- <8> --定时器设置; TMOD ; TIMER MODE; TCON ; TIMER CONTROL; T2CON ; TIMER 2 CONTROL; T4CON ; TIMER 4 CONTROL; TMR3CN ; TIMER 3 CONTROL; TMR3RLL ; TIMER 3 RELOAD REGISTER - LOW BYTE; TMR3RLH ; TIMER 3 RELOAD REGISTER - HIGH BYTE; TMR3L ; TIMER 3 - LOW BYTE; TMR3H ; TIMER 3 - HIGH BYTE;■-- <9> --串行通讯; SCON0 ; SERIAL PORT 0 CONTROL; SCON1 ; SERIAL PORT 1 CONTROL; SBUF1 ; SERAIL PORT 1 DA TA; SADDR1 ; SERAIL PORT 1; PCON ; POWER CONTROL; RCAP2L ; TIMER 2 CAPTURE REGISTER - LOW BYTE; RCAP2H ; TIMER 2 CAPTURE REGISTER - HIGH BYTE; RCAP4L ; TIMER 4 CAPTURE REGISTER - LOW BYTE; RCAP4H ; TIMER 4 CAPTURE REGISTER - HIGH BYTE; SADDR0 ; SERIAL PORT 0 SLA VE ADDRESS;■-- <10> --可编程计数器阵列; PCA0CN ; PCA 0 COUNTER CONTROL; PCA0MD ; PCA 0 COUNTER MODE; PCA0CPM0 ; CONTROL REGISTER FOR PCA 0 MODULE 0; PCA0CPM1 ; CONTROL REGISTER FOR PCA 0 MODULE 1; PCA0CPM2 ; CONTROL REGISTER FOR PCA 0 MODULE 2; PCA0CPM3 ; CONTROL REGISTER FOR PCA 0 MODULE 3; PCA0CPM4 ; CONTROL REGISTER FOR PCA 0 MODULE 4;■-- <11> --SMBus通讯; SMB0CN ; SMBUS 0 CONTROL; SMB0CR ; SMBUS 0 CLOCK RA TE; SMB0STA; SMBUS 0 STA TUS; SMB0DA T ; SMBUS 0 DA TA; SMB0ADR ; SMBUS 0 SLA VE ADDRESS;■-- <12> --SPI总线通讯; SPI0CKR ; SERIAL PERIPHERAL INTERFACE 0 CLOCK RA TE CONTROL ; SPI0DA T ; SERIAL PERIPHERAL INTERFACE 0 DA TA; SPI0CFG ; SERIAL PERIPHERAL INTERFACE 0 CONFIGURA TION; SPI0CN ; SERIAL PERIPHERAL INTERFACE 0 CONTROL;-- <13> --ADC转换; AMX0CF ; ADC 0 MUX CONFIGURA TION; AMX0SL ; ADC 0 MUX CHANNEL SELECTION; ADC0CF ; ADC 0 CONFIGURA TION; ADC0CN ; ADC 0 CONTROL; ADC0L ; ADC 0 DA TA - LOW BYTE; ADC0H ; ADC 0 DA TA - HIGH BYTE; ADC1CF ; ADC 1 ANALOG MUX CONFIGURA TION; AMX1SL ; ADC 1 ANALOG MUX CHANNEL SELECT; ADC1CN ; ADC 1 CONTROL; ADC0GTL ; ADC 0 GREA TER-THAN REGISTER - LOW BYTE; ADC0GTH ; ADC 0 GREA TER-THAN REGISTER - HIGH BYTE; ADC0LTL ; ADC 0 LESS-THAN REGISTER - LOW BYTE; ADC0LTH ; ADC 0 LESS-THAN REGISTER - HIGH BYTE; REF0CN ; VOLTAGE REFERENCE 0 CONTROL; ADC1 ; ADC 1 DA TA;■-- <14> --DAC转换; PCA0L ; PCA 0 TIMER - LOW BYTE; PCA0H ; PCA 0 TIMER - HIGH BYTE; DAC0CN ; DAC 0 CONTROL; DAC1L ; DAC 1 REGISTER - LOW BYTE; DAC1H ; DAC 1 REGISTER - HIGH BYTE; DAC1CN ; DAC 1 CONTROL;■-- <15> --比较器设置; CPT0CN ; COMPARA TOR 0 CONTROL; CPT1CN ; COMPARA TOR 1 CONTROL; EMI0TC ; EMIF TIMING CONTROL;■-- <16> --时钟/电压基准设置; CKCON ; CLOCK CONTROL; SADEN1 ; SERIAL PORT 1 SLA VE ADDRESS MASK; SADEN0 ; SERIAL PORT 0 SLA VE ADDRESS MASK; P1MDIN ; PORT 1 INPUT MODE; PSW ; PROGRAM STA TUS WORD; B ; B REGISTER; WDTCN ; W A TCHDOG TIMER CONTROL;◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆;;==================================================================== ; function: Init_CTS 定时器/计数器,中断和串行通讯初始化子程序; input: -----------------; output: -----------------; usage: -----------------;==================================================================== THS0 equ 0a8hTLS0 equ 09ah; THS1 equ 0fah;0feh;0fah;-4800;0f4h; TLS1 equ 0fah;0feh;0fah;-4800;0f4h;; THS2 equ 0ffh;0feh;0fah;-4800;0f4h; TLS2 equ 0b8h;0feh;0fah;-4800;0f4hInit_TCS: ;定时器/计数器,中断和串行通讯初始化子程序;〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓; ◆◆◆8051内部控制寄存器◆◆◆;****************************************************************************** ******;|名称| 代号| 地址|位寻| B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 |;|--------|------|------|----|-----|------|------|------|------|------|------|------|;|电源控制| PCON | 87H | NO |SMOD | -- | -- | -- | GF1 | GF0 | PD | IDL |;|--------|------|------|----|-----|------|------|------|------|------|------|------|;|计时控制| TCON | 88H | YE |TF1 | TR1 | TF0 | TR0 | IE1 | IT1 | IE0 | IT0 |;|--------|------|------|----|-----|------|------|------|------|------|------|------|;|计时模式| TMOD | 89H | NO |1GA TE| 1C/T | 1M1 | 1M0 | 0GA TE| 0C/T | 0M1 | 0M0 | ;|--------|------|------|----|-----|------|------|------|------|------|------|------|;|串行控制| SCON | 98H | YE |SM0 | SM1 | SM2 | REN | TB8 | RB8 | TI | RI |;|--------|------|------|----|-----|------|------|------|------|------|------|------|;|中断允许| IE | A8H | YE |EA| -- | ET2 | ES | ET1 | EX1 | ET0 | EX0 |;|--------|------|------|----|-----|------|------|------|------|------|------|------|;|中断优先| IP| B8H | YE |-- | -- | PT2 | PS | PT1 | PX1 | PT0 | PX0 |;****************************************************************************** ******;时钟频率为:11.059200MHz;;机器周期为:12/fosc=1.085069μs;;CT0定时器设定延时为:2000μs;;CT0定时器工作于模式0;;CT0溢出处理采用中断方式;;CT0选择内部时钟;;CT0启动由TR0的0/1决定;;设定波特率为:4800bps;;串口0工作于方式1--T1定时器工作于方式2;;串口1工作于模式3--T2定时器用于波特率发生器4800bpsmov TH0, #THS0mov TL0, #TLS0; mov TH1, #THS1; mov TL1, #TLS1; mov TH2, #THS2; mov TL2, #TLS2;▲■-- <1> --电源管理;〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓;87H---PCON-------电源控制寄存器;复位值: 00000000;位7-2:保留。

240128LCD驱动程序(c8051f020)

240128LCD驱动程序(c8051f020)

240128的程序#include <c8051f020.h>#include <tab.c>#include <dis240128.c>////sfr16 DP = 0x82; // data pointersfr16 TMR3RL = 0x92; // Timer3 reload valuesfr16 TMR3 = 0x94; // Timer3 countersfr16 ADC0 = 0xbe; // ADC0 datasfr16 ADC0GT = 0xc4; // ADC0 greater than windowsfr16 ADC0LT = 0xc6; // ADC0 less than windowsfr16 RCAP2 = 0xca; // Timer2 capture/reloadsfr16 T2 = 0xcc; // Timer2sfr16 RCAP4 = 0xe4; // Timer4 capture/reloadsfr16 T4 = 0xf4; // Timer4sfr16 DAC0 = 0xd2; // DAC0 datasfr16 DAC1 = 0xd5; // DAC1 data//unsigned int ad_temp,dis_y=0;unsigned char ad_i=0;char tabc;unsigned char dis_i,dis_k=0;//unsigned char t_count,t_i;unsigned int t_timecount;bit t_flag;unsigned long t_y=0;//void SYSCLK_Init (void){unsigned int i; // delay counterOSCXCN = 0x67; // start external oscillator withfor (i=0; i < 3000; i++) ; // Wait for osc. to start upwhile (!(OSCXCN & 0x80)) ; // Wait for crystal osc. to settleOSCICN = 0x88;}//----------------------------------------------------------------------------- //函数名称: PORT_Init ()//函数功能: 通用I/O口及交叉开关初始化//入口参数: 无//出口参数: 无//全局变量引用: 无//调用模块: 无//-----------------------------------------------------------------------------void PORT_Init (void){XBR1 = 0x02;XBR2 = 0x40;P74OUT = 0x0f; // P2口设为推挽方式P4=0x07;}//void T_Init(void){CKCON=0X18;TMOD=0x15;IP=0x0a;TH0=0;TL0=0;TH1=(65536-44237)/256;TL1=(65536-44237)%256;TR1=1;TR0=1;ET0=1;ET1=1;}// ADC0配置,T3定时启动ADC//----------------------------------------------------------------------------- void ADC0_Init (void){ADC0CN = 0x00; // ADC0 向AD0BUSY写1时采样,左对齐REF0CN = 0x03; // 启用内部基准源ADC0CF =0X40;AMX0SL = 0x01;AD0EN =1; // 选择采样输入源EIE2 |= 0x02; // 启用 ADC 中断}//void t0(void) interrupt 1{t_count++;}void t1(void) interrupt 3{TH1=(65536-44237)/256;TL1=(65536-44237)%256;t_timecount++;if(t_timecount==250){TR0=0;t_timecount=0;t_flag=1;}}// ADC0采样中断//----------------------------------------------------------------------------- void ADC0_ISR (void) interrupt 15{AD0INT = 0; // 清 ADC 中断标志位ad_temp=((ADC0H*256+ADC0L)*13)>>10;tab_wave[ad_i]=(unsigned char)(ad_temp&0xff);ad_i++;if(ad_i>=216){ad_i=0;AD0EN=0;}AD0BUSY=1;}////----------------------------------------------------------------------------- // 主程序//----------------------------------------------------------------------------- void main (void){WDTCN = 0xde;WDTCN = 0xad; //禁止看门狗定时器SYSCLK_Init (); // 系统时钟初始化PORT_Init ();ADC0_Init ();T_Init();lcd_int1();wtcd2(0x24,0x0000);show_coor(X_length,Y_length,origin_X,origin_Y,0,0);showxy();displayword(0,112,tab_word,2);displayword(13,112,tab_word+64,2);displaychar(6,112,tab_char+48,1);displaychar(10,112,tab_char+64,1);displaychar(23,112,tab_char+80,2);AD0BUSY=1;EA = 1;while(1){//幅度显示if(AD0EN==0){show_wave(1);for(dis_i=0,dis_k=0;dis_i<216;dis_i++)if(tab_wave[dis_i]>dis_k)dis_k=tab_wave[dis_i];dis_y=(unsigned int)dis_k;dis_y=(dis_y*755)>>4;//dis_y=dis_y>>8;displaychar(5,112,tab_number+(dis_y/1000%10)*16,1); displaychar(7,112,tab_number+(dis_y/100%10)*16,1); displaychar(8,112,tab_number+(dis_y/10%10)*16,1); displaychar(9,112,tab_number+(dis_y%10)*16,1);////计数显示for(t_i=0;t_i<6;t_i++){if(t_flag==1){t_flag=0;t_y=(t_count*65536+TH0*256+TL0)*2;t_timecount=0;t_count=0;TH0=0;TL0=0;TR0=1;}displaychar(18,112,tab_number+(t_y/10000%10)*16,1); displaychar(19,112,tab_number+(t_y/1000%10)*16,1); displaychar(20,112,tab_number+(t_y/100%10)*16,1); displaychar(21,112,tab_number+(t_y/10%10)*16,1);displaychar(22,112,tab_number+(t_y%10)*16,1);}//show_wave(0);show_coor(X_length,Y_length,origin_X,origin_Y,0,0);showxy();AD0EN=1;AD0BUSY=1;}}}---------------------------------------------------------------------------------------------------------------dis240128.c文件--------------------------------------------------------------------------------------------------------------#define X_length 216 //x way#define Y_length 106 //y way#define origin_X 0 //原点x(绝对坐标)#define origin_Y 53 //原点y(绝对坐标)y为53//unsigned char cklcdst(void){unsigned char temp;P5 = 0xFF;P4 = 0x03;temp=P5;P4=0x07;return temp;}//void check01(void) // 状态位STA1,STA0 判断(读写指令和读写数据){while(cklcdst()&0x03!=0x03);}///*void check3(void) // 状态位ST3 判断(数据自动写状态){while(cklcdst()&0x08!=0x08);//void check2(void) // 状态位ST2 判断(数据自动读状态){while(cklcdst()&0x04!=0x04);}//void check6(void) // 状态位ST6 判断(屏读/屏拷贝状态){while(cklcdst()&0x40!=0x40);}//void delay1000(unsigned char delayvalue){unsigned char i;unsigned int j;i = delayvalue;while(i--){j = 1000;while(j--);}}//void awtdt0(unsigned char uData) // 自动写数据{check3();wtdt(uData);}*///void delay50(unsigned char delayvalue){unsigned char i,j;i = delayvalue;while(i--){j = 50;while(j--);}void wtcd(unsigned char cmd){P4=0x05;P5=cmd;P4=0x07;delay50(1);}//------------------------------------------------------------------------------ // IO口方式写数据//------------------------------------------------------------------------------ // status: O.K.void wtdt(unsigned char lcddata){P4=0x04;P5=lcddata;P4=0x06;delay50(1);}//void wtcd2(unsigned char uCmd,unsigned int uPar) // 写双参数的指令{check01();wtdt(uPar& 0xFF);//先写低字节,再写高字节check01();wtdt((unsigned char)(uPar>>8));check01();wtcd(uCmd);}/********************//= 函数原型: uchar wr_cmd_1(uchar uCmd,uchar uPar1)//= 功能: 给T6963C写带单参数的指令//= 参数://= 返回值: 返回0 成功,否则忙//= 函数性质:私有函数********************/void wtcd1(unsigned char uCmd,unsigned char uPar) // 写单参数的指令{check01();wtdt(uPar);check01();wtcd(uCmd);}void wtcd0(unsigned char uCmd) // 写无参数的指令{check01();wtcd(uCmd);}//void wtdt0(unsigned char uData) // 写一次数据{check01();wtdt(uData);}//void lcdclr( ){ unsigned char i,j;wtcd2(0x24,0x0000);wtcd0(0xb0);for(j=0;j<=0x80;j++)for(i=0;i<=0x1E;i++)wtdt0(0x00);wtcd0(0xb2);}//---------------------------------------------------------------------------------- //---------------------------------------------------------------------------------- //初始化函数void lcd_int1( ){ lcdclr(); //清屏wtcd2(0x42,0x0000);wtcd2(0x43,0x001e); //图形显示宽度30wtcd2(0x24,0x0000);wtcd0(0x80); //显示方式 OR功能wtcd0(0x98); //启用图形显示方式,光标闪烁}//void printpoint(unsigned char PointX,unsigned char PointY,bit flag){unsigned int k=0;unsigned char ldata=0xf0;//bit operation : flag=0 bit reset and flag=1 bit set;(7-PointY%8)is select bit.k=PointY*30 + PointX/8; //k save the addressldata=ldata+7-PointX%8;if(flag)ldata=ldata|0x08;wtcd2(0x24,k);wtcd0(ldata); //output the bit operation}//--------------------------------------------------------------------------void show_coor(unsigned char x_length,unsigned char y_length,unsigned char origin_x, unsigned char origin_y,bit offset,bit offset1){unsigned char i,j,k,l,m;//show coordinate start pointif((offset==0)&&(offset1==0)){ j=origin_x;k=x_length+origin_x+6;l=origin_y-y_length/2;m=y_length+origin_y-y_length/2+3; //y way length}else if((offset==0)&&(offset1==1)){j=origin_x;k=x_length+origin_x+6;l=origin_y;m=y_length+origin_y+3;}else if((offset==1)&&(offset1==0)){j=origin_x;k=x_length+origin_x+6;l=origin_y-y_length;m=y_length+origin_y-y_length+3;}//show the coordinatefor(i=j;i<k;i++)//x wayprintpoint(i,origin_y,1);for(i=l;i<m;i++)//Y_wayprintpoint(origin_x,i,1);for(i=l;i<m;i=i+y_length/8) //y_way average dividing{printpoint(origin_x+1,i,1);}for(i=j;i<k;i=i+x_length/8)//x way average dividing{ printpoint(i,origin_y-1,1);}printpoint(i-1,origin_y-1,1);//x way the next point}//----------------------------------------------------------------------------------void show_wave(bit mod)// y 0 1{ unsigned char i,k;for(i=1;i<X_length;i++){k=origin_Y-tab_wave[i];if(k!=origin_Y)printpoint(origin_X+i,k,mod);}}//汉化显示程序,y为行,x为列,注意一个汉字占两列,而西文字符占一列void displayword(unsigned char x,unsigned char y,unsigned char *word,unsigned char c){unsigned int xy;unsigned char i,j,k=0;xy=y*30+x;for(i=0;i<c;i++)for(j=0;j<16;j++){wtcd2(0x24,xy+j*30+i*2);//置地址指针 low addresswtcd1(0xc0,word[k]);wtcd1(0xc0,word[k+1]);k+=2;}}//字符显示程序,y为行,x为列,注意一个汉字占两列,而西文字符占一列void displaychar(unsigned char x,unsigned char y,unsigned char *word,unsigned char c){unsigned int xy;unsigned char i,j,k=0;xy=y*30+x;for(i=0;i<c;i++)for(j=0;j<16;j++){wtcd2(0x24,xy+j*30+i);//置地址指针 low addresswtcd1(0xc0,word[k]);k++;}}void showxy(void){displaychar(1,0,tab_char,1);displaychar(27,54,tab_char+16,1);displaychar(1,54,tab_char+32,1);}--------------------------------------------------------------------------------------------------------------tab.c文件--------------------------------------------------------------------------------------------------------------unsigned char code tab_number[]={/*-- 文字: 0 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x00,0x00,0x18,0x24,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x24,0x18,0x00,0x00,/*-- 文字: 1 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x00,0x00,0x10,0x70,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x7C,0x00,0x00,/*-- 文字: 2 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x04,0x04,0x08,0x10,0x20,0x42,0x7E,0x00,0x00,/*-- 文字: 3 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x00,0x00,0x3C,0x42,0x42,0x04,0x18,0x04,0x02,0x02,0x42,0x44,0x38,0x00,0x00,/*-- 文字: 4 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x00,0x00,0x04,0x0C,0x14,0x24,0x24,0x44,0x44,0x7E,0x04,0x04,0x1E,0x00,0x00,/*-- 文字: 5 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x00,0x00,0x7E,0x40,0x40,0x40,0x58,0x64,0x02,0x02,0x42,0x44,0x38,0x00,0x00,/*-- 文字: 6 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x00,0x00,0x1C,0x24,0x40,0x40,0x58,0x64,0x42,0x42,0x42,0x24,0x18,0x00,0x00,/*-- 文字: 7 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x00,0x00,0x7E,0x44,0x44,0x08,0x08,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00,/*-- 文字: 8 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x24,0x18,0x24,0x42,0x42,0x42,0x3C,0x00,0x00,/*-- 文字: 9 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x00,0x00,0x18,0x24,0x42,0x42,0x42,0x26,0x1A,0x02,0x02,0x24,0x38,0x00,0x00,};unsigned char code tab_char[]={/*-- 文字: y --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x00,0x00,0xE7,0x42,0x24,0x24,0x28,0x18,0x10,0x10,0xE0,0x00,0x00,0x00,0x00, /*-- 文字: x --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x00,0x00,0x6E,0x24,0x18,0x18,0x18,0x24,0x76,0x00,0x00,0x00,0x00,0x00,0x00, /*-- 文字: 0 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x00,0x00,0x18,0x24,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x24,0x18,0x00,0x00, /*-- 文字: . --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00,0x00, /*-- 文字: V --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x00,0x00,0xE7,0x42,0x42,0x44,0x24,0x24,0x28,0x28,0x18,0x10,0x10,0x00,0x00, /*-- 文字: H --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x00,0x00,0xE7,0x42,0x42,0x42,0x42,0x7E,0x42,0x42,0x42,0x42,0xE7,0x00,0x00,/*-- 文字: z --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x44,0x08,0x10,0x10,0x22,0x7E,0x00,0x00, };//unsigned char code tab_word[]={/*-- 文字: 幅 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x20,0x00,0x23,0xFE,0x20,0x00,0xF9,0xFC,0xA9,0x04,0xA9,0x04,0xA9,0xFC,0xA8,0x00, 0xAB,0xFE,0xAA,0x22,0xAB,0xFE,0xBA,0x22,0x22,0x22,0x23,0xFE,0x22,0x02,0x20,0x00,/*-- 文字: 度 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x01,0x00,0x00,0x80,0x3F,0xFE,0x22,0x20,0x22,0x20,0x2F,0xFC,0x22,0x20,0x23,0xE0, 0x20,0x00,0x27,0xF8,0x22,0x10,0x21,0x20,0x20,0xC0,0x41,0x30,0x46,0x0E,0x98,0x04,/*-- 文字: 频 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x08,0x00,0x08,0xFE,0x4E,0x20,0x48,0x40,0x48,0xFC,0xFE,0x84,0x00,0xA4,0x08,0xA4, 0x4A,0xA4,0x4A,0xA4,0x84,0xA4,0x08,0x50,0x10,0x48,0x20,0x86,0xC3,0x02,0x00,0x00,/*-- 文字: 率 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x02,0x00,0x01,0x00,0x7F,0xFE,0x41,0x00,0x22,0x28,0x17,0xD0,0x04,0x80,0x11,0x10, 0x22,0x48,0x47,0xC4,0x01,0x20,0xFF,0xFE,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,};//unsigned char tab_wave[216];。

C8051F020入门指导

C8051F020入门指导

接到端口I/O引脚。
DAC为电压输出方式,有灵活的输出更新机制。这一机制允许 用软件写和定时器2、定时器3及定时器4的溢出信号更新DAC输出。
C8051F020/2的DAC之电压基准由专用的VREFD输入引脚提供,而
C8051F021/3的DAC之电压基准由器件内部的电压基准提供。DAC在 作为比较器的参考电压或为ADC差分输入提供偏移电压时非常有用。
1.9 比较器和DAC
C8051F020/1/2/3系列MCU内部有两个12位DAC和两个比较器。 MCU与每个比较器和DAC之间的数据和控制接口通过特殊功能寄存 器实现。MCU可以将任何一个DAC或比较器置于低功耗关断方式。 比较器的回差电压可以用软件编程。每个比较器都能在上升沿、下 降沿或在两个边沿都产生中断。这些中断能将MCU从休眠方式唤醒。比 较器的输出状态可以用软件查询。可通过设置交叉开关将比较器的输出
1.8 8 位模/数转换器
C8051F020有一个片内8位SAR ADC(ADC1),带有一个8通道输入多路 选择器和可编程增益放大器。该ADC工作在500ksps的最大采样速率时可提供 真正的8位精度,INL为±1LSB。有8个用于测量的输入端。ADC1完全由CIP51通过特殊功能寄存器控制。ADC0的电压基准可以在模拟电源电压(AV+) 和一个外部VREF引脚之间选择。
配置为两个单端输入或一个差分输入。
可编程增益放大器接在模拟多路选择器之后,增益可以用软件设置,从 0.5到16以2的整数次幂递增。 A/D转换有4种启动方式:软件命令、定时器2溢出、定时器3溢出和外部 信号输入。这种灵活性允许用软件事件、外部硬件信号或周期性的定时器 溢出信号触发转换。 转换结束由一个状态位指示,或者产生中断(如果中断被使能)。在转 换完成后,10或12位转换结果数据字被锁存到两个特殊功能寄存器中。这 些数据字可以用软件控制为左对齐或右对齐。

C8051F020学习笔记-IO初始化

C8051F020学习笔记-IO初始化

二,使用过程中,常常出现程序的IO口设置,包括设置为交叉开关,推挽方式等。

由于对这种设置方法不太了解,因此做一个专题。

//--------------------------------------------------------------------// I/O初始化程序//--------------------------------------------------------------------// 配置交叉开关和 GPIO 端口void xbar_init (void){XBR0 = 0x07; // 允许 I2C SPI和 UARTXBR1 = 0x00; //XBR2 = 0x40; // 允许交叉开关和弱上拉//PRT0CF |= 0xff; // 允许P0口的所有输出为弱上拉//P0MDOUT// 让交叉开关将这些引脚配置为输入//PRT1CF |= 0x40; // 允许 P1.6 (LED) 为弱上拉输出}(通过对比几个程序的I/O初始化,发现主要是对寄存器XBR0~2以及PRT(0~7)CF进行设置。

特将与IO口设置相关的寄存器做一个说明)2.1 GPIO口和数字外设口C8051F020/1/2/3 MCU 是高集成度的混合信号片上系统,有按8 位端口组织的64 个数字I/O 引脚。

低端口(P0、P1、P2 和P3)既可以按位寻址也可以按字节寻址。

高端口(P4、P5、P6 和P7)只能按字节寻址。

所有引脚都耐5V 电压,都可以被配置为漏极开路或推挽输出方式和弱上拉。

C8051F020/1/2/3 器件有大量的数字资源需要通过4 个低端I/O 端口P0、P1、P2 和P3 才能使用。

P0、P1、P2 和P3 中的每个引脚既可定义为通用的端口I/O(GPIO)引脚,又可以分配给一个数字外设或功能(例如:UART0 或/INT1),这种资源分配的灵活性是通过使用优先权交叉开关译码器实现的。

C8051F系列单片机的初始化

C8051F系列单片机的初始化

C8051F系列单片机的初始化C8051F系列单片机是由美国Silicon Laboratories公司研发的一款8位微控制器,它具有强大的功能和灵活的性能,是一种广泛应用于各种电子设备中的微控制器。

在使用C8051F系列单片机之前,需要进行初始化操作,以确保单片机能够正常工作。

下面将介绍C8051F系列单片机的初始化过程。

1. 系统时钟初始化在初始化单片机之前,需要先配置它的系统时钟。

C8051F系列单片机的系统时钟可从外部晶体振荡器或内部RC振荡器提供。

通过设置相关的寄存器,可以选择使用哪一种时钟源,并配置其频率。

2. 系统时钟分频器初始化对于大多数应用程序而言,操作系统时钟的速度往往太快,因此需要对其进行分频,减少操作速度。

C8051F系列单片机提供了一个系统时钟分频器,通过设置相关的寄存器,可以选择分频比例,将操作速度减慢。

3. I/O端口初始化C8051F系列单片机具有多个I/O端口,用于输入和输出数据。

在初始化单片机时,需要设置每个I/O端口的输入和输出模式,以及电平状态和电流限制等参数。

4. 中断初始化C8051F系列单片机支持多种中断模式,可以在程序执行期间随时中断当前任务,处理新的事件。

在初始化单片机时,需要配置中断引脚和中断向量表等参数。

5. 定时器初始化C8051F系列单片机具有多个定时器,用于计时和延时等功能。

在初始化单片机时,需要设置每个定时器的计数模式、频率、触发条件和计时范围等参数。

6. 串口初始化C8051F系列单片机支持串口通信,可以与其他设备进行数据交换。

在初始化单片机时,需要设置串口的通信协议、波特率和数据格式等参数。

7. ADC/DAC初始化C8051F系列单片机具有模拟转换模块,可以对模拟信号进行采样和变换。

在初始化单片机时,需要设置ADC/DAC的采样率、分辨率和参考电压等参数。

通过以上步骤,就可以完成C8051F系列单片机的初始化。

在开发具体应用程序时,还需要根据实际需求对各个模块进行进一步配置和编程。

C8051F020例程

C8051F020例程

/***************************************************************************** 本测试程序用来测试板上所以I/O连接状况外接LED共阳数码管实验时将跳线帽接至+3V淘宝地址/*****************************************************************************/#include <c8051f020.h>#define uchar unsigned char#define uint unsigned intuchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};void PORT_Init (void){XBR2 = 0x40; /*使能交叉开关*/P0MDOUT =0xff;P1MDOUT =0xff;P2MDOUT =0xff;P3MDOUT =0xff;P74OUT =0xff;}/*******************************/void delay(uint z){uint x,y;for(x=0;x<z;x++)for(y=0;y<121;y++);}/*******************************/void main (void){uchar i;WDTCN = 0xde;WDTCN = 0xad; //禁止看门狗定时器PORT_Init ();while(1){for(i=0;i<10;i++){P0=tab[i];P1=tab[i];P2=tab[i];P3=tab[i];P4=tab[i];P5=tab[i];P6=tab[i];P7=tab[i];delay(500);}}}/***************************************************************************** 闪烁灯实验本实验采用P3.4口输出短接J11 实验时将跳线帽接至+3V淘宝地址/*****************************************************************************/ #include <c8051f020.h>#define uchar unsigned char#define uint unsigned intsbit LED=P3^4;void PORT_Init (void){XBR2 = 0x40; /*使能交叉开关*/P3MDOUT =0xff;}/*******************************/void delay(uint z){uint x,y;for(x=0;x<z;x++)for(y=0;y<121;y++);}/*******************************/void main (void){WDTCN = 0xde;WDTCN = 0xad; //禁止看门狗定时器PORT_Init ();while (1){LED=0;delay(500);LED=1;delay(500);}}/***************************************************************************** 流水灯实验本实验采用P0口输出外接LED 实验时将跳线帽接至+3V淘宝地址/*****************************************************************************/#include <c8051f020.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intvoid PORT_Init (void){XBR2 = 0x40; /*使能交叉开关*/P0MDOUT =0xff;}/*******************************/void delay(uint z){uint x,y;for(x=0;x<z;x++)for(y=0;y<121;y++);}/*******************************/void main (void){uchar i;WDTCN = 0xde;WDTCN = 0xad; //禁止看门狗定时器i=0xfe;PORT_Init ();P0=i;while(1){delay(500);i = _crol_(i,1); //循环右移1位,点亮下一个LEDP0 = i;}}/***************************************************************************** 数码管实验本实验采用P0口输出外接LED共阳数码管实验时将跳线帽接至+3V淘宝地址/*****************************************************************************/#include <c8051f020.h>#define uchar unsigned char#define uint unsigned intuchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};void PORT_Init (void){XBR2 = 0x40; /*使能交叉开关*/P0MDOUT =0xff;}/*******************************/void delay(uint z){uint x,y;for(x=0;x<z;x++)for(y=0;y<121;y++);}/*******************************/void main (void){uchar i;WDTCN = 0xde;WDTCN = 0xad; //禁止看门狗定时器PORT_Init ();while(1){for(i=0;i<10;i++){P0=tab[i];delay(500);}}}/****************************************************************************** **********按键实验本实验采用P2.0和P2.1作为输入P0外接LED共阳数码管输出实验时将跳线帽接至+3V淘宝地址/******************************************************************************* *********/#include <c8051f020.h>#define uchar unsigned char#define uint unsigned intsbit K1 = P2^0;sbit K2 = P2^1;uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};void PORT_Init (void){XBR2 = 0x40; /*使能交叉开关*/P0MDOUT = 0xff;}/*******************************/void delay(uint z){uint x,y;for(x=0;x<z;x++)for(y=0;y<121;y++);}/*******************************/void main (void){uchar i;WDTCN = 0xde;WDTCN = 0xad; //禁止看门狗定时器PORT_Init ();while(1){if(K1==0){delay(10);if(K1==0){if(i==9)i=9;elsei++;while(!K1);}}if(K2==0){delay(10);if(K2==0){if(i==0)i=0;elsei--;while(!K2);}}P0=tab[i];}}/***************************************************************************** 串口通讯实验本实验采用UART0输出数据到PC机实验时将跳线帽接至+3V复位一次,单片机发送256个数据波特率为9600淘宝地址/*****************************************************************************/#include <c8051f020.h>#define uchar unsigned char#define uint unsigned intvoid SYSCLK_Init();void PORT_Init();void UART0_Init();void SYSCLK_Init(){unsigned int i;OSCXCN=0X67; //0X67=0110,0111for(i=0;i<256;i++); //等待>1mswhile(!(OSCXCN&0X80)); //等待XTLVLD变为1OSCICN=0X88; //时钟失效监测器,选择外部时钟源作为系统时钟}void PORT_Init(){XBR0 = 0x04;XBR2 = 0x40;}void UART0_Init(){SCON0=0x50; //串口方式1TMOD=0X20; //选用定时器1作为波特率发生器TH1=0xF4;TL1=0xF4;PCON=0x80; //波特率为9600TR1=1; //定时器启动}void main(){unsigned int i;WDTCN=0XDE;WDTCN=0XAD;SYSCLK_Init();PORT_Init();UART0_Init();for(i=0;i<256;i++){SBUF0=i;while(!TI0);TI0=0;}while(1);}/***************************************************************************** LCD1602并口显示实验本实验采用P6为数据口和P1为控制口实验时将跳线帽接至+5V淘宝地址/*****************************************************************************/ #include <c8051f020.h>#define uchar unsigned char#define uint unsigned int#define DataPort P6sbit LCM_VO=P1^7;sbit LCM_RS=P1^6;sbit LCM_RW=P1^5;sbit LCM_EN=P1^4;sbit LED=P3^4;uchar code TAB1[] = "C8051F-020";uchar code TAB2[] = "QQ:123514611";uchar aa,bb;/*******************************/void PORT_Init (void){XBR2 = 0x40; /*使能交叉开关*/P1MDOUT =0xff;P3MDOUT =0xff;P74OUT |= 0xff; /*推挽输出*/}/*******************************/void delay(uint z){uint x,y;for(x=0;x<z;x++)for(y=0;y<121;y++);}/*******************************//*******************************///写指令void WriteCommandLCM(uchar CMD){LCM_RS=0;LCM_RW=0;DataPort=CMD;LCM_EN=1;delay(50);LCM_EN=0;}/*******************************///写数据void WriteDataLCM(uchar dataW){LCM_RS=1;LCM_RW=0;DataPort=dataW;LCM_EN=1;delay(50);LCM_EN=0;}/***********************************/void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData) {Y &= 0x1;X &= 0xF; //限制X不能大于15,Y不能大于1if (Y) X |= 0x40; //当要显示第二行时地址码0x40;X |= 0x80; // 算出指令码WriteCommandLCM(X); //这里不检测忙信号,发送地址码WriteDataLCM(DData);}//-----------------------------------------------------------------------------//按指定位置显示一串字符//-----------------------------------------------------------------------------void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData) {unsigned char ListLength;ListLength = 0;Y &= 0x1;X &= 0xF; //限制X不能大于15,Y不能大于1 while (DData[ListLength]>0x20) //若到达字串尾则退出{if (X <= 0xF) //X坐标应小于0xF{DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符ListLength++;X++;}}}/***********************************/void InitLcd(){WriteCommandLCM(0x38); //8位数据,双行显示,5X7字型WriteCommandLCM(0x08); //WriteCommandLCM(0x01); //WriteCommandLCM(0x06); //WriteCommandLCM(0x0c); //}/***********************************/void main (void){WDTCN = 0xde;WDTCN = 0xad; //禁止看门狗定时器PORT_Init ();OSCICN |= 0x01;delay(5000);LCM_VO=0;InitLcd ();aa=0x41;for(bb=0;bb<26;bb++){LED=0;delay(500);WriteDataLCM(aa);aa++;if(aa==0x51){WriteCommandLCM(0xc0);}if(aa==0x5b){break;}LED=1;delay(500);}delay(2000);WriteCommandLCM(0x01);for(bb=0;bb<10;bb++){LED=0;delay(500);DisplayListChar(3, 0, TAB1);DisplayListChar(2, 1, TAB2);LED=1;delay(500);}delay(5000);}/****************************************************************************** **********LCD12864 ST7920控制芯片测试程序本实验采用P3口和P0口驱动实验时将跳线帽接至+3V淘宝地址/******************************************************************************* *********/#include <c8051f020.h>#define uchar unsigned char#define uint unsigned int#include <intrins.h>#include <string.h>#include <stdio.h>#define uchar unsigned char#define uint unsigned int#define ulong unsigned long//------------------------------------void PORT_Init (void);void delay(uint z);//-----------------------------------#define LCDBUS P3sbit RS = P0^0;sbit RW = P0^1;sbit E = P0^2;sbit PSB = P0^3;sbit RST = P0^4;void PORT_Init (void){XBR2 = 0x40; /*使能交叉开关*/P3MDOUT =0xff;P0MDOUT =0xff;}/*******************************/void delay(uint z){uint x,y;for(x=0;x<z;x++)for(y=0;y<121;y++);}/*******************************/uchar code symbo[]={/*-- 调入了一幅图像:D:\guoq files\technic support\pic\128x32 Symbo.bmp --*//*-- 宽度x高度=128x32 --*/0x00,0x07,0xFF,0x00,0x00,0x00,0x00,0x00,0x1F,0xC0,0x00,0x1F,0xC0,0x03,0xE0,0x00, 0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x10,0x20,0x00,0x20,0x40,0x04,0x10,0x00, 0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x00,0x40,0x40,0x08,0x08,0x00, 0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x10,0x08,0x00,0x80,0x40,0x08,0x08,0x00, 0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x10,0x04,0x01,0x00,0x40,0x08,0x08,0x00, 0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x10,0x02,0x02,0x00,0x40,0x08,0x08,0x00, 0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x10,0x01,0x04,0x00,0x40,0x08,0x08,0x00, 0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x88,0x00,0x80,0x04,0x10,0x00, 0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x50,0x01,0x00,0x03,0xE0,0x00, 0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x02,0x00,0x00,0x00,0x00, 0x1F,0xFC,0x01,0xFF,0xDF,0xFF,0xFF,0xFF,0xC1,0x00,0x00,0x04,0x00,0x00,0x00,0x00, 0x10,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x40,0x80,0x00,0x08,0x1F,0xFF,0xFF,0xF8, 0x10,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x40,0x40,0x00,0x10,0x10,0x00,0x00,0x08, 0x10,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x40,0x20,0x00,0x20,0x10,0x00,0x00,0x08, 0x10,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x40,0x10,0x00,0x40,0x10,0x00,0x00,0x08, 0x10,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x40,0x08,0x00,0x80,0x10,0x00,0x00,0x08, 0x10,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x40,0x10,0x00,0x40,0x10,0x00,0x00,0x08, 0x10,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x40,0x20,0x00,0x20,0x10,0x00,0x00,0x08, 0x10,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x40,0x40,0x00,0x10,0x10,0x00,0x00,0x08, 0x10,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x40,0x80,0x00,0x08,0x1F,0xFF,0xFF,0xF8, 0x1F,0xFC,0x01,0xFF,0xDF,0xFF,0xFF,0xFF,0xC1,0x00,0x00,0x04,0x00,0x00,0x00,0x00, 0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x02,0x00,0x00,0x00,0x00, 0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x50,0x01,0x00,0x03,0xE0,0x00, 0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x88,0x00,0x80,0x04,0x10,0x00, 0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x10,0x01,0x04,0x00,0x40,0x08,0x08,0x00, 0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x10,0x02,0x02,0x00,0x40,0x08,0x08,0x00, 0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x10,0x04,0x01,0x00,0x40,0x08,0x08,0x00, 0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x10,0x08,0x00,0x80,0x40,0x08,0x08,0x00, 0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x00,0x40,0x40,0x08,0x08,0x00, 0x00,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0x10,0x20,0x00,0x20,0x40,0x04,0x10,0x00, 0x00,0x07,0xFF,0x00,0x00,0x00,0x00,0x00,0x1F,0xC0,0x00,0x1F,0xC0,0x03,0xE0,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 };//-----------------------------------// Delay Routine//-----------------------------------void delay100us(void) //delay TIMER1*1 ms for 12MHz{uchar data i;for(i=0;i<=10;i++){_nop_();_nop_();}}void delayms( uint m ) // 12MHz Xtal, close to ms value {uint j;uint i;for(i=0; i<m; i++)for(j=0; j<109; j++)_nop_();}void SdCmd(uchar Command) //send command{RS = 0;RW=0;LCDBUS = Command;E = 1;E = 0;delay100us();}void SdData(uchar DData) //send display data{RS = 0;RS=1;RW=0;LCDBUS = DData;E = 1;E = 0;delay100us();}uchar RdData(){uchar DData;RS = 0;RW = 1;RS=1;LCDBUS=0xff;E=1;DData = LCDBUS;E = 0;return(DData);}//-----西文写入函数----------------void PrintASCII(uint x,y,uchar *pstr) //通用函数{uint addr;y=y<<4;addr=y|0x80+x;SdCmd(addr);while(*pstr>0){SdData(*pstr++);}}//----中文写入函数-----------------void PrintGB(uchar x,y,uchar *pstr){uint addr;y=y<<4;addr=y|0x80+x;SdCmd(addr);while(*pstr>0){SdData(*pstr++);delayms(300); //演示用}}//----初始化函数-----------------void initLCM(){RST=0;delayms(5);RST=1;delayms(800);SdCmd(0x30); /* 设置工作方式(8位总线) */ SdCmd(0x06); /* 设置输入方式*/SdCmd(0x0f); /* 设置显示方式*/SdCmd(0x01); /* 清屏*/delayms(2);}//----清屏函数------------------void ClearRAM(){uchar i,j;SdCmd(0x34);for(i=0;i<32;i++){SdCmd(i|0x80);SdCmd(0x80);for(j=0;j<16;j++){SdData(0x00);//SdData(0x00);}}SdCmd(0x30);}//---- 画图函数-----------------------------void ShowBmp(uchar x,y, width,high,uchar *bmp) {uchar i,j;SdCmd(0x34);SdCmd(0x36);for(i=y;i<(y+high);i++){if (i<32){SdCmd(0x80|i);SdCmd(0x80|x);}else{SdCmd(0x80|(i-32));SdCmd(0x80|(x+8));}for(j=0;j<width;j++){SdData(*bmp++);SdData(*bmp++); //}}SdCmd(0x30);}//---画点函数----------------void Draw_Dot(uint x,y){uchar m,n;uint k;if(y>=32){y=y-32;x=x+128;}SdCmd(y|0x80);k=x/16;SdCmd(k|0x80);k=0x8000;k=k>>x%16;m=RdData();m=RdData()|k>>8;n=RdData()|k;k=x/16;SdCmd(y|0x80);SdCmd(k|0x80);SdData(m);SdData(n);}//--- 画线函数---------------void Draw_Line(uint x1,y1,x2,y2) {uint temp;int dalt_x,dalt_y,err=0;if (y1>y2){temp=x1;x1=x2;x2=temp;temp=y1;y1=y2;y2=temp;}Draw_Dot(x1,y1);dalt_x=x2-x1;dalt_y=y2-y1;if(dalt_x>=0){if(dalt_y>dalt_x)//k>1{while(y1<y2){if(err<0){x1=x1+1;y1=y1+1;err=err+dalt_y-dalt_x;}else{y1=y1+1;err=err-dalt_x;}Draw_Dot(x1,y1);}}else // 0<=k=<1{if (dalt_y==0)y1=y1-1;while(x1<x2){if(err<0){x1=x1+1;err=err+dalt_y;}else{y1=y1+1;x1=x1+1;err=err+dalt_y-dalt_x;}Draw_Dot(x1,y1);}}}else{dalt_x=x1-x2;if(dalt_y>dalt_x)//k<-1{while(y1<y2){if(err<0){x1=x1-1;y1=y1+1;err=err+dalt_y-dalt_x;}else{y1=y1+1;err=err-dalt_x;}Draw_Dot(x1,y1);}}else //0>k>=-1{if (dalt_y==0)y1=y1-1;while(x1>x2){if(err<0){x1=x1-1;err=err+dalt_y;}else{x1=x1-1;y1=y1+1;err=err+dalt_y-dalt_x;}Draw_Dot(x1,y1);}}}}//--功能演示函数-------------------------void quxian1(){SdCmd(0x06);PrintGB( 0,0,"画面不动光标地址加1 指令代码为06");delayms(3000);SdCmd(0x01);delayms(2);SdCmd(0x04);PrintGB( 15,0,"画面不动光标地址减1 指令代码为04");delayms(3000);SdCmd(0x01);delayms(2);SdCmd(0x07);PrintGB( 0,0,"画面整体左移1 位指令代码为07");delayms(3000);SdCmd(0x01);delayms(2);SdCmd(0x05);PrintGB( 15,0,"画面整体右移1 位指令代码为05");delayms(3000);SdCmd(0x06);}//----做图演示函数------------------------------------void quxian2(){uint code data1[48]={88,89,85,87,89,90,89,89,88,86,87,86,88,89,90,94,95,96,96,97,99,99,101,103,101,101,100,103,105,113,113,117,117,116,114,107,110,114,113,112,115,112,113,119,120,125,124,128};uint a1,b1,a2,b2,i;SdCmd(0x01);delayms(2);SdCmd(0x0c);PrintASCII(0,0," Time");PrintASCII(14,1,"Temp");SdCmd(0x34);SdCmd(0x36);Draw_Line(1, 60, 125,60);// 设置坐标X coordinate Draw_Line(1, 15, 1, 60);// 设置坐标Y coordinatedelayms(1000);a1=1;for ( i=0;i<40;i++){b1=data1[i]-70;Draw_Dot(a1,b1);//画点a1=a1+3;}delayms(3000);a1=1;for ( i=0;i<40;i++){b1=data1[i]-70;b2=data1[i+1]-70;a2=a1+3;Draw_Line(a1,b1,a2,b2);//画线a1=a2;}SdCmd(0x32);}//-----------------------------------// Main Program//-----------------------------------void main(){WDTCN = 0xde;WDTCN = 0xad; //禁止看门狗定时器PORT_Init ();SP=0x60;EA=0;PSB=1; //并行接口选择LCDBUS=0xff; // 初始化接口RW=1;E =0;initLCM();while(1){SdCmd(0x01); /* 清屏*/delayms(2);ClearRAM();//-- 字库字符显示PrintASCII(8,0," ST7920 演示程序");delayms(3000);//-- 图画显示SdCmd(0x01); /* 清屏*/delayms(2);ClearRAM();ShowBmp(0,0,8,32,symbo);ShowBmp(0,32,8,32,symbo);delayms(3000);//-- 写入功能展示SdCmd(0x01);delayms(2);quxian1();delayms(3000);//-- 做图功能展示ClearRAM();quxian2(); // 仅在并行接口使用delayms(3000);}}/****************************************************************************** **********LCD12864 ST7565控制芯片AD转换测试程序本实验采用P0串口驱动实验时将跳线帽接至+3V淘宝地址/******************************************************************************* *********/#include <c8051f020.h>#define uint unsigned int#define uchar unsigned char#define ulong unsigned long#define SYSCLK 22118400bit aa;uchar count=0;ulong AD;ulong mm;uchar temp_l;uchar temp_h;uchar xdata dispbuf[4];uchar ContrastLevel; // for contrast setting level// 串行通讯方式驱动程序uchar bdata transdata; //该变量可为位操作之变量sbit transbit = transdata^7;sbit _CS = P0^0;sbit _RES = P0^1;sbit A0 = P0^2;sbit SCLK = P0^6;sbit SDA = P0^7;/*******************************/void delayms(uint z){uint x,y;for(x=0;x<z;x++)for(y=0;y<121;y++);}void OSCILLATOR_Init (void){int i; /*延时计数器*/OSCXCN = 0x67; /*打开外部晶体振荡器*/for (i=0; i < 256; i++) ; /*延时*/while (!(OSCXCN & 0x80)) ; /*查询外部晶体是否稳定起振*/OSCICN = 0x88; /*用外部晶体作为系统时钟,并使能时钟丢失检测*/}void PORT_Init (void){P0MDOUT = 0xff;XBR2 = 0x40;}//------------- ASCII字符库----------------------------------------------------------------//说明:该字库为5*7点阵字符字模库,但字库格式为8*8点阵字模数据,第8行为行间距,// 第6-8列为字间距。

单片机C8051F020的初始化设置

单片机C8051F020的初始化设置

单片机C8051F020的初始化设置单片机C8051F020的初始化设置在喧闹的世界中,能静下心来研究技术也是很有趣的事情。

好多年没作些具体的技术工作了,幸好领导给分配一个单片机任务。

现在把研究的技术写下来,与朋友们分享。

研究C8051F020编程不能离开初始化设置。

对于简单程序,读技术手册,将用到的I/O口,中断,串口,晶振等正确初试化后,已经成功一半了。

晶振需要初始化,C8051F020有内部晶振,精度不高,一般电路都使用外部晶振。

初始化晶振主要是OSCXCN和OSCICN两个寄存器的设置。

具体初始化代码可由Silicon的配置程序自动生成:void Oscillator_Init(){int i = 0;OSCXCN = 0x67;for (i = 0; i < 3000; i++);while ((OSCXCN & 0x80) == 0);OSCICN = 0x08;}上面程序包括了晶振初始化的全部过程:1、使能外部振荡器:OSCXCN = 0x67;2、等待至少1m钟,等待外部振荡器起稳:for (i = 0; i < 3000; i++);3、查询OSCXCN的第八位XTLVLD是否为1,1表明外部振荡器起稳:while ((OSCXCN & 0x80) == 0);4、关内部晶振,切换到外部晶振 OSCICN = 0x08;而同事们的设置是OSCICN= 0x88;应该是使用外部振荡器,但是内部振荡器也没关,这样MCU耗能高些。

串口0(UART0)也需要配置:void UART0_Init (void){SCON0 = 0x50; // SCON0: 模式1,可接收,8位串口TMOD = 0x20; // TMOD: 定时器1, 模式2, 8位自动重载TH1 = -(SYSCLK/BAUDRATE/16); // 设置定时器1TR1 = 1; // 开始定时CKCON |= 0x10; // 定时器用SYSCLK作基准时间PCON |= 0x80; // 禁止UART0波特率/2}SCON0是UART0控制寄存器,用来选择传输模式。

C8051F020入门指导

C8051F020入门指导
接到端口I/O引脚。
DAC为电压输出方式,有灵活的输出更新机制。这一机制允许
用软件写和定时器2、定时器3及定时器4的溢出信号更新DAC输出。
C8051F020/2的DAC之电压基准由专用的VREFD输入引脚提供,而
C8051F021/3的DAC之电压基准由器件内部的电压基准提供。DAC在
作为比较器的参考电压或为ADC差分输入提供偏移电压时非常有用。

真正8 位500 ksps 的ADC,带PGA 和8 通道模拟多路开关

两个12 位DAC,具有可编程数据更新方式

64K 字节可在系统编程的FLASH 存储器

4352(4096+256)字节的片内RAM


可寻址64K 字节地址空间的外部数据存储器接口
硬件实现的SPI、SMBus/ I2C 和两个UART 串行接
I/O 引脚(C8051F021/3)。下面列出了一些主要特性:

高速、流水线结构的8051 兼容的CIP-51 内核(可达25MIPS)

全速、非侵入式的在系统调试接口(片内)

真正12 位(C8051F020/1)或10 位(C8051F022/3)、 100
ksps 的8 通道ADC,带PGA和模拟多路开关

端口0–3中所有未被交叉开关分配的引脚都可以作为通用I/O
(GPI/O)引脚,通过读或写相应的端口数据寄存器访问。

被交叉开关分配的那些端口引脚的输出状态受使用这些引脚
的数字外设的控制。

不管交叉开关是否将引脚分配给外设,读一个端口数据寄存器
(或端口位)将总是返回引脚本身的逻辑状态。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

C8051F020单片机初始化程序和编译步骤2011-02-15 12:20:06| 分类:| 标签:|字号大中小订阅C8051F020编程步骤一、编程步骤:1、看门狗设置2、系统初始化3、端口初始化4、对应功能初始化(如:串口,定时器,I2C,SPI,PCA,DAC/ADC,中断等等)5、功能函数或中断函数(如需要)6、包含的头文件7、项目说明二、对应功能初始化要点:1、Uart:(1)串口工作模式由SCON设定(2)定时器工作方式设定TMOD (3)波特率TH载入值设定(4)启动TR1 (5)时钟基准CKCON (6)波特率加倍设定PCON(7)开中断使能TI2、Time:(1)工作方式设定TMOD (2)定时器时钟基准CKCON (3)启动/停止TCON设定TRn3、Interrupt:(1)中断允许IE (2)触发方式设定(上下沿,电平)(3)对应控制位允许设定,如ES串口允许C8051F020单片机初始化程序; $INCLUDE (C8051F020.inc)C8051F020单片机功能强大,初始化也比较繁杂,为了便于初始化各功能模块,我们编了此程序可看着“说明”初始化。

ORG SYS_INIT;※▲◆●◎★☆△;◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆;■-- <1> --电源管理; PCON ; POWER CONTROL;■-- <2> --系统时钟和振荡器; OSCXCN ; EXTERNAL OSCILLATOR CONTROL; OSCICN ; INTERNAL OSCILLATOR CONTROL;■-- <3> --复位及看门狗管理; RSTSRC ; RESET SOURCE; WDTCN ; WATCHDOG TIMER CONTROL;■-- <4> --FLASH存储器编程和安全管理; FLSCL ; FLASH MEMORY TIMING PRESCALER; PSCTL ; PROGRAM STORE R/W CONTROL; FLACL ; FLASH ACESS LIMIT;■-- <5> --中断控制; IE ; INTERRUPT ENABLE; EIE1 ; EXTERNAL INTERRUPT ENABLE 1; EIE2 ; EXTERNAL INTERRUPT ENABLE 2; IP ; INTERRUPT PRIORITY; EIP1 ; EXTERNAL INTERRUPT PRIORITY REGISTER 1; EIP2 ; EXTERNAL INTERRUPT PRIORITY REGISTER 2 ; P3IF ; PORT 3 EXTERNAL INTERRUPT FLAGS;■-- <6> --端口IO初始化及交叉开关设置; XBR0 ; DIGITAL CROSSBAR CONFIGURATION REGISTER 0; XBR1 ; DIGITAL CROSSBAR CONFIGURATION REGISTER 1; XBR2 ; DIGITAL CROSSBAR CONFIGURATION REGISTER 2 ; P0MDOUT ; PORT 0 OUTPUT MODE CONFIGURATION; P1MDOUT ; PORT 1 OUTPUT MODE CONFIGURATION; P2MDOUT ; PORT 2 OUTPUT MODE CONFIGURATION; P3MDOUT ; PORT 3 OUTPUT MODE CONFIGURATION; P74OUT ; PORTS 4 - 7 OUTPUT MODE;■-- <7> --外部RAM和片内XRAM; EMI0CN ; EXTERNAL MEMORY INTERFACE CONTROL; EMI0CF ; EXTERNAL MEMORY INTERFACE (EMIF) CONFIGURATION; EMI0TC ; EXTERNAL MEMORY;■-- <8> --定时器设置; TMOD ; TIMER MODE; TCON ; TIMER CONTROL; T2CON ; TIMER 2 CONTROL; T4CON ; TIMER 4 CONTROL; TMR3CN ; TIMER 3 CONTROL; TMR3RLL ; TIMER 3 RELOAD REGISTER - LOW BYTE; TMR3RLH ; TIMER 3 RELOAD REGISTER - HIGH BYTE; TMR3L ; TIMER 3 - LOW BYTE; TMR3H ; TIMER 3 - HIGH BYTE;■-- <9> --串行通讯; SCON0 ; SERIAL PORT 0 CONTROL; SCON1 ; SERIAL PORT 1 CONTROL; SBUF1 ; SERAIL PORT 1 DATA; SADDR1 ; SERAIL PORT 1; PCON ; POWER CONTROL; RCAP2L ; TIMER 2 CAPTURE REGISTER - LOW BYTE; RCAP2H ; TIMER 2 CAPTURE REGISTER - HIGH BYTE; RCAP4L ; TIMER 4 CAPTURE REGISTER - LOW BYTE; RCAP4H ; TIMER 4 CAPTURE REGISTER - HIGH BYTE; SADDR0 ; SERIAL PORT 0 SLAVE ADDRESS;■-- <10> --可编程计数器阵列; PCA0CN ; PCA 0 COUNTER CONTROL; PCA0MD ; PCA 0 COUNTER MODE; PCA0CPM0 ; CONTROL REGISTER FOR PCA 0 MODULE 0; PCA0CPM1 ; CONTROL REGISTER FOR PCA 0 MODULE 1; PCA0CPM2 ; CONTROL REGISTER FOR PCA 0 MODULE 2; PCA0CPM3 ; CONTROL REGISTER FOR PCA 0 MODULE 3; PCA0CPM4 ; CONTROL REGISTER FOR PCA 0 MODULE 4;■-- <11> --SMBus通讯; SMB0CN ; SMBUS 0 CONTROL; SMB0CR ; SMBUS 0 CLOCK RATE; SMB0STA ; SMBUS 0 STATUS; SMB0DAT ; SMBUS 0 DATA; SMB0ADR ; SMBUS 0 SLAVE ADDRESS;■-- <12> --SPI总线通讯; SPI0CKR ; SERIAL PERIPHERAL INTERFACE 0 CLOCK RATE CONTROL ; SPI0DAT ; SERIAL PERIPHERAL INTERFACE 0 DATA ; SPI0CFG ; SERIAL PERIPHERAL INTERFACE 0 CONFIGURATION ; SPI0CN ; SERIAL PERIPHERAL INTERFACE 0 CONTROL;-- <13> --ADC转换; AMX0CF ; ADC 0 MUX CONFIGURATION; AMX0SL ; ADC 0 MUX CHANNEL SELECTION; ADC0CF ; ADC 0 CONFIGURATION; ADC0CN ; ADC 0 CONTROL; ADC0L ; ADC 0 DATA - LOW BYTE; ADC0H ; ADC 0 DATA - HIGH BYTE; ADC1CF ; ADC 1 ANALOG MUX CONFIGURATION; AMX1SL ; ADC 1 ANALOG MUX CHANNEL SELECT; ADC1CN ; ADC 1 CONTROL; ADC0GTL ; ADC 0 GREATER-THAN REGISTER - LOW BYTE; ADC0GTH ; ADC 0 GREATER-THAN REGISTER - HIGH BYTE ; ADC0LTL ; ADC 0 LESS-THAN REGISTER - LOW BYTE; ADC0LTH ; ADC 0 LESS-THAN REGISTER - HIGH BYTE; REF0CN ; VOLTAGE REFERENCE 0 CONTROL; ADC1 ; ADC 1 DATA;■-- <14> --DAC转换; PCA0L ; PCA 0 TIMER - LOW BYTE; PCA0H ; PCA 0 TIMER - HIGH BYTE; DAC0CN ; DAC 0 CONTROL; DAC1L ; DAC 1 REGISTER - LOW BYTE; DAC1H ; DAC 1 REGISTER - HIGH BYTE; DAC1CN ; DAC 1 CONTROL;■-- <15> --比较器设置; CPT0CN ; COMPARATOR 0 CONTROL; CPT1CN ; COMPARATOR 1 CONTROL; EMI0TC ; EMIF TIMING CONTROL;■-- <16> --时钟/电压基准设置; CKCON ; CLOCK CONTROL; SADEN1 ; SERIAL PORT 1 SLAVE ADDRESS MASK; SADEN0 ; SERIAL PORT 0 SLAVE ADDRESS MASK; P1MDIN ; PORT 1 INPUT MODE; PSW ; PROGRAM STATUS WORD; B ; B REGISTER; WDTCN ; WATCHDOG TIMER CONTROL;◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆;;==================================================================== ; function: Init_CTS 定时器/计数器,中断和串行通讯初始化子程序; input: -----------------; output: -----------------; usage: -----------------;====================================================================THS0 equ 0a8hTLS0 equ 09ah; THS1 equ 0fah;0feh;0fah;-4800;0f4h; TLS1 equ 0fah;0feh;0fah;-4800;0f4h;; THS2 equ 0ffh;0feh;0fah;-4800;0f4h; TLS2 equ 0b8h;0feh;0fah;-4800;0f4hInit_TCS: ;定时器/计数器,中断和串行通讯初始化子程序;〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓; ◆◆◆8051内部控制寄存器◆◆◆;************************************************************************************ ;|名称| 代号| 地址|位寻| B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 | ;|--------|------|------|----|-----|------|------|------|------|------|------|------| ;|电源控制| PCON | 87H | NO |SMOD | -- | -- | -- | GF1 | GF0 | PD | IDL | ;|--------|------|------|----|-----|------|------|------|------|------|------|------| ;|计时控制| TCON | 88H | YE |TF1 | TR1 | TF0 | TR0 | IE1 | IT1 | IE0 | IT0 | ;|--------|------|------|----|-----|------|------|------|------|------|------|------|;|计时模式| TMOD | 89H | NO |1GATE| 1C/T | 1M1 | 1M0 | 0GATE| 0C/T | 0M1 | 0M0 | ;|--------|------|------|----|-----|------|------|------|------|------|------|------|;|串行控制| SCON | 98H | YE |SM0 | SM1 | SM2 | REN | TB8 | RB8 | TI | RI | ;|--------|------|------|----|-----|------|------|------|------|------|------|------|;|中断允许| IE | A8H | YE |EA | -- | ET2 | ES | ET1 | EX1 | ET0 | EX0 | ;|--------|------|------|----|-----|------|------|------|------|------|------|------| ;|中断优先| IP | B8H | YE |-- | -- | PT2 | PS | PT1 | PX1 | PT0 | PX0 | ;************************************************************************************;时钟频率为:11.059200MHz;;机器周期为:12/fosc=1.085069μs;;CT0定时器设定延时为:2000μs;;CT0定时器工作于模式0;;CT0溢出处理采用中断方式;;CT0选择内部时钟;;CT0启动由TR0的0/1决定;;设定波特率为:4800bps;;串口0工作于方式1--T1定时器工作于方式2;;串口1工作于模式3--T2定时器用于波特率发生器4800bpsmov TH0, #THS0mov TL0, #TLS0; mov TH1, #THS1; mov TL1, #TLS1; mov TH2, #THS2; mov TL2, #TLS2;▲■-- <1> --电源管理;〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓;87H---PCON-------电源控制寄存器;复位值: 00000000;位7-2:保留。

相关文档
最新文档