ad0804转换器通过12864显示的c编程

合集下载

12864液晶经典驱动程序,一看就懂,有详细的注释(C语言编写,不看后悔)

12864液晶经典驱动程序,一看就懂,有详细的注释(C语言编写,不看后悔)

这个程序写得很好,自己也是看的别人写的很好的程序,但是它代码不够完整,注释不详细,经过自己的修改加以完善。

另外我发现很多的测试代码都没有附上测试代码效果图,在本人的代码下面有自己拍的效果图,填补不足之处。

自己在找资料的过程中花掉很多的财富值,如果大家看得起该代码请评五分加以下载,在下感激不尽!/*******************************************程序名称:12864液晶经典驱动程序(带中文字库)功能:12864测试程序修改作者:王程修改时间:2014年2月5日23:22:32********************************************/#include<reg52.h>#define uchar unsigned char#define uint unsigned int// P0 为数据口sbit LCD_RS=P2^0; //数据、命令选择端口sbit LCD_RW=P2^1; //液晶读写控制sbit LCD_EN=P2^2; //液晶使能控制sbit PSB = P2^4; //模式选择1为并行0为串行sbit RES = P2^5;//复位端口低电平复位,上电之前进行复位,为了稳定!unsigned char code DAT[] = "我爱我家"; //测试显示的汉字,下面的A为测试显示的英文/*******************************************函数名称:Delay_1ms (晶振为12M)功能:延时约1ms的时间参数:无返回值:无********************************************/void delay_1ms(uint x){uint i,j;for(j = 0;j < x;j++)for(i=0;i<110;i++);}/*******************************************函数名称:write_cmd功能:向液晶中写控制命令参数:cmd--控制命令返回值:无********************************************/void write_cmd(uchar cmd){uchar lcdtemp = 0;LCD_RS=0;LCD_RW=1;do //经典判忙方式,精简{LCD_EN=1;delay_1ms(2);lcdtemp = P0;LCD_EN=0;}while(lcdtemp & 0x80);LCD_RW=0;P0 = cmd;LCD_EN=1;delay_1ms(5);LCD_EN=0;}/*******************************************函数名称:write_data功能:向液晶中写显示数据参数:dat--显示数据返回值:无********************************************/ void write_data(uchar dat){uchar lcdtemp = 0;LCD_RS=0;LCD_RW=1;do //经典判忙方式{LCD_EN=1;delay_1ms(2);lcdtemp = P0;LCD_EN=0;}while(lcdtemp & 0x80);LCD_RS=1;LCD_RW=0;P0 = dat;LCD_EN=1;delay_1ms(5);LCD_EN=0;}/*******************************************函数名称:lcd_int功能:初始化液晶模块参数:无返回值:无********************************************/void lcd_int(void){delay_1ms(40); //大于40MS的延时程序PSB=1; //设置为8BIT并口工作模式delay_1ms(1); //延时RES=0; //复位delay_1ms(1); //延时RES=1; //复位置高delay_1ms(10);write_cmd(0x30); //基本指令集delay_1ms(5);write_cmd(0x30); //基本指令集delay_1ms(5);write_cmd(0x08); // 地址归位delay_1ms(5);write_cmd(0x10); //光标设置delay_1ms(5);write_cmd(0x0c); //整体显示打开,游标关闭delay_1ms(5);write_cmd(0x01); //清除显示delay_1ms(5);write_cmd(0x06); //游标右移delay_1ms(5);write_cmd(0x80); //设定显示的起始地址delay_1ms(5);}函数名称:main功能:测试1602初始化函数模块参数:无返回值:无********************************************/void main(){uchar i;char *a = DAT;//使用指针,指向字符串地址lcd_int();write_data('A'); //每个显示都是用的两个字节,必须写两次write_data(' ');//再写一次,不然乱显示(如果不加就再显示一个别的字母)for(i=0;i<8;i++){write_data(*a);//将地址当作数据传给12864a++;//一个汉字传送两次,因为一个汉字占用两个字节,两次传完}write_cmd(0x90);//一行显示八个汉字,第一行0x80-87,第二行0x90开始a = DAT;for(i=0;i<8;i++){write_data(*a);a++;}while(1); //停住,不然重复的初始化显示,作为测试用}/*******************************************代码测试效果图片两两张由于曝光度影响,拍了两张********************************************/。

12864液晶串行显示C程序

12864液晶串行显示C程序

Temp_data = W_bits;
Temp_data <<= i;
if((Temp_data&0x80)==0) //bit7 is zero
{
SID = 0;
nop;
SCLK = 1;
nop;
nop;
SCLK = 0;
nop;
SID = 0;
}
else
//bit7 is one
{
SID = 1;
if(RW == 0) {
S_ID &=~ 0x04; } else //if(RW==1) {
S_ID |= 0X04; } if(RS == 0) {
S_ID &=~ 0x02; } else //if(RS==1) {
S_ID |= 0X02; } H_data = W_data; H_data &= 0xf0; //屏蔽低 4 位的数据 L_data = W_data; //xxxx0000 格式 L_data &= 0x0f; //屏蔽高 4 位的数据 L_data <<= 4; //xxxx0000 格式 CS = 1; Write_8bits(S_ID); //发送 S_ID Write_8bits(H_data); //发送 H_data Write_8bits(L_data); //发送 L_data CS = 0; } /******************************************************************** 函 数 名:Write_8bits 入口参数:W_bits 出口参数:无 函数作用:负责串行输出 8 个 bit 位 ********************************************************************/ void Write_8bits(uint W_bits) { uint i,Temp_data; for(i=0; i<8; i++) {

12864LCD串行操作C程序

12864LCD串行操作C程序

12864LCD串行控制C程序下面是一个最简单的12864液晶串行控制程序,没什么花样,只是想帮助大家学习掌握控制一个串行的12864液晶的基本原理。

无论是12864的并行操作还是串行操作,12864液晶与12232液晶的操作时序几乎完全一样,打家学习的时候可以参考一下12232的时序图(方便理解),郭天祥的《51单片机C语言教程》156页中就讲到了12232液晶的使用例程。

一、时序图1、12232时序图2、12864时序图二、液晶引脚对应图三、12864液晶与单片机接口(程序中PSB没接,RST接高电平,NC悬空)四、程序:#include<reg52.h>#define uint unsigned int#define uchar unsigned charsbit CS=P2^6;//片选信号线,接12864的RS端sbit SID=P2^5;//串行数据线,接12864的RW端sbit SCLK=P2^7;//串行时钟信号线,接12864的EN端//uchar a;uchar code word[]={"我好喜欢你啊"};//12864LCD显示内容//函数声明void lcd_init();//声明液晶初始化函数void write_com(uchar com);//声明'写入命令控制字节'函数void write_date(uchar dat);//声明'写入数据控制字节'函数void delayms(uint x);//声明延时函数//液晶初始化函数void lcd_init(){delayms(10);write_com(0x30);//基本指令操作write_com(0x0c); //显示开,关光标write_com(0x10);//设置地址计数器AC为00H,并将游标移到开头原点位置write_com(0x06);//游标及显示右移一位write_com(0x01);//清除液晶显示内容}//向12864写入命令函数/* 串行数据由三个字节构成,第一个为命令控制字节,第二个为由命令字节高四位低四位补零构成的字节,第三个为由命令字节低四位左移四位低四位补零后构成的字节*/void write_com(uchar com){uchar i;uchar i_data;i_data=0xf8;//0xf8是命令控制字节,它比表示写入的内容com是一个命令CS=1;//写入之前令片选信号CS为1(这是时序要求的)SCLK=0;//写入之前令时钟信号CLK为1(这也是时序要求的)for(i=0;i<8;i++)//写入命令控制字节{SID=(bit)(i_data&0x80);SCLK=1;SCLK=0;i_data=i_data<<1;}i_data=com;i_data&=0xf0;for(i=0;i<8;i++)//写入命令的高四位{SID=(bit)(i_data&0x80);//取得命令的最高位给液晶串行总线SCLK=1;SCLK=0; //每写一位SCLK都要有一个下降沿(时序要求)i_data=i_data<<1; //命令字节左移一位(取命令的次高位给液晶串行总线)}i_data=com;i_data<<=4;//命令字节左移4位,即把低四位移到高四位for(i=0;i<8;i++)//写入命令的低四位{SID=(bit)(i_data&0x80);//取得命令字节移位后的最高位给液晶串行总线SCLK=1;SCLK=0;i_data=i_data<<1; //移位后命令字节左移一位(每一次移位前的次高位给液晶串行总线)}CS=0; //写入命令控制字节后令片选信号CS为0delayms(10);}//向12864写入数据函数void write_date(uchar dat){uchar i;//第三个为由数据低四位左移四位后低四位补零构成的字节uchar i_data;i_data=0xfa;//(数据控制字节为0xfa)CS=1;SCLK=0;for(i=0;i<8;i++)//写入数据控制字节{SID=(bit)(i_data&0x80);//取得数据控制字节的最高位给液晶串行总线SCLK=1;SCLK=0;//每写一位SCLK都要有一个下降沿(时序要求)i_data=i_data<<1;//数据控制字节左移一位(取命令控制字节的次高位给液晶串行总线)}i_data=dat;i_data&=0xf0;//取数据字节的高四位for(i=0;i<8;i++)//写入数据的高四位{SID=(bit)(i_data&0x80);//(以下跟写入命令函数的注释同理)SCLK=1;SCLK=0;i_data=i_data<<1;}i_data=dat;i_data<<=4;for(i=0;i<8;i++)//写入数据的低四位{SID=(bit)(i_data&0x80);SCLK=1;SCLK=0;i_data=i_data<<1;}CS=0;delayms(10);}//延时函数void delayms(uint x) //延时x ms{uint i,j;for(j=x;j>0;j--)for(i=110;i>0;i--);}//主函数void main(){uchar b; //定义计算写入显示内容数量的变量lcd_init(); //初始化液晶write_com(0x90); //写入显示位置for(b=0;b<12;b++) //b要12是因为要显示6个中文{write_date(word[b]); //写入要显示的内容}while(1);}。

