c8051f020_AD转换程序

合集下载

基于C8051F020的双通道信号处理系统设计

基于C8051F020的双通道信号处理系统设计

4 结束 语
经测试 , 该系统能按要求 同时采集并回放两路不 同模拟信号 , 并
能显示采集信号 的幅度 、 频率 等参数其设计方 案简单合理 , 输 出信号
稳 定 , 测 量 精 度 较 高 , 满 足 了 设 计 要 求 。 e
【 参考 文献 】
[ 1 ] 胡延如. 低频电子技术 【 M ] . 高等教育出版社 , 2 0 0 8 . [ 2 ] 潘琢金. C 8 0 5 1 F 0 2 0 / 1 / 2 / 3 数据手册 [ Z 】 . 沈阳新 华龙电子有 限公 司, 2 0 0 2 . [ 3 ] N I - 存储器 M B 8 5 R S 2 5 6资料[ Z 】 .

科技・ 探索・ 争鸣
图 2 类 图
总之 , 在当前时代 的潮流下 , 经济 、 效率是很重要的 。 款好 的招 生管理系统能给招生单位 以及单位招生人员提供莫大的帮助 . 而培训 机构的快速高效的发展也是有利 于人类文明的进步 . 所以 说 我们应该
以 积 极 的 态 度 来 加 速 培 训 机 构 的 发 展 。 e

浆 工 程 流 量 测 量 的 首 选 仪 器 , 可 广 泛 推 广 使 用 。 e
5 结 语
[ 责任编辑 : 汤静 ]
S c i e n c e&T e c h n o l o g y V i s i o n 科技视界 l 1 3 1
I l
示。
3 程 序设 计
系统上电后 . 主程序先对单片测到输入信号后启动采样 , 并将此采样数据 送入 R A M 中暂存 。 采样结束后将已采数 据送人 F L A S H中保存。需要 信号回放 时 . 则调用显示子程序 , 对采样数据进行 D / A转换 。 在定时器 中断时将转换数据送人 R A M. 最后输出波形到显示屏上 。 系统软件设 计 如图 5所示

c8051f系列AD转换设计步骤

c8051f系列AD转换设计步骤

标度转换(例)
• 测量范围:0-30V • AD字长: 10位
30 0 U ( N 0) 0 0.0293N 1023 0 U 1 293* N
• N: 0 ~ 1023 N=1023时 U1=299739 U1 应定义为长整形 • 结果送显示时,将小数点显示在合适位置 29.9739
转换结束?
读AD转换结果
读AD结果
• ads=ADC0H*256+ADC0L • ads 应定义为无符号整形数
– Unsigned int
采样周期与滤波
• 采样周期
– N次/秒
n 1
• 滤波
– 平均值滤波
1 U Ui n i 0
惯性滤波
R
1 Y (S ) X (S ) 1
递推算式: T:采样周期 τ:滤波时间常数
• 对齐方式
ADC0H 左对齐 右对齐 ADC0L
XXXXXXXX XXXX XXXX XXXXXXXX
电压基准配置
• REF0CN: 电压基准控制寄存器
ADC控制
• ADC0CN: ADC0控制寄存器 • 六种启动方式 • 使能ADC
– AD0EN 置“1”
N
启动AD转换开始
• 查询方式
– 软件启动 AD0BUSY置“1” – 查询结束 AD0BUSY=“0”?
I/O端口及交叉开关设置
• 端口寄存器
– P0 P1 P2
• 输入方式寄存器
– PxMDIN
• 输出方式寄存器
– PxMDOUT
• 跳过寄存器
– PxSKIP P105
I/O端口配置步骤
1. 用端口输入方式寄存器(PnMDIN)选择所有端口引脚 的输入方式(模拟或数字)。 2. 用端口输出方式寄存器(PnMDOUT)选择所有端口引 脚的输出方式(漏极开路或推挽)。 3. 用端口跳过寄存器(PnSKIP)选择应被交叉开关跳过的 那些引脚。 4. 将引脚分配给要使用的外设。

C8051F同时实现AD和串口收发的程序

C8051F同时实现AD和串口收发的程序

C8051F同时实现AD和串口收发的程序//---------------------------------------------------------------------#include <C8051F020.h>#include "stdio.h"sfr16 TMR3RL = 0x92; //定时器3重装载寄存器sfr16 TMR3 = 0x94; //定时器3计数器sfr16 DP =0x82;sfr16 ADC0 =0xbe;sfr16 ADC0GT =0xc4;sfr16 ADCOLT =0xc6;sfr16 RCAP2 =0xca;sfr16 T2 =0xcc;sfr16 RCAP4 =0xe4;sfr16 T4 =0xf4;sfr16 DAC0 =0xd2;sfr16 DAC1 =0xd5;#define uchar unsigned char#define uint unsigned int//----------------------------------------------------------------------//参数设置区//----------------------------------------------------------------------#define BAUDRATE 9600 //波特率bps#define SYSCLK 11059200 //外部晶振,修改也要修改OSCXCN#define SMODV AL 0 //SMOD的值,修改请也修改PCONV AL#define PCONV AL 0x00 //PCON的值,=0x00时SMOD0=0; =0x80时SMOD0=1#define TXV AL (256-SYSCLK*(SMODVAL+1)/BAUDRA TE/384) //定时器初值#define MAX_LEN 1//每次接收/发送字符串的长度#define SAMPLERATE0 5000#define NUM_SAMPLES 1#define TURE 1#define FALSE 0//---------------------------------------------------------------------//全局变量//---------------------------------------------------------------------sbit LED = P1^6; //LED '1'亮'0'灭bit readFlag = 0; //读标志uchar readCounts = 0; //已经读取的字符个数,与MAX_LEN比较uchar idATa trdATa[MAX_LEN]; //要接收/发送的字符串xdA Ta unsigned samples[NUM_SAMPLES];bit ADC0_DONE;//----------------------------------------------------------------------//子函数声明//----------------------------------------------------------------------void SYSCLK_Init(void); //系统时钟初始化void PORT_Init(void); //端口初始化void UART0_Init(void); //串口UART0初始化void Send_Char(uchar ch); //发送单个字符void Send_String(uchar * str, uint len); //发送一个字符串void UART0_ISR(); //串口中断服务程序,接收字符void Timer3_Init(uint counts); //定时器3初始化void Timer3_ISR(void); //定时器3中断服务程序void ADC0_Init (void);//---------------------------------------------------------------------- //主函数//---------------------------------------------------------------------- void main(void){unsigned short i;floAT temp,k;WDTCN = 0xde; //禁止看门狗WDTCN = 0xad;P6&=0x02;here:i=0;SYSCLK_Init(); //时钟初始化PORT_Init(); //端口初始化UART0_Init(); //串口初始化Timer3_Init(SYSCLK/12/10); //定时器初始化EA = 1; //开全局中断ADC0_Init();AD0INT=0;AD0BUSY=1;while(AD0INT==0);temp=ADC0;k=(temp*2.4)/4096;printf("\n");printf("voltage%f",k);printf("\n");i=0;while(1){{if(readFlag) //已经读取{readFlag = 0; //清零Send_String(trdATa,MAX_LEN); //发送字符串i++;if(i==10000){goto here;}}}}}//----------------------------------------------------------------------//子函数具体实现//----------------------------------------------------------------------//系统时钟初始化void SYSCLK_Init(void){uint i;OSCXCN = 0x67; //采用外部晶振22.1184MHz,不分频. 选型OSCXCN=0110,0111 for(i=0;i<256;i++); //等待>1mswhile(!(OSCXCN&0x80)); //查询直到XTLVLD=1,晶振稳定OSCICN = 0x88; //切换到外部振荡器,允许时钟失效监测器. OSCICN=1000,1000 }//端口初始化void PORT_Init(void){XBR0 = 0x04; //允许UART0,RX,TX连到2个端口引脚. XBR0=0000,0100XBR1 = 0x00;XBR2 = 0x40; //交*开关使能P0MDOUT |= 0x03; //P0.0为推拉方式输出,即TX0,RX0所在的端口0000,0011P1MDOUT |=0x40; //P1.6为推拉方式输出,即LED所在的端口0100,0000}//串口初始化void UART0_Init(void){SCON0=0x50;TMOD=0x20;TH1=-(SYSCLK/BAUDRA TE/16);TR1=1;CKCON|=0x10;PCON|=0x80;TI0=1;TR0 = 1;ES0 =1; //UART0中断开启ADC时候要屏蔽TR1 = 1; //启动定时器T1}//定时器初始化void Timer3_Init(uint counts){TMR3CN = 0x00; //禁止定时器T3,清TF3,采用SYSCLK/12为时基TMR3RL = -counts; //初始化重装载值TMR3 = 0xffff; //设置为立即重装载EIE2 |= 0x01; //T3中断开启TMR3CN |= 0x04; //启动T3}//发送单个字符void Send_Char(uchar ch){SBUF0 = ch; //送入缓冲区1while(TI0 == 0); //等待发送完毕TI0 = 0; //软件清零}//发送字符串,调用Send_Char() len字符串长度void Send_String(uchar * str,uint len){uint k = 0;do{Send_Char(*(str + k));k++;} while(k < len);}//定时器3中断服务程序void Timer3_ISR(void) interrupt 14 using 0{TMR3CN &= ~(0x80); //清TF3LED = ~LED;}//UART0中断服务程序. 接收字符void UART0_ISR(void) interrupt 4 using 1{uchar rxch;if(RI0) //中断标志RI0=1 数据完整接收{RI0 = 0; //软件清零rxch = SBUF0; //读缓冲if(readCounts>=MAX_LEN){readCounts = 0;readFlag = 1;}trdATa[readCounts] = rxch; //存入数组,供发送readCounts++;}}//ADC0_Init//配置ADC0使用定时器3溢出作为转换启动信号,转换信号结束时候产生中断,使用左对齐输出方式//允许ADC0,但保持ADC0转换结束中断为禁止状态void ADC0_Init(void){ADC0CN=0x04; //定时器3 溢出启动ADC0 转换REF0CN=0x07; //内部偏压发生器工作,内部电压基准缓冲器工作。

C8051F320AD转换和温度传感器

C8051F320AD转换和温度传感器

C8051F320部有一个10位逐次逼近型ADC,可以工作在单端方式或者差分方式。

一、简要原理单片机集成了2个多路选择器,分别作为ADC的正输入信号和负输入。

正输入端由寄存器AMX0P控制输入信号,可以是P1~P3、温度传感器、VDD之一;负输入端由寄存器AMX0N控制输入信号,可以是P1~P3、VREF、GND之一。

单负输入端选择GND时,采用单端方式;其他情况则采用差分方式,即用正端相对于负端的电压进行转换。

*采用并行口作为输入信号时,必须将对应输入引脚设为模拟输入,并且对应的SKIP要设置为1,即跳过二、寄存器1、转换结果保存在两个8位寄存器ADC0H和ADC0L中,由于转换结果是10位,可以自由选择在寄存器中采用左对齐或者右对齐(下详)单端方式下,转换结果直接保存为10位的无符号数差分方式下,结果保存为10位有符号整数(原说明:2的补码。

未深究)2、温度传感器的输出电压由下面公式决定:V = 2.86(T)+ 776 (单位mv)从图表看,最高只能在1000mv左右,也就是10 0°时仅1V上下3、AD启动方式有六种启动方式,包括四个定时器溢出启动、特定位置1启动和P0.6上升沿启动。

(下详)采用中断时,中断号interrupt 104、跟踪方式对跟踪不是很理解!5、寄存器AMX0P,正输入通道选择寄存器00H~10H,对应P1.0~P3.0 0x1E对应温度传感器0x1F对应VDD 寄存器XMXON,负输入通道选择寄存器00H~10H,对应P1.0~P3.0 0x1E对应VREF 0x1F对应GND,此时为单端方式6、寄存器ADC0CF,配置寄存器,控制转换时钟,和数据保存方向D7~D3 时钟控制位,大意就是分频数,系统时钟与AD时钟的比值减1D2,为0时数据右对齐,为1时左对齐7、寄存器ADC0CN,控制寄存器。

D7,AD使能,0时禁止转换D6,跟踪方式,不懂D5,中断标志位,要手动清0D4,读取时为忙标志位,写入时可为启动标志位,但不知道要不要清0D3,窗口比较中断标志,不是很清楚D2~D0 转换方式选择,且受到D6影响。

C8051F040的ADC程序

C8051F040的ADC程序

//----------------------------------------------------------------------------// 16-bit SFR Definitions for 'F04x //----------------------------------------------------------------------------sfr16 sfr16 sfr16 sfr16 sfr16 sfr16 sfr16 sfr16 sfr16 sfr16 sfr16 sfr16 sfr16 DP RCAP2 RCAP3 RCAP4 TMR2 TMR3 TMR4 ADC0 ADC0GT ADC0LT DAC0 DAC1 CAN0DAT = = = = = = = = = = = = = 0x82; 0xCA; 0xCA; 0xCA; 0xCC; 0xCC; 0xCC; 0xBE; 0xC4; 0xC6; 0xD2; 0xD2; 0xD8; // // // // // // // // // // // // // data pointer Timer2 reload/capture value Timer3 reload/capture value Timer4 reload/capture value Timer2 counter/timer Timer3 counter/timer Timer4 counter/timer ADC0 data ADC0 greater than window ADC0 less than window DAC0 data DAC1 data CAN data window
#define SAMPLE_DELAY 2500 #define ANALOG_INPUTS 4

C8051F020单片机完成16路信号源的输出

C8051F020单片机完成16路信号源的输出
个数字 I/O 引脚;具有 12 位 100kps 的 8 通道 ADC,带 PGA 和多路模拟开关 ; 具有 2 个 12 位 DAC,具有可编程数据更新方式;64K 可在系统编程的 FLASH 存储 器;4352 字节的片内 RAM;可寻址 64K 字节地址空间的数据存储器接口:2 个 UART 串行接口。基于以上优良特性,故选用该单片机。
二、系统方案论证
本系统有 DA 输出部分、AD 反馈部分、串口输出部分组成,系统框图下:
URAT输 出
电脑上 位机
DA
单片机
AD
多路模 拟开关
跟随输 入
采样保 持部分
滤波电 路
放大部 分
16选1开 关
16路信 号输入
输出
1.单片机部分
图 1.系统流程图
单片机选用 C8051F020,是完全集成的混合信号系统级 MCU 芯片,具有 64
图 14.放大输出电路
图 15.仿真波形
5.串行通信方式的选择与上位机的选择
单片机通过 URAT 发送数据至上位机长采用以下 2 种方法即通过蓝牙或 TTL 转串口线将单片机数据发送到电脑上位机。其中由于蓝牙使用较为方便, 故采用集成蓝牙模块。上位机需要直观显示单片机发出数据,故采用 Serial_Digital_Scope V2。
系统集成与应用 实验报告
2013/2014 学年第 2 学期
学生姓名:
*杰
学 号:
*
学 院:
仪器与电子学院
专 业:
电子科学与技术
题 目 : 用 C8051F020 单片机完成 16 路信号源的输出
指导教师: 焦新泉 2014 年 5 月 15 日
一、 设计任务与要求

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];。

第11讲 C8051F020 模数(AD)转换系统

第11讲 C8051F020 模数(AD)转换系统
AD0BUSY 位在转换期间被置‘1’,转换结束后复‘0’。AD0BUSY 位的 下降沿触发一个中断(当被允许时)并将中断标志AD0INTADC0CN.5)置 ‘1’。 转换数据被保存在ADC数据字的MSB 和LSB 寄存器
11.2.4 数据寄存器及数据格式
AD0LJST:ADC0 数据左对齐选择位。 0:ADC0H:ADC0L 寄存器数据右对齐。 1:ADC0H:ADC0L 寄存器数据左对齐。
可编程转换速率,最大500ksps 8 个外部输入 可编程放大器增益:4、2、1、0.5
11.2 12 位模/数转换器ADC0
11.2.1 模拟多路开关和PGA
(1)模拟输入方式的选择:单端输入/差分输入 Differential pair inputs: + V V can be positive or negative
第 11 讲
C8051F020 模数转换系统
1.1 概述
1.1.1 12 位模/数转换器ADC0
可编程转换速率,最大100ksps
可多达8
个外部输入;可编程为单端输入或差分输入 可编程放大器增益:16、8、4、2、1、0.5 数据相关窗口中断发生器 内置温度传感器(±3°C)
1.1.2 8位模/数转换器ADC1
(2)转换时钟设定 ADC0的转换时钟来源于系统时钟,AD0SC4-0: ADC0 转换时钟周期控制位。 ADC0 时钟应小于或等于2.5MHz
ADC0CF:A1.2.3 ADC0工作方式
(1)启动转换
有4 种转换启动方式,由ADC0CN 中的ADC0 启动转换方式位 (AD0CM1,AD0CM0)的状态决定。转换触发源有:
00---向ADC0CN 的AD0BUSY 位写1; 01---定时器3 溢出(即定时的连续转换); 10---外部ADC 转换启动信号的上升沿,CNVSTR; 11---定时器2 溢出(即定时的连续转换)。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include"c8051f020.h"
#include"math.h"
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define jpan P1 //定义键盘
float DA_data; //DA数据
unsigned char Dkey;
void SysclkInit(void) //晶振初始化{
unsigned int i;
OSCXCN=0x67;
for(i=0;i<256;i++);
while(!(OSCXCN&0x80));
OSCICN=0x88;
}
void DACInit(void) //DAC的初始化{
REF0CN=0x03;
DAC0CN=0x80;
DAC1CN=0x80;
}
void delay1(int ms) //延时
{
while(ms--)
{
uchar i;
for(i=0;i<250;i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
void keyscan(void) //键盘扫描
{
uchar temp,key;
jpan=0x0F; //低四位输入delay1(1);
temp=jpan; //读P3口
temp=temp&0x0F;
temp=~(temp|0xF0);
if(temp==1)
key=0;
else if(temp==2)
key=1;
else if(temp==4)
key=2;
else if(temp==8)
key=3;
else
key=16;
jpan=0xF0; //高四位输入
delay1(1);
temp=jpan; //读P3口
temp=temp&0xF0;
temp=~((temp>>4)|0xF0);
if(temp==1)
key=key+0;
else if(temp==2)
key=key+4;
else if(temp==4)
key=key+8;
else if(temp==8)
key=key+12;
else
key=16;
switch(key)
{
case 0 :key=2;break;
case 1 : key=1;break;
case 2 : key=12;break;
case 3 : key=3;break;
case 4 : key=13;break;
case 5 : key=0;break;
case 6 : key=15;break;
case 7 : key=14;break;
case 8 : key=8;break;
case 9 : key=7;break;
case 10 : key=10;break;
case 11 : key=9;break;
case 12 : key=5;break;
case 13 : key=4;break;
case 14 : key=11;break;
case 15 : key=6;break;
default: key=16;
}
if(key==7)
{
DA_data=DA_data+1000; }
if(key==8)
{
DA_data=DA_data+100; }
if(key==9)
{
DA_data=DA_data+10;
}
if(key==10)
{
DA_data=DA_data+1;
}
if(key==4)
{
DA_data=DA_data-1000;
}
if(key==5)
{
DA_data=DA_data-100;
}
if(key==6)
{
DA_data=DA_data-10;
}
if(key==11)
{
DA_data=DA_data-1;
}
jpan=0x0f;
while(jpan!=0x0f);
}
void keydown(void) //检测是否按下键盘
{
jpan=0xF0;
if(jpan!=0xF0)
{
delay1(60);
if(jpan!=0xf0)
{
keyscan();
Dkey=1;
}
delay1(60);
}
}
void main(void)
{
// float Date;
// float vc;
WDTCN=0xde;
WDTCN=0xad; //禁止看门狗定时
P1MDOUT=0xff; //P1口推挽
XBR2=0x40;//使能交叉开关
SysclkInit();//晶振初始化
DACInit(); //DAC初始化
while(1)
{
keydown(); //键盘检测
if(Dkey)
{
Dkey=0;
DAC0L=(unsigned int ) DA_data;//低字节数据寄存器DAC0H=((unsigned int)DA_data)>>8;//高字节
DAC1L=(unsigned int ) DA_data;
DAC1H=((unsigned int)DA_data)>>8;
}
}
}。

相关文档
最新文档