/* 功能:使用12C5A60S2内部AD读取外部三路电压,显示在1602上 */

/*     最多可同时输入8路电压,设置P1ASF            */

#include

#include

sbit RS = P2^6;   //定义1602使用的端口

sbit RW = P2^5;

sbit EN = P2^7;

#define uchar unsigned char;

#define uint unsigned int;

#define RS_CLR RS=0

#define RS_SET RS=1

#define RW_CLR RW=0

#define RW_SET RW=1

#define EN_CLR EN=0

#define EN_SET EN=1

#define DataPort P0   //连接1602数据口 P0

//uchar b,i,ge,shi,bai;

uchar da1=0,da2=0,da3=0;

double Data,c;

char a[5]="";

uchar ADC_Chanul_Turn=0;

/*------------------------------------------------

uS延时函数,含有输入参数 unsigned char t,无返回值

unsigned char 是定义无符号字符变量,其值的范围是

0~255 这里使用晶振12M,精确延时请使用汇编,大致延时

长度如下 T=tx2+5 uS

------------------------------------------------*/

void DelayUs2x(unsigned char t)

{

while(--t);

}

/*------------------------------------------------

mS延时函数,含有输入参数 unsigned char t,无返回值

unsigned char 是定义无符号字符变量,其值的范围是

0~255 这里使用晶振12M,精确延时请使用汇编

------------------------------------------------*/

void DelayMs(unsigned char t)

{

while(t--)

{

//大致延时1mS

DelayUs2x(245);

DelayUs2x(245);

}

}

/*------------------------------------------------

判忙函数

------------------------------------------------*/

bit LCD_Check_Busy(void)

{

DataPort= 0xFF;

RS_CLR;

RW_SET;

EN_CLR;

_nop_();

EN_SET;

return (bit)(DataPort & 0x80);

}

/*------------------------------------------------

写入命令函数

------------------------------------------------*/

void LCD_Write_Com(unsigned char com)

{

while(LCD_Check_Busy()); //忙则等待

RS_CLR;

RW_CLR;

EN_SET;

DataPort= com;          //

_nop_();

EN_CLR;

}

/*------------------------------------------------

写入数据函数

------------------------------------------------*/

void LCD_Write_Data(unsigned char Data)

{

while(LCD_Check_Busy()); //忙则等待

RS_SET;

RW_CLR;

EN_SET;

DataPort= Data;

_nop_();

EN_CLR;

}

/*------------------------------------------------

清屏函数

------------------------------------------------*/

void LCD_Clear(void)

{

LCD_Write_Com(0x01);

DelayMs(5);

}

/*------------------------------------------------

写入字符串函数

------------------------------------------------*/

void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)//y为行数,x为横坐标,最后一个是字符

{

if (y == 0)

{

LCD_Write_Com(0x80 + x);     //表示第一行

}

else

{

LCD_Write_Com(0xC0 + x);      //表示第二行

}

while (*s)

{

LCD_Write_Data( *s);

s ++;

}

}

/*------------------------------------------------

写入字符函数

------------------------------------------------*/

void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data)

{

if (y == 0)

{

LCD_Write_Com(0x80 + x);

}

else

{

LCD_Write_Com(0xC0 + x);

}

LCD_Write_Data( Data);

}

/*------------------------------------------------

初始化函数

------------------------------------------------*/

void LCD_Init(void)

{

LCD_Write_Com(0x38);    /*显示模式设置*/

DelayMs(5);

LCD_Write_Com(0x38);

DelayMs(5);

LCD_Write_Com(0x38);

DelayMs(5);

LCD_Write_Com(0x38);

LCD_Write_Com(0x08);    /*显示关闭*/

LCD_Write_Com(0x01);    /*显示清屏*/

LCD_Write_Com(0x06);    /*显示光标移动设置*/

DelayMs(5);

LCD_Write_Com(0x0C);    /*显示开及光标设置*/

}

/*------------------------------------------------

ADC函数

------------------------------------------------*/

void InitADC()//初始AD寄存器