ADC0804工作原理其程序

ADC0804工作原理其程序

前言:本文详细说明了ADC0804工作原理及过程,还附有一个ADC0804在单片机中的典型应用,包含原理图,源程序,程序注释详细清楚,这有助于更好地理解与应用ADC0804芯片。

1、A/D转换概念:即模数转换(Analog to DigitalConversion),输入模拟量(比如电压信号),输出一个与模拟量相对应的数字量(常为二进制形式)。

例如参考电压VREF为5V,采用8位的模数转换器时,当输入电压为0V时,输出的数字量为0000 0000,当输入的电压为5V时,输出的数字量为1111 1111。

当输入的电压从从0V到5V变化时,输出的数字量从0000 0000到1111 1111变化。

这样每个输入电压值对应一个输出数字量,即实现了模数转换。

2、分辨率概念:分辨率是指使输出数字量变化1时的输入模拟量,也就是使输出数字量变化一个相邻数码所需输入模拟量的变化值。

分辨率与A/D转换器的位数有确定的关系,可以表示成FS / 2 n 。

FS表示满量程输入值,n 为A/D转换器的位数。

例如,对于5V的满量程,采用4位的ADC时,分辨率为5V/16=0.3125V (也就是说当输入的电压值每增加0.3125V,输出的数字量增加1);采用8位的ADC时,分辨率为5V/256=19.5mV(也就是说当输入的电压值每增加19.5mV,则输出的数字量增加1);当采用12位的ADC时,分辨率则为5V/4096=1.22mV(也就是说当输入的电压值每增加1.22mV ,则输出的数字量增加1)。

显然,位数越多,分辨率就越高。

3、ADC0804引脚功能:。

12864液晶显示资料及程序

12864液晶显示资料及程序

12864液晶显示资料及程序控制器2010-12-30 10:39:29 阅读36 评论0 字号:大中小订阅硬件连接方式是:并口直接访问。

这是汉字显示程序:#include<reg51.h>#include<absacc.h>#define uchar unsigned char#define datawr 0x1200 //写数据通道#define comwr 0x1000 //写控制命令通道#define datare 0x1300 //读数据通道#define comre 0x1100 //读忙通道uchar code disp_data[]={" 浙江大学" //第一行,第一页"04级通信工程一班" //第三行" 宁波理工学院" //第二行" 竞赛小组" //第四行"128X64液晶显示器" //第一行,第二页" 测试程序" //第三行" 07年07月25日" //第二行" Tornado "}; //第四行void set12864();void write_command(uchar command);void write_page(uchardata_add);void read_page(uchardata_add);void delays(ucharcont);void main(){while(1){set12864(); //初始化12864write_page(0); //写入一页数据read_page(0x30); //读出一页数据到内部RAMdelays(2); //延时2swrite_page(64); //写入下一页数据delays(2); //延时2s}}void set12864(){write_command(0x30); //功能设定控制字write_command(0x0c); //显示开关控制字write_command(0x01); //清除屏幕控制字write_command(0x06); //进入设定点控制字}//写控制命令子程序void write_command(uchar command){bit flag=1; //12864空闲标志位while(flag) //检查12864是否空闲flag="XBYTE"[comre]&0x80;XBYTE[comwr]=command; //空闲传送控制字}//写一页子程序void write_page(uchardata_add){bit flag=1; //12864空闲标志位ucharnum=64; //64个循环,连续写入32个汉字或是64个西文字符write_command(0x80);for(;num>0;num--){while(flag) //检查12864是否空闲flag="XBYTE"[comre]&0x80;XBYTE[datawr]=disp_data[data_add++]; //空闲传送数据}}//读一页子程序void read_page(uchardata_add){bit flag=1; //12864空闲标志位ucharnum=64; //64个循环,连续写入32个汉字或是64个西文字符write_command(0x80);for(;num>0;num--){while(flag) //检查12864是否空闲flag="XBYTE"[comre]&0x80;DBYTE[data_add++]=XBYTE[datare]; //空闲传送数据}}void delays(uchar count){unsigned char h,i,j,k;do{for(h=5;h>0;h--)for(i=4;i>0;i--)for(j=116;j>0;j--)for(k=214;k>0;k--);}while(--count);}这是图象显示程序:#include<reg51.h>#include<absacc.h>#define uchar unsigned char#define uint unsigned int#define datawr 0x1200 //写数据通道#define comwr 0x1000 //写控制命令通道#define datare 0x1300 //读数据通道#define comre 0x1100 //读忙通道uchar code disp_data[] = // 数据表{0x00,0x01,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x80,0x00,0x00,0x00,0x00,0x00,0x07,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC0,0x00,0x00,0x00,0x00, 0x00,0x07,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xE0,0x00,0x00,0x00,0x00, 0x00,0x0F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF0,0x00,0x00,0x00,0x00, 0x00,0x0F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF8,0x00,0x00,0x00,0x00, 0x00,0x1F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFC,0x00,0x00,0x00,0x00, 0x00,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0x80,0x00,0x00,0x00, 0x00,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x03,0xFF,0xFF,0xFF, 0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x07,0xFF,0xFF, 0x01,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x80,0x00,0x0B,0xFF, 0x01,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x80,0x00,0x00,0x1F, 0x01,0xFF,0xFF,0xFF,0xFF,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC0,0x00,0x00,0x00, 0x01,0xFF,0xFF,0xFF,0xF3,0x79,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC0,0x00,0x00,0x00, 0x03,0xFF,0xFF,0xFF,0xE6,0x62,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xE1,0x60,0x00,0x68, 0x01,0xFF,0xFF,0xFE,0x00,0x60,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xE1,0x00,0x00,0x0E, 0x01,0xFF,0xFF,0xF8,0x00,0x4B,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF0,0x8E,0x08,0x79,0x07,0xFF,0xFF,0xF0,0x00,0x41,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xE6,0xC0,0x07,0x61, 0xC3,0xFF,0xFE,0xC0,0x00,0x00,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xED,0xEF,0x3F, 0x83,0xFF,0xFE,0x60,0x00,0x00,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xC0,0xFF,0xFD,0xFC,0x6C,0x00,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xF0,0x7F,0xF3,0xFF,0xFE,0x60,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xF3,0xFF,0xFF,0x50,0x1F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC9, 0xFB,0xFF,0xF1,0xF8,0x8C,0xD8,0x1F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFB,0x6F,0xD9, 0xC2,0x3F,0xF8,0x40,0x00,0x00,0x1F,0xFF,0xFF,0xFF,0xFF,0xFF,0xF6,0xDF,0x1E,0xFF, 0xFF,0x7F,0xFC,0x38,0x00,0x00,0x1F,0xFF,0xFF,0xFF,0xFF,0xFF,0x64,0x2F,0x6F,0xFF, 0xFD,0x7B,0xFC,0x1F,0xE0,0x00,0x1F,0xFF,0xFF,0xFF,0xFF,0xFF,0x5F,0x7C,0xEE,0xFF, 0xC7,0xFF,0xBC,0x0F,0xFF,0x00,0x03,0xFF,0xFF,0xFF,0xFF,0xFF,0xDF,0xFE,0xEF,0xFF, 0xFF,0xE7,0xDC,0x07,0xE7,0xF8,0x12,0x7F,0xFF,0xFF,0xFF,0xFF,0x47,0xFF,0xFF,0xFF, 0xFF,0xE7,0x80,0x03,0xF4,0x00,0x00,0x5F,0xFF,0xFF,0xFE,0xFE,0xE3,0xFF,0xFF,0xFF, 0xFF,0xFE,0xC0,0x01,0xC0,0x00,0x00,0x1B,0xFF,0xFF,0xFB,0xFF,0xFF,0xFF,0xFF,0xFF, 0x7F,0xEE,0xC0,0x00,0xC0,0x00,0x00,0x03,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFE,0x98,0x00,0x00,0x00,0x00,0x00,0x03,0xFF,0xFF,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF, 0x20,0x0E,0x60,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x8F,0xFF,0xFF,0xFF,0xFF,0xFF,0x05,0x80,0xE0,0x00,0x00,0x00,0x00,0x01,0xFF,0xFD,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0x09,0x80,0xA0,0x00,0x00,0x00,0x00,0x01,0xFF,0xFF,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0x85,0x2A,0xC0,0x00,0x00,0x00,0x00,0x01,0xFF,0xFB,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE, 0xBF,0xF3,0xC0,0x00,0x00,0x00,0x00,0x00,0xFF,0xF7,0xFF,0xFF,0xFF,0xFF,0xFF,0xF8, 0xFF,0xFF,0x80,0x00,0x00,0x00,0x00,0x01,0xFF,0xE0,0xFF,0xFF,0xFF,0xFF,0xFF,0x00, 0xFF,0xFF,0x80,0x00,0x00,0x00,0x00,0x00,0xFF,0xC0,0xFF,0xFF,0xFF,0xFF,0xC0,0x1F, 0xFF,0xFF,0x80,0x00,0x40,0x00,0x00,0x00,0xFF,0x80,0xFF,0xFF,0xFF,0x80,0x07,0xFF,0xFF,0xFF,0xC0,0x00,0xC0,0x00,0x00,0x01,0xFF,0x01,0xFF,0xFF,0xF8,0x00,0xFF,0xFF, 0xFF,0xFF,0xE0,0x63,0x80,0x00,0x00,0x01,0xFE,0x01,0xFF,0x18,0x00,0x3F,0xFF,0xFF,0xFF,0xFF,0xFE,0x00,0x00,0x00,0x00,0x01,0xCC,0x01,0xFE,0x00,0x07,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFE,0x00,0x00,0x00,0x00,0x07,0xA0,0x03,0xFC,0x00,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFE,0x00,0x00,0x00,0x00,0x05,0xC0,0x03,0xC8,0x00,0x7F,0xFF,0xFF,0xFF, 0xFF,0xFF,0xFE,0x00,0x00,0x00,0x00,0x19,0x00,0x00,0x88,0x0C,0x07,0xFF,0xFF,0xFF,0xFF,0xFF,0xFC,0x00,0x0C,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0xC0,0x7F,0xFF,0xFF, 0xFF,0xFF,0xF8,0x07,0x0F,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x0F,0xFF,0xFE,0xFF,0xFF,0xD0,0x07,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x03,0xFF,0xF8,0xFF,0xFC,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xFF,0xC0, 0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xFF,0xF8,0xFF,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x1F,0xFE,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x78,0x02,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x03,0xF0,0x78,0x00,0x00,0x00,0x00,0x00,0x02,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00,0x1F,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xF0,0x00,0x00,0x00,0x00,0x00,0x7F,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xE0,0x00,0x00,0x00,0x00,0x00,0x3F,0xFF,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x27,0xC0,0x00,0x00,0x00,0x00,0x00,0x01,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x80,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01 };void set12864();void setxy(ucharx,uchar y);void write_command(uchar command);void write_16byte(uintdata_add);void delays(uchar count);void main(){ucharx,y,i;while(1){y="0x80"; //设置液晶上半部分坐标x="0x80";delays(2); //延时2sset12864(); //初始化12864delays(2);for(i=0;i<32;i++) //写入液晶上半图象部分{ //写入坐标setxy(x,y);write_16byte(i*16); //连续写入16字节数据y++; //y轴地址加1}y="0x80"; //设置液晶下半部分坐标x="0x88";for(i=0;i<32;i++) //写入液晶下半图象部分{setxy(x,y); //写入坐标write_16byte((32+i)*16);//连续写入16字节数据y++; //y轴地址加1}write_command(0x34); //写入扩充指令命令write_command(0x36); //显示图象}}//初始化12864子程序void set12864(){write_command(0x30); //功能设定控制字write_command(0x0c); //显示开关控制字write_command(0x01); //清除屏幕控制字write_command(0x06); //进入设定点控制字}//设置绘图坐标void setxy(ucharx,uchar y){write_command(0x34); //写入扩充指令命令write_command(y); //写入y轴坐标write_command(x); //写入x轴坐标write_command(0x30); //写入基本指令命令}//写控制命令子程序void write_command(uchar command){bit flag="1"; //12864空闲标志位while(flag) //检查12864是否空闲flag="XBYTE"[comre]&0x80;XBYTE[comwr]=command; //空闲传送控制字}void write_16byte(uintdata_add){bit flag="1"; //12864空闲标志位ucharnum="16"; //16个循环,连续写入16个字节for(;num>0;num--){while(flag) //检查12864是否空闲flag="XBYTE"[comre]&0x80;XBYTE[datawr]=disp_data[data_add++]; //空闲传送数据}}//延时count秒子程序void delays(uchar count){unsigned char h,i,j,k;do{for(h=5;h>0;h--)for(i=4;i>0;i--)for(j=116;j>0;j--)for(k=214;k>0;k--);}while(--count);}。

