找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

PIC16F877A的AD转换,PWM输出,lcd1602显示仿真例子

查看数: 34260 | 评论数: 65 | 收藏 12
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2013-12-11 15:20

正文摘要:

1、AD转换 2、PWM输出 3、AD输入的比例控制PWM的占空比。 4、lcd1602显示AD测试值,PWM输出占空比 5、全文注释 6、proteus仿真图。 顶一下,谢谢

回复

ID:1146374 发表于 2025-4-6 14:22
OK,很有用!
ID:609145 发表于 2022-7-11 11:10
非常不错 值得学习。
ID:18297 发表于 2022-2-12 09:04
请讲述你的问题,你的功能要求。
ID:61632 发表于 2021-12-2 16:06
  1. #include <pic.h>
  2. #include <math.h>
  3. //#include <myfuncs1.h>
  4. //#include <seg74.h>
  5. #include <htc.h>
  6. #define SEG_BITSEL_PORT PORTD                   //位选端口
  7. #define SEG_BITSEL_PORT_DIR TRISD               //位选端口的方向寄存器
  8. #define SEG_FONT_PORT PORTC                     //字形输出端口
  9. #define SEG_FONT_PORT_DIR TRISC                 //字形输出端口的方向寄存器
  10. #define DLY_MS 67
  11. const char Seg7TableN[]={0b11000000,0b11111001,0b10100100,0b10110000,0b10011001,0b10010010,0b10000010,0b11111000,0b10000000,0b10010000};

  12. //__CONFIG(FOSC_HS & WDTE_ON & PWRTE_OFF & BOREN_ON & LVP_ON & CPD_OFF & WRT_OFF & CP_OFF);
  13. //__CONFIG (XT & WDTDIS & LVPDIS);
  14. unsigned int g_ADRTable[12] = {0,0,0,0,0,0,0,0,0,0,0 };
  15. unsigned char g_Count=0;
  16. bit OverFlag = 0;//12位转换次数完成标志位清零;
  17. void delayms (int ms);
  18. void DisplayData (unsigned int iData);
  19. void interrupt ISR (void)
  20. {
  21.     if ( ADIE && ADIF  )
  22.     {
  23.        ADIF = 0;
  24.        g_ADRTable[g_Count]=(((unsigned int)ADRESH)<<8)+ADRESL;
  25.        g_Count++;
  26.        if(g_Count==12)
  27.        {
  28.            g_Count =0;
  29.            OverFlag=1;//
  30.        }
  31.        else
  32.        {
  33.            GO_DONE = 1;//启动AD
  34.        }      
  35.     }
  36.     else
  37.        {
  38.            while(1);
  39.        }
  40. }
  41. void main(void)
  42. {
  43.     //void  DisplayData();
  44.     char i=0,j=0;
  45.     int tmp = 0;//
  46.     int adc_v = 0;
  47.     TRISA0 = 1;
  48.     SEG_BITSEL_PORT_DIR = 0;//位选端口的方向寄存器,确定输出端口
  49.     SEG_FONT_PORT_DIR = 0;//字形输出端口的方向寄存器,确定输出端口
  50.     ADFM = 1;
  51.     PCFG3:PCFG0 = 0000;
  52.     ADCON0 = 0B11000001;
  53.     ADIE = 1;
  54.     ADIF = 0;
  55.     PEIE = 1;
  56.     GIE = 1;
  57.     for(i=0;i<15;i++)
  58.     {
  59.         ;
  60.     }
  61.     GO_DONE = 1;
  62.     while(GO_DONE)
  63.     {
  64.         if(OverFlag==1)
  65.         {
  66.             for(i=0;i<12;i++)//冒泡法排序
  67.             {
  68.                 for(j=i+1;j<12;j++)
  69.                 {
  70.                     if(g_ADRTable[i] > g_ADRTable[j])
  71.                     {
  72.                         tmp = g_ADRTable[i];
  73.                         g_ADRTable[i] = g_ADRTable[j];
  74.                         g_ADRTable[j] = tmp;
  75.                     }
  76.                 }   
  77.             }
  78.         tmp = 0;
  79.         for(i=2;i<10;i++)
  80.         {
  81.             tmp = tmp + g_ADRTable[i];            
  82.         }
  83.         tmp = tmp >>3;//将数按照 2进制像右移动.每向右移动一位,相当于 除2的n次幂
  84.         adc_v = tmp;
  85.         adc_v = ((long)adc_v*5000/1023);
  86.         OverFlag = 0;
  87.         GO_DONE = 1;
  88.         }
  89.         DisplayData(adc_v);
  90.     }
  91. }
  92. void DisplayData (unsigned int iData )
  93. {
  94.     char i=0,j=0;//
  95.     char k = 0,NumStr[ 5 ]={0,0,0,0,0};
  96.     NumStr[1]=iData / 1000;//取整
  97.     NumStr[2]=iData % 1000/100;
  98.     NumStr[3]=iData % 100/10;
  99.     NumStr[4]=iData % 10;
  100.     for(i=0;i<10;i++)
  101.     {
  102.         SEG_BITSEL_PORT = k =0X01;
  103.         for(j=0;j<=4;j++)
  104.         {
  105.             SEG_BITSEL_PORT = k;
  106.             if(j==1)
  107.             {
  108.                 SEG_FONT_PORT = Seg7TableN[NumStr[j]]&0b01111111;         
  109.             }
  110.             else
  111.             {
  112.                 SEG_FONT_PORT = Seg7TableN[NumStr[j]];
  113.                
  114.             }
  115.             delayms(5);
  116.             k = k <<1;//把1向左移1为显示
  117.         }
  118.     }
  119. }
  120. void delayms (int ms)
  121. {
  122.     int i=0,j =0;
  123.     for(i=0;i < ms;i++)
  124.         for(j =0; j < DLY_MS;j++)
  125.         {;}
  126. }