{

P1ASF=0X07;     //0xff设置P1口全部为ADC通道,0x07=0000,0111  即使用P10,P11,P12作为输入

ADC_RES=0X00;    //清除高8位缓冲数据

if(ADC_Chanul_Turn%3==0)//外部基准电压

{

ADC_CONTR=0xF0; //AD转换控制寄存器,1111,0000  P10口

_nop_();

_nop_();

_nop_();

_nop_();

ADC_CONTR=0xE8;    //1110,1000(清零Flag,置位Start)

}

if(ADC_Chanul_Turn%3==1)

{

ADC_CONTR=0xF1; // 1111,0001  P11口

_nop_();

_nop_();

_nop_();

_nop_();

ADC_CONTR=0xE9;    //1110,1001

}

if(ADC_Chanul_Turn%3==2)

{

ADC_CONTR=0xF2; //1111,0010  P12口

_nop_();

_nop_();

_nop_();

_nop_();

ADC_CONTR=0xEA;    //1110,1010

}

}

void timer0() interrupt 1      //interrupt 1: 定时器0,interrupt3:定时器3

{

TH0=(65536-20000)/256;       //高八位,(需要表示Xms的定时,计数器由65536-X数到65536,由于16位,只能分高低位)

TL0=(65536-20000)%256;     //低八位

InitADC();

}

void adc_isr() interrupt 5      //FLAG标志位置位触发中断,没有设优先级,但是同优先级下定时器0更高

{

//V_5REF=V_1REF*256/da_ref;

if(ADC_Chanul_Turn%3==0)                     //外部基准电压

{

da1=ADC_RES;                                   //获取转换结果

Data=((double)da1/256)*5;     //取八位计算基准电压Data,

c =Data;

}

if(ADC_Chanul_Turn%3==1)

{

da2=ADC_RES;                                  //获取转换结果

Data=((double)da2/256)*5;     //取八位计算实际值Data,

c =Data;

}

if(ADC_Chanul_Turn%3==2)

{

da3=ADC_RES;                                  //获取转换结果

Data=((double)da3/256)*5;     //取八位计算实际值Data,

c =Data;

}

a[0]=((int)c%10+0x30);//个位(电压<5,仅有个)     //0x30: ASCAI码里代表“0”,必须转换成字符存在字符型数组里才可以在1602液晶屏上显示

a[1]=0x2e;                    //小数点

a[2]=((int)(c*10)%10+0x30); // 十分位

a[3]=((int)(c*100)%10+0x30);// 百分位

a[4]='\0';                  //  加了串尾符才成了字符串哦

if(ADC_Chanul_Turn%3==0)  LCD_Write_String(0,0,a);

if(ADC_Chanul_Turn%3==1)  LCD_Write_String(5,0,a);

if(ADC_Chanul_Turn%3==2) LCD_Write_String(0,1,a);

ADC_CONTR&=0xEF;               //标志位清零

ADC_Chanul_Turn++;

if(ADC_Chanul_Turn==252)

ADC_Chanul_Turn=0;

}

void main()

{

LCD_Init();

LCD_Clear();                     //清屏

//LCD_Write_String(0,2,"Hello Dog!");

DelayMs(255);

TH0=(65536-20000)/256;           //开定时器0

TL0=(65536-20000)%256;

EA=1;                             //开全局中断

ET0=1;                             //允许定时器零中断

EADC=1;                          //允许ADC中断

TR0=1;

while(1);

}

