完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
大家好,有问题需要请教,具体如下:
硬币分类计数系统: 1、对高速分类的不同面值的硬币通过光电传感器进行分别计数,由不同的数码管分别显示各种面值的金额数; 2、对不同面值的硬币总金额数由另一组数码管进行显示汇总; 3、能够手动清零。 没接触过单片机,该怎样来实现,望各位坛友不吝赐教。 |
|
相关推荐
1个回答
|
|
#include
#define uchar unsigned char //无符号char类型 #define uint unsigned int //无符号int类型 /************************常用位抄作指令*****************************/ #define set_bit(x,y) (x|=(1< #define HIBYTE(v1) ((uchar)((v1)>>8)) //取高位字节 #define LOBYTE(v1) ((uchar)((v1)&0xff)) //取低位字节 #define nop() _nop_ /********************************************************************/ #define LongToBin(n) ( ((n >> 21) & 0x80) | ((n >> 18) & 0x40) | ((n >> 15) & 0x20) | ((n >> 12) & 0x10) | ((n >> 9) & 0x08) | ((n >> 6) & 0x04) | ((n >> 3) & 0x02) | ((n ) & 0x01) ) #define Bin(n) LongToBin(0x##n##l) //write binary charactor set,exsample : Bin(11111111) = 0xff //*******************************数码管com口定义**********************************// #define display_location_1_set set_bit(P3,0)//P3_3=1 #define display_location_1_clr clr_bit(P3,0)//P3_3=0 #define display_location_2_set set_bit(P3,1)//P3_2=1 #define display_location_2_clr clr_bit(P3,1)//P3_2=0 #define display_location_3_set set_bit(P3,2)//P3_1=1 #define display_location_3_clr clr_bit(P3,2)//P3_1=0 #define display_location_4_set set_bit(P3,3)//P3_0=1 #define display_location_4_clr clr_bit(P3,3)//P3_0=0 //*******************************数码管断码定义**********************************// #define display_1_set set_bit(P2,0)//P1_4=0 #define display_1_clr clr_bit(P2,0)//P1_4=1 #define display_2_set set_bit(P2,1)//P1_6=0 #define display_2_clr clr_bit(P2,1)//P1_6=1 #define display_3_set set_bit(P2,2)//P2_5=0 #define display_3_clr clr_bit(P2,2)//P2_5=1 #define display_4_set set_bit(P2,3)//P2_3=0 #define display_4_clr clr_bit(P2,3)//P2_3=1 #define display_5_set set_bit(P2,4)//P2_2=0 #define display_5_clr clr_bit(P2,4)//P2_2=1 #define display_6_set set_bit(P2,5)//P1_5=0 #define display_6_clr clr_bit(P2,5)//P1_5=1 #define display_7_set set_bit(P2,6)//P2_6=0 #define display_7_clr clr_bit(P2,6)//P2_6=1 #define display_8_set set_bit(P2,7)//P2_4=0 #define display_8_clr clr_bit(P2,7)//P2_4=1 uchar bite=1; //数码管位转换数据 //*****************************时间标记变量*************************************// uchar r_timer_2ms=0; //2ms计数累加器 bit f_timer_2ms=0; //2ms标记 //*****************************数码管BCD码值*************************************// code unsigned char LED_DATA[10] ={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f, // 0 1 2 3 4 5 6 7 0x01,0x09,};//,0x3e,0x9c,0x7a,0x9e,0x8e}; // 8 9 - 消 e c d e f void scan_io(uchar LED_TABLE) { //*******************************************************************************// if(LED_TABLE & 0x80) display_1_set;else display_1_clr; //a段码控制 if(LED_TABLE & 0x40) display_2_set;else display_2_clr; //b段码控制 if(LED_TABLE & 0x20) display_3_set;else display_3_clr; //c段码控制 if(LED_TABLE & 0x10) display_4_set;else display_4_clr; //d段码控制 if(LED_TABLE & 0x08) display_5_set;else display_5_clr; //e段码控制 if(LED_TABLE & 0x04) display_6_set;else display_6_clr; //f段码控制 if(LED_TABLE & 0x02) display_7_set;else display_7_clr; //g段码控制 if(LED_TABLE & 0x01) display_8_set;else display_8_set; //H段码控制 //*******************************************************************************// } void scan_lcd(uint Timer_Count_show) { unsigned char temp_data1;unsigned char temp_data2;unsigned char temp_data3;unsigned char temp_data4;unsigned char LED_TABLE; //********************数码管1-4全消隐,避免产生鬼影******************************// display_location_1_clr; //数码管1消隐 display_location_2_clr; //数码管2消隐 display_location_3_clr; //数码管3消隐 display_location_4_clr; //数码管4消隐 display_1_clr;display_2_clr;display_3_clr; //消隐数码屏 display_4_clr;display_5_clr;display_6_clr; //消隐数码屏 display_7_clr;display_8_clr; //消隐数码屏 //*******************************获取个位*******************************// temp_data1=Timer_Count_show/1000; temp_data2=Timer_Count_show%1000/100; temp_data3=Timer_Count_show%1000%100/10; temp_data4=Timer_Count_show%1000%100%10; switch(bite) { case 1: //千位 { bite=2; display_location_1_set; //******************************获取查表数值*************************************// LED_TABLE=LED_DATA[temp_data1]; //获取查表数值 //******************************************************// break; } case 2: //百位 { bite=3; display_location_2_set; //******************************获取查表数值*************************************// LED_TABLE=LED_DATA[temp_data2]; //获取查表数值 //*******************************************************************************// break; } case 3: //十位 { bite=4; display_location_3_set; //******************************获取查表数值*************************************// LED_TABLE=LED_DATA[temp_data3]; //获取查表数值 //*******************************************************************************// break; } case 4: { bite=1; //个位 display_location_4_set; //******************************获取查表数值*************************************// LED_TABLE=LED_DATA[temp_data4]; //获取查表数值 //*******************************************************************************// break; } default:break; } scan_io(LED_TABLE); //数码管扫描 } /*===================定时器1初始化程序区=====================*/ /*16.6M12分频时钟,八位自动重装定时125us定时器*/ void timer0_init(void) { clr_bit(TMOD,0); //M01 0 0 : 13 位定时器/计数器 0 1 : 16 位定时器/计数器 set_bit(TMOD,1); //M11 1 0 : 8 位自动重载定时器 1 1 : 定时器0 此时作为双8 位定时器/计数器 clr_bit(TMOD,2); //C/T1 0:定时器,T0 计数来源于Fosc 分频 1:计数器,T0 计数来源于外部管脚T0/P1.2 clr_bit(TMOD,3); //GATE1 TMOD[3]控制定时器0,置0 且TR0 置1 时才打开T0 //1-T1FD T1 输入频率选择控制 0:T1 频率源自于Fosc/12 1:T1 频率源自于Fosc/4 //0-T0FD T1 输入频率选择控制 0:T1 频率源自于Fosc/12 1:T1 频率源自于Fosc/4 TL0=0x83; //8位自动重载125us一次中断 TH0=0x83; TR0=0; //定时器T1的运行控制位。打开timer1前,先清TRO ET0=1; //允许timer1中断 TR0=1; //允许timer1开始计数 EA=1; } /***********************定时器1中断入口函数**************************/ void timer0() interrupt 1 //125us中断一次 { r_timer_2ms++; xor_bit(P3,5); if(r_timer_2ms>=16) //125us*16=2ms { r_timer_2ms=0; f_timer_2ms=1; } } void main() { timer0_init(); //定时器0初始化 while(1) { if(f_timer_2ms) //2ms执行一次主程序 { f_timer_2ms=0; //时间标记清零 scan_lcd(4321); xor_bit(P3,4); } } } |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
889 浏览 0 评论
1515 浏览 1 评论
ad把一个15mm*1.5mm的灯放到直径15mm的圆形pcb板上,可以实现吗
1359 浏览 1 评论
1635 浏览 1 评论
请问PCB覆铜规则改成了Direct Connect为什么还是Relief Connect连接?
1949 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-25 22:23 , Processed in 0.730552 second(s), Total 75, Slave 57 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号