标题: STC12C5A60S2+DS1302+DS18B20+ADC+PWM(单片机程序开源) [打印本页]

作者: xiaoyuxinke    时间: 2022-5-17 23:04
标题: 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, 下载次数: 414)

作者: 尘土的飞扬    时间: 2022-5-18 13:40
好资料,必须支持开源,
作者: rrqxx    时间: 2022-5-18 21:19
学了N年的单片机,硬是没有入门,只有仿制了。
作者: xiaoyuxinke    时间: 2022-5-18 23:16
rrqxx 发表于 2022-5-18 21:19
学了N年的单片机,硬是没有入门,只有仿制了。

仿制也是一种学习的方法,适当的时候仿制比课本上学的还快些.
作者: 单片机mcu    时间: 2022-5-19 07:59

好资料,必须支持开源
作者: cszhougong    时间: 2022-5-19 08:34
下载,学习了,值得借签
作者: qweer    时间: 2022-5-19 21:13
好资料,支持开源
作者: jinanyuanyue    时间: 2022-5-20 09:23
收藏了,暂时还看不懂
作者: 701    时间: 2022-5-20 13:47
学习了,值得借签
作者: 啤酒瓶子老大    时间: 2022-5-20 14:22
弱弱的问一下,这个是可以调整时间的吗?
作者: xiaoyuxinke    时间: 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退出.
      至于按键消抖部分你自己想办法.
作者: 君工创    时间: 2022-5-20 22:46
程序简洁,注释详细。值得学习。
作者: lingnicole    时间: 2022-5-21 12:02

好资料,支持开源
作者: 小丑only    时间: 2022-5-23 09:12
楼主能否分享下用ADC采用做电量检测,其次是想问下ADC分压按键同时按住如何减少干扰。谢谢
作者: wolfinn    时间: 2022-5-23 19:37
度C可以自编一个显示,1602支持8个自选显示。
作者: 51小白。lht    时间: 2022-5-24 20:46
有多路ds18b20的程序吗
作者: xiaoyuxinke    时间: 2022-5-25 22:25
啤酒瓶子老大 发表于 2022-5-20 14:22
弱弱的问一下,这个是可以调整时间的吗?

您可以自行修改一下就可以调时间了,DS1302调时间很容易,80H/82H/84H分别是秒分时的调整.
作者: xiaoyuxinke    时间: 2022-5-25 22:29
小丑only 发表于 2022-5-23 09:12
楼主能否分享下用ADC采用做电量检测,其次是想问下ADC分压按键同时按住如何减少干扰。谢谢

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

至于你说的ADC分压按键减少干扰,每个键上面并个30PF电容(注意是每个键上都要并,不只是你按下的键),不要太大,否则会对你ADC采样造成影响.
作者: xiaoyuxinke    时间: 2022-5-25 22:34
51小白。lht 发表于 2022-5-24 20:46
有多路ds18b20的程序吗

DS18B20并不是很麻烦的东西,你可以看着说明书自己写就行了.只是延时部分要求严格些.
作者: xiaoyuxinke    时间: 2022-6-3 04:06
会沉么,会的,所以再来顶一下,免的沉下去.
作者: suiwinder    时间: 2022-6-3 16:17
学习的最好方法,就是不断的写,不断的动手。
作者: 2590413275    时间: 2022-6-3 17:50
不断的动手
作者: zxianyu    时间: 2022-6-4 17:29
DS1302时间总是会跑快的,要经常调整时间,不是很理想。
作者: pq1972    时间: 2022-6-5 11:43
好资料,虽然现在还看不太懂,谢谢,慢慢学习
作者: cq03210    时间: 2022-6-7 08:33
强,好资料,必须支持
作者: cq03210    时间: 2022-6-7 08:34
好资料,必须顶上去
作者: gao687    时间: 2022-6-7 09:39
很好,功能很全
作者: xiaoyuxinke    时间: 2022-6-13 15:06
gao687 发表于 2022-6-7 09:39
很好,功能很全

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

