有谁可以给我一份mega16的两路adc输出(外部基准的),1602来显示的程序?

有谁可以给我一份mega16的两路adc输出(外部基准的),1602来显示的程序?,第1张

楼主你好

1602的程序可以给你,但是ADC还得看具体芯片的,不同的芯片的精度、管脚定义、时序不一样,程序也不一样,你可以结合具体芯片型号自己写,很简单的,下面是用51写得一个1602的程序,液隐凯晶显示0123456789和ABCDEDGHIG,你结合实际需要改动一下就行了:

#include<reg52.h>

#define uchar unsigned char

#define uint unsigned int

//这三个引脚参考资料

sbit E=P2^7 //1602使能引脚

sbit RW=P2^6 //1602读写引脚

sbit RS=P2^5 //1602数据/命令选择引脚

/********************************************************************

* 名称 : delay()

* 功能 : 延时,延时时间大概为140US。

* 输入 : 无

* 输出 : 无

***********************************************************************/

void delay()

{

int i,j

for(i=0i<=100i++)

for(j=0j<=20j++)

}

/********************************************************************

* 名称 : enable(uchar del)

* 功能 : 1602命令函数

* 输入闷携源 : 输入的命令值

* 输出 : 无

***********************************************************************/

void enable(uchar del)

{

P0 = del

RS = 0

RW = 0

E = 0

delay()

E = 1

delay()

}

/********************************************************************

* 名称 : write(uchar del)

* 功能 : 1602写数据函数

* 输入 : 需要写入1602的数据

* 输出 : 无

***********************************************************************/

void write(uchar del)

{

P0 = del

RS = 1

RW = 0

E = 0

delay()

E = 1

delay()

}

/********************************************************************

* 名称 : L1602_init()

* 功能 : 1602初始化,请参考1602的资料

* 输入 : 无

* 输出 : 无

***********************************************************************/

void L1602_init(void)

{

enable(0x01)

enable(0x38)

enable(0x0c)

enable(0x06)

enable(0xd0)

}

/********************************************************************

* 名称 : L1602_char(uchar hang,uchar lie,char sign)

* 功能 : 改变液晶中某位的值,如果要让蚂态第一行,第五个字符显示"b" ,调用该函数如下

L1602_char(1,5,'b')

* 输入 : 行,列,需要输入1602的数据

* 输出 : 无

***********************************************************************/

void L1602_char(uchar hang,uchar lie,char sign)

{

uchar a

if(hang == 1) a = 0x80

if(hang == 2) a = 0xc0

a = a + lie - 1

enable(a)

write(sign)

}

/********************************************************************

* 名称 : L1602_string(uchar hang,uchar lie,uchar *p)

* 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符开始显示"ab cd ef" ,调用该函数如下

L1602_string(1,5,"ab cd ef")

* 输入 : 行,列,需要输入1602的数据

* 输出 : 无

***********************************************************************/

void L1602_string(uchar hang,uchar lie,uchar *p)

{

uchar a

if(hang == 1) a = 0x80

if(hang == 2) a = 0xc0

a = a + lie - 1

enable(a)

while(1)

{

if(*p == '\0') break

write(*p)

p++

}

}

/********************************************************************

* 名称 : Main()

* 功能 : 主函数

* 输入 : 无

* 输出 : 无

***********************************************************************/

void Main()

{

uchar i = 48

L1602_init()

L1602_char(1,5,'b')

L1602_string(1,1," 0123456789 ")

L1602_string(2,1," ABCDEDGHIJ ")

while(1)

}

下面是我以前用过的一个程侍指序,不过是MEGA32的,我没用过mega16,楼主只要将以下用到的控制寄存器修改成mega16的即可:

基本思想是初始化程序中设定好自动连续转换,再在中断服务程序中读取结果(每中断一次获得一个通道的转换结果值)。

void adc_init(void)

{

ADCSR = 0x00 // disable adc

ADMUX = 0xC0 // 参考电压选老银配择片内基准电压 2.56V,从PA0号通道开始

ACSR = 0x80 // 不用模拟比较器

ADCSR = 0x89// 启动ADC,转换结果右对齐,分频因子 2

ADC_chn = 0x00 // 选择第一个通道(PA0)

}

