找回密码
 立即注册

QQ登录

只需一步,快速开始

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

STC12C5A60S2+DS1302+DS18B20+ADC+PWM(单片机程序开源)

  [复制链接]
跳转到指定楼层
楼主
以下是部分程序,需要完整程序请下载附件

制作出来的实物图如下:


单片机源程序如下:

//**************************************************************
//【本程序使用STC12C5A60S2单片机和12M晶振,外挂DS1302和DS18B20】
//【本程序集成时间显示,温度显示,ADC电压显示,8位PWM输出功能】
//**************************************************************
//【对于学习单片机的新手来说,此程序看一下然后慢慢理解】
//【对于老手来说可以路过】
//**************************************************************
//【程序中使用经典写法保证DS1302走时稳定和DS18B20显示精度】
//【程序中也使用一些非经典写法,使ADC非查询方式也非中断方式】
//【保证ADC采样速度的同时也保证稳定性(在相应的ADC端口要接30PF
//左右的电容保证采样稳定性)】
//【本程序可以ADC和PWM单独使用,也可以ADC控制PWM做相应输出】
//【ADC采样引脚:P1.0,PWM输出P1.3】
//****************************************************************
//【LCD1602的数据线】
//****************************************************************  
//            RS=P2^6;                //模式位,低电平输入指令,高电平输入数据
//            RW=P2^5;                //读写位,低电平读,高电平写
//            E =P2^7;                //LCD12864使能位,低电平无效,高电平使能
//****************************************************************
//【DS1302的数据线】
//****************************************************************
//            CLK=P3^6;               //DS1302的时钟信号线   
//            IO =P3^4;               //DS1302的数据端口线
//            RST=P3^5;               //DS1302的片选信号线
//***************************************************************
//【程序编写于2022年5月17日深夜】
//***************************************************************
#include<STC12C5A60S2.h>                          //载入单片机头文件
#include<intrins.h>                                          //载入编程规则文件
#include<lcd1602cl.h>                                  //载入LCD1602文件
#include<ds1302cl.h>                                  //载入DS1302文件
#include<ds18b20cl.h>                                  //载入DS18B20文件
unsigned int result,ge,shifen,baifen;
unsigned char seg[10]={'0','1','2','3','4','5','6','7','8','9'};//要显示字符

bit  flag1 =0;
bit  flag2 =0;
bit  flag3 =0;
//****************************************************************
//【显示界面子程序】
//****************************************************************
//void Displayqt(void)                                
//{

// LCDTestWord(0,0x80);
// LCDSendWord("LOVE LIFE! ");
// }

void DisplayHour(void)                 //往LCD上填写小时数据
{
hour=ReadDs1302(0x85);                                   //读小时数据
LCDTestWord(0,0x80);                                   //在80位置显示小时数据
LCDTestWord(1,(hour/16)+0x30);
LCDTestWord(1,hour%16+0x30);
LCDTestWord(0,0x82);                                   //在82位置显示":"
LCDTestWord(1,(0x3a));
}

void DisplayMin(void)                  //往LCD上填写分钟数据   
{
min=ReadDs1302(0x83);                                   //读分钟数据
LCDTestWord(0,0x83);                                   //在83位置显示分钟数据
LCDTestWord(1,(min/16)+0x30);
LCDTestWord(1,min%16+0x30);
LCDTestWord(0,0x85);                                   //在85位置显示":"
LCDTestWord(1,0x3a);
}

void DisplaySec(void)                  //往LCD上填写秒钟数据
{
unsigned char i=0;
unsigned int a=0,b=0,c=0;
sec=ReadDs1302(0x81);                                   //读秒钟数据
LCDTestWord(0,0x86);                                   //在86位置显示秒数据
LCDTestWord(1,(sec/16)+0x30);
LCDTestWord(1,sec%16+0x30);
LCDTestWord(0,0x88);                                   //写三个空格,把空的部分占掉以免乱码
LCDSendWord(" ");
}