stc12c5a单片机c语言adc,STC12C5A60S2单片机的ADC采样程序分享相关推荐

  1. 单片机c语言编程下载,单片机C语言编程.doc

    单片机C语言编程.doc 单片机C语言编程指令格式 功能简述 字节数 周期 一.数据传送类指令 MOV A, Rn 寄存器送累加器 1 1 MOV Rn,A 累加器送寄存器 1 1 MOV A ,Ri ...

  2. 热电偶单片机代码c语言,基于STC12C5A60S2单片机的恒温箱设计-LCD1602-热电偶(电路图+程序源码)...

    https://v.youku.com/v_show/id_XNDc2NzY1MDY2NA==.html?spm=a2hzp.8253869.0.0 2017-468.STC12C5A60S2恒温箱设 ...

  3. stc单片机c语言 pdf,STC单片机C语言程序设计 第13章 STC单片机C语言指针.pdf

    STC单片机C语言指针 主讲:何宾 Email :hebin@mail.buct.edu.cn 2016.03 C51编译器中指针的分类 Cx51编译器支持使用字符"*"声明变量指 ...

  4. arduino和单片机c语言,Arduino和单片机的区别-与非网

    Arduino是一款便捷灵活.方便上手的开源电子原型平台.包含硬件(各种型号的Arduino板)和软件(ArduinoIDE).由一个欧洲开发团队于2005年冬季开发.其成员包括Massimo Ban ...

  5. 51单片机c语言编程函数,单片机C语言教程:C51函数

    其实一直出现在例子中的 main()也算是一个函数,只不过它比较特殊,编译时以它做为程序的开始段.有了函数C 语言就有了模块化的优点,一般功能较多的程序,会在编写程序时把每项单独的功能分成数个子程序模 ...

  6. 单片机c语言条件语句,单片机c语言教程:C51复合语句和条件语句

    曾经在BBS上有朋友问过我{}是什么意思?什么作用?在  C  中是有不少的括号,如{},[],()等,确实会让一些初入门的朋友不解.在 VB 等一些语言中同一个()号会有不一样的 作用,它能用于组合 ...

  7. 单片机C语言仿真图,单片机C语言程序设计代码和仿真图.doc

    word完美格式 精心整理 学习帮手 <单片机C语言程序设计实训100例-基于8051+Proteus仿真>案例 第 01 篇 基础程序设计 01闪烁的LED /* 名称:闪烁的LED 说 ...

  8. 51单片机c语言程序控制,51单片机C语言程序设计源代码

    <51单片机C语言程序设计源代码>由会员分享,可在线阅读,更多相关<51单片机C语言程序设计源代码(281页珍藏版)>请在人人文库网上搜索. 1.51 SCM c语言教程示例2 ...

  9. 单片机c语言关键字 id,单片机关键字sfr和sbit的理解

    在单片机C语言编程中,扩充了两个关键字sfr和sbit. sfr(Special Function Register特殊功能寄存器的缩写),sbit(特殊功能寄存器位),与定义一般的int.char型 ...

  10. 单片机C语言节日彩灯,单片机c语言节日彩灯控制器设计.docx

    单片机c语言节日彩灯控制器设计 湖南涉外经济学院课程设计报告课程名称:单片机原理及应用报告题目:节日彩灯控制器的设计学生姓名:所在学院:信息科学与工程学院专业班级:电子信息工程1102班学生学号:指导 ...

最新文章

  1. 微信朋友圈装x代码_NBA总决赛朋友圈装X图鉴:直男之间有真正的友谊吗?
  2. 用什么DOS命令挂上*.mdf、*.ldf的数据库?
  3. Bridging signals(二分 二分+stl dp)
  4. what you should do if you want to exercise?
  5. mfc从文件中读取数据_Java中Transient关键字,一点课堂(多岸学院)
  6. gridview 动态数据操作
  7. html表单中get与post之间的区别
  8. python打包库_Python 打包自己的库到 PYPI (可pip安装)
  9. MySql中json类型的使用___mybatis存取mysql中的json
  10. ※归并排序(merge sort)
  11. 计算机使用的安全问题,大学计算机基础 教案 了解计算机使用中的安全问题(范文).doc...
  12. 机器学习算法mini版
  13. 【辨异】relation, relationship
  14. 计算机专业毕业设计资料免费下载
  15. Guice集成Properties配置
  16. 照片放大模糊怎么变清晰,图片无损放大
  17. 科研ABC - 文献检索
  18. 平安好医生上半年营收28亿:同比降26% 净亏4.26亿
  19. When you are old - 当你老去时(译)
  20. C++:实现量化Piecewise yield曲线测试实例

热门文章

  1. 矩阵求导公式的推导和计算(公式推导法)
  2. python木马病毒_Python引导木马病毒(拓展篇)
  3. 【RDMA】ibv_modify_qp()
  4. 跟铁拐李李老师学习工作流的第二天
  5. Labview筛选符合条件的数据
  6. WebSphere Application Server V7、V8 和 V8.5 中的高级安全性加强,第 1 部分: 安全性加强的概述和方法...
  7. Didn't find class ...l on path: DexPathList
  8. wordpress 安装主题显示要配置FTP的解决办法
  9. spring boot火车票预订系统毕业设计-附源码091029
  10. 解密Zynga:专注 流水线 数据控