找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 36963|回复: 65
打印 上一主题 下一主题
收起左侧

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

  [复制链接]
跳转到指定楼层
#
1、AD转换
2、PWM输出
3、AD输入的比例控制PWM的占空比。
4、lcd1602显示AD测试值,PWM输出占空比
5、全文注释
6、proteus仿真图。
顶一下,谢谢

图.jpg (168.02 KB, 下载次数: 752)

图.jpg

picad.7z

209.59 KB, 下载次数: 1019, 下载积分: 黑币 -5

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏12 分享淘帖 顶2 踩
回复

使用道具 举报

65#
ID:1146374 发表于 2025-4-6 14:22 | 只看该作者
OK,很有用!
回复

使用道具 举报

64#
ID:609145 发表于 2022-7-11 11:10 | 只看该作者
非常不错 值得学习。
回复

使用道具 举报

63#
ID:18297 发表于 2022-2-12 09:04 | 只看该作者
请讲述你的问题,你的功能要求。
回复

使用道具 举报

62#
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. }
复制代码

能帮我看看这个程序问题出在哪里吗
回复

使用道具 举报

61#
ID:960452 发表于 2021-9-13 16:43 | 只看该作者
求教楼主,我想同时检测电压 电流该怎么改进程序?
回复

使用道具 举报

60#
ID:387687 发表于 2021-9-5 21:45 | 只看该作者
好程序,学习了。
回复

使用道具 举报

59#
ID:625711 发表于 2021-9-1 15:53 | 只看该作者
谢谢分享!!!可以很好的学习下AD!
回复

使用道具 举报

58#
ID:713781 发表于 2020-4-8 15:12 | 只看该作者
我下载出来的电路图和上面的电路图不一样啊,只有我这样吗
回复

使用道具 举报

57#
ID:103421 发表于 2019-9-3 16:08 | 只看该作者
不错,下来学习。
回复

使用道具 举报

56#
ID:154187 发表于 2019-1-22 09:57 | 只看该作者
仿真没有找到lcd1602啊
回复

使用道具 举报

55#
ID:213175 发表于 2018-11-12 20:25 | 只看该作者
感谢分享
回复

使用道具 举报

54#
ID:302666 发表于 2018-6-1 03:18 | 只看该作者
有个例程参考,好多了
回复

使用道具 举报

53#
ID:322187 发表于 2018-5-4 16:29 | 只看该作者
学习学习,感谢分享
回复

使用道具 举报

52#
ID:209855 发表于 2018-1-12 13:30 | 只看该作者
急需看1602的代码,我的就是不显示,只有背光。
回复

使用道具 举报

51#
ID:269685 发表于 2018-1-1 11:43 | 只看该作者
没有lcd1602
回复

使用道具 举报

50#
ID:71549 发表于 2017-11-25 17:53 | 只看该作者

不错  楼主辛苦
回复

使用道具 举报

49#
ID:94088 发表于 2017-11-10 13:16 | 只看该作者
感谢分享!!!
回复

使用道具 举报

48#
ID:183735 发表于 2017-7-1 14:15 | 只看该作者
东西值得去认真看
回复

使用道具 举报

47#
ID:186630 发表于 2017-4-27 16:06 | 只看该作者
好东西,参考一下
回复

使用道具 举报

46#
ID:159112 发表于 2017-3-19 09:51 | 只看该作者
好东西,值得学习。
回复

使用道具 举报

45#
ID:170103 发表于 2017-3-18 09:50 | 只看该作者
楼主的资料真的是帮我了大忙
回复

使用道具 举报

44#
ID:170103 发表于 2017-3-18 09:49 | 只看该作者
楼主这个真是我需要学习的资料啊
回复

使用道具 举报

43#
ID:162067 发表于 2017-2-5 16:49 | 只看该作者
谢谢楼主
回复

使用道具 举报

42#
ID:161115 发表于 2017-1-10 14:14 | 只看该作者
真的是一个不错的学习例子,支持楼主
回复

使用道具 举报

41#
ID:159601 发表于 2017-1-3 14:38 | 只看该作者
很实用啊啊啊啊
回复

使用道具 举报

40#
ID:159270 发表于 2017-1-2 22:23 | 只看该作者
zjjhtony 发表于 2017-1-2 18:10
这个估计是你的编译器的问题,我使用的是mplab V8.7版本的。

版主:我用的是mplab IDE V8.91版本,PICC V8.05版,编译其它程序可以的
回复

使用道具 举报

39#
ID:18297 发表于 2017-1-2 18:10 | 只看该作者
这个估计是你的编译器的问题,我使用的是mplab V8.7版本的。
回复

使用道具 举报

38#
ID:159270 发表于 2017-1-1 22:57 | 只看该作者
编译出现这样的故障代码,菜鸟请教
回复

使用道具 举报

37#
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
回复

使用道具 举报

36#
ID:159270 发表于 2017-1-1 22:48 | 只看该作者
刚刚试了下,1602LCD没有显示,不知啥问题
回复

使用道具 举报

35#
ID:82712 发表于 2016-9-19 17:36 | 只看该作者
学习学习。。。
回复

使用道具 举报

34#
ID:88073 发表于 2016-9-13 17:11 | 只看该作者
仿真还得重新加东西?
回复

使用道具 举报

33#
ID:99245 发表于 2016-8-2 11:50 | 只看该作者
学习了!非常感谢
回复

使用道具 举报

32#
ID:105271 发表于 2016-2-10 23:42 | 只看该作者
学习了!!!谢谢!!
回复

使用道具 举报

31#
ID:104119 发表于 2016-1-22 16:15 | 只看该作者
感谢楼主分享!!!!!!!!!!
回复

使用道具 举报

30#
ID:85606 发表于 2015-12-29 12:19 | 只看该作者
楼主发帖辛苦了,谢谢分享!!!!!!!!
回复

使用道具 举报

29#
ID:90884 发表于 2015-9-23 17:02 | 只看该作者
这是神马东西,lcd在哪都看不见,差评
回复

使用道具 举报

28#
ID:71535 发表于 2015-9-22 08:19 | 只看该作者
感谢楼主分享,这对刚入门的人帮助会很大啊!
回复

使用道具 举报

27#
ID:86543 发表于 2015-8-14 20:02 | 只看该作者
这个必须顶,…………………………
回复

使用道具 举报

26#
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 单片机教程网

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