STC15单片机内部ADC采集数据在LCD12864上显示的程序

STC15单片机内部ADC采集数据在LCD12864上显示的程序

敬告:没有51单片机基础的人请慎重下载高质量实用性51单片机STC15W系列程序(1),STC8A系列可参考STC15单片机内部ADC采集数据在LCD12864上显示的程序main主程序:#include "LCD12864.h"void ValToString(unsigned int tmp,unsigned char *buf);int main(){unsigned int tmp;unsigned char buf[4];P2M1 &= 0xE5;P2M0 &= 0xE5;// P1M1 &= 0x7F;P1M0 &= 0x7F;SPI_config();SPI_init();ADC_init();//delay(10);LCD12864_write1(0,0,5,"test:");LCD12864_write2(0,1,"hello!");while(1){tmp = ADC_getvalue();ValToString(tmp,buf);LCD12864_write1(0,2,sizeof(buf),buf);LCD12864_write2(0,3,buf);//delay(5000);}}void ValToString(unsigned int tmp,unsigned char *buf) {buf[0] = tmp/100 + '0';buf[1] =(tmp%100)/10 + '0';buf[2] = (tmp/10)%10 + '0';buf[3] = '\0';}/*******************************************************/LCD12864程序:#include"LCD12864.h"sbit SPI_cs = P2^4;void delay(unsigned int ms){unsigned int i;do{i = MAIN_Fosc / 13000;while(--i) ; //14T per loop}while(--ms);}//void delay(unsigned int t)//{// unsigned int i,j;// for(i=0; i<t; i++)// for(j=0; j<10; j++);//}void SPI_config(){SPCTL = 0x00;SPCTL |= 0xD0;SPSTAT |= 0xC0;IE2 &= 0xFD;AUXR1 &= 0xF7;AUXR1 |= 0x04;// AUXR1|=0X04; //½« SPI µ÷Õûµ½ P2.1 P2.2 P2.3 P2.4// AUXR1&=0XF7;// SPDAT = 0;// SPSTAT = 0x80|0x40; //Çå³ýSPI״̬λ// SPCTL = 0x40|0x10|0x80;}unsigned char SPI_write(unsigned char dat){SPDAT = dat;while(!(SPSTAT&0x80));SPSTAT = 0xC0;//SPSTAT = 0x80|0x40;return SPDAT;}void SPI_wcmd(unsigned char cmd){SPI_cs = 1;SPI_write(0xF8);SPI_write(cmd&0xF0);SPI_write((cmd&0x0F)<<4);//SPI_write((cmd<<4)&0xF0);delay(2);}void SPI_wdat(unsigned char dat){SPI_cs = 1;SPI_write(0xFA);SPI_write(dat&0xF0);SPI_write((dat&0x0F)<<4);//SPI_write((dat<<4)&0xF0);delay(2);}void LCD12864_write1(unsigned char x,unsigned char y,unsigned char len,unsigned char *buf){//SPI_wcmd(0x03);switch(y){case 0:x=x+0x80;break;case 1:x=x+0x90;break;case 2:x=x+0x88;break;case 3:x=x+0x98;break;default:break;}SPI_wcmd(x);while(len>0){SPI_wdat(*buf++);len--;}}void LCD12864_write2(unsigned char x,unsigned char y,unsigned char *buf){switch(y){case 0:x=x+0x80;break;case 1:x=x+0x90;break;case 2:x=x+0x88;break;case 3:x=x+0x98;break;default:break;}SPI_wcmd(x);while(*buf!='\0')//while(*buf>0){SPI_wdat(*buf++);//delay(50);}}void SPI_init(){//delay(100);SPI_wcmd(0x30);//delay(50);SPI_wcmd(0x0C);//delay(50);}//void display(unsigned char code *buf) //{// while(*buf>0)// {// SPI_wdat(*buf);// buf++;// delay(50);// }//}//void LCD12864_write2()//{// SPI_wcmd(0x03);// delay(50);//// SPI_wcmd(0x91);// display("ÎÒÊÇÈË");//}/*******************************************************/ADC程序:#include "LCD12864.h"unsigned int ADC_getvalue(){unsigned int val;ADC_CONTR |= 0xE7;//val = ADC_RES << 8;val = val | ADC_RESL;ADC_CONTR |= 0x08;//return val;}void ADC_init(){ADC_CONTR &= 0xEF; //0b 1 11 0 1 111;ADC_CONTR |= 0xE7;delay(10);P1ASF |= 0x80;CLK_DIV |= 0x20;EADC = 0;ADC_CONTR |= 0x08;}/*******************************************************/.h文件程序://1#ifndef _ADC_H#define _ADC_Hextern void ADC_init();extern unsigned int ADC_getvalue();#endif//2#ifndef _LCD12864_H#define _LCD12864_H#define MAIN_Fosc 11059200L#include "STC15.H"#include "intrins.h"#include "ADC.h"//sbit SPI_sid = P2^3;//sbit SPI_clk = P2^1;extern void SPI_config();extern void delay(unsigned int ms);extern void SPI_init();extern void LCD12864_write1(unsigned char x,unsigned chary,unsigned char len,unsigned char *buf);extern void LCD12864_write2(unsigned char x,unsigned char y,unsigned char *buf);//extern void LCD12864_write2();#endif。

