![]() |
数码管动态显示会受A/D芯片转换时间的影响,出现闪烁,建议数码管用定时器扫描方式。 |
你用AI8051U 兼容的 直接USB仿真,排产故障更简单 |
不想用三极管,也可以吧r12-r15四个限流电阻改为上拉电阻 |
共阳数码管的四个公共端,供电不足,AT89C52的拉电流有400微安,又加了限流电阻,根本驱动不了数码管,com1-com4用三极管驱动试试吧 |
#include <reg51.h> sbit CLK= P3^1; sbit EOC = P3^0; sbit CS = P2^7; sbit WRR = P3^6; sbit RDD = P3^7; unsigned char code SegmentTable[] = { 0xC0, // 0 0xf9, // 1 0xa4, // 2 0xb0, // 3 0x99, // 4 0x92, // 5 0x82, // 6 0xf8, // 7 0x80, // 8 0x90 // 9 }; void delay(unsigned int ms) { unsigned int i, j; for (i = 0; i < ms; i++) { for (j = 0; j < 120; j++); // 调整 120 的值以改变延时长度 } } void Timer0_Init() { TMOD = 0x01; // 定时器0,模式1(16位定时模式) TH0 = 0xFC; // 设置初值高位 TL0 = 0x18; // 设置初值低位 ET0 = 1; // 允许定时器0中断 EA = 1; // 开启总中断 TR0 = 1; // 启动定时器0 } void Timer0_ISR() interrupt 1 { TH0 = 0xFC; // 重置初值高位 TL0 = 0x18; // 重置初值低位 P3 ^= 0x02; // 翻转P3.1电平(高->低或低->高) } void ADC_START() { CS = 0; WRR = 0; delay(1); // 稳定信号 CS = 0; WRR = 1; //与非让START为低电平,不触发 delay(1); } unsigned char ADC_GET() { while (EOC == 0); // 等待 EOC = 1,表示转换完成 delay(5); RDD = 0; CS = 0; delay(5); return P0; // 返回采样结果 } void main() { unsigned int Result; unsigned char digits[3]; unsigned char i; unsigned char position[]={0x02,0x04,0x08}; Timer0_Init(); // 初始化定时器 CS = 1; WRR = 1; while (1) { ADC_START(); Result = ADC_GET(); RDD = 1; CS = 0; Result = Result*100/51; digits[0] = Result/100; //最高位 digits[1] = Result%100/10; digits[2] = Result%100%10; // 小数部分 for(i = 0;i<3;i++) { P2 = position[i]; P1 = SegmentTable[digits[i]]; if(i == 0) { P1 = P1 -0x80; } delay(1); P2 = 0x00; } } } 现在已经实现功能了,但是数码管会闪烁 而且delay函数没法往下调了,j到119甚至就显示不出来了 |
您有可供验证的测试代码吗? |
有问题请描述问题,预计表现,实际表现,提供代码,报错信息 |