void DisplayTemp(void)                                   //往LCD上填写温度数据
{
unsigned int i;                                           //定义i
unsigned char a,b,c;                                   //定义a,b,c
LCDTestWord(0,0x8b);                                   //从8b位置开始写入
TempChange();
i=GetTemp();                                                   //i等于读出来的温度值
a=i/100;                                                           //温度十位
LCDTestWord(1,a+0x30);
b=i/10-a*10;                                                   //温度个位
LCDTestWord(1,b+0x30);
LCDTestWord(1,0x2e);                                   //写入小数点
c=i-a*100-b*10;                                           //温度小数位
LCDTestWord(1,c+0x30);
LCDSendWord("C");                                           //写入字母"C"
}

void Displayvoltage(void)              //往LCD上填写电压数据
{                                                                           //ADC转换结果
unsigned int temp;
temp=ADC_RES;
result=temp*0.01953125*1000;
ge=result/1000;                                                   //个位结果
shifen=result%1000/100;                                   //十分位结果
baifen=result%100/10;                                   //百分位结果
ADC_CONTR = 0xc8;                      //开启转换

LCDTestWord(0,0xC0);                                   //从80位置开始显示
LCDSendWord("       ");
LCDTestWord(0,0xC8);                                   //从86位置开始显示
LCDSendWord("A");                                           //写入字母"A"                                   
LCDSendWord("D");                                           //写入字母"D"
DelayMs(20);
LCDTestWord(1,0x3a);
LCDTestWord(1,seg[ge]);
LCDTestWord(1,0x2e);
LCDTestWord(1,seg[shifen]);
LCDTestWord(1,seg[baifen]);
LCDSendWord("V");                                            //写入字母"V"
  }
//****************************************************************
//【显示指定内容程序】
//****************************************************************
void  Displayxs(void)
{
           DisplayHour();                                           //显示小时数据
        DisplayMin();                                           //显示分钟数据
        DisplaySec();                                           //显示秒钟数据
        DisplayTemp();                                           //显示温度数据
        Displayvoltage();                                   //显示ADC采样电压值
}

//****************************************************************
//【延时部分子程序】
//****************************************************************
void DelayMs(unsigned int a)           //延时 1MS/次
{
unsigned char i;
while(--a!=0)
{
  for(i=0;i<125;i++)
  ;
}
}

void Delay(unsigned char num)               
{

unsigned char i;
_nop_();
while(num--)
i=num;
;
}        


此程序已完美验证,注意本程序使用12M晶振,22.1184M晶振容易导致DS18B20不显示温度,那个延时太难调了.
Keil5代码下载: LCD1602ADCPWM.rar (47.96 KB, 下载次数: 390)

评分

参与人数 2黑币 +80 收起 理由
QJM198972 + 30 赞一个!
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:1024371 发表于 2022-5-18 13:40 | 只看该作者
好资料,必须支持开源,
回复

使用道具 举报

板凳
ID:32289 发表于 2022-5-18 21:19 | 只看该作者
学了N年的单片机,硬是没有入门,只有仿制了。
回复

使用道具 举报

地板
ID:61140 发表于 2022-5-18 23:16 | 只看该作者
rrqxx 发表于 2022-5-18 21:19
学了N年的单片机,硬是没有入门,只有仿制了。

仿制也是一种学习的方法,适当的时候仿制比课本上学的还快些.
回复

使用道具 举报

5#
ID:305762 发表于 2022-5-19 07:59 | 只看该作者

好资料,必须支持开源
回复

使用道具 举报

6#
ID:921339 发表于 2022-5-19 08:34 | 只看该作者
下载,学习了,值得借签
回复

使用道具 举报

7#
ID:242300 发表于 2022-5-19 21:13 | 只看该作者
好资料,支持开源
回复

使用道具 举报