adc0804工作原理

adc0804工作原理

adc0804工作原理ADC0804是一款8位的模数转换器,它的工作原理是将输入的模拟信号转换为相应的数字信号。

在本文中,我们将详细介绍ADC0804的工作原理及其应用。

我们来了解一下ADC0804的基本结构。

它由一个模拟输入多路选择器、一个采样保持电路、一个模数转换电路和一个8位输出缓冲器组成。

其中,模拟输入多路选择器用于选择输入的模拟信号,采样保持电路用于将模拟信号进行采样并保持在一个恒定的电平上,模数转换电路则将采样后的模拟信号转换为相应的数字信号,最后通过输出缓冲器输出。

ADC0804的工作原理主要分为两个步骤:采样和量化。

首先,当ADC0804接收到转换开始信号时,模拟输入多路选择器将选择一个模拟输入信号,并将其输入到采样保持电路中。

在采样保持电路中,模拟信号被采样并保持在一个恒定的电平上,以便进行后续的转换操作。

然后,采样后的模拟信号将被输入到模数转换电路中进行量化。

模数转换电路使用一个内部的参考电压进行比较,将输入的模拟信号与参考电压进行比较,并产生相应的数字信号。

ADC0804使用逐次逼近法进行模数转换,即通过不断逼近输入信号与参考电压之间的差值来确定输出的数字信号。

在模数转换的过程中,ADC0804将输入的模拟信号分成若干个等级,并通过比较电路将其转换为相应的数字信号。

比较电路根据输入信号与参考电压之间的差值来判断输出的数字信号是“0”还是“1”。

通过不断逼近的过程,ADC0804可以将输入的模拟信号转换为相应的8位二进制数字信号。

转换后的数字信号将通过输出缓冲器输出。

输出缓冲器可以将转换后的数字信号放大并输出到外部设备,如微处理器或显示器等。

ADC0804由于其简单的结构和易于使用的特点,在工业控制、仪器仪表、通信等领域得到了广泛的应用。

它可以将各种模拟信号转换为数字信号,并通过输出缓冲器输出给其他设备进行处理。

总结起来,ADC0804是一款基于逐次逼近法的8位模数转换器。

它通过采样和量化的过程将输入的模拟信号转换为相应的数字信号,并通过输出缓冲器输出给其他设备。

12864液晶显示源程序(方法2)

12864液晶显示源程序(方法2)

main函数:*****12864显示********//***作者:曹江*****//*****时间:2008 8 25 ********/#include<Lcd.h>#include<absacc.h>#include "AT89X51.h"//函数名:main() 主函数//函数参数:无//返回值:无void main(){reset(); //调用复位函数dison_off(1); //开lcd显示set_startline(0); // 从第0行开始从上至下滑动显示clear(); //清屏while(1){display();}}lcd.c子函数:#include "AT89X51.h"#include "Lcd.h"#include "data.h"#define uint unsigned int//函数名:delay() 延时函数//函数参数:uint v//返回值:无void delay(uint v){ uint i;while(v!=0){v--;for(i=125;i>0;i--);}}//函数名:busy_check() 检测忙状态左//函数参数:无//返回值:无void busy_check(void){unsigned char busy;while(busy&0x80){busy=0xff;}}//函数名:reset()复位函数//函数参数:无//返回值:无void reset(){P3_2=0; //接lcd复位端口RSTdelay(1);P3_2=1;delay(1);}//函数名:wcode(c,cs1,cs2)写指令函数//函数参数:uchar c, uchar cs1,uchar cs2//返回值:无void wcode(ucharc,uchar cs1,uchar cs2){busy_check();P3_4=cs1;P3_3=cs2;P3_7=0; //接lcd的rs端P3_6=0; //接lcd的rw端P1=c; //lcd数据端d0-d7P3_5=0; //接lcd的e端delay(5);P3_5=1;delay(5);P3_5=0;}//函数名:wdata(c,cs1,cs2)写数据函数//函数参数:uchar c, uchar cs1,uchar cs2//返回值:无void wdata(ucharc,uchar cs1,uchar cs2){busy_check();P3_4=cs1;P3_3=cs2;P3_7=1;P3_6=0;P1=c;P3_5=0;delay(1);P3_5=1;delay(1);P3_5=0;}//函数名:set_startline(i)设置起始行函数//函数参数:uchar i//返回值:无void set_startline(uchar i)//每次加一使其从第0行开始从上至下滑动显示{i=0xc0+i;wcode(i,0,0); //调用写指令函数}//函数名:set_adr(x,y)设置页值,起始列值函数//函数参数:uchar x,uchar y//返回值:无void set_adr(uchar x ,uchar y){x=x+0xb8; //X位址即页page起始0xb8y=y+0x40; //Y位址即列起始0x40wcode(x,0,0);//调用写函数wcode(y,0,0);}//函数名:dison_off(uint o)开关显示函数//函数参数:uint o//返回值:无void dison_off(uchar o){o=o+0x3e;wcode(o,0,0);}//函数名:clear() 清屏函数//函数参数:无//返回值:无void clear(){uchari,loop;for(i=0;i<8;i++){set_adr(i,0);for(loop=0;loop<64;loop++)wdata(0x00,0,0); //左右半屏同时写0}}//函数名:chinese(x,y,n,cs1,cs2) 汉字函数//函数参数:x,y,n,cs1,cs2 注:x,y为页和列号;n为字号;cs1,cs2为左右屏显示//返回值:无void chinese(ucharx,uchary,ucharn,uchar cs1,uchar cs2){ uchari,loop;for(i=0;i<2;i++){set_adr(x+i,y);//一字分上下两页写for(loop=0;loop<16;loop++){wdata(Chinese_Charcter[n][16*i+loop],cs1,cs2);}}}//函数名:display() 显示函数//函数参数:无//返回值:无void display(){uchar i;for(i=0;i<0xff;i++) //汉字上下滚屏显示{set_startline(i);chinese(0,32,0,1,0); //第0行第1个字“长”,屏左边显示chinese(0,48,1,1,0); //第0行第2个字“江”,屏左边显示chinese(0,0,2,0,1); //第0行第3个字“大”,屏右边显示chinese(0,16,3,0,1); //第0行第4个字“学”,屏右边显示chinese(2,16,4,1,0); //第1行第5个字“电”,屏左边显示chinese(2,32,5,1,0); //第1行第5个字“子”,屏左边显示chinese(2,48,6,1,0); //第1行第6个字“信”,屏左边显示chinese(2,0,7,0,1); //第1行第5个字“息”,屏右边显示chinese(2,16,8,0,1); //第1行第7个字“学”,屏右边显示chinese(2,32,9,0,1); //第1行第8个字“院”,屏右边显示chinese(4,32,10,1,0); //第2行第9个字“电”,屏左边显示chinese(4,48,11,1,0); //第2行第10个字“气”,屏左边显示chinese(4,0,12,0,1); //第2行第11个字“工”,屏右边显示chinese(4,16,13,0,1); //第2行第12个字“程”,屏右边显示chinese(4,32,14,0,1); //第2行第13个字“系”,屏右边显示chinese(6,48,15,1,0); //第6行第21个字“曹”,屏左边显示chinese(6,0,16,0,1); //第6行第22个字“江”,屏右边显示delay(10);i+=5;}}data.h:#ifndef _DATA_H_#define _DATA_H_//**********显示文字部分*********////左右分屏写,同页同行内按左到右顺序写extern uchar code Chinese_Charcter[25][32]={{/*-- 文字: 长--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x80,0x80,0x80,0x80,0xFF,0xA0,0xA0,0x90,0x90,0x88,0x84,0x82,0x80,0x80,0x80,0x00, 0x00,0x00,0x00,0x00,0xFF,0x40,0x21,0x12,0x04,0x08,0x10,0x30,0x60,0x20,0x00,0x00, },{/*-- 文字: 江--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x10,0x60,0x01,0xC6,0x30,0x00,0x04,0x04,0x04,0xFC,0x04,0x04,0x04,0x04,0x00,0x00, 0x04,0x04,0x7E,0x01,0x20,0x20,0x20,0x20,0x20,0x3F,0x20,0x20,0x20,0x20,0x20,0x00, },{/*-- 文字: 大--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x20,0x20,0x20,0x20,0x20,0x20,0xA0,0x7F,0xA0,0x20,0x20,0x20,0x20,0x20,0x20,0x00, 0x00,0x80,0x40,0x20,0x10,0x0C,0x03,0x00,0x01,0x06,0x08,0x30,0x60,0xC0,0x40,0x00, },{/*-- 文字: 学--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x40,0x30,0x10,0x12,0x5C,0x54,0x50,0x51,0x5E,0xD4,0x50,0x18,0x57,0x32,0x10,0x00, 0x00,0x02,0x02,0x02,0x02,0x02,0x42,0x82,0x7F,0x02,0x02,0x02,0x02,0x02,0x02,0x00, },{/*-- 文字: 电--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0xF8,0x48,0x48,0x48,0x48,0xFF,0x48,0x48,0x48,0x48,0xF8,0x00,0x00,0x00, 0x00,0x00,0x0F,0x04,0x04,0x04,0x04,0x3F,0x44,0x44,0x44,0x44,0x4F,0x40,0x70,0x00, },{/*-- 文字: 子--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x02,0x02,0x02,0x02,0x02,0xE2,0x12,0x0A,0x06,0x02,0x00,0x80,0x00,0x00, 0x01,0x01,0x01,0x01,0x01,0x41,0x81,0x7F,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x00, },{/*-- 文字: 信--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x80,0x40,0x30,0xFC,0x07,0x0A,0xA8,0xA8,0xA9,0xAE,0xAA,0xA8,0xA8,0x08,0x08,0x00, 0x00,0x00,0x00,0x7F,0x00,0x00,0x7E,0x22,0x22,0x22,0x22,0x22,0x7E,0x00,0x00,0x00, },{/*-- 文字: 息--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x00,0xFC,0x54,0x54,0x56,0x55,0x54,0x54,0x54,0xFC,0x00,0x00,0x00,0x00, 0x00,0x20,0x38,0x01,0x3D,0x41,0x41,0x45,0x59,0x41,0x41,0x71,0x00,0x08,0x30,0x00, },{/*-- 文字: 学--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x40,0x30,0x10,0x12,0x5C,0x54,0x50,0x51,0x5E,0xD4,0x50,0x18,0x57,0x32,0x10,0x00, 0x00,0x02,0x02,0x02,0x02,0x02,0x42,0x82,0x7F,0x02,0x02,0x02,0x02,0x02,0x02,0x00, },{/*-- 文字: 院--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0xFE,0x02,0x32,0x4A,0x86,0x0C,0x24,0x24,0x25,0x26,0x24,0x24,0x24,0x0C,0x04,0x00, 0xFF,0x00,0x02,0x04,0x83,0x41,0x31,0x0F,0x01,0x01,0x7F,0x81,0x81,0x81,0xF1,0x00, },{/*-- 文字: 电--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0xF8,0x48,0x48,0x48,0x48,0xFF,0x48,0x48,0x48,0x48,0xF8,0x00,0x00,0x00, 0x00,0x00,0x0F,0x04,0x04,0x04,0x04,0x3F,0x44,0x44,0x44,0x44,0x4F,0x40,0x70,0x00, },{/*-- 文字: 气--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x20,0x10,0x8C,0xA7,0xA4,0xA4,0xA4,0xA4,0xA4,0xA4,0xA4,0x24,0x04,0x04,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x30,0x40,0xF0,0x00, },{/*-- 文字: 工--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x02,0x02,0x02,0x02,0x02,0xFE,0x02,0x02,0x02,0x02,0x02,0x02,0x00,0x00, 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3F,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00, },{/*-- 文字: 程--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x10,0x12,0xD2,0xFE,0x91,0x11,0x80,0xBF,0xA1,0xA1,0xA1,0xA1,0xBF,0x80,0x00,0x00, 0x04,0x03,0x00,0xFF,0x00,0x41,0x44,0x44,0x44,0x7F,0x44,0x44,0x44,0x44,0x40,0x00, },{/*-- 文字: 系--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x02,0x22,0xB2,0xAA,0x66,0x62,0x22,0x11,0x4D,0x81,0x01,0x01,0x00,0x00, 0x00,0x40,0x21,0x13,0x09,0x05,0x41,0x81,0x7F,0x01,0x05,0x09,0x13,0x62,0x00,0x00, },{/*-- 文字: 曹--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x02,0x02,0xFA,0xAA,0xAA,0xAA,0xFF,0xAA,0xAA,0xFF,0xAA,0xAA,0xAA,0xFA,0x02,0x00, 0x00,0x00,0x00,0x7E,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x7E,0x00,0x00,0x00, },{/*-- 文字: 江--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x10,0x60,0x01,0xC6,0x30,0x00,0x04,0x04,0x04,0xFC,0x04,0x04,0x04,0x04,0x00,0x00, 0x04,0x04,0x7E,0x01,0x20,0x20,0x20,0x20,0x20,0x3F,0x20,0x20,0x20,0x20,0x20,0x00, },};#endif仿真效果图:。