复制代码

能帮我看看这个程序问题出在哪里吗
ID:960452 发表于 2021-9-13 16:43
求教楼主,我想同时检测电压 电流该怎么改进程序?
ID:387687 发表于 2021-9-5 21:45
好程序,学习了。
ID:625711 发表于 2021-9-1 15:53
谢谢分享!!!可以很好的学习下AD!
ID:713781 发表于 2020-4-8 15:12
我下载出来的电路图和上面的电路图不一样啊,只有我这样吗
ID:103421 发表于 2019-9-3 16:08
不错,下来学习。
ID:154187 发表于 2019-1-22 09:57
仿真没有找到lcd1602啊
ID:213175 发表于 2018-11-12 20:25
感谢分享
ID:302666 发表于 2018-6-1 03:18
有个例程参考,好多了
ID:322187 发表于 2018-5-4 16:29
学习学习,感谢分享
ID:209855 发表于 2018-1-12 13:30
急需看1602的代码,我的就是不显示,只有背光。
ID:269685 发表于 2018-1-1 11:43
没有lcd1602
ID:71549 发表于 2017-11-25 17:53

不错  楼主辛苦
ID:94088 发表于 2017-11-10 13:16
感谢分享!!!
ID:183735 发表于 2017-7-1 14:15
东西值得去认真看
ID:186630 发表于 2017-4-27 16:06
好东西,参考一下
ID:159112 发表于 2017-3-19 09:51
好东西,值得学习。
ID:170103 发表于 2017-3-18 09:50
楼主的资料真的是帮我了大忙
ID:170103 发表于 2017-3-18 09:49
楼主这个真是我需要学习的资料啊
ID:162067 发表于 2017-2-5 16:49
谢谢楼主
ID:161115 发表于 2017-1-10 14:14
真的是一个不错的学习例子,支持楼主
ID:159601 发表于 2017-1-3 14:38
很实用啊啊啊啊
ID:159270 发表于 2017-1-2 22:23
zjjhtony 发表于 2017-1-2 18:10
这个估计是你的编译器的问题,我使用的是mplab V8.7版本的。

版主:我用的是mplab IDE V8.91版本,PICC V8.05版,编译其它程序可以的
ID:18297 发表于 2017-1-2 18:10
这个估计是你的编译器的问题,我使用的是mplab V8.7版本的。
ID:159270 发表于 2017-1-1 22:57
编译出现这样的故障代码,菜鸟请教
ID:159270 发表于 2017-1-1 22:56
Clean: Deleting intermediary and output files.
Clean: Deleted file "E:\pic\picad\main.cce".
Clean: Done.
Executing: "C:\HT-PIC\BIN\PICC.EXE" -C -E"main.cce" "main.c" -O"main.obj" -Zg9 -O -ASMLIST -Q -MPLAB -16F877A

This compiler will expire in 19 days
Compiler operating in demo mode.
Some command line options are disabled and compilation is delayed.
Register this compiler to enable these options.

Warning[000] E:\pic\picad\sys.h 9 : Missing newline
Warning[000] E:\pic\picad\main.c 125 : Missing newline
Error[000] E:\pic\picad\main.c 17 : undefined identifier: GO
Warning[000] E:\pic\picad\main.c 124 : line does not have a newline on the end
Halting build on first failure as requested.
BUILD FAILED: Sun Jan 01 22:46:01 2017
ID:159270 发表于 2017-1-1 22:48
刚刚试了下,1602LCD没有显示,不知啥问题
ID:82712 发表于 2016-9-19 17:36
学习学习。。。
ID:88073 发表于 2016-9-13 17:11
仿真还得重新加东西?
ID:99245 发表于 2016-8-2 11:50
学习了!非常感谢
ID:105271 发表于 2016-2-10 23:42
学习了!!!谢谢!!
ID:104119 发表于 2016-1-22 16:15
感谢楼主分享!!!!!!!!!!
ID:85606 发表于 2015-12-29 12:19
楼主发帖辛苦了,谢谢分享!!!!!!!!
ID:90884 发表于 2015-9-23 17:02
这是神马东西,lcd在哪都看不见,差评
ID:71535 发表于 2015-9-22 08:19
感谢楼主分享,这对刚入门的人帮助会很大啊!
ID:86543 发表于 2015-8-14 20:02
这个必须顶,…………………………
ID:84840 发表于 2015-7-5 21:11
standgo 发表于 2015-6-8 18:31
楼主,你好。我看了你的程序,里面A/D转换时钟选择的是二分频,而外部晶振是4M,可以得出A/D转换一位所需时 ...

谢谢分享!!!!!

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

Powered by 单片机教程网

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