找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3037|回复: 6
收起左侧

单片机自带AD 4位电压表AD000.0-500.0源程序

  [复制链接]
ID:699785 发表于 2020-3-26 10:38 | 显示全部楼层 |阅读模式
STC15W401AS自带AD 4位电压表AD000.0-500.0。单片机直接驱动4位共阴数码管!采用定时中断调AD!附件有很清楚的注释!

单片机源程序如下:
  1. #include  "STC15W401AS.h"
  2. #include  "intrins.h"


  3. sbit GND1=P1^4;
  4. sbit GND2=P1^3;
  5. sbit GND3=P1^2;
  6. sbit GND4=P1^1;
  7.          
  8. sbit LEDa=P1^5;
  9. sbit LEDb=P1^6;
  10. sbit LEDc=P3^3;
  11. sbit LEDd=P3^1;
  12. sbit LEDe=P3^0;
  13. sbit LEDf=P1^7;     
  14. sbit LEDg=P3^2;
  15. sbit LEDp=P3^4;
  16. unsigned char count;
  17. unsigned char PWM=9;

  18. float dianya;    // 电压
  19. int dianya1;    // 电压 1
  20. unsigned char code numtab[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
  21. //unsigned char code numtab[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};


  22. /*-------------------------------------延时函数-------------------------------------*/
  23. void delay (unsigned int a)
  24. {
  25.         unsigned int i;
  26.         while( --a != 0)
  27.         {
  28.                 for (i = 0; i < 12; i++);
  29.         }
  30. }


  31. /*-------------------------------------数码管消隐-------------------------------------*/
  32. void displayoff (void)                 
  33. {                  
  34.         GND1=1;
  35.         GND2=1;
  36.         GND3=1;
  37.         GND4=1;
  38.        
  39.         LEDa=0;
  40.         LEDb=0;
  41.         LEDc=0;
  42.         LEDd=0;
  43.         LEDe=0;
  44.         LEDf=0;
  45.         LEDg=0;
  46.         LEDp=0;

  47.         delay(10-PWM);
  48. }
  49. /*-------------------------------------个位码显-------------------------------------*/
  50. void bit1 (unsigned char d)       
  51. {
  52.         unsigned char i;
  53.         i=d&0x01;
  54.         if (i==0x01){
  55.                 GND1=0;LEDa=1;}delay(PWM);displayoff();
  56.         i=d&0x02;
  57.         if (i==0x02){
  58.                 GND1=0;LEDb=1;}delay(PWM);displayoff();
  59.         i=d&0x04;
  60.         if (i==0x04){
  61.                 GND1=0;LEDc=1;}delay(PWM);displayoff();
  62.         i=d&0x08;
  63.         if (i==0x08){
  64.                 GND1=0;LEDd=1;}delay(PWM);displayoff();
  65.         i=d&0x10;
  66.         if (i==0x10){
  67.                 GND1=0;LEDe=1;}delay(PWM);displayoff();
  68.         i=d&0x20;
  69.         if (i==0x20){
  70.                 GND1=0;LEDf=1;}delay(PWM);displayoff();
  71.         i=d&0x40;
  72.         if (i==0x40){
  73.                 GND1=0;LEDg=1;}delay(PWM);displayoff();
  74.         i=d&0x80;
  75.         if (i==0x80){
  76.                 GND1=0;LEDp=1;}delay(PWM);displayoff();
  77. }
  78. /*-------------------------------------十位码显-------------------------------------*/
  79. void bit2 (unsigned char d)
  80. {
  81.         unsigned char i;
  82.         i=d&0x01;
  83.         if (i==0x01){
  84.                 GND2=0;LEDa=1;}delay(PWM);displayoff();
  85.         i=d&0x02;
  86.         if (i==0x02){
  87.                 GND2=0;LEDb=1;}delay(PWM);displayoff();
  88.         i=d&0x04;
  89.         if (i==0x04){
  90.                 GND2=0;LEDc=1;}delay(PWM);displayoff();
  91.         i=d&0x08;
  92.         if (i==0x08){
  93.                 GND2=0;LEDd=1;}delay(PWM);displayoff();
  94.         i=d&0x10;
  95.         if (i==0x10){
  96.                 GND2=0;LEDe=1;}delay(PWM);displayoff();
  97.         i=d&0x20;
  98.         if (i==0x20){
  99.                 GND2=0;LEDf=1;}delay(PWM);displayoff();
  100.         i=d&0x40;
  101.         if (i==0x40){
  102.                 GND2=0;LEDg=1;}delay(PWM);displayoff();
  103.         i=d&0x80;
  104.         if (i==0x80){
  105.                 GND2=0;LEDp=1;}delay(PWM);displayoff();
  106. }
  107. /*-------------------------------------百位码显-------------------------------------*/
  108. void bit3 (unsigned char d)
  109. {
  110.         unsigned char i;
  111.         i=d&0x01;
  112.         if (i==0x01){
  113.                 GND3=0;LEDa=1;}delay(PWM);displayoff();
  114.         i=d&0x02;
  115.         if (i==0x02){
  116.                 GND3=0;LEDb=1;}delay(PWM);displayoff();
  117.         i=d&0x04;
  118.         if (i==0x04){
  119.                 GND3=0;LEDc=1;}delay(PWM);displayoff();
  120.         i=d&0x08;
  121.         if (i==0x08){
  122.                 GND3=0;LEDd=1;}delay(PWM);displayoff();
  123.         i=d&0x10;
  124.         if (i==0x10){
  125.                 GND3=0;LEDe=1;}delay(PWM);displayoff();
  126.         i=d&0x20;
  127.         if (i==0x20){
  128.                 GND3=0;LEDf=1;}delay(PWM);displayoff();
  129.         i=d&0x40;
  130.         if (i==0x40){
  131.                 GND3=0;LEDg=1;}delay(PWM);displayoff();
  132.         i=d&0x80;
  133.         if (i==0x80){
  134.                 GND3=0;LEDp=1;}delay(PWM);displayoff();
  135. }
  136. /*-------------------------------------百位码显-------------------------------------*/
  137. void bit4 (unsigned char d)
  138. {
  139.         unsigned char i;
  140.         i=d&0x01;
  141.         if (i==0x01){
  142.                 GND4=0;LEDa=1;}delay(PWM);displayoff();
  143.         i=d&0x02;
  144.         if (i==0x02){
  145.                 GND4=0;LEDb=1;}delay(PWM);displayoff();
  146.         i=d&0x04;
  147.         if (i==0x04){
  148.                 GND4=0;LEDc=1;}delay(PWM);displayoff();
  149.         i=d&0x08;
  150.         if (i==0x08){
  151.                 GND4=0;LEDd=1;}delay(PWM);displayoff();
  152.         i=d&0x10;
  153.         if (i==0x10){
  154.                 GND4=0;LEDe=1;}delay(PWM);displayoff();
  155.         i=d&0x20;
  156.         if (i==0x20){
  157.                 GND4=0;LEDf=1;}delay(PWM);displayoff();
  158.         i=d&0x40;
  159.         if (i==0x40){
  160.                 GND4=0;LEDg=1;}delay(PWM);displayoff();
  161.         i=d&0x80;
  162.         if (i==0x80){
  163.                 GND4=0;LEDp=1;}delay(PWM);displayoff();
  164. }
  165. /*-------------------------------------数码管位显-------------------------------------*/
  166. void display(unsigned char l,unsigned char d)
  167. {
  168.         switch (l)                       
  169.         {                                       
  170.                 case 1:                         
  171.                         bit1(d);                
  172.                         break;               
  173.                 case 2:                       
  174.                         bit2(d);               
  175.                         break;       
  176.                 case 3:                       
  177.                         bit3(d);                
  178.                         break;
  179.                 case 4:                       
  180.                         bit4(d);                
  181.                         break;               
  182.         }
  183. }


  184. /*--------------------------------A/D转换初始化函数--------------------------------*/
  185. void Init_ADC()
  186. {
  187.   P1ASF|=0X03;//设定P1.0,P1.1为模拟量电压输入端
  188.         ADC_RES=0;//清除缓存寄存器
  189.         ADC_CONTR=ADC_PWR+ADC_SPD1;//启动ADC电源,设定转换速率
  190.         _nop_();
  191. }
  192. //========================================================================//
  193. uint ReadAdc(uchar Chx)//读取ADC数据
  194. {       
  195.     uint ADCDAT;
  196.     Init_ADC();
  197.     ADC_CONTR=ADC_PWR+ADC_SPD1+Chx+ADC_START;//启动转换
  198.         _nop_();       
  199.     _nop_();
  200.     _nop_();       
  201.     _nop_();//短暂延时
  202.         while((ADC_CONTR&ADC_FLAG)==0);//等待转换完毕
  203.         //ADC_CONTR&=~ADC_FLAG;//清除转换完成标志
  204.         ADC_CONTR &= 0xE7;//1111,0111 清 ADC_FLAG 位, 关闭A/D转换,
  205.         ADCDAT=ADC_RES;//获取ADC数值
  206.     ADCDAT<<=2;
  207.     ADCDAT|=ADC_RESL;       
  208.         return ADCDAT;//返回数值
  209. }
  210. /*--------------------------------------主函数--------------------------------------*/       
  211. void main (void)
  212. {
  213.         P1M0=0x01;        P1M1=0xe0;
  214.         P3M0=0x00;        P3M1=0x1f;

  215.         TMOD=0x01;//定时器工作方式1
  216.         TH0=0x3C;//定时器初始产生50ms时基信号
  217.         TL0=0xB0;//定时器初始产生50ms时基信号
  218.        
  219.         EA=1;//开总中断
  220.         ET0=1;//开定时器中断
  221.         TR0=1;//启动定时器                       

  222.         while(1)
  223.         {
  224.         if (count==10)
  225.         {
  226.         /*        dianya=ReadAdc(0)*(5.0/4500.0);  // 取电压
  227.                 dianya=dianya*100;
  228.                 dianya1=(int)dianya;
  229.         */
  230.         dianya=ReadAdc(0);
  231.                 dianya1=dianya;
  232.             count=0;
  233.         }
  234. /*                P2=0x01;
  235.                 P0=shuzu[dianya1/100]; // 取百位
  236.                 DELAY_MS(5);
  237.                 P2<<=1;
  238.                 P0=shuzu[dianya1%100/10];// 取十位
  239.                 DELAY_MS(5);
  240.                 P2<<=1;   
  241.                    P0=shuzu[dianya1%100%10]&0x7f;// 取个位
  242.                 DELAY_MS(5);                               
  243. */
  244.                 display (1,numtab[dianya1/1000 + '0']); //取百位
  245.                 display (2,numtab[dianya1%1000/100 + '0']);         //取十位
  246.                 display (3,numtab[dianya1%100/10 + '0']);         //取个位
  247.                 display (3,numtab[dianya1%10 + '0']);                 //取小数点后一位


  248.         }
  249. }
  250. /*-----------------------------------中断服务程序-----------------------------------*/       
  251. void Timer0_Routine(void) interrupt 1
  252. {
  253.         TH0=0x3C;                         
  254.         TL0=0xB0;                       
  255.     count++;
  256. }
复制代码

所有资料51hei提供下载:
500电压表.rar (29.56 KB, 下载次数: 50)
回复

使用道具 举报

ID:1 发表于 2020-3-26 20:44 | 显示全部楼层
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
回复

使用道具 举报

ID:214276 发表于 2020-3-27 00:58 | 显示全部楼层
这个贴要学习下。顶
回复

使用道具 举报

ID:15020 发表于 2020-3-27 09:04 | 显示全部楼层
初级代码,初学者玩玩可以
回复

使用道具 举报

ID:59884 发表于 2020-3-27 10:05 | 显示全部楼层
不错!顶一下!谢谢楼主分享!
回复

使用道具 举报

ID:377382 发表于 2020-5-27 13:49 | 显示全部楼层
好东东,分享下图纸就好
回复

使用道具 举报

ID:770983 发表于 2020-6-6 11:14 | 显示全部楼层
很好的东西,有个电路图就更好了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表