我的51单片机之模数转换ADC0804的C语言和汇编编程

我的51单片机之模数转换ADC0804的C语言和汇编编程
//返回数据处理,LED 显示,Frequency 为转换频率 unsigned int DoWitchData(unsigned int Frequency) {
unsigned char AD[2];//存高低字节 unsigned int InputV;//最后处理结果 unsigned char i; InputV=ReadAD(); AD[1]=InputV&0xF0; AD[1]=AD[1]>>4; AD[0]=InputV&0x0F; InputV=ADH[AD[1]]+ADL[AD[0]]; for(i=0;i<Frequency;i++) {
//延时 void delay(unsigned char n) {
unsigned char i; for(i=0;i<n;i++) {
; } }
//AD 转换,P 口取数 unsigned char ReadAD() {
unsigned char ADData; RDA=1; WRA=1; InputPort=0xFF; WRA=0; _nop_(); WRA=1; delay(100); RDA=0; _nop_();_nop_();_nop_();_nop_();_nop_(); ADData=InputPort; _nop_();_nop_();_nop_();_nop_();_nop_(); RDA=1; _nop_(); return (ADData); }
//
{ 0 , 1, 2 , 3 , 4 , 5, 6, 7, 8,
//
9, A , b , C , d, e, f, 点, 息灯, }
sbit RDA=P3^7; sbit WRA=P3^6; sbit INTR=P3^3;

用12864做示波器(程序和图)

用12864做示波器(程序和图)

#include <reg51.h>#include <intrins.h>#include <ADC0808.c>sbit DI=P2^2; // 数据\指令选择sbit RW=P2^1; // 读\写选择sbit E=P2^0; // 读\写使能sbit CS1=P2^4; // 片选1sbit CS2=P2^3; // 片选2sbit busy=P1^7;sbit jia=P3^7;sbit jian=P3^3;sbit jia1=P3^0;sbit jian1=P3^1;unsigned int i;unsigned char ye,lei,shu; unsigned char a[94];char code t[]={0x00,0x00,0x08,0x00,0x04,0x00,0x02,0x00,0x01,0x80,0x40,0x60,0x80,0x00,0x7F,0xFF, //小0x00,0x00,0x00,0x20,0x00,0x40,0x00,0x80,0x01,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x80,0x00,0x82,0x00,0x82,0x00,0x82,0x40,0x82,0x80,0x82,0x7F,0xE2, //子0x00,0xA2,0x00,0x92,0x00,0x8A,0x00,0x86,0x00,0x80,0x00,0xC0,0x00,0x80,0x00,0x00,0x00,0x40,0x00,0x60,0x3F,0x5E,0x01,0x48,0x01,0x48,0xFF,0xFF,0x11,0x48,0x21,0x4C, //制0x1F,0x68,0x00,0x40,0x07,0xF8,0x40,0x00,0x80,0x00,0x7F,0xFF,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x40,0x00,0x20,0xFF,0xF8,0x00,0x87,0x00,0x40,0x00,0x30,0x00,0x0F, //作0xFF,0xF8,0x08,0x88,0x08,0x88,0x08,0xC8,0x0C,0x88,0x08,0x0C,0x00,0x08,0x00,0x00,};void checkstate(){//bit dat;DI=0;RW=1;//P1=0x00;do{E=1;E=0;//仅当第7位为0时才可操作(判别busy信号)}while(busy==1);}void writecommand(unsigned char command) //写命令{checkstate();DI=0;RW=0;P1=command;E=1;E=0;}void writedate(unsigned char date) //写数据{checkstate();DI=1;RW=0;P1=date;E=1;E=0;}void pianxuan(unsigned int i){if(i==1)CS1=0,CS2=1;if(i==2)CS1=1,CS2=0;if(i==3)CS1=0,CS2=0;}void cleanscreen() //清屏{unsigned char page,i;for(page=0xb8;page<0xc0;page++){writecommand(page);writecommand(0x40);for(i=0;i<64;i++)writedate(0x00);}}void init(void) //开显示,起始行0行{writecommand(0xc0);writecommand(0x3f);}void delay_50us(uint t){uchar j;for(;t>0;t--)for(j=19;j>0;j--);}void shuju(){pianxuan(i); writecommand(ye); writecommand(lei); writedate(shu);}void qing(){uchar i;for(i=0xb8;i<=0xbf;i++) {ye=i;shu=0x00;shuju();}}void main(){uint r,j,g=0,q,dianya=1,k,p;uchar U,m,l;pianxuan(3);cleanscreen();init();pianxuan(2);l=0xb8;for(k=0;k<4;k++,l=l+0x02){ye=l;lei=0x70;for(r=0;r<16;r++){shu=t[2*r+1+32*k];shuju();lei++;}ye=l+0x01;lei=0x70;for(r=0;r<16;r++){shu=t[2*r+32*k];shuju();lei++;}}while(1){uchar d1,d2,d3,d4,d5;aaa:do{adc();}while((AD!=128)&&(AD!=129)&&(AD!=130));U=AD;adc();if(U>AD)goto aaa;while(jia==0){while(jia==0);g=g+1;}while(jian==0){while(jian==0);if(g!=0) g=g-1;}while(jia1==0){while(jia1==0);dianya=dianya+1;}while(jian1==0){while(jian1==0);if(dianya!=1) dianya=dianya-1;}for(j=0;j<94;j++) //AD采样{adc();a[j]=AD;delay_50us(g);}lei=0x40;for(r=0,j=0;r<94;r++,j++){if(j<64) i=1;if(j==64) lei=0x40;if(j>=64)i=2;qing(); //清掉之前的内容AD=a[j]*0.196/dianya; //计算在12864的电压值if(AD<=7) ye=0xbf,shu=(0x80>>AD); else if(AD<=15) ye=0xbe,shu=0x80>>(AD-8); else if(AD<=23) ye=0xbd,shu=0x80>>(AD-16); else if(AD<=31) ye=0xbc,shu=0x80>>(AD-24); else if(AD<=39) ye=0xbb,shu=0x80>>(AD-32); else if(AD<=47) ye=0xba,shu=0x80>>(AD-40); else if(AD<=55) ye=0xb9,shu=0x80>>(AD-48); else if(AD<=63) ye=0xb8,shu=0x80>>(AD-56);if(r==0){d1=shu;d2=ye;}if(r!=0){d3=shu;d4=ye;if(ye==d2){if(shu>d1){d5=shu;d5=d5>>1;while(d5!=d1){d5=d5>>1;shu=shu|(shu>>1);}}if(shu<d1){d5=shu;d5=d5<<1;while(d5!=d1){d5=d5<<1;shu=shu|(shu<<1);}}if(ye<d2){for(q=0;q<7;q++){shu=shu|(shu<<1);}shuju();ye++;while(ye<d2) {shu=0xff,shuju(),ye++;}if(ye==d2){shu=0x01;if(shu<d1){d5=shu;d5=d5<<1;while(d5!=d1){d5=d5<<1;shu=shu|(shu<<1);}}}}if(ye>d2){for(q=0;q<7;q++){shu=shu|(shu>>1);}shuju();ye--;while(ye>d2) {shu=0xff,shuju(),ye--;}if(ye==d2){shu=0x80;if(shu>d1){d5=shu;d5=d5>>1;while(d5!=d1){d5=d5>>1;shu=shu|(shu>>1);}}}}}if(r!=0)d1=d3;d2=d4;}shuju();if(lei!=0x7f) lei++; }}}。