8#
ID:67312 发表于 2022-5-20 09:23 | 只看该作者
收藏了,暂时还看不懂
回复

使用道具 举报

9#
ID:443637 发表于 2022-5-20 13:47 | 只看该作者
学习了,值得借签
回复

使用道具 举报

10#
ID:230742 发表于 2022-5-20 14:22 | 只看该作者
弱弱的问一下,这个是可以调整时间的吗?
回复

使用道具 举报

11#
ID:61140 发表于 2022-5-20 15:58 | 只看该作者
本帖最后由 xiaoyuxinke 于 2022-5-21 08:37 编辑
啤酒瓶子老大 发表于 2022-5-20 14:22
弱弱的问一下,这个是可以调整时间的吗?

调时间前应先禁止走时并允许写入
再把DS1302内相应数据先读出来,然后相应位按键就加1(若按键为长按则当前位不断加1,当然中间要加延时,不然加的速度会非常快,人眼根本看不清)
秒钟=60,若等于60清零当前位并分钟位加1,
分钟=60,若等于60清零当前位并小时位加1,
小时=24,若等于24则小时分钟和秒钟全部清零,
退出前开走时并禁止写入时间.

调整时间很简单 比如要调整分,按键按下,DS1302停止走时,读出DS1302分数据然后分钟加一,若分钟不等于或大于60则把加1后的数据再写回DS1302,打开DS1302走时,禁止写入时间.  若分钟加一后等于或大于60,然后把小时数据也读出来分钟清0小时加1,若小时不等于或大于24则把清零后的分钟和小时都写回DS1302,退出.若小时等于或大于24(这里的大于24是防止程序跑飞的现象,有时用手摸一下DS1302时间会显示超过24小时)则时分秒全部清0退出.
      至于按键消抖部分你自己想办法.
回复

使用道具 举报

12#
ID:965189 发表于 2022-5-20 22:46 | 只看该作者
程序简洁,注释详细。值得学习。
回复

使用道具 举报

13#
ID:1028406 发表于 2022-5-21 12:02 | 只看该作者

好资料,支持开源
回复

使用道具 举报

14#
ID:447439 发表于 2022-5-23 09:12 | 只看该作者
楼主能否分享下用ADC采用做电量检测,其次是想问下ADC分压按键同时按住如何减少干扰。谢谢
回复

使用道具 举报

15#
ID:776619 发表于 2022-5-23 19:37 | 只看该作者
度C可以自编一个显示,1602支持8个自选显示。
回复

使用道具 举报

16#
ID:1028725 发表于 2022-5-24 20:46 | 只看该作者
有多路ds18b20的程序吗
回复

使用道具 举报

17#
ID:61140 发表于 2022-5-25 22:25 | 只看该作者
啤酒瓶子老大 发表于 2022-5-20 14:22
弱弱的问一下,这个是可以调整时间的吗?

您可以自行修改一下就可以调时间了,DS1302调时间很容易,80H/82H/84H分别是秒分时的调整.
回复

使用道具 举报

18#
ID:61140 发表于 2022-5-25 22:29 | 只看该作者
小丑only 发表于 2022-5-23 09:12
楼主能否分享下用ADC采用做电量检测,其次是想问下ADC分压按键同时按住如何减少干扰。谢谢

ADC做电量测量,如果要精准需要加一个标准电压检测(需要三路ADC,一路做标准电压检测,另两路分别是电压和电流采样)不需要太精准的话,直接两路ADC采集电压电流值,然后算出功率,

至于你说的ADC分压按键减少干扰,每个键上面并个30PF电容(注意是每个键上都要并,不只是你按下的键),不要太大,否则会对你ADC采样造成影响.
回复

使用道具 举报

19#
ID:61140 发表于 2022-5-25 22:34 | 只看该作者
51小白。lht 发表于 2022-5-24 20:46
有多路ds18b20的程序吗