void adc_isr(void)

{

UINT ADC_value

ADCSR |= 0x10 // 清 AD 完成标志

ADC_value = ADCL// 先读低搏锋八位数据

ADC_value |= (int)ADCH <<8// 再读高二位数据并移至高字节

if ( ADC_chn == 0x00 )

{input[0] = ADC_value// 保存PA0的值

}

else if ( ADC_chn == 0x01 )

{input[1] = ADC_value// 保存PA1的值

}

else if ( ADC_chn == 0x02 )

{ input[2] = ADC_value// 保存PA2的值

}

。。。。。。。。

else if ( ADC_chn == 0x07 )

{ input[7] = ADC_value// 保存PA7的值

}

ADC_chn ++ // 通道号加 1

if ( ADC_chn >0x07 ) ADC_chn = 0x00

ADMUX = 0xC0 + ADC_chn // 切换通道

}

只能给你一些思路和程序,主穗简要的编程技术关键都在这里面。至于画图只得自己弄。

89S51看门狗功能的使用方法

89S51看门狗功能的使用方法如下:

在程序初始化中向看门狗寄存器(WDTRST地址是0A6H)中先写入01EH,再写入0E1H。即可激活看门狗。

ORG 0000H //这是汇编语言

LJMP begin

Begin:

MOV 0A6H,#01EH 先送1E

MOV 0A6H,#0E1H 后送E1

;在程序初始化中激活看门狗。

……

……

For:

……

MOV 0A6H,#01EH 先送1E

MOV 0A6H,#0E1H 后送E1

喂狗指令

……

LJMP For

在C语言中要增加一个声明语句。 在AT89X51.h声明文件中增加一行 sfr WDTRST = 0xA6

Main()

{

WDTRST=0x1E

WDTRST=0xE1//初始化看门狗。

While (1)

{

WDTRST=0x1E

WDTRST=0xE1//喂狗指令

}

}

注意事项:

1. 89S51的看门狗必须由程序激活后才开始工作。所以必须保证CPU有可靠的上电复位。否则看猜咐裤门狗也无法工作。

2. 看门狗使用的是CPU的晶振。在晶振停振的时候看门狗也无效。

3. 89S51只有14位计数器。在16383个机器周期内必须至少喂狗一次。而且这个时间是固定的,无法更改。当晶振为12M时每16个毫秒需喂狗一次。还可利用定时器把看门狗的喂狗时间延长几秒至几分钟。

/* AT89S51/52片内简皮看门狗使用范例,c51语言*/

#include <reg51.h>

#include <intrins.h>

sfr AUXR = 0x8E//定义AT89S51扩展寄存器

sfr WDTRST = 0xA6

void clr_wdt()

main()

{

AUXR = 0xff// 初始化看门狗相关寄存器

while(1) // 主循环

{

clr_wdt()// 8191个机器周期内必须至少调用此程序一次

// 否则看门狗会溢出

// 其它子程序

//

}

}

void clr_wdt()

{

WDTRST = 0x1E// 清除看门狗指令

WDTRST = 0xE1//

---------------------------------------------------------------------

---------------------------------------------------------------------

四相步进电机控制正反转.已通过测试

#include<reg51.h>

#define uchar unsigned char

#define TURE 1

uchar code MOTO[4]={0x33,0xa6,0xcc,0x59}

uchar status=0

void delay(void)

{unsigned int i

for (i=0i<=450i++)

}

/*

void fanzhuan(void)

{

status--

if (status==255)

{ status=3}

status%=4

P0=MOTO[status]

delay()

}

*/

void zhengzhuan(void)

{status++

status%=4

P0=MOTO[status]

delay()

}

void main(void)

{uchar dp1

P0=MOTO[status]

while(1){

dp1=P1

dp1=dp1&0x03

zhengzhuan()

}}


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/8283246.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-15
下一篇2023-04-15

发表评论

登录后才能评论

评论列表(0条)

    保存