12864液晶显示C语言程序代码

12864液晶显示C语言程序代码
unsigned char code pic3[];
/******************************************************************/
/* 定义接口信息 */
DisplayGraphic(pic3); //显示图片3
delayms(200);
initinal(); //调用LCD字库初始化程序
delay(100); //大于100uS的延时程序
delay(100); //大于100uS的延时程序
TransferData(0x30,0); //Function Set
delay(37); ////大于37uS的延时程序
TransferData(0x08,0); //Display on Control
void TransferData(char data1,bit DI);
void display(void);
void display_grapic(void);
void delayms(unsigned int n);
void DisplayLine(unsigned char line1,unsigned char line2);
delay(100); //大于100uS的延时程序
TransferData(0x10,0); //Cursor Display Control光标设置
delay(100); //大于100uS的延时程序
/*-----------------------------------------------
名称:LCD12864 字库液晶 芯片组st7920
日期:2009.5

AD采样以及12864液晶显示成功程序

AD采样以及12864液晶显示成功程序
if(dat_comm)
sid=1; //数据
else
sid=0; //指令
clk=1;// rw完成
clk=0;//进行传送
sid=0;// rs=0,显示指令数据
clk=1;//
clk=0;//传送'0'
while(temp!=0xf0)//有键按下
{
delay(5);
temp=P0;
temp=temp&0xfe;
while(temp!=0xf0)
{
temp=P0;
switch(temp)
{
case 0x7b:num=7;break;
}
sid=0;
for(i=0;i<4;i++)
{
clk=1;
clk=0;
}
}
} /*一次攒的数据八位*/
/*---------------显示汉字或字符----------------*/
uint ad0809_dy()
{
uint ad_0809;
ABC=0;//选通通道,ABC同时接A8
oe=0;//以下三条指令为起动AD0809
st=0;
st=1;
st=0;
delay(1);
while(!eoc);//等待转换结束
oe=1;//取出读得的数据
case 0xbb:num=8;break;
case 0xdb:num=9;break;
case 0xeb:num=12;break;
}
while(temp!=0xf0)//松手检测

12864点阵型驱动程序(51单片机、c语言)

12864点阵型驱动程序(51单片机、c语言)
** 函 数 名:asc()
** 功能描述:在液晶显示器上写一个ASCII字符,写之前需要使用setxy()函数确定位置
** 输入参数:uchar ascii:字符对应的ascii码
** 输出参数:
** 返 回 值:
** 作 者:xiwangcumt
** 日 期:
**********************************************************/
** 功能描述:C语言下最精确最简单的延时函数,延时时间为2*t+2(us)
** 输入参数:t-延时时间参数
** 输出参数:
** 返 回 值:
** 作 者:xiwangcumt
** 日 期:
**********************************************************/
void setp(uchar n)
{
switch(n){
case 0: cs1=1;cs2=1; break;
case 1: cs1=1;cs2=0; break;
case 2: cs1=0;cs2=1; break;
default:break;}
}
/*********************************************************
** 输入参数:uchar dat
** 输出参数:
** 返 回 值:
** 作 者:xiwangcumt
** 日 期:
**********************************************************/

ADC0804模数转换与显示

ADC0804模数转换与显示

ADC 数模转换与现实(扩展用 1602 带电阻值显示)实验目的:1. 掌握ADC 的使用控制方法。

2. 实验内容:基本要求:设计一程序采集 ADC0809第3通道的电 压值,将其转换为数字量, 并在数码管上显示; 5V 显示为 255,0V 显示为 000。

3. 扩展要求:将转换结果以用 1602 表现出当前电阻值。

C 程序:#include<reg52.h>#include<intrins.h>#define uint unsigned int#define uchar unsigned char //ADC0804 CS 端//ADC0804 WR 端//ADC0804 RD 端//lcd 锁存器//lcd1602 EN 端 //lcd1602 RS 端 // 段选端// 位选端//52 系列单片机头文件//包含_nop_函数所在的头文件// 宏定义sbit CS=P2A 1;sbit wr=P2A4;sbit rd=P2A5;sbit lcd1=P2A3;sbit lcden=P2A2;sbit lcdrs=P2A0;sbit dula=P2A7; sbit wela=P2A6;// float r;uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71};void delay(uint xms) // 延时函数uint i,j;for(i=xms;i>0;i--)for(j=110;j>0;j--);void display(uchar bai,uchar shi,uchar ge) // 数码管显示函数// 打开段选dula=1;P0=table[bai]; // 送入百位dula=0; // 关闭段选P0=0xff; // 消隐wela=1; // 打开位选P0=0x7e; // 选择第一位wela=0; P0=0; delay(5);dula=1;P0=table[shi]; dula=0; P0=0xff; wela=1; P0=0x7d; wela=0; P0=0; delay(5);dula=1;P0=table[ge]; dula=0; P0=0xff; wela=1; P0=0x7b; wela=0; P0=0;// 关闭位选 // 消隐 // 延时delay(5); }void write_com(uchar com) {lcdrs=0;P0=com;delay(5);lcden=1;delay(5);lcden=0;}void write_data(uchar data1) {lcdrs=1;P0=data1;delay(5);lcden=1;delay(5);lcden=0;//1602 写指令//1602 写数据}void init() //1602 初始化{dula=0; // 关闭段选wela=0; // 关闭位选lcden=0; //lcden 置于低电平write_com(0x38); //设置16*2 显示,5*7 点阵,8位数据接口write_com(0x0c); // 设置开显示,不显示光标write_com(0x06); // 写一个字符后地址加1write_com(0x01); // 显示清0,数据指针清0}void lcd_display(uint ge,F1,F2,F3,F4) //lcd_ 显示(F1 小数点后一位F2 小数点后两位F3 F4){wela=0;dula=0;lcden=1;lcd1=1; // 打开lcd 锁存器// write_com(0x01);write_com(0x80); write_data(48+ge); delay(5); write_data('.'); delay(5);write_data(48+F1); delay(5); write_data(48+F2); delay(5); write_data(48+F3); delay(5);write_data(48+F4); delay(5); write_data('K'); delay(5); lcd1=0; // 关闭锁存器// 选择在 1602 第一行显示 //ascii 码 48 写入个位 // 延时void main() // 主程序{uchar a,A1,A2,A3,shu;uint ge,F1,F2,F3,F4;float r;init();CS=0;while(1){r=(255-shu)/256; // 转换公式wr=1;_nop_();wr=O; //启动A/D转换_nop_();wr=1;for(a=10;a>0;a--){ display(A1,A2,A3);}P1=0xff; //读取P1 口之前先给其写全1rd=1; // 选通AD0804 CS端_nop_();rd=0; //A/D 读使能_nop_();shu=P1; //A/D 数据读取赋给P1 口rd=1;A1=shu/100; // 数码管分出百十个A2=shu%100/10;A3=shu%10;ge=(int)r%10; //(int )字符型强制转换成整形1602 分出个位跟小数点后四位F1=(int)(r*10)%10;F2=(int)(r*100)%10;F3=(int)(r*1000)%10;F4=(int)(r*10000)%10;lcd_display(ge,F1,F2,F3,F4);}}仿真图:耳106*1Fa'^fn■Ort**" 通1*1・F』•… 申阳■口KEl&K.U b;C $|$ t.:27JKM ELAJI 忙-.j■皿j r2±^- 3 rZTJRTS 即O U B93.VT'D申PTr 33! STI 冲El罄宀X ri■au ff。