DS18B20并不是很麻烦的东西,你可以看着说明书自己写就行了.只是延时部分要求严格些.
回复

使用道具 举报

20#
ID:61140 发表于 2022-6-3 04:06 | 只看该作者
会沉么,会的,所以再来顶一下,免的沉下去.
回复

使用道具 举报

21#
ID:409878 发表于 2022-6-3 16:17 | 只看该作者
学习的最好方法,就是不断的写,不断的动手。
回复

使用道具 举报

22#
ID:1019972 发表于 2022-6-3 17:50 | 只看该作者
不断的动手
回复

使用道具 举报

23#
ID:409674 发表于 2022-6-4 17:29 | 只看该作者
DS1302时间总是会跑快的,要经常调整时间,不是很理想。
回复

使用道具 举报

24#
ID:624685 发表于 2022-6-5 11:43 | 只看该作者
好资料,虽然现在还看不太懂,谢谢,慢慢学习
回复

使用道具 举报

25#
ID:368834 发表于 2022-6-7 08:33 | 只看该作者
强,好资料,必须支持
回复

使用道具 举报

26#
ID:368834 发表于 2022-6-7 08:34 | 只看该作者
好资料,必须顶上去
回复

使用道具 举报

27#
ID:915491 发表于 2022-6-7 09:39 | 只看该作者
很好,功能很全
回复

使用道具 举报

28#
ID:61140 发表于 2022-6-13 15:06 | 只看该作者
gao687 发表于 2022-6-7 09:39
很好,功能很全

后面会发一些适合新手学习的程序和DIY项目
回复

使用道具 举报

29#
ID:1000963 发表于 2022-6-14 09:39 | 只看该作者
程序写的不错的
回复

使用道具 举报

30#
ID:388099 发表于 2022-6-14 20:20 | 只看该作者
感谢分享,下载了慢慢学习。谢谢。
回复

使用道具 举报

31#
ID:893249 发表于 2022-6-19 23:13 | 只看该作者
好资料,必须支持开源
回复

使用道具 举报

32#
ID:61140 发表于 2022-6-19 23:56 | 只看该作者
wolfinn 发表于 2022-5-23 19:37
度C可以自编一个显示,1602支持8个自选显示。

本程序只做演示不做实用,如果实用的话我会夹带汇编以修正时间差,可以做到年走时误差3S以内不是神话.
回复

使用道具 举报

33#
ID:372579 发表于 2022-6-20 11:09 | 只看该作者
好资料,必须支持楼主
回复

使用道具 举报

34#
ID:58874 发表于 2022-6-20 23:45 | 只看该作者
好资料,必须支持开源
回复

使用道具 举报

35#
ID:893249 发表于 2022-6-21 21:56 来自手机 | 只看该作者
请问ad采集的哪里的电压,pwm输出到哪里?是要控制什么吗?
回复

使用道具 举报

36#
ID:425251 发表于 2022-6-22 08:09 | 只看该作者
好资料,必须支持开源。收藏了。
回复

使用道具 举报

37#
ID:1036478 发表于 2022-6-22 20:23 | 只看该作者
  好资料,必须支持开源
回复

使用道具 举报

38#
ID:1033693 发表于 2022-6-25 11:13 | 只看该作者
好资料,有独立的思考方式
回复

使用道具 举报

39#
ID:61140 发表于 2022-6-25 22:21 | 只看该作者
本帖最后由 xiaoyuxinke 于 2022-9-14 15:29 编辑
nicevoip 发表于 2022-6-21 21:56
请问ad采集的哪里的电压,pwm输出到哪里?是要控制什么吗?

这个看你想怎么应用了,可以用AD变成PWM控制电机转速,也可以用PWM控制其它或用其它变量控制输出的PWM,这个可以灵活应用.
回复

使用道具 举报

40#
ID:965189 发表于 2022-9-13 21:46 | 只看该作者
好资料就要下载学习。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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