关于STC单片机AD转换和显示程序。

关于STC单片机AD转换和显示程序。,第1张

重点不在算法,重点是会AD_init() 和AD_get(channel)

会初始化和启动AD转换并读取转换结果

至于换算是根据自己电路情况确定的,由于计算时采用过多的浮点型变量会占用较多内存,造成内存不足,因此有除法时常采用整形变量进行计算,运算时为了保持尾数不丢失,需把被除数扩大100倍或1000倍,如整数123/100=1,小数部分丢失了,为得到1.23这个结果,需把123扩大100倍,变成12300,12300/100=123.0,然后将小数点向左移2位(缩小100倍),即得1.23 这就是定(小数)点计算

LedCtrl = LedCtrl &0xdf大概就是一次选通一个数码管,7f df ef bf每次只有一位是0

本文所设计的数字钟具有通过reset键对时、 分、 秒调整功能.该设计分为六个部分: 六进制计数器 counter6,十进制计数器 counter10 ,二四进制计数器 counter24, 时钟模块 bclock, LED扫描显示模块 ledctrl。设计使用VHDL 语言, 程序代码如下:

--*****************************************************************

--模块名 : 顶层设计

--文件名: myclock.vhd

--时间:2006年12月9日

--*********************************************************************

library ieee

use ieee.std_logic_1164.all

entity myclock is

port(clk1,clk2,reset:in std_logic --clk1为计数脉冲,clk2为LED扫描脉冲

hh_set:in std_logic_vector(1 downto 0)--时高位调整

mh_set,sh_set:in std_logic_vector(2 downto 0)--分,秒高位调整

hl_set,ml_set,sl_set:in std_logic_vector(3 downto 0) --时,分,秒低位调整

led_dp:out std_logic --LED小数点

sel:out std_logic_vector(2 downto 0) --送三-八译码生成位选信号

seg:out std_logic_vector(6 downto 0)) --段码

end myclock

architecture one of myclock is

component bclock is

port(clk,reset:in std_logic

hhin:in std_logic_vector(1 downto 0)

mhin,shin:in std_logic_vector(2 downto 0)

hlin, mlin,slin:in std_logic_vector(3 downto 0)

hho: out std_logic_vector(1 downto 0)

mho,sho:out std_logic_vector(2 downto 0)

hlo,mlo,slo:out std_logic_vector(3 downto 0))

end component bclock

component ledctrl is

port(clk:in std_logic

hh:in std_logic_vector(1 downto 0)

mh,sh:in std_logic_vector(2 downto 0)

hl,ml,sl:in std_logic_vector(3 downto 0)

dp:out std_logic

selo:out std_logic_vector(2 downto 0)

sego:out std_logic_vector(6 downto 0))

end component ledctrl

signal hh1:std_logic_vector(1 downto 0)

signal mh1,sh1:std_logic_vector(2 downto 0)

signal hl1,ml1,sl1:std_logic_vector(3 downto 0)

begin

u1:bclock port map(clk1,reset,hh_set,mh_set,sh_set,hl_set,ml_set,sl_set,hh1,mh1,sh1,hl1,ml1,sl1)

u2:ledctrl port map(clk2,hh1,mh1,sh1,hl1,ml1,sl1,led_dp,sel,seg)

end one

--*********************************************************************

--模块名 : 十进制数器

--文件名: counter10.vhd

--时间:2006年12月9日

--*********************************************************************

library ieee

use ieee.std_logic_1164.all

use ieee.std_logic_unsigned.all

entity counter10 is

port(clk,reset:in std_logic

din:in std_logic_vector(3 downto 0)

c:out std_logic

dout:out std_logic_vector(3 downto 0))

end counter10

architecture one of counter10 is

signal dd:std_logic_vector(3 downto 0)

signal c1:std_logic

begin

process(clk,reset) is

begin

if reset='1' then dd<=dinc1<='0'

elsif rising_edge(clk) then

if dd="1001" then dd<="0000"c1<='1'

else dd<=dd+1c1<='0'

end if

end if

end process

dout<=ddc<=c1

end one

--*****************************************************

--模块名 : 六进制计数器

--文件名: counter6.vhd

--时间:2006年12月9日

--******************************************************

library ieee

use ieee.std_logic_1164.all

use ieee.std_logic_unsigned.all

entity counter6 is

port(clk,reset:in std_logic

din:in std_logic_vector(2 downto 0)

c:out std_logic

dout:out std_logic_vector(2 downto 0))

end counter6

architecture one of counter6 is

signal dd:std_logic_vector(2 downto 0)

signal c1:std_logic

begin

process(clk,reset) is

begin

if reset='1' then dd<=dinc1<='0'

