单片机AD转换用的这段程序意思是什么

单片机AD转换用的这段程序意思是什么,第1张

ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch //开始转换

这是用STC单片机内部A/D转换电路进行A/D转换时,要给A/D控制寄存器ADC_CONTR写启动转换命令,ADC_CONTR是ADC控制寄存器,其中的每一位的作用见下图,而这行语句前面肯定要有定义每一位状态的语句,或用#define宏定义了各位的值。

您好,/*

此程序通过对DAC0832 *** 作,实现D/A转换。按INT1键DAC0832输出电压变高,按s3键DAC0832电压变低。

输出接口是"D/A OUT"

*/

#include<reg51.h>

//////////////////////

sbit le1=P1^0/*ic1 74hc373使能端*/

sbit dac0832_cs=P3^7

sbit dac0832_wr=P1^1

sbit int1_k=P3^3

sbit s3_k=P3^6

sbit blight=P0^6

void s_q00()

void s_q01()

void s_q02()

void s_q03()

void s_q04()

void s_q05()

void s_q06()

void s_q07()

void c_q00()

void c_q01()

void c_q02()

void c_q03()

void c_q04()

void c_q05()

void c_q06()

void c_q07()

//void delay1()

void delayms(unsigned int i)

void delay100us()

void initi_lcd()

void initi()

void c_rw()

void s_rw()

void c_e()

void s_e()

void c_rs(void)

void s_rs(void)

void display(unsigned int addr,char a)

void out_74ls164(unsigned char i)

unsigned char q1=0

unsigned char da_out_74ls164=0,pwm1=0

void d_to_a(unsigned char dat)//DAC0832写函数。

{

out_74ls164(dat)

//c_q14()/*片选*/

dac0832_cs=0

//c_q13()/*写数据*/

//s_q13()

dac0832_wr=0

dac0832_wr=1

// s_q14()/*禁止转换*/

dac0832_cs=1

}

main()

{

unsigned char dat=0

initi_lcd()

display(0,'o')

display(1,'u')

display(2,'t')

display(3,'p')

display(4,'u')

display(5,'t')

display(6,':')

display(7,0x30+dat/100)display(8,0x30+dat%100/10)display(9,0x30+dat%10)

while(1)

{

if(int1_k==0) {dat++display(7,0x30+dat/100)display(8,0x30+dat%100/10)display(9,0x30+dat%10)}

if(s3_k==0) {dat--display(7,0x30+dat/100)display(8,0x30+dat%100/10)display(9,0x30+dat%10)}

blight=1

d_to_a(dat)

delayms(60)

}

}

void display(unsigned int addr,char a)

{

s_e()

c_rs()

c_rw()

// P0=0x80+i

out_74ls164(0x80+addr)/*写地址*/

c_e()

delay100us()

s_e()

s_rs()

//P0=a

out_74ls164(a)/*写数据*/

c_e()

delay100us()

s_e()

}

void delayms(unsigned int i)

{

unsigned int j

for(i>0i--)

for(j=100j>0j--)

}

void initi_lcd()

{

delayms(10)

c_rw()

s_e()

c_rs()

// P0=0x01

out_74ls164(0x01)

c_e()

delayms(5)

s_e()

c_rs()

// P0=0x38

out_74ls164(0x38)

c_e()

delayms(5)

s_e()

//P0=0x0f

out_74ls164(0x0f)

c_e()

delayms(5)

s_e()

// P0=0x04

out_74ls164(0x04)

c_e()

delayms(5)

s_e()

}

void out_74ls164(unsigned char i)

{

unsigned char j,i_tem

// s_q27()

for(j=0j<8j++)

{

i_tem=i<<j

if(i_tem&0x80)s_q01()/*74ls164数据*/

else c_q01()

c_q00()/*74ls164时钟*/

s_q00()

}

}

void s_rs(){s_q05()}

void c_rs(){c_q05()}

void s_rw(){s_q06()}

void c_rw(){c_q06()}

void s_e(){s_q07()}

void c_e(){c_q07()}

void delay100us() { unsigned int i=2 for(i>0i--) }

///////////////////////////////////////////////////////

//////////////////////////////////////////////////

/*74hc373扩展接口函数:s表示置1,c表示置0,q1表示ic1 74hc373 ,

q2表示ic2 74hc373 ,仅接着的数字表示相应输出Q的序号 */

void s_q00(){q1=q1|0x01 P0=q1le1=1le1=0}

void s_q01(){q1=q1|0x02 P0=q1le1=1le1=0}

void s_q02(){q1=q1|0x04 P0=q1le1=1le1=0}

//void s_q03(){q1=q1|0x08 P0=q1le1=1le1=0}

void s_q04(){q1=q1|0x10 P0=q1le1=1le1=0}

void s_q05(){q1=q1|0x20 P0=q1le1=1le1=0}

void s_q06(){q1=q1|0x40 P0=q1le1=1le1=0}

void s_q07(){q1=q1|0x80 P0=q1le1=1le1=0}

void c_q00(){q1=q1&(~0x01)P0=q1le1=1le1=0}

void c_q01(){q1=q1&(~0x02)P0=q1le1=1le1=0}

void c_q02(){q1=q1&(~0x04)P0=q1le1=1le1=0}

//void c_q03(){q1=q1&(~0x08)P0=q1le1=1le1=0}

void c_q04(){q1=q1&(~0x10)P0=q1le1=1le1=0}

void c_q05(){q1=q1&(~0x20)P0=q1le1=1le1=0}

void c_q06(){q1=q1&(~0x40)P0=q1le1=1le1=0}

void c_q07(){q1=q1&(~0x80)P0=q1le1=1le1=0}

仅供参考:

#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)

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/10894317.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-12
下一篇 2023-05-12

发表评论

登录后才能评论

评论列表(0条)

保存