将光敏电阻adc后显示在12864上

将光敏电阻adc后显示在12864上

//此程序的实验板为郭天祥51单片机用的是郭天祥板子自带的AD 8位转换器数据输入口为P1口此处使用的液晶数据口为P0口此处将12864的写读使能端与ad的adwr定义到一个io口//上了//此程序仅供初学者且是选用郭天祥板片的此处的ADC0804//如有解释错误或者有什么问题可直接通过百度账号与我联系#include<reg51.h>#include <intrins.h>#define uint unsigned int#define uchar unsigned charsbit adrd=P3^7; //IO口定义sbit adwr=P3^6;sbit dula=P2^6;//段定义sbit wela=P2^7;//位定义sbit LCM_CS = P3^5;//12864数据命令选择端sbit LCM_EN = P3^4;//12864使能信号sbit LCM_POS = P1^3;//位置选择端sbit key2=P3^1;//设置阀sbit key3=P3^2;//设置阀值unsigned char j,k,adval;//定义变量uchar shichu,busy,s,count;//定义变量uchar dis2[]={"阀值"};//12864上显示阀值uchar dis1[]={"光照强度"};//12864上显示光照强度void delay(unsigned char i) //延时程序{for(j=i;j>0;j--)for(k=125;k>0;k--);}void delayms(uint xms){uint i,j;for(i=xms;i>0;i--)for(j=114;j>0;j--);}void chk_busy() //此处可省略由于有些液晶反应速度要慢单片机故加上此处用来防置液//晶显示混乱{do{LCM_EN=0;adwr=1;LCM_CS=0;LCM_EN=1;busy=P0;LCM_EN=0;delayms(1);} while(busy&&0x80==1);}void write_data(uchar Dispdata)//用来写数据到液晶中{chk_busy();//检测液晶是否处于工作中如果处于工作中则等待不动LCM_CS=1;adwr=0;LCM_EN=1;P0=Dispdata;LCM_EN=0;delayms(5);}void write_com(uchar cmdcode)//些命令到12864中{LCM_CS=0;adwr=0;LCM_EN=1;P0=cmdcode;LCM_EN=0;delayms(5);}/*set position*/void lcd_pos(uchar X,uchar Y) //数据在12864中的地址设置{uchar pos;if(X==0)//第一行{X=0x80;}else if(X==1)//第二行{X=0x90;}else if(X==2)//第三行{X=0x88;}else if(X==3)//第四行{X=0x98;}pos=X+Y;write_com(pos);//diaplay the address}//显示函数void display(){uchar i;dis1[9]=(uint)(0x30+count/100);//dis1[10]=(uint)(0x30+count%100/10);dis1[11]=(uint)(0x30+count%100%10);count=5*count/255;//此处用于将二进制数据转换为十进制(此处为8位数据)lcd_pos(0,0);//将所得的数据放入12864的第一行第一个位置for(i=0;i<12;i++){write_data(dis1[i]);//将数据写入12864中}}//ad 转换程序//想必大家看到这里会有疑问因为此程序的PO口是做为12864的数据口使用的如果在使用本程序时12864与ad是否会产生影响我可以肯定的告诉大家不会产生任何影响、//只要将程序调理的写好就会避开此处问题void ad(){uchar a;wela=1;//由于IO口不够用所以有重用的可能所以先将数码管关掉P0=0; //由于io口不过用所以将ad的片选段接到了P0口当片选段为低时ad被选通adwr=0; //AD写入(随便写个什么都行,主要是为了启动AD转换)_nop_();adwr=1; //将写入的数据锁存住P0=0xff; //关闭ADCSdelay(10);wela=0; //关闭有AD片选信号锁存器的锁存端以防止在操作数码管时使AD的片选发生变化因为PO 口连接着数码管display();//此处将显示函数写到这里正常应为一个延时(最好大一些)(当做延时使用了)wela=1; //重新打开有AD片选信号锁存器的锁存端P1=0xff; //读取P1口之前先给其写全1(先将单片机的P1口全写为高电平)P0=0; //选通ADCSadrd=0; //AD读使能count=P1; //将P1口读到的数据送给countadrd=1;P0=0xff; //关闭ADCSadwr=0;}//12864初始化设置//写数据到LCD(底层)void lcd_init(){ chk_busy();LCM_POS=1; //bingkoufangshiwrite_com(0x30); //选择8bit数据流delayms(5);write_com(0x0c); //开显示(无游标、不反白)delayms(5);write_com(0x01); //清除显示,并且设定地址指针为00Hdelayms(5);}//阀值设置部分void shenzhi() //阀值设置{uchar xuanze,i,b;xuanze=1;switch(xuanze)//此处应用switch case 语句有点写多余了嘿嘿嘿{case 1:{if(key2==0){delayms(100);shichu++;if(shichu==100) //加阀值shichu=0;}if(key3==0){ //如果阀值大于零则进入减阀值if(shichu>0){delayms(100);shichu--;}}dis2[4]=(uint)(0x30+shichu/100);//取百位写到第四个位置上dis2[5]=(uint)(0x30+shichu%100/10); //取十位将处理后的阀值显示在12864上写到第五个位置上dis2[6]=(uint)(0x30+shichu%100%10);//取个位写到第六个位置上lcd_pos(2,0);将得到的值写到12864上第三行for(i=0;i<8;i++){write_data(dis2[i]);//将数据写进12864内部}} break;default:break;}}void main() // 主程序{lcd_init();液晶初始化while(1){shenzhi(); 阀值设置ad();ad转换}}。

12864液晶代码(很实用的)

12864液晶代码(很实用的)

#include<reg52.h>#include<intrins.h>#include<stdlib.h>#define uchar unsigned char#define uint unsigned int/*端口定义*/#define LCD_data P0sbit LCD_RS=P3^5;sbit LCD_RW=P3^6;sbit LCD_EN=P3^4;sbit LCD_PSB=P3^7;uchar dis1[10];uchar code dis2[]={""};uchar code dis3[]={"XXXXXXXX"};uchar code dis4[]={"-------"};void delay_ms(uint x){int i,j;for(j = 0; j < x; j++){for(i = 0; i < 110; i++){;}}}/*写指令数据到LCDRS=L——表示DB0-DB7为显示指令数据RW=L——表示DB0-DB7数据被write(当E=“H-L”,指令数据被写到IR或DR) E=高脉冲此时DB0-DB7=指令码*/void write_cmd(uchar cmd){LCD_RS=0;LCD_RW=0;LCD_EN=0;P0=cmd;delay_ms(5);delay_ms(5);LCD_EN=0;}/*设定显示位置*/void lcd_pos(uchar X, uchar Y){uchar pos;if(X == 0){X = 0x80;}else if(X == 1){X = 0x90;}else if(X == 2){X = 0x88;}else if(X == 3){X = 0x98;}pos = X + Y;write_cmd(pos); //显示地址}/*写显示数据到LCD*//*RS=H ——表示DB0-DB7为显示数据RW=L ——RW=L,E='H-L',DB0-DB7数据被写到IR或DR E=高脉冲DB0-DB7=显示数据*/void write_dat(uchar dat){LCD_RS=1;LCD_RW=0;LCD_EN=0;P0=dat;delay_ms(5);delay_ms(5);LCD_EN=0;}/*随机数发生函数*/void randmaker(){uint ran;ran=rand();dis1[0]=ran/10000+0x30;dis1[1]=ran%10000/1000+0x30;dis1[2]=ran%1000/100+0x30;dis1[3]=ran%100/10+0x30;dis1[4]=ran%10+0x30;ran=rand();dis1[5]=ran/10000+0x30;dis1[6]=ran%10000/1000+0x30;dis1[7]=ran%1000/100+0x30;dis1[8]=ran%100/10+0x30;dis1[9]=ran%10+0x30;}/*LCD初始化*/void lcd_init(){LCD_PSB=1;//并口方式write_cmd(0x30);//基本操作指令delay_ms(5);write_cmd(0x0c);//打开显示,光标关闭delay_ms(5);write_cmd(0x01);//清除LCD显示类容delay_ms(5);}/*主程序*/main(){uchar i;delay_ms(10);lcd_init();lcd_pos(1,0);i=0;while(dis2[i]!='\0'){write_dat(dis2[i]);i++;}lcd_pos(2,0);i=0;while(dis3[i]!='\0'){write_dat(dis3[i]);i++;}lcd_pos(3,0);i=0;while(dis4[i]!='\0'){write_dat(dis4[i]);i++;}while(1){lcd_pos(0,0);randmaker();for(i=0;i<10;i++){write_dat(dis1[i]);}}}。

ADC0804驱动程序

ADC0804驱动程序