elsif rising_edge(clk) then

if dd="101" then dd<="000"c1<='1'

else dd<=dd+1c1<='0'

end if

end if

end process

dout<=ddc<=c1

end one

--*****************************************************

--模块名 : 二十四进制数器

--文件名: counter24.vhd

--时间:2006年12月9日

--******************************************************

library ieee

use ieee.std_logic_1164.all

use ieee.std_logic_unsigned.all

entity counter24 is

port(clk,reset:in std_logic

dhin:in std_logic_vector(1 downto 0)

dlin:in std_logic_vector(3 downto 0)

dh:out std_logic_vector(1 downto 0)

dl:out std_logic_vector(3 downto 0))

end counter24

architecture one of counter24 is

signal dl1:std_logic_vector(3 downto 0)

signal dh1:std_logic_vector(1 downto 0)begin

process(clk,reset) is

begin

if reset='1' then dl1<=dlindh1<=dhin

elsif rising_edge(clk) then

if dh1="10"and dl1="0011" then dl1<="0000"dh1<="00"

elsif dl1="1001" then dl1<="0000"dh1<=dh1+1

else dl1<=dl1+1

end if

end if

end process

dh<=dh1dl<=dl1

end one

--*******************************************************

--模块名 : 时钟模块

--文件名: bclock.vhd

--时间:2006年12月9日

--*******************************************************

library ieee

use ieee.std_logic_1164.all

use ieee.std_logic_unsigned.all

entity bclock is

port(clk,reset:in std_logic

hhin:in std_logic_vector(1 downto 0)

mhin,shin:in std_logic_vector(2 downto 0)

hlin, mlin,slin:in std_logic_vector(3 downto 0)

hho: out std_logic_vector(1 downto 0)

mho,sho:out std_logic_vector(2 downto 0)

hlo,mlo,slo:out std_logic_vector(3 downto 0))

end bclock

architecture one of bclock is

component counter10 is

port(clk,reset:in std_logic

din:in std_logic_vector(3 downto 0)

c:out std_logic

dout:out std_logic_vector(3 downto 0))

end component counter10

component counter6 is

port(clk,reset:in std_logic

din:in std_logic_vector(2 downto 0)

c:out std_logic

dout:out std_logic_vector(2 downto 0))

end component counter6

component counter24 is

port(clk,reset:in std_logic

dhin:in std_logic_vector(1 downto 0)

dlin:in std_logic_vector(3 downto 0)

dh:out std_logic_vector(1 downto 0)

dl:out std_logic_vector(3 downto 0))

end component counter24

signal csl,csh,cml,cmh:std_logic

begin

u1:counter10 port map(clk,reset,slin,csl,slo)

u2:counter6 port map(csl,reset,shin,csh,sho)

u3:counter10 port map(csh,reset,mlin,cml,mlo)

u4:counter6 port map(cml,reset,mhin,cmh,mho)

u5:counter24 port map(cmh,reset,hhin,hlin,hho,hlo)

end one

--******************************************************

--模块名 : LED扫描显示模块

--文件名:ledctrl.vhd

--时间:2006年12月9日

--*********************************************************

library ieee

use ieee.std_logic_1164.all

use ieee.std_logic_unsigned.all

use ieee.std_logic_arith.all

entity ledctrl is

port(clk:in std_logic

hh:in std_logic_vector(1 downto 0)

mh,sh:in std_logic_vector(2 downto 0)

hl,ml,sl:in std_logic_vector(3 downto 0)

dp:out std_logic

selo:out std_logic_vector(2 downto 0)

sego:out std_logic_vector(6 downto 0))

end ledctrl

architecture one of ledctrl is

signal ledon:std_logic_vector(3 downto 0)

signal count:std_logic_vector(2 downto 0)

begin

process(clk) is

begin

if rising_edge(clk) then

if count="101" then count<="000"

else count<=count+1

end if

end if

end process

selo<=count

ledon<=sl when count="000" else

'0'&sh when count="001" else

ml when count="010" else

'0'&mh when count="011" else

hl when count="100" else

"00"&hh when count="101" else

"000"

dp<='1' when count="010" or count="100" else

'0'

sego<="0111111" when ledon="0000" else

"0000110" when ledon="0001" else

"1011011" when ledon="0010" else

"1001111" when ledon="0011" else

"1100110" when ledon="0100" else

"1101101" when ledon="0101" else

"1111101" when ledon="0110" else

"0000111" when ledon="0111" else

"1111111" when ledon="1000" else

"1101111" when ledon="1001" else

"0000000"

end one

希望能帮到你...


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

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

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

发表评论

登录后才能评论

评论列表(0条)

    保存