仅供参考:
#include<reg52.h> //52单片机头文件
#include<intrins.h> //内部库函数头文件
#define uchar unsigned char //变量宏定义
#define uint unsigned int
//LCD
sbit CS1=P2^4 //片选1
sbit CS2=P2^3 //片选2
sbit DI=P2^2 //数据\指令选择
sbit RW=P2^1 //读\写选择
sbit E=P2^0 //读\写使能
sbit busy=P0^7 //忙标志位
//键盘
sbit jia=P1^0 //X+,X轴增加
sbit jian=P1^1 //X-,X轴减小
sbit jia1=P1^2 //Y+,Y轴增加
sbit jian1=P1^3 //Y-,Y轴减小
//ADC
sbit START=P2^7 //ADC转换启动
sbit OE=P2^6 //ADC输出使能
sbit EOC=P2^5 //ADC转换状态标志
//变量与数组
char a[107] //ADC数据采样缓存
uint g=0,dianya=1 //采样频率,电压(信号幅度)
uchar code word[]= //汉字字模(楷体,右旋90,横向取码)
{
0x04,0x00,0x45,0x20,0x44,0xA8,0x2C,0x60,0x13,0xFE,0x1A,0x10,0x27,0x58,0x10,0x94,//数
0x0A,0x40,0x04,0x70,0x0B,0x4C,0x10,0xE0,0x30,0x20,0x20,0x20,0x20,0x00,0x00,0x00,
0x00,0x00,0x02,0x00,0x02,0x18,0x02,0x08,0x02,0x28,0x02,0x28,0x21,0x29,0x41,0x96,//字
0x3F,0x54,0x01,0x34,0x01,0x04,0x01,0x14,0x01,0x0C,0x01,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x40,0x0C,0x40,0x07,0x40,0x00,0x44,0x00,0x44,0x10,0x44,0x3F,0xC4,//示
0x00,0x24,0x00,0x22,0x01,0x22,0x02,0x20,0x06,0x20,0x00,0x20,0x00,0x00,0x00,0x00,
0x00,0x00,0x18,0x20,0x0C,0x40,0x23,0x04,0x18,0x08,0x06,0x00,0x11,0xF0,0x11,0x10,//波
0x0A,0x90,0x04,0xFF,0x0A,0x88,0x11,0x88,0x30,0x18,0x20,0x00,0x20,0x00,0x00,0x00,
}
//ADC0808转换控制
uchar adc()
{
char AD //读数变量
START=0 //拉低电平
START=1 //拉高电平,在上升沿清零所有内部寄存器
START=0 //拉低电平,在下降沿的时候,开始进行AD转换
while(EOC==0) //等待转换结束(EOC=1,表示转换结束)
OE=1 //使能输出,允许数据线输出数据
AD=P3 //读取端口
OE=0 //停止输出
return AD
}
//LCD忙检测
void checkstate()
{
E=0DI=0RW=1 //读指令寄存器
do //循环输出状态值
{ E=1E=0}
while(busy==1) //判断,仅当busy=0时,中断循环
}
//写命令到LCD
void writecommand(uchar command)
{
checkstate() //查忙
E=0DI=0RW=0 //准备写指令
P0=command //指令送端口
E=1 //使能写入
E=0 //停止写入
}
//写数据到LCD
void writedate(uchar date)
{
checkstate() //查忙
E=0DI=1RW=0 //准备写数据
P0=date //数据送端口
E=1 //使能写入
E=0 //停止写入
}
//左右屏选择
void selectscreen(uint ss)
{
if(ss==0)CS1=0,CS2=0 //参数0,选全屏
if(ss==1)CS1=0,CS2=1 //参数1,选左屏
if(ss==2)CS1=1,CS2=0 //参数2,选右屏
if(ss==3)CS1=1,CS2=1 //参数3,不选屏
}
//清屏
void clearscreen(uchar ss)
{
uchar i,j //页,列变量
selectscreen(ss) //选屏
for(i=0i<8i++) //从0到7共8页
{
writecommand(0xb8+i) //写入页地址
writecommand(0x40) //首列地址
for(j=0j<64j++) //每页64列
writedate(0x00) //逐列写空字节,列地址自加1
}
}
//初始化LCD
void init_lcd()
{
selectscreen(0)
writecommand(0xc0) //设置起始行0行
writecommand(0x3f) //开显示
}
//us延时
void delayus(uint t)
{
while(t--)
}
//ms延时
void delayms(uint t)
{
uint i
while(t--)
for(i=0i<110i++)
}
//显示汉字(按列纵向显示)
void displaychines(uchar ss,uchar page,uchar col,uchar *dat,uchar n)
{
uchar k,y,x //汉字显示变量:字数,页,列,
for(k=0,y=0k<nk++,y+=2) //写入4个汉字,每写入一个汉字,页码+2
{
selectscreen(ss) //选屏
writecommand(0xb8+page+y) //写上半字页地址0页(0~2~4~6)
writecommand(0x40+col) //首列地址112列(右屏48列),自动加1
for(x=0x<16x++) //循环16次, 写上半字16个编码字节
{
writedate(dat[2*x+1+32*k]) //依次读取字符编码:1,3,5...15写入
}
writecommand(0xb8+page+y+1) //写下半字页地址1页(1~3~5~7)
writecommand(0x40+col) //首列地址112列(右屏48列),自动加1
for(x=0x<16x++) //循环16次, 写下半字16个编码
{
writedate(dat[2*x+32*k]) //依次读取字符编码:0,2,4...14写入
}
}
}
//按键 *** 作
void keyscan()
{
while(jia==0) //如果 X+ 键被按下
{
while(jia==0) //等待键松开后
if(g>0)g-=10 //若g 不为0则减1(采样频率减小)
}
while(jian==0) //如果 X- 键被按下
{
while(jian==0) //等待键松开后
if(g<100)g+=10 //g自加1 (采样频率增大)
}
while(jia1==0) //如果 Y+ 键被按下
{
while(jia1==0) //等待键松开后
if(dianya>1)dianya-=2 //若电压值不为0 则-1(幅度增大)
}
while(jian1==0) //如果 Y- 键被按下
{
while(jian1==0) //等待键松开后
if(dianya<12)dianya+=2 //电压值自+1 (幅度减小)
}
}
//在指定坐标(x,y)上描点函数(逐点绘图)
void lcd_pixel(uchar x,char y) //x水平坐标,y垂直坐标,Vect矢量绘图参数
{
char dat[8] //定义列字节数组
uchar j //循环变量
// y=63-y //更改y坐标为习惯方式
for(j=0j<8j++) dat[j]=0x00 //数组元素赋初值 0x00
dat[y>>3]|=0x01<<(y&0x07) //y值所在字节对应位置 1
if(x<64) //列坐标小于64
selectscreen(1) //选择左半屏
else //列坐标大于等于64
{selectscreen(2)x-=64} //选择右半屏,列坐标调整为0~63
for(j=0j<8j++) //每屏8页(0~7),8个字节
{
writecommand(0xb8+j) //写页地址
writecommand(0x40+x) //写列地址
writedate(dat[j]) //写字节数据
}
}
//主程序
void main()
{
uchar i //定义变量
char U
init_lcd() //初始化LCD
clearscreen(0) //清屏
while(1)
{
displaychines(2,0,48,word,4) //显示汉字:数字示波
keyscan() //按键扫描
for(i=0i<107i++) //ADC采样(取94个读数值)
{
a[i]=adc()/4 //读取AD值存入缓存数组
delayus(g) //延时g us,控制采样频率
}
for(i=0i<107i++ ) //循环94次,读取缓存数组中数据
{
U=a[i]/dianya //计算在12864中的幅值
lcd_pixel(i,U) //定位描点显示波形
}
delayms(2000)
clearscreen(0)
}
}
//------------------------------------------------------------// ADC0809模数转换
//ADC0809采样通道3输入的模拟量,转换后结果显示在数码管上
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar code LEDData[]=
//ADC0809引脚定义
sbit OE=P1^0
sbit EOC=P1^1
sbit ST=P1^2
sbit CLK=P1^3
//延时
void Delayms(uint ms)
{
uchar i
while(ms--)for(i=0i<120i++)
}
//显示转换结果
void Display_Result(uchar d)
{
P2=0xf7
P0=LEDData[d%10]
Delayms(5)
P2=0xfd
P0=LEDData[d%100/10]
Delayms(5)
P2=0xfd
P0=LEDData[d/100]
Delayms(5)
}
// 主程序
void main()
{
TMOD=0x02
TH0=0x14
TL0=0x00
IE=0x82
TR0=1
P1=0x3f//选择ADC0809通道3(0111)
//高4位设通道地址为0111
while(1)
{
ST=0ST=1ST=0//启动转换
while(EOC==0) //等待转换结果
OE=1 //允许输出
Display_Result(P3) //显示A/D转换结果
OE=0 //关闭输出
}
}
//T0定时器中断给ADC0809提供时钟信号
void Timer0_INT() interrupt 1
{
CLK=!CLK//ADC0809时钟信号
}
#include <reg52.h>#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit CS=P3^0
sbit CLK=P3^1 //时钟
sbit DIO=P3^2 //ADC0832输出引脚
sbit din=P0^7
uchar code tab1[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xA7,0xA1,0x86,0x8E} //共阳数码表
uchar code tab[4]={0xfe,0xfd,0xfb,0xf7} //数码管位选表
void delay(uint k)
{
uint i,j
for(i=0i<ki++)
for(j=0j<121j++)
}
uint A_D() // A/D转换函数
{
unsigned char i,dat
CS=0 //片选
CLK=0 //为第1个脉冲作准备
CLK=1//第1个脉冲
DIO=1// DI置1,规定的起始信号
_nop_()_nop_()
CLK=0 //第1个脉冲的下降沿
CLK=1 //第2个脉冲
DIO=1 // DI置1, 通道选择信号:1
_nop_()_nop_()
CLK=0 //第2个脉冲下降沿
CLK=0 //第3个脉冲
DIO=1 // DI置0,通道选择信号:0, 选通道0
_nop_()_nop_()
// CLK=0 //第3个脉冲下降沿,转换开始
// _nop_()_nop_()//第3个脉冲后,
// CLK=1
for(i=0i<8i++) //高位在前
{
CLK=1 //第4个脉冲
if(DIO)
dat=(dat<<1)|0x80//从高位至低位读取 "|"的优先级高于">>"
else
dat=(dat<<1)|0x00
CLK=0
}
for(i=0i<8i++) //高位在前
{
CLK=1 //第4个脉冲
if(DIO)
dat=(dat>>1)|0x80//从高位至低位读取 "|"的优先级高于">>"
else
dat=(dat>>1)|0x00
CLK=0
}
CS=1
CLK=1
return dat
}
void display(uint k)
{
P2=tab[1]
P0=tab1[k/100]
din=0
delay(3)
P2=0xff
P2=tab[2]
P0=tab1[k/10%10]
delay(3)
P2=0xff
P2=tab[3]
P0=tab1[k%10]
delay(3)
P2=0xff
}
void main(void) //主函数
{
uint temp
while(1)
{
temp=A_D()*5.0/256*100// 根据转换结果求出电压值
display(temp)
}
}
ADC0832程序 板子做出来 能用
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)