作者: 867910038    时间: 2022-6-14 09:39
程序写的不错的
作者: qq76832893    时间: 2022-6-14 20:20
感谢分享,下载了慢慢学习。谢谢。
作者: nicevoip    时间: 2022-6-19 23:13
好资料,必须支持开源
作者: xiaoyuxinke    时间: 2022-6-19 23:56
wolfinn 发表于 2022-5-23 19:37
度C可以自编一个显示,1602支持8个自选显示。

本程序只做演示不做实用,如果实用的话我会夹带汇编以修正时间差,可以做到年走时误差3S以内不是神话.
作者: aide51    时间: 2022-6-20 11:09
好资料,必须支持楼主
作者: sdsdzs    时间: 2022-6-20 23:45
好资料,必须支持开源
作者: nicevoip    时间: 2022-6-21 21:56
请问ad采集的哪里的电压,pwm输出到哪里?是要控制什么吗?
作者: chenzg2018    时间: 2022-6-22 08:09
好资料,必须支持开源。收藏了。
作者: yelk'    时间: 2022-6-22 20:23
  好资料,必须支持开源
作者: 无线hi    时间: 2022-6-25 11:13
好资料,有独立的思考方式
作者: xiaoyuxinke    时间: 2022-6-25 22:21
本帖最后由 xiaoyuxinke 于 2022-9-14 15:29 编辑
nicevoip 发表于 2022-6-21 21:56
请问ad采集的哪里的电压,pwm输出到哪里?是要控制什么吗?

这个看你想怎么应用了,可以用AD变成PWM控制电机转速,也可以用PWM控制其它或用其它变量控制输出的PWM,这个可以灵活应用.
作者: 君工创    时间: 2022-9-13 21:46
好资料就要下载学习。
作者: cqgdlq    时间: 2022-10-4 20:23
好资料,下来学习下。
作者: 2441982213    时间: 2022-10-4 22:43
好资料,必须支持开源
作者: zhhdok    时间: 2022-10-5 16:17
能帮我写一个程序吗?大侠&#129464;‍♀️,http://www.51hei.com/bbs/dpj-223490-1.html,我现在这段程序,还是不能用!
作者: 君工创    时间: 2022-11-23 20:10
好资料,值得学习学习。
作者: 肖肖111111    时间: 2022-11-24 12:32
非常棒,学习一下好程序
作者: xiaoyuxinke    时间: 2022-12-2 00:41
zhhdok 发表于 2022-10-5 16:17
能帮我写一个程序吗?大侠&#129464;‍♀️,http://www.51hei.com/bbs/dpj-223490-1.html,我现 ...

没时间,我工作忙,只能业除搞一下这些
作者: Su_xin    时间: 2022-12-5 08:12
好资料..学习学习..必须支持开源
作者: lixiongkuku    时间: 2023-2-23 17:39
suiwinder 发表于 2022-6-3 16:17
学习的最好方法,就是不断的写,不断的动手。

是的,一次做等于很多次学。
我记得我成长最快的时候是给朋友做设计,现在10年过去了,我去找了原来的代码,发现那几个月自己产出的东西真多,而且也因为那个时期写了好多代码,发现自己逐渐懂了一些,有些东西是一下子就能看懂看明白的。

不动手,只看,只想,永远出不来效果。
作者: 斯图尔特魏    时间: 2023-4-2 08:34
不错哦,确实是好资料呢,感觉有点复杂,我得慢慢琢磨一下
作者: suiwinder    时间: 2023-4-2 19:58
硬件如果有问题,那就是大问题。
作者: 2663496424    时间: 2023-4-8 21:28
好资料,支持开源
作者: 风的旋律    时间: 2023-4-11 09:05

感谢分享,好资料就要下载学习,谢谢
作者: 666777888484    时间: 2023-4-23 20:47
大佬可以教一下怎么使用蜂鸣器播放音乐吗
作者: meiwazichuan    时间: 2023-5-13 21:20

