|
不知道楼上 的是什么情况
彭伟 编著 《单片机C语言程序设计实训100例 >> ---基于8051+Proteus仿真(第2版)》
28 ADC0809模数转换与显示
- //-----------------------------------------------------------------
- // 名称: ADC0809模数转换与显示
- //-----------------------------------------------------------------
- // 说明: ADC0809采样通道3输入的模拟量,转换后的结果显示在数码管上.
- //
- //-----------------------------------------------------------------
- #include <reg51.h>
- #define INT8U unsigned char
- #define INT16U unsigned int
- //共阳数码管段码定义
- INT8U code SEG_CODE[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90 };
- //ADC0809引脚定义
- sbit OE = P1^0; //输出使能
- sbit EOC = P1^1; //转换结束
- sbit ST = P1^2; //启动转换
- sbit CLK = P1^3; //采样时钟
- //-----------------------------------------------------------------
- // 延时子程序
- //-----------------------------------------------------------------
- void delay_ms(INT16U x)
- {
- INT8U t; while(x--) for(t = 0; t < 120; t++);
- }
- //-----------------------------------------------------------------
- // 显示转换结果
- //-----------------------------------------------------------------
- void Display_Result(INT8U AD)
- {
- int v;
- //根据四舍五入法计算电压值(放大100倍以使分解)
- v = AD * 500.0 * 2 / 511.0;
- //或根据舍尾取整法计算电压值(放大100倍以使分解)
- //v = AD * 500.0 / 256.0;
- P2 = 1 << 2; P0 = SEG_CODE[v % 10]; delay_ms(5);
- P2 = 1 << 1; P0 = SEG_CODE[v % 100 / 10]; delay_ms(5);
- P2 = 1 << 0; P0 = SEG_CODE[v / 100] & 0x7F; delay_ms(5);
- }
- //-----------------------------------------------------------------
- // 主程序
- //-----------------------------------------------------------------
- void main()
- {
- TMOD = 0x02; // TIMER0工作于模式2(8位自动重装模式)
- TL0 = -250; //定时初值(工作寄存器)
- TH0 = -250; //在TL0溢出时,TH0的值自动重新装入TL0
- IE = 0x82; //允许TIMER0溢出中断
- TR0 = 1; //启动定时器
- P1 = 0x3F; //选择ADC0809的通道3(0011)
- //高四位设通道地址为0011(3),低4位为CLK,ST,EOC,OE/CE
- while(1)
- {
- ST = 0; ST = 1; ST = 0; //启动转换
- while(EOC == 0); //等待转换结束
- OE = 1; //允许输出
- Display_Result(P3); //显示A/D转换结果
- OE = 0; //关闭输出
- }
- }
- //-----------------------------------------------------------------
- // T0定时器中断给ADC0809提供时钟信号
- //-----------------------------------------------------------------
- void Timer0_INT() interrupt 1
- {
- CLK = !CLK; //ADC0809采样时钟信号
- }
复制代码 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|