ADC0804驱动程序//此程序是用12864液晶串行显示采集到的电压数值注意:要将控制AD的总开关打开和基准电压、模拟电压的输入以及AD要通过掉线接中断 #include <reg51.h> #define uchar unsigned char #define uint unsigned int #define comm 0 #define dat 1sbit cs=P2^0; //用12864显示电压sbit sid=P2^1;sbit sclk=P2^2;sbit AD_RD=P3^7; //ADC0804 sbit AD_WR=P3^6;sbit AD_cs=P3^5;uchar num1;uchar code tab2[64]={"电压电流"};void wr_lcd (uchar dat_comm,uchar content);void delay0(uchar n){uchar i;for(i=0;i<n;i++) ;}void delay (uint us) //delay time{while(us--);}void delay1(uint u){uint i;for(i=0;i<u;i++){delay(2000);}}void init_lcd (void){wr_lcd (comm,0x30); /*30---基本指令动作*/wr_lcd (comm,0x01); /*清屏,地址指针指向00H*/ delay (100);wr_lcd (comm,0x06); /*光标的移动方向*/wr_lcd (comm,0x0c); /*开显示,关游标*/}void chn_disp (uchar code *chn) //显示汉字{uchar i,j;wr_lcd (comm,0x30);wr_lcd (comm,0x80);for (j=0;j<4;j++){for (i=0;i<16;i++)wr_lcd (dat,chn[j*16+i]);}}void wr_lcd (uchar dat_comm,uchar content) {uchar a,i,j;delay (500);a=content;cs=0;cs=1;sclk=0; //初始sid=1;for(i=0;i<5;i++){sclk=1;sclk=0;}sid=0;sclk=1;sclk=0;if(dat_comm)sid=1; //dataelsesid=0; //commandsclk=1;sclk=0;sid=0; //固定为零sclk=1;sclk=0;for(j=0;j<2;j++){for(i=0;i<4;i++){a=a<<1; //移出的位放在cy中sid=CY;sclk=1;sclk=0;}sid=0;for(i=0;i<4;i++){sclk=1;sclk=0;}}cs=0;sid=1;}uchar change (uchar i){switch(i){case 0x00: return(0x30);break;case 0x01: return(0x31);break;case 0x02: return(0x32);break;case 0x03: return(0x33);break;case 0x04: return(0x34);break;case 0x05: return(0x35);break;case 0x06: return(0x36);break;case 0x07: return(0x37);break;case 0x08: return(0x38);break;case 0x09: return(0x39);break;}}void xianshi (uint e) //显示电压{uchar qian,bai,shi,ge,i;float vol;uchar tab[6]={0};vol=(e*4.92)/256;qian=(vol*1000)/1000;bai=(vol*1000)/100-(qian*10);shi=(vol*1000)/10-qian*100-bai*10;ge=(vol*10000)/10-(qian*1000)-(bai*100)-(shi*10);qian=change(qian); bai=change(bai);shi=change(shi);ge=change(ge); tab[0]=qian;tab[1]='.';tab[2]=bai;tab[3]=shi;tab[4]=ge; tab[5]='v'; wr_lcd (comm,0x30);wr_lcd (comm,0x83);for(i=0;i<6;i++){wr_lcd(dat,tab[i]);}}void system_init(void ){IT0=0; //选择INT0为电平触发方式EX0=1; //外部中断允许EA=1; //系统中断允许}void INT0_SCANkey() interrupt 0 using 1{EA=0;AD_cs=0;AD_RD=0; /*开始读数据*/delay0(2);num1=P0; /*读人数据*/AD_RD=1;AD_cs=1;EA=1;}/*A/D数据采集子程序ADC0804*/ void AD_start(void) { AD_cs=0;delay(1);AD_WR=0;delay(2);AD_WR=1; /*发出写信号,启动AD转换*/delay(1);AD_cs=1;delay(1);}void main(){system_init() ;init_lcd ();chn_disp(tab2);while(1){AD_start();xianshi(num1);delay1(50);}}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
P2=0xfe;
delay(1);
P3=led[two];
P2=0xfd;
delay(1);
P3=led[three];
P2=0xfb;
0x6d,0x7d,0x07,0x7f,0x6f}; //显示段码
sbit int1=P3^3; //定义管脚功能
sbit cs="P3"^2; //使能端
sbit wr="P3"^6; //写端口
sbit rd="P3"^7; //读端口
void Delay(unsigned int tc) //显示延时程序
rd=0; //开始读转换后数据
i=i; i="i"; //无意义语句,用于延时等待ADC0804 读数完毕
addata=P1; //读出的数据赋与addate
rd=1;cs=1; //读数完毕
return(addata); //返回最后读出的数据
dianyah=dianyah>>4; //右移四位 取出高四位
dianyal=dianya&0x0f; //屏蔽高四位 取出低四位
dianya=dianyal*20+dianyah*320; //最后的结果是一个四位数,便于显示
return(dianya); //返回最后处理结果
for(x=0;x<10;x++) //将 10次测得的结果存储在dianya中
{
dianya=adc0804()+dianya;
}
dianya=dianya/10; //求平均值
dianyah=dianya&0xf0; //屏蔽低四位
{
Led( ); //只需调用显示函数
}
}
////////////////////////////////////////////////////////////////////////
//名称:单片机控制ADC0804模数转换实现电压测量(0~5V)
{
while( tc != 0 )
{
unsigned int i;
for(i=0; i<100; i++);
tc--;
}
}
unsigned char adc0804( void ) //读AD0804子程序
{
unsigned char addata,i;
delay(1);
P3=led[four]-0x80; //显示小数点
P2=0xf7;
delay(1);
}
}
int main(void)
{ while(1)
Delay(8);
P2=P2|0xf0; P2=P2&0x7f;
P0=seg7code[date%10]; //输出小数点后第三位
Delay(8);
P2=P2|0xf0;
}
void main()
{
while(1)
for(j=0;j<410;j++);
}
//启动AD转换子程序//////////////////////////////////////////////////////////
void start_ad(void)
{ cs=0; //允许进行A/D转换
sbit cs=P1^0; //芯片选择信号,控制芯片的启动和结果读取,低电平有效
sbit rd=P1^1; //读数据控制,低电平有效
sbit wr=P1^2; //AD转换起动控制,上升沿有效
sbit intr=P1^3; //AD转换结束输出低电平
{ uint a=50,one,two,three,four;
four=ad_data/51; //第四位数码管(最高位)
three=ad_data%51*10/51; //第三位数码管
uchar led[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//5ms延时子程序/////////////////
void delay(uint i)
{ uint j;
for(;i>0;i--)
//说明:当输入电压为5V时,A/D输出为FFH,即输入电压=AD数据*(5/255)=AD数据/(255/5)=AD数据/51
// 用四位数码管进行显示,数码管的A~H接于P3口,公共端从最低位是P2.0,最高位是P2.3
void data_shout(uint ad_data)
//控制口定义//////////////////////
#include<reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define ad0_7 P0 //AD数据口
}
unsigned int datpro(void)//ADC0804 读出的数据处理
{
unsigned char x;
unsigned int dianyah,dianyal; //用于存储读出数据的高字节和低字节
unsigned int dianya="0"; //存储最后处理完的结果 注意数据类型
P2=P2|0xf0; P2=P2&0xdf;
P0=seg7code[date%1000/100]; //输出小数点后第一位
Delay(8);
P2=P2|0xf0; P2=P2&0xbf;
P0=seg7code[date%100/10]; //输出小数点后第二位
//ADC0804转换程序
//好久没在这发表日志了,写了一段AD0804的程序,希望对新
//手们有所帮助^_^也希望高手能出来指点错误……
#include <reg51.h>
unsigned char code seg7code[10]={0x3f,0x06,0x5b,0x4f,0x66,
ad_data=ad0_7; //把数据存到ad_data中
rd=1;cs=1; //停止A/D读取
ret////////////////////////////////////
}
void Led()
{
unsigned int date;
date=datpro(); //调用数据处理最后结果
P2=P2&0xef;
P0=seg7code[date/1000]|0x80; //输出个位数和小数点
Delay(8);
two=ad_data%51*10%51*10/51; //第二位数码管
one=ad_data%51*10%51*10%51*10/51; //第一位数码管(最低位)
while(a--)
{ P3=led[one];
read_ad()
{ uint ad_data;
ad0_7=0xff;
cs=0; //允许读
rd=0; //读取转换数据结果数据结果
_nop_();
wr=0;_nop_();wr=1; //WR由低变高时,AD开始转换
while(intr); //查询转换结束产生INTR 信号(低电平有效)
cs=1; //停止AD转换
}
//读A/D数据子程序///////////////////////////////////////
rd=1;
wr=1;
int1=1; //读ADC0804 前准备
P1=0xff; //P1全部置一准备
cs=0;
wr=0;
wr=1; //启动ADC0804开始测电压
while(int1==1); //查询等待A/D转换完毕产生的INT(低电平有效)信号
//作者:飛星科技 /saishm
//芯片:AT89S52
//晶振:12M
//编译器:伟福6000
//日期:2007-08-23
////////////////////////////////////////////////////////////////////////
{ start_ad(); //启动AD
data_shout(read_ad()); //读AD数据并显示
}
}
相关文档
最新文档