好资料,必须支持开源
作者: 芯菲    时间: 2023-5-14 19:37
正是我需要的资料,谢谢分享。
作者: 我的对象是佩琪    时间: 2023-5-15 15:46

好资料,必须支持开源
作者: 我的对象是佩琪    时间: 2023-5-15 15:49
支持开源!!!

作者: Esst    时间: 2023-5-16 14:12
需要用到,感谢了
作者: 565378860    时间: 2023-6-6 14:38
支持楼主的高风亮节
作者: 憨名    时间: 2023-7-15 08:04
好程序条理分明,注释清晰,值得学习
作者: xiaoyuxinke    时间: 2023-8-9 18:25
666777888484 发表于 2023-4-23 20:47
大佬可以教一下怎么使用蜂鸣器播放音乐吗

很简单的东东,实现的方法也很多,

作者: 阿飞7812    时间: 2023-8-10 08:57
我用的12M 显示总是更新的很快是什么原因,看都看不清。 我就改了下我开发板对应的IO口,按一下复位能暂停
作者: 君工创    时间: 2023-8-19 20:28
我用STC8G2K的片子,读不到DS1302的时间出来。
作者: 阿飞7812    时间: 2023-8-29 09:05
楼按你的程序怎么改AD采样脚 怎么会改不了 ,程序里改了AD输入P1.1和控制位也改了相应的脚位, 但上电测试还是在原不那脚 除这二个地方外还要改那哦 请指教,还有DS1302那块时间也不走
作者: 阿飞7812    时间: 2023-9-2 20:25
楼主;我按你的程序去打了PCB样  脚位定都一样,现在出现的问题是不改AD IO口采样正常,但我改了IO口后如P1.1,但发现还是原来的P10口调电位器才有用,改的P1.1口电位不起作用,我改的地方P1ASF =0x02;原来0X01改成0X02,ADC_CONTR = 0xc9;        原来0XC8改成0XC9;0XCA,都试了还是在原来P1.0口上,还有时间读不出来;我用坛友uid:889094程序试了能正常走时,搞了二天都没找到原因;温度正常,望指点                                 
作者: ha987549e    时间: 2023-10-26 21:33
非常棒,学习一下好程序
作者: STC新未来    时间: 2023-10-28 08:52
感谢楼主的精彩分享!后续您有精力的话可以考虑移植到支持硬件USB下载和硬件USB仿真的STC8H8K64U上



[attach]320942[/attach]

[attach]320943[/attach]


作者: 不开单佛看见    时间: 2023-10-30 09:15
好资料,必须支持开源
作者: xiaoyuxinke    时间: 2023-11-4 21:29
阿飞7812 发表于 2023-9-2 20:25
楼主;我按你的程序去打了PCB样  脚位定都一样,现在出现的问题是不改AD IO口采样正常,但我改了IO口后如P1 ...

不改就可以用,为什么要改呢?

作者: dyx811    时间: 2023-11-5 08:48
好资料就是要顶!
作者: dj3365191    时间: 2023-11-5 11:16
显示用的是1602吗
作者: xiaoyuxinke    时间: 2023-11-7 20:38
dj3365191 发表于 2023-11-5 11:16
显示用的是1602吗

是的,LCD1602
作者: QQQQ987    时间: 2023-11-13 21:42
附件有电路图吗?
作者: 市井闲叟    时间: 2023-12-18 22:48
好程序条理分明,注释清晰全面,真心帮助别人进步的好帖子。
作者: xiaoyuxinke    时间: 2024-1-18 16:38
666777888484 发表于 2023-4-23 20:47
大佬可以教一下怎么使用蜂鸣器播放音乐吗

我的贴子里面有,自己找一下,
作者: xiaoyuxinke    时间: 2024-1-18 16:40
阿飞7812 发表于 2023-9-2 20:25
楼主;我按你的程序去打了PCB样  脚位定都一样,现在出现的问题是不改AD IO口采样正常,但我改了IO口后如P1 ...

嘿嘿,小样,仔细看一下STC的单片机说明书你会发现差别,




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1